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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 04.10.2011, 19:24   #1
Mr.KOHCEPBATOP
 
Регистрация: 02.10.2011
Сообщений: 7
По умолчанию Циклы

1. Найти все трицифрови числа, равные сумме кубов своих цифр.
2. Найти Z = (h +3) (h +2.8) (h +2.6) (h +2.4 ).....( h +1).
Mr.KOHCEPBATOP вне форума
Старый 04.10.2011, 19:42   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

задача 1
Код:
program Project1;
var i, a1,a2,a3 : integer;
begin
 for i:=100 to 999 do
 begin
   a1:= i div 100;
   a2:= (i-a1*100) div 10;
   a3:= i mod 10;
   if a1*a1*a1+a2*a2*a2+a3*a3*a3=i then
   writeln(i);
 end;
end.
задача 2
Код:
program Project2;
var Z,h,v : double;
begin
 writeln('введите h '); read (h);
 v:=3;  
 Z:=1;
 while v>=1 do
 begin
   z:=z*(h+v);
   v:=v-0.2;
 end;
 writeln('Z= ',z:6:2);
end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума
Старый 06.10.2011, 00:44   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

JUDAS, посмотри-ка сюда..
Вот протокол работы твоего кода (задача 2) с вставленной печатью параметра v перед вычислением произведения:
Код:
Running "d:\...\111005_JUDAS.exe "
введите h
1
 3.00000000000000E+000
 2.80000000000000E+000
 2.60000000000000E+000
 2.40000000000000E+000
 2.20000000000000E+000
 2.00000000000000E+000
 1.80000000000000E+000
 1.60000000000000E+000
 1.40000000000000E+000
 1.20000000000000E+000
Z= 68653.32
Замечаешь ошибку? Значения 1.0 в списке нет, до него не дошло.
Никогда нельзя сравнивать действительные переменные ТОЧНО. Обязательно нужно учитывать ошибки вычислений. Я недавно уже писал тут по этому поводу, поищи.

В данном случае (вычисления с шагом по действительной пременной) я рекомендую в условии окончания использовать конечное значение плюс половина шага:
Код:
 while v>0.9 do
Число 0.9 получилось так: 1 - 0.2/2
Успехов ).
Предпочитаю на "ты".
TinMan вне форума
Старый 06.10.2011, 01:28   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Замечаешь ошибку? Значения 1.0 в списке нет, до него не дошло.
Никогда нельзя сравнивать действительные переменные ТОЧНО. Обязательно нужно учитывать ошибки вычислений. Я недавно уже писал тут по этому поводу, поищи.

В данном случае (вычисления с шагом по действительной пременной) я рекомендую в условии окончания использовать конечное значение плюс половина шага:
Причиной тому является то, что все числа в компьютере представляются в двоичной системе счисления (что общеизвестно). А при работе с дробными числами в двоичной системе счисления иногда может возникнуть ситуация, что результат будет нельзя будет записать полностью, поскольку дробь может получится бесконечной. При усечении (или округлении) появляются ошибки. Виду этого результатом сравнения двух действительных числе на равенство чуть ли не всегда будет ЛОЖЬ, даже если эти числа равны.

Кстати, добавлю, что вторую задачу можно решить с помощью цикла FOR

Последний раз редактировалось Вадим Мошев; 06.10.2011 в 01:35.
Вадим Мошев вне форума
Старый 06.10.2011, 06:09   #5
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Причиной тому является то, что все числа в компьютере представляются в двоичной системе счисления
Вадим.. скажи - ты правда думаешь, что если бы компьютеры были троичными, или там десятичными (на 3 или 10 уровнях сигнала, или еще как-то..), то этой проблемы бы не было?..
Предпочитаю на "ты".
TinMan вне форума
Старый 06.10.2011, 12:30   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
JUDAS, посмотри-ка сюда..
Код:
while v>=1 do
 begin
   v:=v-0.2;
 end;
Посмотри внимательней сам и старайся копировать код с форума а не набирать с клавиатуры делая ошибки
----
Пробовал на 701-м Паскале - тот же результат.
П.С. я обьявлял вещественные как double, а не как real. Может изза этого у тебя и ошибка
сопроцессор оперирует с extended и как альтернатива с double, остальные вещественные типы имеют свойство "сокращатся" тем или иным транслятором до какой то конкретной точности.
П.П.С. твой совет, умесен при сравнении результата n-ного ряда когда delta ==> 0 или когда задача требует определённой точности. Также, такой эффект проявляется в компиляторах конца 80-х годов, на которые подсаживают проеподы своих студентов исключительно потому, что новые технологии и среды разработки им впадлу изучать.
Поэтому на форуме имеется этот раздел, и подавляющее большинство начинающих пишут на Досовских версиях Паскаля.
Изображения
Тип файла: jpg for888908.JPG (42.7 Кб, 138 просмотров)
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 06.10.2011 в 13:26.
JUDAS вне форума
Старый 06.10.2011, 14:01   #7
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

JUDAS, я тебе указал на твою ошибку и объяснил ее причины. Это серьезная ошибка, и особенно в таком вот случае. Каким образом реагировать на мою помощь - это твой вопрос. Можешь считать, что я на тебя наезжаю.
Удачи тебе.

P.S.
странно даже - ты правда думаешь, что я руками набираю?..

Фу-ты.. совсем с тобой крыша похала.. даже не заметил, что ты выводишь v после прибавления. А я ведь специально в том посте выделил болдом..
Короче, посмотри ВНИМАТЕЛЬНО. В твоей картинк е есть все та же ошибка. Правильный ответ
Z= 137306.64
Предпочитаю на "ты".

Последний раз редактировалось Stilet; 09.10.2011 в 11:59.
TinMan вне форума
Старый 06.10.2011, 14:08   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

JUDAS
я не знаю, кто прав, кто виноват. сейчас голова другим забита..

просто хочу отметить, что Вы невнимательно прочитали текст сообщения
Цитата:
Сообщение от TinMan
Вот протокол работы твоего кода (задача 2) с вставленной печатью параметра v перед вычислением произведения:
а у Вас в примере - после!
Serge_Bliznykov вне форума
Старый 06.10.2011, 14:21   #9
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Серж, спасибо за поддержку.
Это, конечно, удачно вышло, что ошибка воспроизвелась.. Могла и не повториться. Но суть в том, что единственный опровергающий пример - будь он хоть real, хоть single - и все насмарку. И не спасут ни double, ни triple, ни millennium.. Потеря точности - это принципиальная черта вычислительной техники.
Ты постарайся понять это, JUDAS, и учитывать, если ты хочешь продолжать программировать.
Предпочитаю на "ты".
TinMan вне форума
Старый 06.10.2011, 14:30   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

TinMan скажи что обломался и не знаешь как себя выправдвть. ты писал что:
Цитата:
Никогда нельзя сравнивать действительные переменные ТОЧНО. Обязательно нужно учитывать ошибки вычислений. Я недавно уже писал тут по этому поводу, поищи.
Так вот, подумай сначала что за бред ты написал на досуге, потом советуй.
На последок - сначала сделатй сам чтото, потом лечи других. Ок ?
------------
Цитата:
Потеря точности - это принципиальная черта вычислительной техники.
чтобы игнорировать издержки процессоров конца 80-х, на компиляторах которых вы проверяете код, придумали сопросцессор+расширения XMM, SSE, SSE2 и потомки + кучу команд (опкод) с преффикосм comp, которые сравнивают те самые вещественные значения. Для них число 1.0 и (4.0-3.0) одна и то же субстанция.

П.С. в своём коде ошибку увидел, но форум устроен так, что я не могу поменять местами две строки внутри цикла.
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 06.10.2011 в 14:47.
JUDAS вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
синусы и ко. циклы, вроде циклы Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2010 19:26
Циклы - вложенны циклы? tigga Microsoft Office Excel 5 19.02.2010 23:36
Циклы Mizantrop Помощь студентам 0 04.11.2009 18:32
циклы Mizantrop Помощь студентам 0 04.11.2009 18:06
Циклы }{oт@бь)ч Общие вопросы Delphi 4 05.02.2009 16:41