Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите довести программу до совершенства
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Борец с Паскалем
Привет!
Мне нужно довести мою прогу до ума. По идее после ввода чисел в переменные должно происходить вычисление по формуле но иногда прога отваливатся изза ошибок. Вот я и не могу понять почему и можно ли сделать так чтобы при ошибке прога перезапускалась. Мне кажется все дело в генераторе. Возможно с значениями которые он генерирует не всегда возможно вычисление. Кроме того есть проблемы с выводом. Какие параметры вывода лучше поставить? Имеется ввиду чтоб выглядело приемлемо а то 3.00 при отображении целого числа както дико.


uses Crt;
var x,y,z,q,h,e:real;
begin
Writeln('Для выполнения программы необходимы 3 произвольных числа для переменных X,Y,Z');
Writeln('Нажмите 1 для ввода данных, нажмите 2 для генерации произвольных чисел.'); //как зделать так чтобы после выбора не нужно блыо нажимать ентерб чтоб сразу по нажатию на клавишу шло по сценарию
read(q);
Clrscr;
if q=1 then
begin
writeln('Введите X');
readln(x);
Clrscr;
writeln('Введите Y');
readln(y);
Clrscr;
writeln('Введите Z');
readln(z);
Clrscr;
Writeln('Установлено:');
Writeln(' X=',x:8:3);
Write(' Y=',y:8:3);
Write(' Z=',z:8:3);
End
else
begin
randomize;
x:= random (20);
y:=random(20);
z:=random(20);
Clrscr;
Write('Установлено:');
Write(' X=',x:8:3);
Write(' Y=',y:8:3);
Writeln(' Z=',z:8:3);
end;
Writeln('Вычисляю значение');
e:=exp(3*ln(cos(x)-sin(y)))/sqrt(sin(x)/cos(x))+exp(2*ln(ln(x+y+z))); //правильно ли описан тут корень из tg(x) - >sqrt(sin(x)/cos(x))
Writeln('');
Writeln('Ответ: ',e:8:3);
Writeln('');
h:=0;
if(x>-1)and(x<15) then h:=(5*x)-(3*y);
if(x>15) then h:=x+2*abs(y);
if(x=15) or (x<=-1) then h:=y*2;
Writeln('Значение h:=',h:8:3);
readln;
End.

мисс_граффити
Естественно, у функции есть область определения. например, ln(отрицательного числа) нельзя посчитать... или деление на 0 может возникать.
Можешь проверять это предварительно и ругаться на пользователя осмысленно.
Борец с Паскалем
К сожалению я не знаю как это сделать sad.gif

А что насчет вывода на экран например целое число выводится как 1.00
volvo
Цитата
как зделать так чтобы после выбора не нужно блыо нажимать ентерб чтоб сразу по нажатию на клавишу шло по сценарию


Writeln('Нажмите 1 для ввода данных, нажмите 2 для генерации произвольных чисел.');
q := Ord(ReadKey) - Ord('0');

{ ... далее - по тексту }



P.S. Только q надо описать не как Real, а как Integer...

Добавлено через 12 мин.
Цитата
К сожалению я не знаю как это сделать

Смотреть, какие ошибки могут возникать при вычислении выражения, и предотвращать:

...
Repeat { <--- добавить это в начале }

Writeln('Для выполнения программы необходимы 3 произвольных числа для переменных X,Y,Z');

... { Здесь - ввод данных }

error := false;
if (cos(x) - sin(x)) <= 0 then begin
Writeln('Некорректный параметр для Ln'); error := true;
end
else
if cos(x) < 0.0001 then begin { не надо сравнивать с 0 вещественное число }
WriteLn('Деление на 0'); error := true;
end
else { вроде больше ошибок быть не должно, вычисляем... }
e:=exp(3*ln(cos(x)-sin(y)))/sqrt(sin(x)/cos(x))+exp(2*ln(ln(x+y+z)));

Until not error;

Writeln('');
Writeln('Ответ: ',e:8:3);
Writeln('');
...


Ну, а Repeat/Until - для того, чтобы запрашивать данные, пока программа не завершится без ошибок...
Айра
Цитата
Имеется ввиду чтоб выглядело приемлемо а то 3.00 при отображении целого числа както дико.

Ну раз число целое, то сразу опиши его как integer и выводи так:

var x,y,z,h: integer;
...
if(x=15) or (x<=-1) then h:=y*2; //(h ведь тоже получается целым))
('Значение h:=',h);
...

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.