IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Как обозначить цифры?, Помогите плиз решить вопрос!
Lauri
сообщение 8.01.2006 10:55
Сообщение #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.

 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 11)
volvo
сообщение 8.01.2006 11:16
Сообщение #2


Гость






Цитата
(мне надо сделать так, чтобы можно было ввести только цифры, а при введении букв выводилось сообщение об ошибке)
Цифры или числа?

Для чисел уже выкладывалось... Цикл Repeat, поиском пользуйся...
 К началу страницы 
+ Ответить 
Lauri
сообщение 9.01.2006 16:08
Сообщение #3


Гость






В этом примере рассматриваются только числовые значения от 0 до 365, а мне надо как-то обозначить английский алфавит от A до Z и сделать так, чтобы когда вводишь "456FR3" или "FGHFGH" выводилось сообщ. об ошибке, а обычные числа ( от -999999999 до 999999999) проходили процедуру дальнейшей обработки... причём я пытался использовать repeat, но там и так есть repeat и совместное использование двух операторов негативно сказывается на работе программы... (она ничего не пересчитывает).. вообще не знаю что делать...((
 К началу страницы 
+ Ответить 
volvo
сообщение 9.01.2006 16:17
Сообщение #4


Гость






Цитата
а мне надо как-то обозначить английский алфавит от 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
сообщение 9.01.2006 16:52
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 136
Пол: Мужской
Реальное имя: Александр

Репутация: -  -2  +


А вот, если что, процедура, которая осуществляет ввод значения (от -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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.01.2006 17:14
Сообщение #6


Гость






    GotoXY(WhereX-1,WhereY);
    Write(' ');
    GotoXY(WhereX-1,WhereY);

blink.gif Зачем же так жестоко? Так не проще?
Write(#8#32#8);
 К началу страницы 
+ Ответить 
Shura
сообщение 9.01.2006 17:25
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 136
Пол: Мужской
Реальное имя: Александр

Репутация: -  -2  +


good.gif Точно!


--------------------
Старайтесь восполнять пробелы в области незнания! ;-D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lauri
сообщение 10.01.2006 20:38
Сообщение #8


Гость






Но как же совместить эту процедуру с моей программой?.. Мои попытки заканчивались тем, что введя цифры, получалась пустая строка, а далее - обычный ход программы...
А вариант, предложенный Volvo работает у меня некорректно, я грешу на то, что используется repeаt внутри repeat...
А вот если так, к примеру:

Код

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

или

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


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

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

З.Ы. Тока не смейтесь плиззз, да, я ламер в этом деле... надеюсь что в скором будущем перестану им ытьsmile.gif
 К началу страницы 
+ Ответить 
volvo
сообщение 10.01.2006 20:41
Сообщение #9


Гость






Цитата
А вариант, предложенный Volvo работает у меня некорректно
Полностью ВСЮ свою программу приведи (не кусками, а всю)... И заодно, те данные которые ты вводишь, и ЧТО ТЫ ХОЧЕШЬ ПОЛУЧИТЬ... Сказать "не получается" или "некорректно" очень просто, ты ДОКАЖИ, что это действительно некорректно...
 К началу страницы 
+ Ответить 
Lauri
сообщение 10.01.2006 21:09
Сообщение #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 ... wacko.gif
 К началу страницы 
+ Ответить 
volvo
сообщение 10.01.2006 21:26
Сообщение #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.
Вот ... Проверь.
 К началу страницы 
+ Ответить 
Гость
сообщение 10.01.2006 21:39
Сообщение #12


Гость






Спасибо ОГРОМНОЕ, теперь всё работает как надо! ))
Как хорошо что есть ещё добрые люди! Не знаю как отблагодарить! =)
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 29.07.2025 15:31
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"