IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите довести программу до совершенства, Программа для вычисления значений
сообщение
Сообщение #1


Гость






Привет!
Мне нужно довести мою прогу до ума. По идее после ввода чисел в переменные должно происходить вычисление по формуле но иногда прога отваливатся изза ошибок. Вот я и не могу понять почему и можно ли сделать так чтобы при ошибке прога перезапускалась. Мне кажется все дело в генераторе. Возможно с значениями которые он генерирует не всегда возможно вычисление. Кроме того есть проблемы с выводом. Какие параметры вывода лучше поставить? Имеется ввиду чтоб выглядело приемлемо а то 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.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






К сожалению я не знаю как это сделать sad.gif

А что насчет вывода на экран например целое число выводится как 1.00
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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


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 - для того, чтобы запрашивать данные, пока программа не завершится без ошибок...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Цитата
Имеется ввиду чтоб выглядело приемлемо а то 3.00 при отображении целого числа както дико.

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

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 7:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name