我写了下面的pascal代码。它的主要目的是使用与之相反的函数将字母给定的数字转换为数字给定的整数(将数字给定的数字转换为字母):
enter code here
Program number_to_letters;
Uses crt;
// beginning of the function convert
// the following function converts a number given by the user to letters. For 12 ==>
'Twelve'
Function convert(user_input:Integer) : String;
Var
units,tens,thousands,hundreds: Integer;
s: String;
Begin
units := user_input Mod 10;
tens := ( user_input Div 10) Mod 10;
hundreds := ( user_input Div 100 ) Mod 10;
thousands := user_input Div 1000;
//*** handling units first ***
case ( units ) of
1 : s := 'One';
2 : s := 'Two';
3 : s := 'Three';
4 : s := 'Four';
5 : s := 'Five';
6 : s := 'Six';
7 : s := 'Seven';
8 : s := 'Eight';
9 : s := 'Nine';
end;
//*** handling tens
Case ( tens ) Of
2 : s := 'Twenty' + s;
3 : s := 'Thirty' + s;
4 : s := 'Forty' + s;
5 : s := 'Fifty' + s;
6 : s := 'Sixty' + s;
8 : s := 'Eighty' + s;
end;
convert := s;
end;
//* end of the function **
// begin of the program
//** the program reveive a number from the user written with letters and converts it to a number using the Function above
var
user_input : string;
i:integer ;
begin
write('Enter your number : ');
readln(user_input);
for i:=1 to 80 do
begin
if (convert(i) = user_input ) then write(i);
end;
end.
我得到的结果是我想要的20 -80之间的数字,除非输入20,30,40,50,60,80例如,当我从29变至41并且输入Thirty时,我得到的结果是“ ThirtyTwentyNine”而不是“ Thirt”,知道如果我输入另一个数字,例如“ TwentyNine”,我将得到29。如果执行writeln(convert(30)),我会得到“三十”。那么为什么它在for循环中不起作用?
似乎Pascal会在第一次运行之前而不是在每次运行之前清除函数变量的区域。通常,Pascal用于进行良好的编程,并且对没有赋值的变量进行任何操作(最后一位等于0的情况)不是一个好主意。因为在十位的情况下使用“ s”,所以它应该有一个值,即s:=''
应该写在前面的某个地方,例如在单位之前。
顺便说一句,这是一个有趣的副作用-已声明但未分配的变量保留了函数上一次运行的值。