我在delphi中的程序可能因为goto命令而无法工作

时间:2015-04-28 12:35:52

标签: delphi label pascal goto

我有这个任务要做:编写一个程序,打开文本文件cypher.txt并创建2个输出文件。输出文件first.txt将包含所有偶数单词和空格字符,而不是奇数单词。空格字符数等于奇数字的字母数。输出文件second.txt将包含所有奇数单词和空格字符,而不是偶数单词。如果我们打印文件first.txt并随后在同一张纸上提交second.txt,它们应合并到原始文本中。

我的代码:

(((((192 << 8) | 43) << 8) | 244) << 8) | 18 =

= 11000000001010111111010000000000 | 18 =

= 11000000001010111111010000000000 |
                          00010010 =

= 11000000001010111111010000010010

但我的程序只创建了两个空文件而没有别的......问题在哪里?

2 个答案:

答案 0 :(得分:1)

这是非常混乱的代码,并且goto语句完全没有必要,因为它们位于循环点的旁边,因此您可以简单地使用多个条件。备查; goto语句通常保留用于转义极大的嵌套循环;甚至这被认为是不良编码实践,应该避免。

您可以使用此行来删除您的第一个goto语句:

  Until (j = count-1) or (letter[j-1] = ' ');

第二个也可以通过简单地将其包含在另一个循环中来避免:

Repeat //instead of start label

 //rest of your code here

Repeat
 Read (cyp, letter[j]);
 //etc

Until (j = count-1) or (letter[j - 1] = ' ');
Until (letter[j - 1] <> ' '); 
{this condition is inverted from the previous one because you want
to escape the inner loop with the second condition but not the outer one.}

你的代码看起来好像你实际上试图找到偶数字母和奇数字母,而不是你所说的字,所以我会按照这个假设运行。

空文件的问题是无关的。

可能不正确的行是:

ReadLn(sent);

据我了解,您更可能想要:

Readln(cyp, sent);

否则,当控制台弹出时,按Enter键将其关闭,count设置为0,因此程序无法执行您想要的操作。

答案 1 :(得分:0)

我不想做你的作业,但这个小程序应该引导你走的路。

program so_29919709;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function IfThen( const ACondition: Boolean; const ATrueArg, AFalseArg: Char ): Char;
begin
  if ACondition then
    Result := ATrueArg
  else
    Result := AFalseArg;
end;

procedure SplitText( const AStr: string; out AEvenStr, AOddStr: string );
var
  LChar: Char;
  LIsEven: Boolean;
begin
  LIsEven := False;

  // loop through the text char by char
  for LChar in AStr do
  begin

    // append the char to the output depending on even state
    AEvenStr := AEvenStr + IfThen( LIsEven, LChar, ' ' );
    AOddStr := AOddStr + IfThen( LIsEven, ' ', LChar );

    // Toggle the even state if needed
    if LChar = ' ' then
      LIsEven := not LIsEven;

  end;
end;

procedure Test;
var
  LCipherStr, LEvenStr, LOddStr: string;
begin
  LCipherStr :=
  {} 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam '
  {} + 'nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam '
  {} + 'erat, sed diam voluptua. At vero eos et accusam et justo duo '
  {} + 'dolores et ea rebum.';

  Writeln( 'CipherStr:' );
  Writeln( '==========' );
  Writeln( LCipherStr );
  WriteLn;

  SplitText( LCipherStr, LEvenStr, LOddStr );

  Writeln( 'EvenStr:' );
  Writeln( '========' );
  Writeln( LEvenStr );
  WriteLn;

  Writeln( 'OddStr:' );
  Writeln( '=======' );
  Writeln( LOddStr );
  WriteLn;
end;

begin
  try

    Test;

  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.

这是生成的输出:

CipherStr:
==========
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At v
ero eos et accusam et justo duo dolores et ea rebum.

EvenStr:
========
      ipsum       sit       consetetur            elitr,     diam        eirmod
       invidunt    labore    dolore       aliquyam       sed      voluptua.    v
ero     et         et       duo         et    rebum.

OddStr:
=======
Lorem       dolor     amet,            sadipscing        sed      nonumy
tempor          ut        et        magna          erat,     diam           At
    eos    accusam    justo     dolores    ea