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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2010, 13:20   #1
bwitcher
Форумчанин
 
Регистрация: 09.06.2010
Сообщений: 112
По умолчанию Из While в Repeat

Нам тут одну и ту же прогу нужно в двух вариантах сделать. Я вроде бы сделал ее в While:
Код:
Program MyProg;
Var
q,pi,x,a:real;
Begin
Writeln(‘Vvedite peremennuy x’);
Readln(x);
a:=1.65;
while (x>=0.7) and (x<=2) do begin
if x<1.4 then q:=(pi*sqr(x)-7/sqr(x));
if x=1.4 then q:=(a*exp(3*ln(x))+7*sqrt(x));
if x>1.4 then q:=(ln(x+7*sqrt(abs(sqr(x)+a))));
x:=x+0.2; end;
Writeln(‘Znachenie vyrajeniya=’,q);
Readln;
End.[/B]
Пытался сделать с помощью Repeat, но что-то не выходит. Посмотрите, пжл, где ошибочка?
[B]Program MyProg;
Var
q,pi,x,a:real;
Begin
Writeln(‘Vvedite peremennuy x’);
Readln(x);
a:=1.65;
Repeat
if x<1.4 then q:=(pi*sqr(x)-7/sqr(x));
if x=1.4 then q:=(a*exp(3*ln(x))+7*sqrt(x));
if x>1.4 then q:=(ln(x+7*sqrt(abs(sqr(x)+a))));
x:=x+0.2;
Until (x<=0.7) and (x>=2);
Writeln(‘Znachenie vyrajeniya=’,q);
Readln;
End.

Последний раз редактировалось Stilet; 21.11.2010 в 14:46.
bwitcher вне форума Ответить с цитированием
Старый 21.11.2010, 14:03   #2
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

хотя оно работало, но выглядело тупо

Последний раз редактировалось profi; 21.11.2010 в 15:38.
profi вне форума Ответить с цитированием
Старый 21.11.2010, 14:36   #3
bwitcher
Форумчанин
 
Регистрация: 09.06.2010
Сообщений: 112
По умолчанию

x больше 0.7 и больше 2 сразу? Вы уверены, что так? Я еще не проверял, просто удивляюсь)
bwitcher вне форума Ответить с цитированием
Старый 21.11.2010, 15:25   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

цикл until от цикла while отличается двумя важными "чертами".
1) цикл while может не выполнится ни разу (если предусловие не выполнилось). repeat until выполнится хотя бы один раз не зависимо от условия.

2) в while цикл выполняется, пока выполняется условие (т.е. пока условие ИСТИННО)
в цикле repeat until задаётся условие ВЫХОДА из цикла, т.е. цикл выполняется пока условие ЛОЖНО!

поэтому вместо
Код:
while (x>=0.7) and (x<=2) do begin
end;[/
пишем
Код:
repeat 
  if (x>=0.7) and (x<=2) do begin
  end;
until Not ((x>=0.7) and (x<=2));

Цитата:
x больше 0.7 и больше 2 сразу? Вы уверены, что так?
вы правильно удивляетесь, там ошибка. Если раскрыть NOT по правилам булевой алгебры получится
until ((x<0.7) or (x>2));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2010, 15:57   #5
bwitcher
Форумчанин
 
Регистрация: 09.06.2010
Сообщений: 112
По умолчанию

Что-то не пойму. Там, где у вас if, Паскаль требует и then. Не могли бы вы полностью прогу написать? А то я что-то не пойму.
bwitcher вне форума Ответить с цитированием
Старый 21.11.2010, 16:00   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

bwitcher вы верно заметили, у Serge_Bliznykov ошибка. Соглашусь, что мой код не сильно "красивый" был.

Цитата:
Var
q,pi,x,a:real;
Begin
Writeln('Vvedite peremennuy x');
Readln(x);
a:=1.65;
Repeat
if (x>=0.7) and (x<=2) then
begin
if x<1.4 then q:=(pi*sqr(x)-7/sqr(x));
if x=1.4 then q:=(a*exp(3*ln(x))+7*sqrt(x));
if x>1.4 then q:=(ln(x+7*sqrt(abs(sqr(x)+a))));
x:=x+0.2;
end
else break;
Until (x>=2);
Writeln('nachenie vyrajeniya=',q);
Readln;
end.

Последний раз редактировалось profi; 21.11.2010 в 16:13.
profi вне форума Ответить с цитированием
Старый 21.11.2010, 16:11   #7
bwitcher
Форумчанин
 
Регистрация: 09.06.2010
Сообщений: 112
По умолчанию

А мне кажется, он не работал. Я проверял
bwitcher вне форума Ответить с цитированием
Старый 21.11.2010, 16:16   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Фигово проверял . Короче я ответ уже написал в посте #6.
profi вне форума Ответить с цитированием
Старый 21.11.2010, 19:23   #9
bwitcher
Форумчанин
 
Регистрация: 09.06.2010
Сообщений: 112
По умолчанию

Да, спасибо большое!
bwitcher вне форума Ответить с цитированием
Старый 21.11.2010, 19:57   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
(x>=2);
при равенстве двойке (x = 2) цикл прервётся.
а, судя по коду с while нужно, чтобы 2-ка входила в цикл..


честно слово, лучше бы мой код взяли..
там надо было вместо do написать then (писал на форуме и торопился, вот и описка..)
ну и тело цикла вставить...


Впрочем, решена задача, так решена.
Лишь бы TC был доволен...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
While and repeat Linker88 Фриланс 4 19.05.2009 20:33
While and Repeat! Linker88 Паскаль, Turbo Pascal, PascalABC.NET 12 19.05.2009 13:43
repeat ... until 08ekhiv1 Помощь студентам 3 17.03.2009 16:42
repeat until 4ERRY Помощь студентам 7 21.02.2009 21:38
Repeat Наталья111 Общие вопросы Delphi 7 06.01.2009 19:44