|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
02.06.2013, 19:36
|
#1
|
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
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Ошибка при программировании на Free pascal
Твое условие закончилось на предыдущем Begin End которые с точкой с запятой на конце, следующий Begin End без условия
|
(Offline)
|
|
02.06.2013, 23:59
|
#3
|
AnyKey`щик
Регистрация: 02.06.2013
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Ошибка при программировании на Free pascal
Я вас понял, большое спасибо за подсказку. сейчас перекомпелирую!)
|
(Offline)
|
|
03.06.2013, 00:06
|
#4
|
Модератор
Регистрация: 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
|
AnyKey`щик
Регистрация: 02.06.2013
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Ошибка при программировании на Free pascal
Да я 2 дня этот код пишу, алгоритмы долго продумывал..
Завтра заново перепишу.
|
(Offline)
|
|
03.06.2013, 02:16
|
#6
|
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
|
Модератор
Регистрация: 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
|
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
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Ошибка при программировании на Free pascal
в паскале не шарю но твой алгоритм не отработает дробную часть показателя
__________________
|
(Offline)
|
|
03.06.2013, 15:40
|
#10
|
Модератор
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:00.
|