Про вывод в цикле |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Про вывод в цикле |
>hamka< |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 35 Пол: Женский Репутация: 0 |
В цикле выводится сообщение. Оно выводится столько раз, скока неправильно. А как сделать, чтобы только один раз оно выводилось?
|
trminator |
Сообщение
#2
|
Четыре квадратика Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: 4 |
Код while bla_bla do begin ... if condition then begin writeLn('ERROR!!!'); break; {завершение цикла, довольно грубо} end; ... end; Или вместо break устанавливать какой-нибудь флаг в true, а в условии цикла проверять, чему равен флаг. ИМХО break не есть очень хорошо, ибо GOTO подобно... (привет SKVOZNIAK'у ) -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
volvo |
Сообщение
#3
|
Гость |
Цитата(>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< |
Сообщение
#4
|
Новичок Группа: Пользователи Сообщений: 35 Пол: Женский Репутация: 0 |
И еще вопрос
Ситуация такая -> строка (переводимое в число) проверяется на 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 |
Сообщение
#5
|
Гость |
Цитата(>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< |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 35 Пол: Женский Репутация: 0 |
Цитата(volvo @ 8.03.05 22:05) P.S. Не отвлекайтесь от темы... Сколько можно уже? Вам же уже приводили пример полностью работоспособной программы... Зачем это опять переделывать? Если я бы программу эту сдала , я бы тогда не спрашивала. Мне нужно учесть все нюансы. И та программа была не про это. Там стоял совершенно другой вопрос! |
>hamka< |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 35 Пол: Женский Репутация: 0 |
как проделать вот это.
когда пользователь вводит 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); я понимаю что что-то в цикле не прав. Где моя ошибка? |
volvo |
Сообщение
#8
|
Гость |
Ну и сколько раз я должен писАть одно и то же? Если Вам решение не нравится, Вы бы хоть сказали, чем именно. Двумя постами выше написано:
Код { Чуть-чуть изменено (для учета одного '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< |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 35 Пол: Женский Репутация: 0 |
все решения мне нравятся =)) тока, если они работают не так, как мне нужно, то я их меняю.
сейчас у меня прога почти полностью работает. тока если вводится один нуль, то пишется, что неправильно, а если несколько нулей, то происходит переход на след. строчку и программа зависает. И мне нужно , чтобы выводилась ошибка. О она даже при проверке на пустую строчку не выводится, а виснет. И с else я не знаю, что делать. там запуться можно, т.к. куда-то надо end ставить. вот что у меня сейчас Прикрепленные файлы LABA_1.PAS.doc ( 27.5 килобайт ) Кол-во скачиваний: 545 |
volvo |
Сообщение
#10
|
Гость |
Цитата(>hamka< @ 9.03.05 16:20) все решения мне нравятся =)) тока, если они работают не так, как мне нужно, то я их меняю. Так вот чтобы они работали так, как Вам нужно, определитесь сначала, что Вы вообще от программы хотите. Вы же даже тесты для нее не придумали. Как Вы ее вообще проверяете? Сколько вариантов было предложено - и ни один не подошел? В таком случае, может Вам стоит поучиться задавать вопросы? Цитата И с else я не знаю, что делать. там запуться можно А почему? Потому что Goto используете... Вот и разбирайтесь в этих переходах... А процедуры Вы просто игнорируете, хотя с их помощью программа сократится до 20 строк... Ну как хотите, изобретайте велосипед дальше... |
>hamka< |
Сообщение
#11
|
Новичок Группа: Пользователи Сообщений: 35 Пол: Женский Репутация: 0 |
Всем спасибо. Велосипед изобретен =)). Я нашла способ работы с нулями.
Программа бы никогда не сократилась до 20 строк, т.к. сдававшие ее укладывались в 200 строк. А у меня всего 141 Тока один вопрос остался. При запросе кол-ва цифр. Enter у меня идет как ошибка. А при заполнении вектора при нажатии Enter заносится 0. Почему. ведь алгоритм везде один и тот же? и еще один Код trunc(Exp((length(n)-i)*Ln(10))) как именно работает эта формула? Ln - это логарифм. А в справочнике exp я не нашла Сообщение отредактировано: >hamka< - |
volvo |
Сообщение
#12
|
Гость |
А что будет, если я сделаю из нее 30 строк? На будущее - "прежде, чем сказать _невозможно_, подумай, прав ли ты".
Если ваши сокурсники укладываются в 200 строк, это совсем не значит, что нельзя уложиться в 30... :yes: |
Текстовая версия | 23.12.2024 20:16 |