![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
bhldr |
![]()
Сообщение
#1
|
Гость ![]() |
По идее когда число повторений неизвестно, For использовать нельзя, но может все-таки как-нибудь можно?
Реально ли перебить этот фрагмент под цикл For?
Var x,eps,U,Un:Real;
a:Byte;
.......
U:=1;
a:=2;
Un:=U*cos(x/a);
Repeat
U:=Un;
Un:=U*cos(x/a);
a:=a*2
Until Abs (Un-U)<eps;
........
|
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
bhldr, нет... Ты действительно должен знать точное число итераций, а здесь ты этого не можешь знать из-за рекуррентности формулы (последующий элемент зависит от предыдущего).
Кстати, а чем Repeat Until не нравится? Он побыстрее For будет (при использовании Турбо Паскаля...) |
bhldr |
![]()
Сообщение
#3
|
Гость ![]() |
Мне RepeatUntil нравится, просто задание у меня такое: нужно эту тему представить в трех циклах, а я не врубаюсь, как ее в For перебить.
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Извращение, конечно, но... Сам просил:
const
maxIter = 100; { можешь поменять... }
Var
x,eps,U,Un:Real;
a:Byte;
stop: boolean;
...
U := 1; a := 2; Un := U*Cos(x/a);
stop := False;
for i := 1 to maxIter Do
If not stop Then Begin
U := Un; Un := U*Cos(x/a);
a := a*2;
{ Как только stop станет равным True, остаток цикла пройдет вхолостую... }
stop := (Abs(Un - U) < eps);
End;
...
|
bhldr |
![]()
Сообщение
#5
|
Гость ![]() |
Спасибо, всё круто. Только maxIter надо по-видимому сделать переменной, зависящей от eps, иначе если очень маленькую eps задать, то цикл рано закончится.
|
klem4 |
![]()
Сообщение
#6
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
хе-хе ну раз про извращения разговор пошел, то можно и вот так :
const
maxIter = 100; { можешь поменять... }
Var
x,eps,U,Un:Real;
a:Byte;
...
U := 1; a := 2; Un := U*Cos(x/a);
for i := 1 to maxIter Do Begin
U := Un; Un := U*Cos(x/a);
a := a*2;
{ Как только stop станет равным True, остаток цикла пройдет вхолостую... }
if (Abs(Un - U) < eps) then break; // используем прерывание цикла
End;
...
добвлено : Volvo, я просто с просони забыл убрать эту переменную и проверку, естественно она в таком случае не нужна. Сообщение отредактировано: klem4 - 24.10.2005 9:09 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
klem4, это не извращение, а невнимательность:
...
U := 1; a := 2; Un := U*Cos(x/a);
for i := 1 to maxIter Do
U := Un; Un := U*Cos(x/a);
a := a*2;
if (Abs(Un - U) < eps) then break; // используем прерывание цикла
End;
...
stop в таком случае вообще не нужен ![]() |
Digitalator |
![]()
Сообщение
#8
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 247 Пол: Мужской Репутация: ![]() ![]() ![]() |
а вот вам супер извращение, по идее должно работать
Код for i:=1 to 1 do begin <делаем что-нить> if not(<уловие выхода>) then begin //извращение с указателем т.к. //некотрые компиляторы не дают //изменять индекс цикла, //а так должно сработать pi := @i; pi^ := 0; end; end; -------------------- |
Altair |
![]()
Сообщение
#9
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Позволю себе оффтоп.
Все таки иногда удивляюсь насколько красиво может быть программирование... Цитата for i:=1 to 1 do begin <делаем что-нить> if not(<уловие выхода>) then begin pi := @i; pi^ := 0; end; end; еще одна оригинальная конструкция улетает в копилку... Хотя ИМХО возможно еще по адресное хранения переменный, типа x: integer absolute i; тогда for i:=1 to 1 do
begin
<делаем что-нить>
if not(<уловие выхода>) then x:=0;
end;
! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Олег, а вот это не срабатывает (на FPC, в частности)
![]() Цитата Error: Illegal assignment to for-loop variable i , хотя меняю я X ... |
Altair |
![]()
Сообщение
#11
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
хм.. круто!
![]() TP вроде пропускал это ![]() ![]() -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 4:53 |