(13,3) Фатально: синтаксическая ошибка, ; ожидалось, но ДРУГОЕ найдено

Program prueba1;
uses Estructu;
Var Pila1:Pila; Fila1,Completa:Fila;
Begin
    Inicfila (Completa);
    readpila(Pila1);
    readfila(Fila1);
    While (not pilavacia(Pila1) and not filavacia(Fila1)) do
    begin
        if (tope(Pila1) > primero(Fila1)) then
        begin
            agregar(Completa, desapilar(Pila1))
        else
            if (tope(Pila1) < primero(Fila1)) then
            begin
                agregar(Completa, extraer(Fila1))
            else
                if (tope(Pila1) = primero(Fila1)) then
                begin
                    agregar(Completa, desapilar(Pila1));
                    agregar(Completa, extraer(Fila1))
                end
            end
        end
    end
    write('El resultado final de Completa es');
    Writefila(Completa);
End.

Целью программы было бы организовать в Completa все переменные из Pila1 и Fila1 в порядке от первого до последнего. Я не знаю, что я делаю неправильно, и буду признателен за помощь


person Sebastiàn Cappi    schedule 03.05.2020    source источник
comment
Возможно, вам будет полезно прочитать этот ответ, который я опубликовал, в котором содержится руководство по правильному использованию begin и end в Паскале.   -  person Ken White    schedule 03.05.2020


Ответы (1)


Вы неправильно используете if ... then ... else и begin ... end.

Существует концепция блока, который начинается с begin и заканчивается на end. Везде, где ожидается одно утверждение, вы можете вместо этого поместить блок. Это также относится к if <condition> then <statement> else <statement>;.

Итак, этот код действителен:

if something() then
  stuff
else
  stuff;

... как это:

if something() then
  begin
    stuff;
    moreStuff;
  end
else
  begin
    otherStuff;
    moreOtherStuff;
  end;

Однако это (которое вы используете) не является:

if something() then
  begin
    stuff // I guess here you omitted the semicolon because you correctly remembered
          // that there shouldn't be a semicolon before `else`, but...
else // WRONG, this is in the middle of the block!
    otherStuff;
  end;

Чтобы понять, почему, давайте исправим отступ, чтобы он соответствовал логической интерпретации этого кода:

if something() then
  begin
    stuff
    else // ????????
    otherStuff;
  end;

Вы получаете сообщение об ошибке, поскольку begin ... else ... end не является допустимой конструкцией. Поскольку есть begin, но нет end перед else, ваш else находится в середине блока then, что не имеет смысла.

Убедитесь, что ваш блок end перед началом части else, а затем begin новый блок.

person CherryDT    schedule 03.05.2020
comment
Спасибо, хотя теперь у меня проблемы с строками write и writefila - person Sebastiàn Cappi; 03.05.2020
comment
Я думаю, что вам не хватает ; после того, как условие закончилось. Таким образом, в end, который завершает if или while, вам нужен ; (хотя не перед else). - person CherryDT; 03.05.2020
comment
было бы также неплохо опустить ; после последних операторов в начале конца. Подумайте об этом, так как начало и конец являются скобками, и вы используете ; для разделения элементов в скобках. Вам не нужно ; после последнего элемента в начале конца. Многие компиляторы допустят это или даже вставят пустой оператор после last ; - person robert aleksic; 14.06.2020