Другие языки программирования и технологии

Помогите с паскалем пж,

что не так сделал, что пишет Nan??? как исправить?!
NaN - типа ошибка, нет решений. А почему пишет - так в программе вычисляется в том числе и квадратный корень. А корень из отрицательного числа (<0) не берется (не извлекается). Вы, мой друг, ввели -11 как h, соответственно √h=√-11, что, понятное дело, невозможно (как и деление на 0). И Вам еще повезло, что программа выдает такой результат - ибо зачастую при таком раскладе программы вылетают с ошибкой. Чтобы этого не было надо это предусмотреть. Да и вообще у Вас программа не оптимизирована - во-первых, как я (и не только я) писАл выше, не предусмотрена защита от ввода отрицательного значения h, а во-вторых, зачем лишняя переменная r, когда без нее можно спокойно обойтись. Но нет же, Вы решили лишних 6 байт (а именно столько занимает лишняя переменная такого типа) занять... Понятное дело, что сейчас 6 байт - ни о чем, но в более сложных программах, где полно переменных надо будет использовать, то там уже и до мегабайтов недалеко...

Вот исправление:
 Program P1; 
uses crt;
var g, h: real;
begin
clrscr;
writeln ('Введите с клавиатуры значения переменных g и h (только числа). После ввода значения каждой из переменных нажимайте клавишу Enter. При вводе дробных значений целую часть от дробной отделяйте точкой, а не запятой.');
write ('Введите значение переменной g: g=');
readln (g);
write ('Введите значение переменной h: h=');
readln (h);
if h
Сергей Перятинский
Сергей Перятинский
43 559
Лучший ответ
корень из -11 не может быть, вот и NAN
Юрий Максимов
Юрий Максимов
97 871
NaN (нечисло) — это числовой тип данных, значение которого является неопределенным или непредставимым. Это может произойти, когда ты пытаешься вычислить корень из отрицательного числа или делить на ноль.

В твоем коде возможно две причины для NaN:
  • Если x = 0, то ты будешь делить на ноль в строке 10: y:= a + b / x;
  • Если y < 0, то ты будешь извлекать корень из отрицательного числа в строке 11: y:=sqrt( y);
Чтобы избежать этого, тебе нужно проверять эти условия и выводить соответствующее сообщение об ошибке. Например:
 program test;  
var g,h,r:real;
begin
write('Введите значение h');
read(h);
write('Введите значение g');
read(g);
r:=23*h-sqr(g)*sqr(g)+sqrt(h)/6-g*h;
if r r then // проверяем, является ли r NaN
writeln('Некорректный ввод! Результат не определен!')
else
write('ответ: ',r);
end.
Виктор Носачев program test;
var g,h,r:real;
begin
write('Введите значение h');
read(h);
write('Введите значение g');
read(g);
r:=23*h-sqr(g)*sqr(g)+sqrt(h)/6-g*h;
write('ответ: ',r);
end.