【问题标题】:Pascal else if statment帕斯卡 else if 语句
【发布时间】:2020-07-15 16:33:35
【问题描述】:

下面是我的代码和错误消息,我一直在考虑如何纠正它,但仍然无法纠正,谁能帮助我,谢谢 我正在尝试制作一个可以制作一个带有数字的正方形的程序 像这样

input:3
output: 1 2 3
        8   4
        7 6 5

input:4
output:1 2 3 4
       12    5
       11    6
       10 9 8 7

input:1
output:1

var i,n,e1,e2,n2:longint;
begin
readln(n);
n2:=n;
   if n2<>1 then;
      begin
         for i:=1 to n do
            begin
               write(i:4);
            end;
            e1:=(n*n-(n-2)*(n-2));
            e2:=n+1;
            if n>2 then;
               begin
                  for i:=1 to n-2 do
                     begin
                        writeln();
                        write(e1:4,e2:(n-1)*4);
                        e1:=e1-1;
                        e2:=e2+1;
                     end;
               end;
            writeln();
            begin;
               for i:=1 to n2 do
                  begin;
                     if n2>2 then;
                        begin;
                           write(e1:4);
                           e1:=e1-1;
                     end
                  end
            end
      end
   else if n2=1 then;
      write('1');
end.




Free Pascal Compiler version 2.6.2-8 [2014/01/22] for x86_64
Copyright (c) 1993-2012 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling main.pas
main.pas(35,4) Fatal: Syntax error, ";" expected but "ELSE" found
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode (normal if you did not specify a source file to be `compiled)`

【问题讨论】:

  • 您所有的then; 都应该是then。进行更改,然后继续调试。
  • 你认为在begin 前面加上一个分号; 有什么作用?
  • 另见我的answer

标签: if-statement pascal freepascal pascalscript


【解决方案1】:

你可以看看这个执行你想做的事情的程序,并从中学习如何使用 pascal 将问题分层分解为更小的问题,然后单独整理每个问题:

program box;
var n,len, t,i : integer;

  procedure firstrow;
  var i : integer;
  begin
    for i := 1 to n do write (i:len);
    writeln
  end;

  procedure midrow (r:integer);
  var i : integer;
  begin
    write (4*(n-1)+2-r:len);
    for i := 1 to n-2 do write (' ':len);
    writeln (n+r-1:len)
  end;

  procedure lastrow;
  var x, i : integer;
  begin
    x := 3 * (n-1) + 1;
    for i := x downto x-n+1 do write (i:len);
    writeln
  end;

begin
  write ('input: '); readln (n);

  { calculate number of digits in bigest nuber printed }
  t   := (n-1)*4;
  len := 1;
  while t>9 do
  begin
    len := len+1;
    t   := t div 10
  end;
  len := len+1; { plus one for space }

  writeln ('output:');
  for i := 1 to n do
    if i = 1
    then firstrow
    else if i = n
         then lastrow
         else midrow (i)

end.

您还可以查看如何使用局部变量(i 作为全局变量,i 作为过程中的局部变量)。因此,当您编写程序时,您可以为局部变量使用任何名称,只要它不影响您要在程序内部访问的全局变量(来自全局范围的 n)。将全局变量作为参数传递给过程也是一种很好的做法,因为这样您就可以为局部变量使用任何您想要的名称。如果你这样写,你可以把你以前写的过程和函数复制粘贴到任何你需要它们的程序中......

【讨论】:

    【解决方案2】:

    你使用 ;以错误的方式。它用于分隔由 begin ... end 组成的语句。例如,您编写 begin s1;s2;s3 end。想想像括号一样的开始和结束,它们通过组合许多语句来构成一个语句。 if、for、while 和 repeat 只能包含一个语句,因此如果您需要放置更多语句,请将它们括在 begin end 中并用 ; 分隔。

    例如:如果 x

    有帕斯卡语法图很方便,你可以从中推断出这样的事情......

    我把你的程序缩进了一点,这样你就可以更容易地看到你写的东西,并且先反转 if 然后 else,这样更容易理解。

    所有只包含一个语句的开头结尾都可以省略,你可以看到你首先测试了两次相同的条件,如果:

    program box;
    var
      i,n, e1,e2,n2 : longint;
    
    begin
      readln (n);
    
      n2 := n;
      if n2=1
      then if n2=1
           then write('1')
           else
      else begin
             for i:=1 to n do
              begin
                write (i:4);
              end;
    
              e1 := n*n - (n-2)*(n-2);
              e2 :=n+1;
              if n>2
              then begin
                     for i:=1 to n-2 do
                     begin
                        writeln;
                        write (e1:4, e2:(n-1)*4);
                        e1 := e1-1;
                        e2 := e2+1
                     end
                   end;
    
              writeln;
    
              begin
                for i:=1 to n2 do
                begin
                  if n2>2
                  then begin
                         write (e1:4);
                         e1 := e1-1
                      end
                end
             end
          end
     end.
    

    你在正确的轨道上,但它不适用于 n=2。

    此外,您可能会注意到第一个 if 中的 else 为空。这是因为 if a then if b then c else d 将 d as else 放在第二个 if 中。因此,如果您想将 else 与 first if 联系起来,那么您将执行 if a then if b then c else else d。

    【讨论】:

      【解决方案3】:

      then 后面的分号不正确。正确的语法是

      if condition then statement;
      if condition then statement else statement
      

      对于两个 if 语句。在我的示例中,一个是 if,另一个是 if-else。请注意,分号将两个语句分开。如果分支中有多个语句,则可以使用 begin end 块对语句进行分组。用分号分隔语句。

      【讨论】:

        猜你喜欢
        • 2019-04-09
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        • 2015-07-06
        • 2012-08-05
        • 2018-05-06
        • 1970-01-01
        相关资源
        最近更新 更多