Помощь - Поиск - Пользователи - Календарь
Полная версия: ввод с клавы только цифр и вопросик о Eoln
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DFooz
Какими способами можно ограничить ввод с клавиатуры только цифр?
Я пробую таким, но наверняка есть способ проще и лучше=)
Код
Var
  k:Char;
  st:String;

Begin
  Repeat
      k:=ReadKey;
      If k in ['0'.. '9'] then          
        begin
          st:=st+k;
          Write(k);
        end
      Else if (ord(k)) = 8 then
        begin
          delete(st, length(st), 1);
          GotoXY(1,WhereY);
          ClrEOL;
          Write(st);
        end
    Until k = #13;
END.


второй вопросик
если напр. написать этот код, то пишутся на экране только цифры
Код

Repeat
      k:=ReadKey;
      If k in ['0'.. '9'] then  
        begin
          st:=st+k;
          Write(k);
        end
    Until [b]k = #13[/b];
  END.

если же вместо k = #13 написать EOLN, то на экране появляются также буквы. Почему? Знаю, что EOLN писать здесь неправильно, но просто интересно, почему на экране пишутся буквы?
klem4
Цитата
Какими способами можно ограничить ввод с клавиатуры только цифр?


Вот пример вода числа, после переводи строку в число

uses crt;
var
   s : string;
   ch : char;

begin
   clrscr;
   s := '';
   repeat
      ch := readkey;
      if ch in ['0'..'9'] then begin
          s := s + ch;
          write(ch);
      end;
   until ch = #13;
   writeln;
   writeln(s);
   readln;
end.


А, ну так у тебя тоже самое и есть smile.gif

ps a EOLN у теб выполняется при первом вводе символа, так как после этого курсо указывает на конец строки, я так понимаю.
volvo
Цитата
наверняка есть способ проще и лучше
Я пользуюсь вот таким:
uses crt;

function get_digits: string;
var s: string; ch: char;
begin
  s := '';
  repeat
    ch := readkey;
    case ch of
      #8:
      begin
        if length(s) > 0 then begin
          write(#8,#32,#8);
          delete(s, length(s), 1)
        end
      end;

      '0' .. '9':
        begin s := s + ch; write(ch) end
    end;
  until ch = #13;
  writeln;
  get_digits := s
end;

var
  s: string;

begin
  { ... }
  s := get_digits;
  { ... }
end.


Цитата
если же вместо k = #13 написать EOLN
А вот этого делать не стоит:
Цитата(Б.Поляков: Программирование в среде Турбо Паскаль)
Более того, от EoLn без параметра не дождетесь значения False. Она "Подвешивает" программу и возвращает управление следующему оператору только после нажатия ввода...
Так что эта функция тут неприменима вообще...
DFooz
что делают эти коды я вроде понял...#8-сдвиг курсора влево, #32-удаление
Код
write(#8,#32,#8);


но что это за конструкция такая? blink.gif Или где об этом почитать можно?=)

ЗЫ: никто не напишет, где можно скачать книгу Полякова или бооольшую статью о ЕОЛН почитать? rolleyes.gif

Цитата
ps a EOLN у теб выполняется при первом вводе символа, так как после этого курсо указывает на конец строки, я так понимаю.

меня просто интересует, почему он вообще буквы выписывает пр ЕОЛН, ведь кода на вывод букв нет...
volvo
Цитата
ведь кода на вывод букв нет...
А тот код, который есть НЕ выполняется! Программа переходит в режим ожидания нажатия Enter-а! В это время все, что ты будешь нажимать, будет отображаться.

Цитата
что это за конструкция такая?

write(
  #8,  { переходим на один символ левее }
  #32, { "забиваем" то, что там было пробелом (фактически - удаляем последний символ С ЭКРАНА) }
  #8   { и опять возвращаемся назад, т.к. при выводе пробела курсор опять сдвинулся вправо }
);
DFooz
ааа, понятно, спасибо=)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.