Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 02.06.2013, 19:36   #1
JlyHb92=)
AnyKey`щик
 
Регистрация: 02.06.2013
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ошибка при программировании на Free pascal

Здравствуйте)
Написал код универсального калькулятора на Free pascal,
но он выдаёт ошибку при компелировании, даже указывает строку в которой ошибка, но я там ошибки не нашёл
Если я не правильно задал вопрос, то извините, первый раз на этом форуме.
Ошибка:
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.
(Offline)
 
Ответить с цитированием
Старый 02.06.2013, 21:33   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Ошибка при программировании на Free pascal

Твое условие закончилось на предыдущем Begin End которые с точкой с запятой на конце, следующий Begin End без условия
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 02.06.2013, 23:59   #3
JlyHb92=)
AnyKey`щик
 
Регистрация: 02.06.2013
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Ошибка при программировании на Free pascal

Я вас понял, большое спасибо за подсказку. сейчас перекомпелирую!)
(Offline)
 
Ответить с цитированием
Старый 03.06.2013, 00:06   #4
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Ошибка при программировании на Free pascal

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

Рекомендация - правильнее всего вдумчиво переписать сначала, если лень - убрать function power(x,y:real):real; и идти вниз по коду, вставляя отступы в соответствии с вложением условий. В ходе этого должна стать понятной структура условий, и будет видно, что где лишнее.
(Offline)
 
Ответить с цитированием
Старый 03.06.2013, 00:20   #5
JlyHb92=)
AnyKey`щик
 
Регистрация: 02.06.2013
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Ошибка при программировании на Free pascal

Да я 2 дня этот код пишу, алгоритмы долго продумывал..
Завтра заново перепишу.
(Offline)
 
Ответить с цитированием
Старый 03.06.2013, 02:16   #6
JlyHb92=)
AnyKey`щик
 
Регистрация: 02.06.2013
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Ошибка при программировании на 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.
(Offline)
 
Ответить с цитированием
Старый 03.06.2013, 04:11   #7
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Ошибка при программировании на Free pascal

Сообщение от JlyHb92=) Посмотреть сообщение
Правда, пришлось искать другой алгоритм возведения в степень)
А старый чем не устроил? Если мне не изменяет память, он-то как раз правильный.
По сути, воткнуть
	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;
и должно работать (естественно, имена переменных привести в соответствие).
(Offline)
 
Ответить с цитированием
Старый 03.06.2013, 13:25   #8
JlyHb92=)
AnyKey`щик
 
Регистрация: 02.06.2013
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Ошибка при программировании на 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.
(Offline)
 
Ответить с цитированием
Старый 03.06.2013, 13:48   #9
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Ошибка при программировании на Free pascal

в паскале не шарю но твой алгоритм не отработает дробную часть показателя
__________________
(Offline)
 
Ответить с цитированием
Старый 03.06.2013, 15:40   #10
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Ошибка при программировании на 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);
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com