В чем ошибка кода?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

В чем ошибка кода?

Сообщение Антон » 04.01.2012 21:48:44

Начал изучать паскаль и столкнулся с рядом непонятных вещей:
1)Задача на площадь треугольника по формуле Герона, написал код:
var
a,b,c,p,s:integer;
begin
readln(a,b,c);
p:=((a+b+c) div 2)+((a+b+c) mod 2);
s:=sqrt(p*(p-a)*(p-b)*(p-c));
writeln(s);
readln;
end.

Скажите пожалуйста почему не работает?
2)почему когда я использую деление или корень вместо нормального ответа получается что-то типа 5.0000000000E+0000&?
помогите пожалуйста)
Антон
незнакомец
 
Сообщения: 1
Зарегистрирован: 04.01.2012 21:41:02

Re: В чем ошибка кода?

Сообщение Little_Roo » 04.01.2012 22:28:37

Антон писал(а):p:=((a+b+c) div 2)+((a+b+c) mod 2);

?????????
Входные данные должны быть real
полупериметр = (a+b+c)/2

Далее - вычисление корня из целого числа всегда даст результат типа real - так что var a,b,c,p,s : real;
А по последнему вопросу - учите матчасть и используйте форматный вывод - типа write(s:2:3);
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: В чем ошибка кода?

Сообщение tema » 05.01.2012 01:44:59

Антон писал(а):p:=((a+b+c) div 2)+((a+b+c) mod 2);

Вот это реально круто! Никогда бы не догадался, что это полупериметр!
Антон писал(а):В чем ошибка кода?

Боюсь, в данном случае, в прокладке между монитором и сиденьем.
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Re: В чем ошибка кода?

Сообщение Vadim » 05.01.2012 07:41:47

Антон писал(а):2)почему когда я использую деление или корень вместо нормального ответа получается что-то типа 5.0000000000E+0000&?
помогите пожалуйста)

По умолчанию, В Паскале все числа с плавающей точкой выводятся в виде именно с плавающей точкой, т.е., к примеру:
Код: Выделить всё
1.2345E-2

т.к. компилятор оперирует именно такими числами. Ещё надо сказать ему спасибо, за то, что он не выводит их в двоичном виде. :D
Как сказали выше, надо использовать явное задание формата:
WriteLn(Число:ОбщийРазмер:ЦифрПослеЗапятой);
где
ОбщийРазмер - это, сколько знакомест на экране будет занимать выводимый результат,
ЦифрПослеЗапятой - сколько знакомест будут занимать цифры из дробной части.
Учтите, что Общий размер должен быть, как минимум, на 2 больше дробной части, т.к. одно знакоместо занимает точка, плюс сколько то там нужно выделить на целую часть.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: В чем ошибка кода?

Сообщение Little_Roo » 05.01.2012 17:07:11

Vadim писал(а):Учтите, что Общий размер должен быть, как минимум, на 2 больше дробной части, т.к. одно знакоместо занимает точка, плюс сколько то там нужно выделить на целую часть.

Вообще-то проходит и write(x:0:2) :) - по опыту знаю - первое число, т.е. общий размер как резина - не влезает число -> растянем
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: В чем ошибка кода?

Сообщение Vadim » 05.01.2012 19:37:47

Little_Roo писал(а):Вообще-то проходит и write(x:0:2) :) - по опыту знаю - первое число, т.е. общий размер как резина - не влезает число -> растянем

Лучше знать точно, чем предполагать и надеятся. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru