Помощь - Поиск - Пользователи - Календарь
Полная версия: Про вывод в цикле
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
>hamka<
В цикле выводится сообщение. Оно выводится столько раз, скока неправильно. А как сделать, чтобы только один раз оно выводилось?
trminator
Код

while bla_bla do
begin
   ...
   if condition then
   begin
       writeLn('ERROR!!!');
       break; {завершение цикла, довольно грубо}
   end;
   ...
end;


Или вместо break устанавливать какой-нибудь флаг в true, а в условии цикла проверять, чему равен флаг.

ИМХО break не есть очень хорошо, ибо GOTO подобно... (привет SKVOZNIAKsmile.gif)
volvo
Цитата(>hamka< @ 8.03.05 18:13)
В цикле выводится сообщение. Оно выводится столько раз, скока неправильно. А как сделать, чтобы только один раз оно выводилось?


Ну, а если при этом нельзя прерывать выполнение цикла, то что-то типа:
Код
print_me := true;
for i := 1 to n do
 begin
   ...
   if condition and print_me then
     begin
       print_me := false;
       writeln('Error !!!')
     end;
 end;


В таком случае цикл продолжится, но последующие сообщения печататься уже не будут...
>hamka<
И еще вопрос huh.gif
Ситуация такая -> строка (переводимое в число) проверяется на max допустимое значение. В max может быть 10 символов. Изначально я хотела – все, что больше 10 чисел -> неправильно. Но пользователь может перед этими 10 цифрами и входящими в диапазон ввести нулики. Т.е. при переводе в число строка из 40 символов может преобразоваться в нормальное число. Как лучше сделать? Сейчас у меня так :
Код

procedure BOLSHOE_CHISLO ( n:string; var f: boolean);
var j,k,n:integer; l:longint; c:array [1..100] of longint;
begin
f:=true;
for j:=1 to length (n) do
begin
l:=ord(n[j])-48;
c[j]:=l;k:=k+1;
end;
if k=10 then begin
if (c[1]=3) or (c[1]>3) then f:=false;
и так до 10
end;
if k > 10 then begin
for n:=j downto 1 do
?????????
end;

volvo
Цитата(>hamka< @ 8.03.05 20:54)
Но пользователь может перед этими 10 цифрами и входящими в диапазон ввести нулики. Т.е. при переводе в число строка из 40 символов может преобразоваться в нормальное число. Как лучше сделать?

Лучше всего удалить незначащие нули:
Код
Function LeadZeroes(s: string): string;
 begin
   while s[1] = '0' Do delete(s, 1, 1)
   LeadZeroes := s
 end;


P.S. Не отвлекайтесь от темы... Сколько можно уже? Вам же уже приводили пример полностью работоспособной программы... Зачем это опять переделывать?
>hamka<
Цитата(volvo @ 8.03.05 22:05)
P.S. Не отвлекайтесь от темы... Сколько можно уже? Вам же уже приводили пример полностью работоспособной программы... Зачем это опять переделывать?

Если я бы программу эту сдала blink.gif , я бы тогда не спрашивала. Мне нужно учесть все нюансы.
И та программа была не про это. Там стоял совершенно другой вопрос!
>hamka<
как проделать вот это.
когда пользователь вводит 0, то ошибка, когда все нули тож ошибка, и когда первые нули, а потом число, то тоже у меня в программе это как ошибка. а я хочу, чтобы число впереди в нуликами воспринималось.
Код

readln(n);
for j:=1 to length (n) do
begin
k:=k+1;
end;
for j:=1 to length (n) do
begin
if (k > 1) and (n[j]='0') then begin
writeln('Некорректное значение. Нажмите <Enter> для продолжения');
readkey; goto main; end;
if k > 1 then begin
while n[1]='0' do delete (n,1,1); end;
end;
BOLSHOE_CHISLO (n,f);

я понимаю что что-то в цикле не прав. Где моя ошибка? blink.gif
volvo
Ну и сколько раз я должен писАть одно и то же? Если Вам решение не нравится, Вы бы хоть сказали, чем именно. Двумя постами выше написано:
Код
{ Чуть-чуть изменено (для учета одного '0')}
Function LeadZeroes(s: string): string;
begin
  if s <> '0' then
    while s[1] = '0' Do delete(s, 1, 1);
  LeadZeroes := s
end;


Ну так примените это:
Код

readln(n);
n := LeadZeroes(n);

{ продолжаем работать с N}
if n = '' then { введено только несколько нулей - ошибка }
else { начальные нули успешно удалены или был один '0'}

Кстати, что за метка main? куда она ведет? И почему опять метки, Вам что процедурами пользоваться нельзя.
>hamka<
все решения мне нравятся =)) тока, если они работают не так, как мне нужно, то я их меняю.
сейчас у меня прога почти полностью работает. тока если вводится один нуль, то пишется, что неправильно, а если несколько нулей, то происходит переход на след. строчку и программа зависает. И мне нужно , чтобы выводилась ошибка. О она даже при проверке на пустую строчку не выводится, а виснет. И с else я не знаю, что делать. там запуться можно, т.к. куда-то надо end ставить. sad.gif
вот что у меня сейчас
volvo
Цитата(>hamka< @ 9.03.05 16:20)
все решения мне нравятся =)) тока, если они работают не так, как мне нужно, то я их меняю.

Так вот чтобы они работали так, как Вам нужно, определитесь сначала, что Вы вообще от программы хотите. Вы же даже тесты для нее не придумали. Как Вы ее вообще проверяете?

Сколько вариантов было предложено - и ни один не подошел? В таком случае, может Вам стоит поучиться задавать вопросы?

Цитата
И с else я не знаю, что делать. там запуться можно
А почему? Потому что Goto используете... Вот и разбирайтесь в этих переходах... А процедуры Вы просто игнорируете, хотя с их помощью программа сократится до 20 строк... Ну как хотите, изобретайте велосипед дальше...
>hamka<
Всем спасибо. Велосипед изобретен =)). Я нашла способ работы с нулями.
Программа бы никогда не сократилась до 20 строк, т.к. сдававшие ее укладывались в 200 строк. А у меня всего 141 smile.gif
Тока один вопрос остался. При запросе кол-ва цифр. Enter у меня идет как ошибка. А при заполнении вектора при нажатии Enter заносится 0. Почему. ведь алгоритм везде один и тот же?
и еще один
Код

trunc(Exp((length(n)-i)*Ln(10)))

как именно работает эта формула? Ln - это логарифм. А в справочнике exp я не нашла sad.gif
volvo
А что будет, если я сделаю из нее 30 строк? На будущее - "прежде, чем сказать _невозможно_, подумай, прав ли ты".

Если ваши сокурсники укладываются в 200 строк, это совсем не значит, что нельзя уложиться в 30... :yes:
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.