问题描述
我想要做的是连续读取字符并计算大写,小写,数字和空格中的字符数。 (被告知不要使用字符串)。
我的问题是,为什么此代码不起作用?是不是应该先读取第一个字符,然后读取第二个字符,直到输入的最后一个字符?
如何制作一个循环,该循环读取输入中的第一个字符,然后再读取输入的字符,依此类推...当看到行尾时,应停止循环。
program Contadordecaracteres;
VAR
minusculas,mayusculas,numeros,espacios:integer;
c:char;
begin
minusculas:= 0;
mayusculas:= 0;
numeros:= 0;
espacios:= 0;
writeln('Escriba algo');
while not EoLn do
begin
read(c);
case c of
' ': espacios:= espacios+1;
'0'..'9': numeros:= numeros+1;
'A'..'Z': mayusculas:= mayusculas+1;
'a'..'z': minusculas:= minusculas+1;
end; //end of case
end; // end of while
writeln('Mayusculas: ',mayusculas);
writeln('Minusculas: ',minusculas);
writeln('Numeros: ',numeros);
writeln('Espacios: ',espacios);
readln;
end.
解决方法
如何制作一个循环以读取输入中的第一个字符,然后 在此之后读取字符,依此类推...当看到行尾时 它应该停止循环。
除一个细节外,您的程序实际上完成了您想要执行的操作。无法按您期望的那样工作的一个细节是,当您按 Enter (在此之前敲过各种键之后)时,程序会在writeln()
和{ {1}},然后终止。我猜您希望程序会在此readln
行处停止。
使用readln;
语句,您需要用户按 Enter 来查看摘要。没关系。
while not EoLn do
看到该按键产生的while not EoLn do
(回车换行),并很满意退出循环,但并未从其中移除CR LF
输入缓冲区。
执行CR LF
(在所有readln
之后)后,它会在输入缓冲区中看到writeln
,从缓冲区中读取并继续,从而导致程序结束
解决方法是在已经拥有的CR LF
之后再添加一个readln;
。然后程序将停止,直到您再次按 Enter 。