Паскаль. Пишет "Встречено 'else', а ожидалось ';'". Строка с последним else. В чём проблема?

Вылазит ошибка "Встречено 'else', а ожидалось ';'". В строке с последним else (62 строка) В чём проблема?

var R,x0,y0:integer;
    k1,b1:integer;
    k2,b2:integer;
    x1,y1:real;
    x,y:real;
    a,b,c:real;
begin
  writeln('Окружность:');
  write('Введите R (Радиус): ');
  read(R);
  write('Введите x0 (Абсцисса центра окружности): ');
  read(x0);
  write('Введите y0 (Ордината центра окружности): ');
  read(y0);
  if (R>0) then
    writeln('Параметры задают окружность')
  else
    writeln('Параметры не задают окружность');
  writeln('Первая прямая:');
  write('Введите k1 (Коэффициент наклона первой прямой): ');
  read(k1);
  write('Введите b1 (Коэффициент смещения первой прямой по оси y): ');
  read(b1);
  if (k1>0) then
    writeln('Параметры задают первую прямую')
  else
    writeln('Параметры не задают первую прямую');
  writeln('Вторая прямая:');
  write('Введите k2 (Коэффициент наклона второй прямой): ');
  read(k2);
  write('Введите b2 (Коэффициент смещения второй прямой по оси y): ');
  read(b2);
  if (k2<0) then
    writeln('Параметры задают вторую прямую')
  else
    writeln('Параметры не задают вторую прямую');
  if (R>0) and (k1>0) and (k2<0) then
  begin
    writeln('Область пересечения: ');
    x1:=(b2-b1)/(k1-k2);
    y1:=(k1*x1+b1);
    if (sqr(x1-x0)+sqr(y1-y0))<sqr(R) then
      writeln('Графики образуют область пересечения');
      begin
      writeln('Введите координаты произвольной точки: ');
      write('Введите x: ');
      read(x);
      write('Введите y: ');
      read(y);
      a:=k1*x+b1;
      b:=k2*x+b2;
      c:=sqr(x-x0)+sqr(y-y0);
      if (((y<a) and (y>b)) or ((y>a) and (y<b))) and (c<sqr(R)) then
         writeln('Точка (x,y) входит в область пересечения')
       else if (((y<a) and (y>b)) or ((y>a) and (y<b))) and (c=sqr(R)) or ((y=a) or (y=b)) and (c<sqr(R)) and not(x1=x) and not(y1=y) then
         writeln('Точка (x,y) находится на границе области пересечения')
       else if ((y=a) or (y=b)) and (c=sqr(R)) or (x1=x) and (y1=y) then
         writeln('Точка (x,y) находится в точке пересечения графиков')
       else
         writeln('Точка (x,y) не входит в область пересечения')
      end
    else
      writeln('Графики не образуют область пересечения');
      writeln('Ошибка')
    end
  else
    writeln('Ошибка')
end.

Ответы (1 шт):

Автор решения: Zhihar

вот вам код с нормальными отступами

var R,x0,y0:integer;
k1,b1:integer;
k2,b2:integer;
x1,y1:real;
x,y:real;
a,b,c:real;
begin
    writeln('Окружность:');
    write('Введите R (Радиус): ');
    read(R);
    write('Введите x0 (Абсцисса центра окружности): ');
    read(x0);
    write('Введите y0 (Ордината центра окружности): ');
    read(y0);
    if (R>0) then
        writeln('Параметры задают окружность')
    else
        writeln('Параметры не задают окружность');
    writeln('Первая прямая:');
    write('Введите k1 (Коэффициент наклона первой прямой): ');
    read(k1);
    write('Введите b1 (Коэффициент смещения первой прямой по оси y): ');
    read(b1);
    if (k1>0) then
        writeln('Параметры задают первую прямую')
    else
        writeln('Параметры не задают первую прямую');
    writeln('Вторая прямая:');
    write('Введите k2 (Коэффициент наклона второй прямой): ');
    read(k2);
    write('Введите b2 (Коэффициент смещения второй прямой по оси y): ');
    read(b2);
    if (k2<0) then
        writeln('Параметры задают вторую прямую')
    else
        writeln('Параметры не задают вторую прямую');
    if (R>0) and (k1>0) and (k2<0) then
    begin
        writeln('Область пересечения: ');
        x1:=(b2-b1)/(k1-k2);
        y1:=(k1*x1+b1);
        if (sqr(x1-x0)+sqr(y1-y0))<sqr(R) then
            writeln('Графики образуют область пересечения');
            begin
                writeln('Введите координаты произвольной точки: ');
                write('Введите x: ');
                read(x);
                write('Введите y: ');
                read(y);
                a:=k1*x+b1;
                b:=k2*x+b2;
                c:=sqr(x-x0)+sqr(y-y0);
                if (((y<a) and (y>b)) or ((y>a) and (y<b))) and (c<sqr(R)) then
                    writeln('Точка (x,y) входит в область пересечения')
                else if (((y<a) and (y>b)) or ((y>a) and (y<b))) and (c=sqr(R)) or ((y=a) or (y=b)) and (c<sqr(R)) and not(x1=x) and not(y1=y) then
                    writeln('Точка (x,y) находится на границе области пересечения')
                else if ((y=a) or (y=b)) and (c=sqr(R)) or (x1=x) and (y1=y) then
                    writeln('Точка (x,y) находится в точке пересечения графиков')
                else
                    writeln('Точка (x,y) не входит в область пересечения')
            end
        else
            writeln('Графики не образуют область пересечения');
        writeln('Ошибка')
    end
    else
        writeln('Ошибка')
end.

смотрим 38 строку

        if (sqr(x1-x0)+sqr(y1-y0))<sqr(R) then
            writeln('Графики образуют область пересечения');
            begin

дальше идет код внутри begin, затем на 61 строке

        end
    else

Если выкинуть всю лишнюю начинку, то получается

        if (sqr(x1-x0)+sqr(y1-y0))<sqr(R) then
            writeln('Графики образуют область пересечения');
            begin
            end
        else

Такой вопрос - а так можно писать? т.е. в несколько строчек условие без блока begin/end, т.е. без:

        if (sqr(x1-x0)+sqr(y1-y0))<sqr(R) then
        begin
            writeln('Графики образуют область пересечения');
            begin
            end
        end
        else

Скорее всего Pascal вообще воспринимает код так:

        if (sqr(x1-x0)+sqr(y1-y0))<sqr(R) then
            writeln('Графики образуют область пересечения');
        begin
        end
        else

и тогда else вообще непонятно откуда для него берется

→ Ссылка