Помощь - Поиск - Пользователи - Календарь
Полная версия: Как обозначить цифры?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Lauri
Люди, помогите плиз, скажите - как обозначить формат вводимых данных? (мне надо сделать так, чтобы можно было ввести только цифры, а при введении букв выводилось сообщение об ошибке) может надо использовать 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
Цитата
(мне надо сделать так, чтобы можно было ввести только цифры, а при введении букв выводилось сообщение об ошибке)
Цифры или числа?

Для чисел уже выкладывалось... Цикл Repeat, поиском пользуйся...
Lauri
В этом примере рассматриваются только числовые значения от 0 до 365, а мне надо как-то обозначить английский алфавит от A до Z и сделать так, чтобы когда вводишь "456FR3" или "FGHFGH" выводилось сообщ. об ошибке, а обычные числа ( от -999999999 до 999999999) проходили процедуру дальнейшей обработки... причём я пытался использовать repeat, но там и так есть repeat и совместное использование двух операторов негативно сказывается на работе программы... (она ничего не пересчитывает).. вообще не знаю что делать...((
volvo
Цитата
а мне надо как-то обозначить английский алфавит от A до Z и сделать так, чтобы когда вводишь "456FR3" или "FGHFGH" выводилось сообщ. об ошибке, а обычные числа ( от -999999999 до 999999999) проходили процедуру дальнейшей обработки...

lol.gif Не смеши меня так больше... Есть такая игра, "Найди отличия"... Попробуй найти 3 отличия в том, что было по ссылке, и в том, что есть здесь:
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
А вот, если что, процедура, которая осуществляет ввод значения (от -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.
volvo
    GotoXY(WhereX-1,WhereY);
Write(' ');
GotoXY(WhereX-1,WhereY);

blink.gif Зачем же так жестоко? Так не проще?
Write(#8#32#8);
Shura
good.gif Точно!
Lauri
Но как же совместить эту процедуру с моей программой?.. Мои попытки заканчивались тем, что введя цифры, получалась пустая строка, а далее - обычный ход программы...
А вариант, предложенный Volvo работает у меня некорректно, я грешу на то, что используется repeаt внутри repeat...
А вот если так, к примеру:

Код

writeln ('Введите число');
readln (a); readln (s);

или

writeln ('Введите число');
readln (a,s);


Так вообще можно делать? Первый вариант - получается что сначала считывается a, а потом только b, а мне надо так, чтобы ОДНО число проверялось и оно же считалось...

Помоги, пожалуйста, для меня это очень важно, вопрос буквально жизни и смерти!

З.Ы. Тока не смейтесь плиззз, да, я ламер в этом деле... надеюсь что в скором будущем перестану им ытьsmile.gif
volvo
Цитата
А вариант, предложенный Volvo работает у меня некорректно
Полностью ВСЮ свою программу приведи (не кусками, а всю)... И заодно, те данные которые ты вводишь, и ЧТО ТЫ ХОЧЕШЬ ПОЛУЧИТЬ... Сказать "не получается" или "некорректно" очень просто, ты ДОКАЖИ, что это действительно некорректно...
Lauri
Код

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 ... wacko.gif
volvo
Нет, не так... Вот так я имел в виду вводить числа:
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.
Вот ... Проверь.
Гость
Спасибо ОГРОМНОЕ, теперь всё работает как надо! ))
Как хорошо что есть ещё добрые люди! Не знаю как отблагодарить! =)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.