Помощь - Поиск - Пользователи - Календарь
Полная версия: Цикл Repeat
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
garry_m
Помогите pls вставить цикл следующего типа в программу:
Цикл:

repeat
{$I-}
write('...'); readln(...);
{$I+}
ok:=(ioresult=0); val(s,k,err);
ok:=ok and (err=0);
if not ok then writeln('...');
until ok;



Программа:
uses crt;
var
x,y,z:real;
c:real;
ans:char;
begin clrscr; repeat clrscr;

writeln('Raschet znachenija functii.');
writeln('');
write('Vvedite X -> '); readln(x);
write('Vvedite Y -> '); readln(y);
write('Vvedite Z -> '); readln(z);
writeln('');
writeln('Raschitaem znachenije functii.');

C:=ln(sqr(2*x+5*y)*(22*x+401*y)/(5*sqr(x)+8*y+9*z));
writeln('');
write('Znachenije functii ravno: ',C:8:4); readln;
writeln('');
writeln('Do you want to repeat?');
ans:=readkey;
until UpCase(ans) = 'N';

end.
volvo
Цикл в программу вставляется обычно не просто так, а для чего-то... Вот если ты объяснишь, для чего тебе понадобился такой цикл, мы подскажем, как его добавить...
garry_m
Ну этот же цикл для проверки на правильность ввода 3 переменных. Собственно его и требуется вставить...
GoodWind
Код
uses crt;
var
x,y,z:real;
c:real;
ans:char;
s:string;
begin clrscr; repeat clrscr;

writeln('Raschet znachenija functii.');
writeln('');
repeat
{$I-}
write('Vvedite X -> '); readln(s);
{$I+}
ok:=(ioresult=0); val(s,x,err);
ok:=ok and (err=0);
if not ok then writeln('Error!');
until ok;

repeat
{$I-}
write('Vvedite Y -> '); readln(s);
{$I+}
ok:=(ioresult=0); val(y,k,err);
ok:=ok and (err=0);
if not ok then writeln('Error!');
until ok;

repeat
{$I-}
write('Vvedite Z -> '); readln(s);
{$I+}
ok:=(ioresult=0); val(s,z,err);
ok:=ok and (err=0);
if not ok then writeln('Error!');
until ok;


writeln('');
writeln('Raschitaem znachenije functii.');

C:=ln(sqr(2*x+5*y)*(22*x+401*y)/(5*sqr(x)+8*y+9*z));
writeln('');
write('Znachenije functii ravno: ',C:8:4); readln;
writeln('');
writeln('Do you want to repeat?');
ans:=readkey;
until UpCase(ans) = 'N';

end.

вроде этого - на компиляторе не проверял!
volvo
Чтобы не раздувать программу - оформляй ввод переменной как отдельную функцию и вызывай ее 3 раза (для каждой переменной)... Что-то такого типа:
Function GetVar(minRange, maxRange: Real): Real;
Begin
{ Здесь используй свой Repeat ... Until }
GetVar := ...
End;

Var
x, y, z: Real;
Begin { основная программа }
x := GetVar(0, 20);
y := GetVar(10, 20); { Значения minRange/maxRange могут быть и другими }
z := GetVar(0, 5);
...
End.
garry_m
Помогите plz применить это к моей программе, чтобы я смог разобраться во всем...
Я вчера парился в редакторе - не выходит!
GoodWind
garry_m, а пост №4 ты смотрел ? dry.gif
garry_m
GoodWind, спасибо большое!
Но я хочу научиться применять цикл, который написал volvo. Т. к. а если мы скажем будем вводить 25 значений переменных, то мы будем 25 раз писать процедуру для проверки на правильность ввода?
GoodWind
тогда обясню - свой цикл (модифицированный конечно) оформляешь в функцию, которую применяешь вместо readln.
Код

function GetRealA(min,max:real;mess:string;):real;
var s:string;
      err:integer;
      t:real;
      ok:boolean;
begin
ok:=false;
repeat
write(mess); readln(s);
val(s,t,err);
ok:=(err<>0) and (t>=min) and (t<=max);
if not ok  then writeln('Error!');
until ok;
GetRealA:=t;
end;

теперь можешь использовать эту фуенкцию в своей программе:
Код

uses crt;
var
x,y,z:real;
c:real;
ans:char;
begin clrscr; repeat clrscr;

writeln('Raschet znachenija functii.');
writeln('');
x:=getRealA({мин значение},{макс значение},'Введите Х: ');
y:=getRealA({мин значение},{макс значение},'Введите Y: ');
x:=getRealA({мин значение},{макс значение},'Введите Z: ');
writeln('');
writeln('Raschitaem znachenije functii.');

C:=ln(sqr(2*x+5*y)*(22*x+401*y)/(5*sqr(x)+8*y+9*z));
writeln('');
write('Znachenije functii ravno: ',C:8:4); readln;
writeln('');
writeln('Do you want to repeat?');
ans:=readkey;
until UpCase(ans) = 'N';

end.


примерно так... unsure.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.