Pascal 程序运行时,写入->-&燃气轮机-&燃气轮机->;。为什么会这样?

Pascal 程序运行时,写入->-&燃气轮机-&燃气轮机->;。为什么会这样?,pascal,freepascal,Pascal,Freepascal,这是程序必须读取的文本文件,并将每个num.放在不同的变量中。 第一个数字(在本例中为3)是n,告诉程序要执行多少次。在NUM之间,有一个空格 文本文件f是这样的 3 2 2 1 1 5 4 2 当它运行代码时,下面的内容会一直被编写 ->->->->->->->->->->->->->->->->->->->->->->->->->->-

这是程序必须读取的文本文件,并将每个num.放在不同的变量中。 第一个数字(在本例中为3)是n,告诉程序要执行多少次。在NUM之间,有一个空格

文本文件f是这样的

3 2
2 1
1 5
4 2
当它运行代码时,下面的内容会一直被编写

->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
为什么会这样

有人能帮我做这个项目吗

代码如下所示

Program thefinalp;

Uses SysUtils;

Var
  f: Text;
  m, d: Integer;
  n: Char;
  c: String[1];

  a, e: array of Integer;
  LowArr: Integer;
  HighArr: Integer;
  ArrayLen: Integer;
  i: Integer;

begin
  Assign(f, 'd:\tempfiles\finalp.txt');
  Reset(f);

  repeat
    Readln(f, n);
    Write(n);
  until (n = ' ');

  Read(f, c);
  Write(c);

  while not SeekEoln(f) do
  begin
    read(f, d);
    Write(d);
  End;
  Readln;
  Writeln;

  StrToIntDef(n, m);

  setlength(a, m);
  LowArr := Low(a);
  HighArr := High(a);
  ArrayLen := Length(a);

  setlength(e, m);
  LowArr := Low(e);
  HighArr := High(e);
  ArrayLen := Length(e);

  for i := LowArr to HighArr do

  begin

    repeat
      Read(f, a[i]);
      Write(a[i]);
    until (n = ' ');

    Read(f, c);
    Write(c);

    while not SeekEoln(f) do
    begin
      read(f, e[i]);
      Write(e[i]);
    End;
    Readln;
    Writeln;

  End;
  Readln;

End.

在第一次
重复到
,您将
读入字符。第一个字符将出现在
n
中,其余字符将被完全跳过,直到新行被读取为止。此时,文件指针将位于第二行数据的
2

由于您的测试针对的是
n='
,因此将再次执行readln,这次将
2
传递到
n
中,并将文件指针推到第三行的
1

当最终到达文件末尾时,将从文件中“读取”一个Control-Z字符。这就是你看到的角色。因为它不是空间,所以循环将永远持续

将此处的
readln
更改为
read
,将读取一个字符。(然后它工作了,你可以继续下一个问题…)

请记住,
readln
一直读取,直到它读取了换行符
Read
读入变量-如果是字符,则读取一个字符。如果它是一个字符串,它会读取一个字符串,但不会读取换行符


不幸的是,要想弄清楚你到底想做什么有点困难。此例程将读取第一行,然后将其余行放入a[?]和e[?]

使用描述性变量名称将执行一些文档,以便您可以了解正在发生的事情。因为我实际上不知道,所以我不得不做出假设,做一些事情来填补空白

查看主例程,首先指定一个文件名(为了方便起见,我使用了
q21366050.txt
),然后使用
重置打开该文件

下一个任务是从文件中读取第一个数字。现在您只显示了一位数,但是设置例程以处理序列很容易

n:=readinteger;
将函数
readinteger
的结果分配给字符串
n

readinteger
的工作方式如下:首先清除字符串
st
,它是一个“局部变量”——仅适用于此例程。然后继续将字符读入
ch
,直到读取的字符在“0”…“9”范围内,因此它将跳过,直到读取一个数字。然后,它将读取的数字添加到字符串
st
,并继续读取字符并将其累加,直到找到的字符不是一个数字。(如果需要,该字符位于
ch
)然后我们将累积的数字串分配给函数的结果

因此,
n
将获得文件中第一个
字符串
;下一个字符已被读取,我们知道它不是数字(否则它将被追加到返回的字符串中)

然后使用
n2
重复该过程。跳过下一个数字之前的所有剩余字符,返回数字序列,并将下一个字符放入
ch

然后我们将字符串
n
转换为整数的结果分配给
m
。您还没有描述其他号码的用途,所以它就在那里,但没有使用

设置两个ARAY,
a
e

然后使用相同的例程读取下一个整数。是否有CRLF字符并不重要-我们跳到下一个数字并返回它。对第二个数字重复这个步骤

将这两个数字转换成各自的数组

这样做
m

最后,在显示器上写一行新行,然后再写一行报告
结果
,然后重复
m次
写一行,其中包含迭代编号
i
和两个数组的值,
a
e
,都是转换为字符串的整数,并且
=
字符,表明我们不仅仅是重复从输入读取的dat

最后,等待来自键盘的输入(因为
readln
没有显式的filevar),它保持程序打开,直到我们可以看到结果


现在-名义上,当然,您也应该在终止之前关闭文件…

您应该正确缩进块。使您的代码更易于阅读。好的,谢谢,我正在更正它。打开编译器提示和警告。注意听他们对你说的话。然后使用调试器逐步检查代码,找出错误所在。一旦你做了那么多,如果你不能解决这个问题,你至少可以更好地描述它并缩小它的范围。我(再次)修复了你的代码格式。现在是你学会正确格式化代码的时候了(无论是在这里还是在你自己的机器上),这样我们就不必一直为你这么做了。当人们自己不做任何努力,期望别人在他们之后清理时,这会变得很烦人。在这里设置代码格式并不困难,因此如果你在自己的代码中正确地设置代码格式,那么只需复制、粘贴和击键或单击工具栏按钮即可在这里正确发布。感谢你解决了这个问题,我还是一个初学者,我尝试对代码进行缩进,但似乎需要更好的缩进,所以我在互联网上搜索了它,所以nexy yime我会发布mycode,它的格式会更好。关于编译器提示,没有编译消息。非常感谢您的帮助。您能给我推荐一种转到nexy行的方法吗?因为当
n:=readinteger;