使用“读取pascal中的多个字符”;而不是EoLn“;

使用“读取pascal中的多个字符”;而不是EoLn“;,pascal,Pascal,我要做的是连续读取字符,并计算大写、小写、数字和空格中的字符数。(我们被告知不要使用字符串) 我的问题是,为什么这个代码不起作用?它不是应该先读取第一个字符,然后再读取第二个字符,直到输入的最后一个字符吗 如何创建一个循环,读取输入中的第一个字符,然后再读取后面的字符,依此类推……当它看到行的结尾时,它应该停止循环 program Contadordecaracteres; VAR minusculas,mayusculas,numeros,espacios:integer; c:ch

我要做的是连续读取字符,并计算大写、小写、数字和空格中的字符数。(我们被告知不要使用字符串)

我的问题是,为什么这个代码不起作用?它不是应该先读取第一个字符,然后再读取第二个字符,直到输入的最后一个字符吗

如何创建一个循环,读取输入中的第一个字符,然后再读取后面的字符,依此类推……当它看到行的结尾时,它应该停止循环

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.
那么,如何创建一个循环来读取输入中的第一个字符呢 阅读后面的字符,以此类推……当它看到行的结尾时 它应该停止循环

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()
s和
readln
,然后终止。我猜你希望程序在这个
readln

使用
while not EoLn do
语句,您需要用户按Enter键查看摘要。没关系

而非EoLn do
会看到该按键产生的
CR LF
(回车换行),并满意地退出循环,但不会从输入缓冲区中删除
CR LF

当执行
readln
(在所有
writeln
s之后)时,它会在输入缓冲区中看到
CR LF
,从缓冲区读取并继续,从而导致程序结束

解决方法是再添加一个
readln在您已有的代码之后。然后程序将停止,直到再次按Enter键

那么,如何创建一个循环来读取输入中的第一个字符呢 阅读后面的字符,以此类推……当它看到行的结尾时 它应该停止循环

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()
s和
readln
,然后终止。我猜你希望程序在这个
readln

使用
while not EoLn do
语句,您需要用户按Enter键查看摘要。没关系

而非EoLn do
会看到该按键产生的
CR LF
(回车换行),并满意地退出循环,但不会从输入缓冲区中删除
CR LF

当执行
readln
(在所有
writeln
s之后)时,它会在输入缓冲区中看到
CR LF
,从缓冲区读取并继续,从而导致程序结束


解决方法是再添加一个
readln在您已有的代码之后。然后程序将停止,直到您再次按Enter键。

对于这样的练习,使用传统的Pascal文件io,编写程序以便将
文本文件的输入读入字符串变量比从键盘一次读入一个字符更有指导意义。这将指导您进行字符串操作,这是一项基本的必备技能。谷歌自己一个教程,适合你的水平。谢谢你的编辑。我删除了我的否决票和之前的所有评论,因为现在你的问题已经很清楚了。最后也回答了你的问题。如果我的答案是正确的,你可以点击我答案旁边的勾号来标记。对于这样的练习,使用传统的Pascal文件io,编写程序以便将
文本文件中的输入读入字符串变量比从键盘一次读入一个字符更有指导意义。这将指导您进行字符串操作,这是一项基本的必备技能。谷歌自己一个教程,适合你的水平。谢谢你的编辑。我删除了我的否决票和之前的所有评论,因为现在你的问题已经很清楚了。最后也回答了你的问题。如果我的答案是正确的,你可以点击我答案旁边的勾号来标记。