Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2014, 14:41   #1
axpehuct123
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 12
По умолчанию Проблема с циклом repeat.

Суть задания такова, вводим число в 16-ной СС нужно перевести в 10-ную СС и должен быть применен цикл repeat, чтобы можно было вводить и переводить числа до тех пор пока не нажмем esc например. У меня все реализовано, но чтобы второе число после расчета первого, нужно дважды нажать enter, из-за чего работа не принимается. Есть предположение, что вся проблема в том, что я когда считываю число для перевода read(a,b) т.е "а" у меня десятки, а "b" еденицы. Потому что если ввести одноразрядное число, то такой проблемы нет. Что можно придумать по этому поводу?

Если нужно могу скинуть код программы.
axpehuct123 вне форума Ответить с цитированием
Старый 09.04.2014, 14:57   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Цитата:
Если нужно могу скинуть код программы.
Нужно. Обязательно. У нас тут просто все штатные телепаты в отпуске.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 09.04.2014, 15:05   #3
axpehuct123
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 12
По умолчанию

Код:
PROGRAM QQ;
USES CRT;
VAR 
  A, B : CHAR;
  S, T1, T2, T3 : STRING;    
  Z, X, C, Q, W, E, F : INTEGER;
BEGIN
  REPEAT
  CLRSCR;  
  WRITELN('Введите 2-ух разрядное число в шестнадцатеричной СС');
  READ(A,B);
  CASE A OF 
    '1' : Z := 16 * 1;
    '2' : Z := 16 * 2;
    '3' : Z := 16 * 3;
    '4' : Z := 16 * 4;
    '5' : Z := 16 * 5;
    '6' : Z := 16 * 6;
    '7' : Z := 16 * 7;
    '8' : Z := 16 * 8;
    '9' : Z := 16 * 9;
    'a' : Z := 16 * 10;
    'b' : Z := 16 * 11;
    'c' : Z := 16 * 12;
    'd' : Z := 16 * 13;
    'e' : Z := 16 * 14;
    'f' : Z := 16 * 15;
    '0' : Z := 16 * 0;
  END; 
  CASE B OF 
    '1' : X := 1;
    '2' : X := 2;
    '3' : X := 3;
    '4' : X := 4;
    '5' : X := 5;
    '6' : X := 6;
    '7' : X := 7;
    '8' : X := 8;
    '9' : X := 9;
    'a' : X := 10;
    'b' : X := 11;
    'c' : X := 12;
    'd' : X := 13;
    'e' : X := 14;
    'f' : X := 15;
    '0' : X := 0;
  END;
  WRITELN('  ');
  C := Z + X;
  STR(C, S);
  T1:=COPY(S,1,1);
  T2:=COPY(S,2,1);
  T3:=COPY(S,3,1);
  VAL(T1, Q, F);
  VAL(T2, W, F);
  VAL(T3, E, F);
  WRITELN('==========||==========');
  WRITELN('|  16CC   ||   10CC  |');
  WRITELN('|    ',a,b ,'   || ',c,'     |');
  WRITELN('==========||==========');
  WRITELN('|       "8421"       |');
  WRITELN('|                    |');
    CASE Q OF 
      1 : WRITE('|   0001');
      2 : WRITE('|   0010');
      3 : WRITE('|   0011');
      4 : WRITE('|   0100');
      5 : WRITE('|   0101');
      6 : WRITE('|   0110');
      7 : WRITE('|   0111');
      8 : WRITE('|   1000');
      9 : WRITE('|   1001');
      0 : WRITE('|   0000');
    END;    
    CASE W OF 
      1 : WRITE(' 0001');
      2 : WRITE(' 0010');
      3 : WRITE(' 0011');
      4 : WRITE(' 0100');
      5 : WRITE(' 0101');
      6 : WRITE(' 0110');
      7 : WRITE(' 0111');
      8 : WRITE(' 1000');
      9 : WRITE(' 1001');
      0 : WRITE(' 0000');
    END;    
    IF E>0 THEN 
    CASE E OF 
      1 : WRITE(' 0001   |');
      2 : WRITE(' 0010   |');
      3 : WRITE(' 0011   |');
      4 : WRITE(' 0100   |');
      5 : WRITE(' 0101   |');
      6 : WRITE(' 0110   |');
      7 : WRITE(' 0111   |');
      8 : WRITE(' 1000   |');
      9 : WRITE(' 1001   |');
      0 : WRITE(' 0000   |');
    END;
  WRITELN('   ');  
  WRITELN('==========||==========');
  
  WRITELN('Для выхода из программы дважды нажмите ESC');
  UNTIL READKEY = #27;
END.

P.S Да я знаю код новичковский и т.д, но программа работает идеально кроме цикла repeat, т.е два раза нужно жмакнуть кнопку, чтобы ввести след. число.



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 09.04.2014 в 15:17.
axpehuct123 вне форума Ответить с цитированием
Старый 09.04.2014, 16:20   #4
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Ну... Вы знаете, что именно делает read(a,b)? Думаю что нет. А делает она вот что: считывает 2 числа, разделенные пробелом. Т.е. "12" будет считано как А, после чего программа продолжит ждать ввод В. А вот "1 2" будет считано как А=1, В=2.
Дерзайте.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 09.04.2014, 16:23   #5
axpehuct123
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 12
По умолчанию

хм.. но если смотреть пошагово и проверить раздел локальных переменных, то А=1 и В=2 даже если вводить слитно
axpehuct123 вне форума Ответить с цитированием
Старый 09.04.2014, 16:58   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
то А=1 и В=2 даже если вводить слитно
да-да, Вы правы, в вашем случае именно так и есть (это исключительно потому что A и B типа char)!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2014, 06:33   #7
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Упс, не прав.

По поводу двойного нажатия - попробуйте readkey вынести из условия внутрь repeat`a с сохранением в новую переменную. И в условии сравнивать не readkey, а полученную переменную.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 10.04.2014, 08:33   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

axpehuct123, меня насторожила надпись:
Цитата:
Код:
WRITELN('Для выхода из программы дважды нажмите ESC');
Почему "дважды"? в TurboPascal достаточно одного нажатия Esc...
Вы программу в каком компиляторе Паскаля запускаете?!


Ну могу сказать, что проблема у Вас в том, что Вы смешиваете чтение с консоли с помощью read и с помощью readkey... Как это можно поправить можно будет сказать только когда Вы огласите используемый Вами компилятор паскаля...

Просто в качестве пробы. Попробуйте поставить ReadLn внутрь цикла.
Например,
Код:
....
  WRITELN('Введите 2-ух разрядное число в шестнадцатеричной СС');
  READ(A,B);
  READLN;
  CASE A OF 
.....


p.s. ну и Вы правы. Код у Вас очень "индусский".

Последний раз редактировалось Serge_Bliznykov; 10.04.2014 в 08:40.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2014, 08:34   #9
axpehuct123
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 12
По умолчанию

Все я проблему решил. Оказывается нужно было в самом конце добавить READLN только я не понял сути исправления. Может кто объяснить теперь? Единственное, что я знаю про него это то что оператор чтения информации, но что такого существенного он внес тут, что избавил от двойного нажатия?
axpehuct123 вне форума Ответить с цитированием
Старый 10.04.2014, 08:36   #10
axpehuct123
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 12
По умолчанию

Дважды нажимается потому что в abc паскале делаю, ибо он автоматически задерживает программу. Т.е один раз нажал esc тебе вывело Программа завершена нажмите любую клавишу... И потом второй раз esc окно закрывается.
axpehuct123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переделать код с циклом while-do на repeat-until(Pascal) Sting95 Помощь студентам 2 31.03.2014 17:21
помогите,пожалуйста решить с циклом repeat и while Жаннулька Паскаль, Turbo Pascal, PascalABC.NET 3 09.01.2014 23:22
Проблема repeat-y в Mozilla (22.0) PsiMagistr HTML и CSS 3 06.08.2013 14:28
Проблема с циклом For Mad_Homa Общие вопросы C/C++ 2 20.05.2013 00:57
проблема с repeat и until dimass68 Паскаль, Turbo Pascal, PascalABC.NET 2 21.04.2012 10:35