Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2010, 15:21   #1
art_d
Пользователь
 
Регистрация: 30.09.2010
Сообщений: 22
По умолчанию Точность вводимого числа

Задача: вести длинны диагоналей ромба, его площадь, периметр и точность вводимых значений (сколько знаков после запятой), затем сравнить периметр и площадь ту что ввел юзер и ту, что вычислила программа, если числа разные просить ввести данные еще раз.
Когда ввожу точность отличную от нуля (не ноль) и при этом площади равны, то всеравно просит ввести еще раз (равенство не выполняется), что не так делаю?
И вообще, стиль написание нормальный?

Код:
program the_second;

var

d1, d2, p, s, z, x, l, S1: real;

BEGIN

repeat

Write('введите точность ');
readln(z);
 while (z<0) do
   begin
   write('Только положительное число, введите еще раз');
   readln(z);
   end;
   
Write('Введите длинну диагонали д1=');
readln(d1);
while (d1<=0) do
   begin
   write('Число должно быть положительное, введите еще раз');
   readln(d1);
   end;
x:=exp(ln(10)*z);
d1:=(d1*x);
d1:=Int(d1);
x:=exp(ln(10)*z);
d1:=(d1/x);

write('D2=');
readln(d2);
while (d2<=0) do
   begin
   write('Число должно быть положительное, введите еще раз');
   readln(d2);
   end;
x:=exp(ln(10)*z);
d2:=(d2*x);
d2:=Int(d2);
x:=exp(ln(10)*z);
d2:=(d2/x);

write('введите периметр и площадь П=');
read(p);
while (p<=0) do
   begin
   write('Число должно быть положительное, введите еще раз');
   readln(p);
   end;
x:=exp(ln(10)*z);
p:=(p*x);
p:=Int(p);
x:=exp(ln(10)*z);
p:=(p/x);

write('S=');
read(s);
while (s<=0) do
   begin
   write('Число должно быть положительное, введите еще раз');
   readln(s);
   end;
x:=exp(ln(10)*z);
s:=(s*x);
s:=Int(s);
x:=exp(ln(10)*z);
s:=(s/x);

S1:=(d1*d2/2);
readln;
if (s1<>s) then writeln('ошибка, введите число еще раз');
until (s1=s);

writeln('good work!')

end.
art_d вне форума Ответить с цитированием
Старый 30.09.2010, 20:03   #2
Silentdi
Пользователь
 
Регистрация: 17.09.2010
Сообщений: 14
По умолчанию

Переменные типа реал так не сравнить нужно сначала воспользоваться функцией Round
Вместо последних строк
if (s1<>s) then writeln('ошибка, введите число еще раз');
until (s1=s);

Нужно

if (Round(s1)<>Round(s)) then writeln('ошибка, введите число еще раз');
until (Round(s1)=Round(s));
Silentdi вне форума Ответить с цитированием
Старый 30.09.2010, 20:41   #3
art_d
Пользователь
 
Регистрация: 30.09.2010
Сообщений: 22
По умолчанию

Спасибо, не знал об этом.
Обьясните, по какой причине нельзя сравнивать.
art_d вне форума Ответить с цитированием
Старый 30.09.2010, 20:56   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

2Silentdi
Абалдеть
то есть по вашему 4.5 =4.7


2art_d
Код:
if abs(s1-s)>(z+0.00000001) then writeln('ошибка, введите число еще раз');
until abs(s1-s)<=(z+0.00000001);
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 30.09.2010, 23:01   #5
art_d
Пользователь
 
Регистрация: 30.09.2010
Сообщений: 22
По умолчанию

if abs(s1-s)>(z+0.00000001) then writeln('ошибка, введите число еще раз');
until abs(s1-s)<=(z+0.00000001);

s1-s разве не должен ровняться нулю?

и обьясните, почему нельзя сравнить как я хотел
art_d вне форума Ответить с цитированием
Старый 30.09.2010, 23:44   #6
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Там есть прикол:
Код:
sum := 0.0; 
for i := 1 to 10 do
 sum := sum + 0.1;
Результат может не равняться единице. Особенности вычислений чисел с плавающей точкой.
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Точность обработки БД в С++ Maks7482 Общие вопросы C/C++ 3 23.08.2010 13:34
Точность типа float HunterMan Общие вопросы C/C++ 6 07.02.2009 23:05
Вставка вводимого текста в код программы var Помощь студентам 10 18.02.2008 15:10
Проверка – является ли раскладка клавиатуры правильной для вводимого текста Xandr Общие вопросы Delphi 7 02.11.2007 09:25
Точность Sour Помощь студентам 2 31.05.2007 21:08