forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Ошибка при программировании на Free pascal (http://forum.boolean.name/showthread.php?t=18231)

JlyHb92=) 02.06.2013 19:36

Ошибка при программировании на Free pascal
 
Здравствуйте)
Написал код универсального калькулятора на Free pascal,
но он выдаёт ошибку при компелировании, даже указывает строку в которой ошибка, но я там ошибки не нашёл :dontknow:
Если я не правильно задал вопрос, то извините, первый раз на этом форуме.
Ошибка:
new 1.pas(64,3) Fatal: Syntax error, ";" expected but "ELSE" found
new 1.pas(0) Fatal: Compilation aborted

Помогите исправить код)
Код:

program Calkulytor;
Uses crt;
var a,b,d,x1,x2,k1,k2,k3:real; i:integer;
function power(x,y:real):real;
begin
repeat
begin
textbackground(7);
clrscr;
textcolor(1);
gotoxy (21,1);
writeln ('Выберете действие:');
writeln ('1.Сложение.');
writeln ('2.Вычитание.');
writeln ('3.Деление.');
writeln ('4.Умножение.');
writeln ('5.Вычисление кв.корня.');
writeln ('6.Возведение в степень.');
writeln ('7.Решение кв.уравнения.');
writeln ('8.Выход.');
readln (i);
 if (i=1) then
begin
 writeln ('Введите слагаемые:');
 readln (a,b);
 writeln ('Сумма = ',a + b);
 end
 else if (i=2) then
 begin
 writeln ('Введите уменьшаемое и вычитаемой:');
 readln (a,b);
 writeln ('Разность = ',a - b);
 end
 else if (i=3) then
 begin
 writeln ('Введите делимое и делитель:');
 readln (a,b);
 writeln ('Частное = ',a / b);
 end
 else if (i=4) then
 begin
 writeln ('Введите множители:');
 readln (a,b);
 writeln ('Произведение = ',a * b);
 end
 else if (i=5) then
 begin
 writeln ('Введите подкоренное число:');
 readln (a);
 writeln ('Ответ = ',sqrt(a))
 end
 else if (i=6) then
  begin
  if x=0 then Power:=0
  else if x>0 then Power:=exp(ln(x)*y)
  else Power:=-exp(ln(abs(x))*y);
  end;
  begin
  writeln ('Введите основание и показатель степени:');
  readln (x,y);
  writeln ('x^y',Power(x,y):0:3)
  end

  else if (i=7) then // В этой строке ошибка.

  begin
  writeln ('Введите коэффициенты:');
  readln (k1,k2,k3);

  d:= k2 * k2 - 4 * k1 * k3; //Вычисление дискриминанта

  if (d<0) then writeln ('Нет решения.')
  else if (d=0) then
    begin
      x1:= - k2 / (2 * k1);
      writeln ('X = ',x1:8:3);
    end
  else begin
      x1:= (- k2 + sqrt (d)) / (2 * k1);
      x2:= (- k2 - sqrt (d)) / (2 * k1);
      writeln ('X1 = ',x1:8:3,'X2 = ',x2:8:3);
  end;
  end
 else if (i=8) then i:=0
 else i:=0
writeln ('Нажмите "ENTER" для продолжения.');
readln;
end;

until i=0
textcolor(2);
writeln ('До свидания =) Автор Игорь (Лунь)');
writeln ('Версия 1.0');
writeln ('Press ENTER to exit');
readln;
end.


pax 02.06.2013 21:33

Ответ: Ошибка при программировании на Free pascal
 
Твое условие закончилось на предыдущем Begin End которые с точкой с запятой на конце, следующий Begin End без условия

JlyHb92=) 02.06.2013 23:59

Ответ: Ошибка при программировании на Free pascal
 
Я вас понял, большое спасибо за подсказку. сейчас перекомпелирую!)

ViNT 03.06.2013 00:06

Ответ: Ошибка при программировании на Free pascal
 
Я структуру условий не разбирал, но видно явное несоответствие - текст начинается с описания функции power, потом идет, судя по всему, цикл главного меню, потом посреди текста идет тело той самой функции power.
Плюс еще, после первого repeat'a стоит begin, который там не нужен, так что похоже, что туда вставлен какой-то левый кусок кода.

Рекомендация - правильнее всего вдумчиво переписать сначала, если лень - убрать function power(x,y:real):real; и идти вниз по коду, вставляя отступы в соответствии с вложением условий. В ходе этого должна стать понятной структура условий, и будет видно, что где лишнее.

JlyHb92=) 03.06.2013 00:20

Ответ: Ошибка при программировании на Free pascal
 
Да я 2 дня этот код пишу, алгоритмы долго продумывал..
Завтра заново перепишу.

JlyHb92=) 03.06.2013 02:16

Ответ: Ошибка при программировании на Free pascal
 
Всё, я исправил код и успешно скомпилировал программу!
Спасибо всем за советы, сделал как сказали, начал всё заново)
Правда, пришлось искать другой алгоритм возведения в степень)

Код:

program Calkulytor;
Uses crt; //Модули
var a,b,d,x1,x2,k1,k2,k3:real; i:integer; num,deg:real; res:real; o:byte;  //Переменные
begin

 textbackground(7);  //Оформление
 clrscr;
 textcolor(1);
 
  repeat  //Начало цикла
 
  clrscr;  //Отчистить экран
  gotoxy (27,2);  //Передвинуть коретку
 
      writeln ('Выберете действие:');  //Команды меню
     
    gotoxy (3,4);
      writeln ('1.Сложение.');
    gotoxy (3,5);
      writeln ('2.Вычитание.');
    gotoxy (3,6);
      writeln ('3.Деление.');
    gotoxy (3,7);
      writeln ('4.Умножение.');
    gotoxy (3,8);
      writeln ('5.Вычисление кв.корня.');
    gotoxy (3,9);
      writeln ('6.Возведение в степень.');
    gotoxy (3,10);
      writeln ('7.Решение кв.уравнения.');
    gotoxy (3,11);
      writeln ('8.Выход.');
    gotoxy (3,13);
      readln (i);  //Ввод значения "i"
     
    if (i=1) then
   
      begin
        writeln ('Введите слагаемые:');
        readln (a,b);
        writeln ('Сумма = ',a + b);
      end;
     
    if (i=2) then
   
      begin
        writeln ('Введите уменьшамое и вычитаемой:');
        readln (a,b);
        writeln ('Разность = ',a - b);
      end;
     
    if (i=3) then
   
      begin
        writeln ('Введите делимое и делитель:');
        readln (a,b);
        writeln ('Частное = ',a / b);
      end;
     
    if (i=4) then
     
      begin
        writeln ('Введите множители:');
        readln (a,b);
        writeln ('Произведение = ',a * b);
      end;
     
    if (i=5) then
     
      begin
        writeln ('Введите подкоренное число:');
        readln (a);
        writeln ('Ответ = ',sqrt(a))
      end;
     
    if (i=6) then
 
      begin
   
      writeln ('Введите основание и показатель степени:');
      readln (num,deg);
   
      res := 1;
 
      o := 0;
      while o < abs(deg) do begin
        res := res * num;
        o := o + 1
      end;
 
    if deg < 0 then
        res := 1 / res;
 
        writeln (res:0:5);
 
      end;
     
    if (i=7) then
   
      begin
        writeln ('Введите коэффициенты:');
        readln (k1,k2,k3);
       
        d:= k2 * k2 - 4 * k1 * k3;  //Вычисление дискриминанта

        if (d<0) then writeln ('Нет решения.');
        if (d=0) then
       
      begin
        x1:= - k2 / (2 * k1);
        writeln ('X = ',x1:8:3);
      end;
        if (d>0) then
      begin
        x1:= (- k2 + sqrt (d)) / (2 * k1);
        x2:= (- k2 - sqrt (d)) / (2 * k1);
        writeln ('X1 =', x1:0:5,' X2 =',x2:0:5);
      end;
      end;
       
    if ((i<1)or(i>7)) then i:=0;
    if (i<8) then
   
      begin
      writeln ('Нажмите "ENTER" для продолжения.');
      readln;
      end;
   
  until i=0;
 
textcolor(2);
writeln ('До свидания =) Автор Игорь (Лунь)');
writeln ('Версия 1.0, 03.06.2013');
writeln ('Press ENTER to exit');
readln;

end.


ViNT 03.06.2013 04:11

Ответ: Ошибка при программировании на Free pascal
 
Цитата:

Сообщение от JlyHb92=) (Сообщение 260578)
Правда, пришлось искать другой алгоритм возведения в степень)

А старый чем не устроил? Если мне не изменяет память, он-то как раз правильный.
По сути, воткнуть
Код:

        if x=0 then Power:=0
          else if x>0 then
                Power:=exp(ln(x)*y)
          else
                Power:=-exp(ln(abs(x))*y);

вместо

Код:

      res := 1;
 
      o := 0;
      while o < abs(deg) do begin
        res := res * num;
        o := o + 1
      end;
 
    if deg < 0 then
        res := 1 / res;

и должно работать (естественно, имена переменных привести в соответствие).

JlyHb92=) 03.06.2013 13:25

Ответ: Ошибка при программировании на Free pascal
 
Вот старый алгоритм
Код:

uses crt;
function Power(x,y:real):real;
begin
if x=0 then Power:=0
else if x>0 then Power:=exp(ln(x)*y)
else Power:=-exp(ln(abs(x))*y);
end;
var x,y:real;
begin
clrscr;
write('x=');readln(x);
write('y=');readln(y);
write('x^y=',Power(x,y):0:3);
readln
end.

Он не хотел работать вместе с моей программой из-за объявленной функции.
Вот новый:
Код:

var
    num, deg: real; res: real; i: byte;
 
begin
   
    writeln ('Введите основание и показатель степени:');
    readln (num,deg);
   
    res := 1;
 
    i := 0;
    while i < abs(deg) do begin
        res := res * num;
        i := i + 1
    end;
 
    if deg < 0 then
        res := 1 / res;
 
    writeln (res:0:5);
 
end.


h1dd3n 03.06.2013 13:48

Ответ: Ошибка при программировании на Free pascal
 
в паскале не шарю но твой алгоритм не отработает дробную часть показателя

ViNT 03.06.2013 15:40

Ответ: Ошибка при программировании на Free pascal
 
А что мешает вставить в виде функции?
У Вас структура такая:
Код:

program...
//модули
//переменные
begin
//код
end.

а с функцией будет так:
Код:

program...
//модули
//переменные
//ФУНКЦИЯ
function Power(x,y:real):real;
begin
  if x=0 then
    Power:=0
  else if x>0 then
    Power:=exp(ln(x)*y)
  else
    Power:=-exp(ln(abs(x))*y);
end;

begin
//код
end.

Ну и вместо
Код:

    res := 1;
 
    i := 0;
    while i < abs(deg) do begin
        res := res * num;
        i := i + 1
    end;
 
    if deg < 0 then
        res := 1 / res;
 
    writeln (res:0:5);

использовать

Код:

writeln(Power(num,deg):0:5);


Часовой пояс GMT +4, время: 15:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot