Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Нельзя преобразовать тип Tuple<integer,integer> к real Скажите пожалуйста какая ошибка была допущена в процессе.

Йоланди Ученик (167), закрыт 1 год назад
Кажется ошибка в неправильной расстановке скобок, но не как не могу понять где именно.
Действия происходят в Pascal.
Лучший ответ
Андрей Высший разум (466148) 1 год назад
Разделитель целой и дробной части числа - ТОЧКА, а не запятая. Минимум, в 3 местах ошибка.
Остальные ответы
Иессив Оракул (59173) 1 год назад
...
Дмитрий ШишкинГений (68342) 1 год назад
В классическом Turbo Pascal не покатит. - Классика не знает, что такое cls. Там сие - clrscr.
Иессив Оракул (59173) Дмитрий Шишкин, это простой учебный интерпретатор ...
Дмитрий Шишкин Гений (68342) 1 год назад
Так всё верно. Умножение на десятичную дробь (как вообще на дробь) - это - деление. А деление не может быть (результат классического деления) целым числом в Паскале. Т.е. целочисленного типа. У Вас там b типа integer (т.е. целочисленная), а что с ней Вы делаете? - Правильно - умножаете его на дробь (b*3.9) - будет не целое число. Так что b тоже должна быть типа real. - что Вам Паскаль верно пишет. Далее у Вас дроби неправильно написаны - в десятичных дробях целая часть от дробной (по крайней мере, в Паскале) отделяется точкой, а не запятой. Т.е. не 3,9, а 3.9. В самой программе ещё 1 ошибка - не объявлена переменная x.

И вообще Вы как-то криво выполняете задание: в задании сказано лишь записать выражения, а не составить программу. Т.е. достаточно просто было написать, что c:=(a/(54*b)...).
Дмитрий ШишкинГений (68342) 1 год назад
Да и вообще переменную c можно было не объявлять. К переменной a тоже вопрос - какой смысл делать её типа integer, когда человек (чисто теоретически может дробь ввести)? - Т.е. тогда программа вылетит с ошибкой, а если её сделать типа real, то и в таком случае вычисления пройдут, и лишних строк не надо будет писать. Странно, что не используете модуль crt (не подключаете) - тогда предыдущие результаты (вычисления) не будут сбивать с толку.

Вот исправление (чисто Вашего кода, как есть, без моего чистого кода):
 Var a: integer; 
b, c: real;
Begin
Writeln('Решаем пример');
Writeln('(a/(54*b)+4.89)/(-7.86-sqrt(1024)+sqr(a)/(b*3.9))');
Writeln('введите переменные a, b');
readln(a,b);
c:= (a/(54*b)+4.89)/(-7.86-sqrt(1024)+sqr(a)/(b*3.9));
Writeln('Ответ:', c :3 :3);
end.
Дмитрий ШишкинГений (68342) 1 год назад
А вот как можно было сделать программу:
 Program P1;
uses crt;
var a, b: real;
begin
clrscr;
writeln ('Решаем пример');
writeln ('(a/(54*b)+4.89)/(-7.86-sqrt(1024)+sqr(a)/(b*3.9))');
writeln ('Введите с клавиатуры значения переменных a и b (только числа). После ввода значения каждой переменной нажимайте клавишу Enter. При вводе дробных значений целую часть от дробной отделяйте точкой, а не запятой.');
write ('a=');
readln (a);
write ('b=');
readln (b);
if b=0 then writeln ('Ошибка: происходит деление на 0.') else writeln ('Ответ: c=', (a/(54*b)+4.89)/(-7.86-sqrt(1024)+sqr(a)/(b*3.9)):1:3);
write ('Программа завершена. Для выхода нажмите клавишу Enter.');
readkey;
end.
Дмитрий ШишкинГений (68342) 1 год назад
А вообще вот такого ответа было бы достаточно в задании (если, конечно, учитель/преподаватель не сказал(а) иначе): c:= (a/(54*b)+4.89)/(-7.86-sqrt(1024)+sqr(a)/(b*3.9));
Похожие вопросы