![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Lauri |
![]()
Сообщение
#1
|
Гость ![]() |
Люди, помогите плиз, скажите - как обозначить формат вводимых данных? (мне надо сделать так, чтобы можно было ввести только цифры, а при введении букв выводилось сообщение об ошибке) может надо использовать a:string, а потом работать со строкой? или case? Вот моя программа (для перевода чисел из десятичной системы в троично-симметричную)...
Program perevod;
uses crt;
var a:integer;
d,i:byte;
mas:array [0..10] of shortint;
f,g:boolean;
Begin
clrscr;
writeln ('Vvedite chislo: Exit - press 0');
repeat
readln(a);
if (a<0) then g:=false
else g:=true;
d:=0;
if (a=0) then halt;
repeat
i:=0;
dec(a);
repeat
f:=true;
inc(mas[i]);
if (mas[i]=2) then
begin
mas[i]:=-1;
inc(i);
if (d<i) then d:=i;
f:=false;
end;
until f;
until (a=0);
for i:=d downto 0 do
begin
if g then write(mas[i]) else write(-mas[i]);
mas[i]:=0;
end;
writeln;
until (1<>1);
end.
|
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата (мне надо сделать так, чтобы можно было ввести только цифры, а при введении букв выводилось сообщение об ошибке) Цифры или числа?Для чисел уже выкладывалось... Цикл Repeat, поиском пользуйся... |
Lauri |
![]()
Сообщение
#3
|
Гость ![]() |
В этом примере рассматриваются только числовые значения от 0 до 365, а мне надо как-то обозначить английский алфавит от A до Z и сделать так, чтобы когда вводишь "456FR3" или "FGHFGH" выводилось сообщ. об ошибке, а обычные числа ( от -999999999 до 999999999) проходили процедуру дальнейшей обработки... причём я пытался использовать repeat, но там и так есть repeat и совместное использование двух операторов негативно сказывается на работе программы... (она ничего не пересчитывает).. вообще не знаю что делать...((
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата а мне надо как-то обозначить английский алфавит от A до Z и сделать так, чтобы когда вводишь "456FR3" или "FGHFGH" выводилось сообщ. об ошибке, а обычные числа ( от -999999999 до 999999999) проходили процедуру дальнейшей обработки... ![]() var
k: longint; ok: boolean;
err: integer; s: string;
...
repeat
{$I-}
write('enter the number -> '); readln(s);
{$I+}
ok := (ioresult = 0); val(s, k, err);
ok := ok and (err = 0) and (length(s) < 11) and ((k >= -999999999) and (k <= 999999999));
if not ok then writeln('* * * Error! * * *');
until ok;
...
Самому нельзя было догадаться |
Shura |
![]()
Сообщение
#5
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 136 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
А вот, если что, процедура, которая осуществляет ввод значения (от -999999999 до 999999999) в глобальную переменную, и не дает пользователю даже ввести некорректные данные. Требует модуль Crt (используется функция ReadKey).
Код Program Vvod; Uses Crt; Var a: LongInt; Procedure GetNumber(var a: LongInt); var s: String; ch: Char; error: Integer; begin s:=''; repeat ch:=ReadKey; case ord(ch) of 45: if s = '' then begin s:='-'; Write('-') end; 48..57: if (length(s) - Pos('-',s) < 9) then begin s:=s+ch; Write(ch) end; 8: begin GotoXY(WhereX-1,WhereY); Write(' '); GotoXY(WhereX-1,WhereY); Delete(s,length(s),1) end end {case} until (ch = #13); Val(s,a,error) end; {****************************************************************************} Begin ClrScr; GetNumber(a); WriteLn; WriteLn('Vvedeno chislo: ', a); ReadLn End. -------------------- Старайтесь восполнять пробелы в области незнания! ;-D
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
GotoXY(WhereX-1,WhereY);
Write(' ');
GotoXY(WhereX-1,WhereY);
![]() Write(#8#32#8);
|
Shura |
![]()
Сообщение
#7
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 136 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
![]() -------------------- Старайтесь восполнять пробелы в области незнания! ;-D
|
Lauri |
![]() ![]()
Сообщение
#8
|
Гость ![]() |
Но как же совместить эту процедуру с моей программой?.. Мои попытки заканчивались тем, что введя цифры, получалась пустая строка, а далее - обычный ход программы...
А вариант, предложенный Volvo работает у меня некорректно, я грешу на то, что используется repeаt внутри repeat... А вот если так, к примеру: Код writeln ('Введите число'); readln (a); readln (s); или writeln ('Введите число'); readln (a,s); Так вообще можно делать? Первый вариант - получается что сначала считывается a, а потом только b, а мне надо так, чтобы ОДНО число проверялось и оно же считалось... Помоги, пожалуйста, для меня это очень важно, вопрос буквально жизни и смерти! З.Ы. Тока не смейтесь плиззз, да, я ламер в этом деле... надеюсь что в скором будущем перестану им ыть ![]() |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата А вариант, предложенный Volvo работает у меня некорректно Полностью ВСЮ свою программу приведи (не кусками, а всю)... И заодно, те данные которые ты вводишь, и ЧТО ТЫ ХОЧЕШЬ ПОЛУЧИТЬ... Сказать "не получается" или "некорректно" очень просто, ты ДОКАЖИ, что это действительно некорректно... |
Lauri |
![]()
Сообщение
#10
|
Гость ![]() |
Код Program perevod; uses crt; var a,err:integer; d,i:byte; mas:array [0..10] of shortint; ok,f,g:boolean; s:string; k:longint; Begin clrscr; repeat writeln ('Vvedite chislo: Exit - press 0'); readln (s); ok:=(ioresult=0); val (s,k,err); ok:= ok and (err=0) and (length(s)<11) and ((k>=-99999999) and (k<=9999999)); if not ok then writeln ('error!!!'); until ok; repeat readln(a); if (a<0) then g:=false else g:=true; d:=0; if (a=0) then halt; repeat i:=0; dec(a); repeat f:=true; inc(mas[i]); if (mas[i]=2) then begin mas[i]:=-1; inc(i); if (d<i) then d:=i; f:=false; end; until f; until (a=0); for i:=d downto 0 do begin if g then write(mas[i]) else write(-mas[i]); mas[i]:=0; end; writeln; until (1<>1); end. Вот так, как я понял... но первый цикл кончается и начинается следующий, который уже выполняет дальнейшие действия (readln(a) - считывается уже другое число, а не то, которое проверялось)... Ввожу "45" - пустая строка, ввожу 45 - 1-1-100 ... ![]() |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Нет, не так... Вот так я имел в виду вводить числа:
Program perevod;
uses crt;
var
err:integer;
d,i:byte;
mas:array [0..10] of shortint;
ok,f,g:boolean;
s:string;
a:longint;
Begin
clrscr;
repeat { Это - начало твоего бесконечного цикла }
{ Это - мой цикл корректного ввода числа }
repeat
writeln ('Vvedite chislo: Exit - press 0'); readln (s);
ok:=(ioresult=0); val (s,a,err);
ok:= ok and (err=0) and (length(s)<11) and ((a>=-99999999) and (a<=9999999));
if not ok then writeln ('error!!!');
until ok;
{ Все, мой цикл закончен, в A находится правильное число... }
{ Кстати, g лучше вычислять вот так, а не If ... Else ... }
g := (a >= 0);
d:=0;
if (a=0) then halt;
repeat
i:=0;
dec(a);
repeat
f:=true;
inc(mas[i]);
if (mas[i]=2) then begin
mas[i]:=-1;
inc(i);
if (d<i) then d:=i;
f:=false;
end;
until f;
until (a=0);
for i:=d downto 0 do begin
if g then write(mas[i]) else write(-mas[i]);
mas[i]:=0;
end;
writeln;
until false; { <--- Это - тоже бесконечный цикл }
end.
Вот ... Проверь. |
Гость |
![]()
Сообщение
#12
|
Гость ![]() |
Спасибо ОГРОМНОЕ, теперь всё работает как надо! ))
Как хорошо что есть ещё добрые люди! Не знаю как отблагодарить! =) |
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 15:31 |