Forth
http://fforum.winglion.ru/

вопросы чайника, заход №2
http://fforum.winglion.ru/viewtopic.php?f=24&t=1444
Страница 2 из 3

Автор:  _Lacoste [ Вс май 02, 2010 18:35 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Благодарю, mOleg
Еще такой вопрос
Как в SP-Forth 4.20 обрабатывать в ввод с клавиатуры.
Тоесть программа просит ввести два или три числа, пользователь вводит их, а программа их уже обрабатывает по внутреней формуле

Например:
Введите число а:
>1
Введите число b:
>2
a + b = 3

Автор:  mOleg [ Вс май 02, 2010 21:04 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

_Lacoste писал(а):
Как в SP-Forth 4.20 обрабатывать в ввод с клавиатуры.

вобщем случае есть несколько вариантов:
1) система работает с файловыми потоками STDIN и STDOUT
2) есть набор слов: KEY KEY? EKEY
3) можно обабатывать события, но это уже при работе с ГУЕм

вобщем, самый простой вариант, использовать стандартную консоль системы,
более сложный вариант, но более фортеру привычный, использовать KEY KEY?
в еще более сложном случае нужно уже отрабатывать события окошек и вообще возиться с графикой

Автор:  Гость [ Вс май 02, 2010 22:45 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

_Lacoste писал(а):
Благодарю, mOleg
Еще такой вопрос
Как в SP-Forth 4.20 обрабатывать в ввод с клавиатуры.
Тоесть программа просит ввести два или три числа, пользователь вводит их, а программа их уже обрабатывает по внутреней формуле

Например:
Введите число а:
>1
Введите число b:
>2
a + b = 3


Можно использовать слова ACCEPT и >NUMBER

Автор:  Гость [ Вс май 02, 2010 23:13 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

_Lacoste писал(а):
Благодарю, mOleg
Еще такой вопрос
Как в SP-Forth 4.20 обрабатывать в ввод с клавиатуры.
Тоесть программа просит ввести два или три числа, пользователь вводит их, а программа их уже обрабатывает по внутреней формуле

Например:
Введите число а:
>1
Введите число b:
>2
a + b = 3

Код:
CREATE buffer: 80 ALLOT
: a+b= ." Введите число a:" CR
       ." >"
       buffer: 80 ACCEPT buffer: SWAP EVALUATE
       ." Введите число b:" CR
       ." >"
       buffer: 80 ACCEPT buffer: SWAP EVALUATE
       + ." a+b=" .
       CR
;
a+b=


Еще >NUMBER cм

Автор:  Гость [ Пн май 03, 2010 00:00 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

_Lacoste писал(а):
Благодарю, mOleg
Еще такой вопрос
Как в SP-Forth 4.20 обрабатывать в ввод с клавиатуры.
Тоесть программа просит ввести два или три числа, пользователь вводит их, а программа их уже обрабатывает по внутреней формуле

Например:
Введите число а:
>1
Введите число b:
>2
a + b = 3


Немного лучше
Код:

: a+b= ." Введите число a:" CR
       ." >"
       PAD DUP 80 ACCEPT  EVALUATE
       ." Введите число b:" CR
       ." >"
       PAD DUP 80 ACCEPT  EVALUATE
       +
       ." a+b=" .
;
a+b=



Автор:  mOleg [ Пн май 03, 2010 11:19 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Гость писал(а):
Можно использовать слова ACCEPT и >NUMBER

это и есть использовать STDIN поток.
преимущество - можно вставлять по ctrl+insert значение, а минус в том, что ошибки придется обрабатывать.
А по KEY можно просто не давать ввести нецифровой символ (если что читайте Броуди "Thinking forth" ).

Автор:  WingLion [ Пн май 03, 2010 14:37 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Обсуждение про безопасность форт кода выделена в отдельный топик.

Автор:  Alexander [ Пн май 03, 2010 15:39 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Конечно не в курсе я, про СПФ, но вот вам на закуску, только целые числа размерностью одна ячейка (обычно 16/32 бита)
Код:
: ?INT-INPUT (  - n f )
   PAD 16 BLANK  PAD 12 ACCEPT  PAD SWAP NUMBER?  DUP 2 = IF 2NIP THEN 1 = ;
: Input ( - n )
      BEGIN ?INT-INPUT UNTIL ;
: MAIN
  CR ." A=" INPUT
  CR ." B=" INPUT
  CR ." A+B=" +
  . ;

Обязательно перед вводом чистить буфер ввода PAD, но как уже замечено лучше выделять отделный буфер для области ввода, если он длинее чем 256/512/1024 символов (зависит от системы).

Автор:  Alexander [ Пн май 03, 2010 17:22 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Теперь я прикинусь "чайником" и буду "кипеть" .
покажите пример использования структуры catch .. throw.
спасибо, добрые люди

Автор:  mOleg [ Пн май 03, 2010 17:31 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Alexander писал(а):
покажите пример использования структуры catch .. throw.


: some-thing ." может быть два варианта развития событий:" IF ." без ошибки" ELSE ." c ошибкой" 123456 THROW THEN ;

: some-other ['] some-thing CATCH IF ." ошибочка вышла: " . THEN ;

1 some-other
0 some-other

Автор:  Alexander [ Пн май 03, 2010 17:55 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Еще раз спасибки.
вот что хотел показать, вроде удалось
Код:
: ?INT-INPUT (  - n f )
   PAD 16 BLANK  PAD 12 ACCEPT  PAD SWAP NUMBER?  DUP 2 = IF 2NIP THEN 1- THROW ;
: Input ( - n )
      BEGIN
         ['] ?INT-INPUT CATCH DUP IF CR ." INCORRECT" 1 THROW THEN
     0= UNTIL ;
: MAIN
  BEGIN CR ." A=" ['] INPUT CATCH 0= UNTIL
  BEGIN CR ." B=" ['] INPUT CATCH 0= UNTIL
  CR ." A+B=" +
  . ;

Еще можно поиграться )

Автор:  mOleg [ Пн май 03, 2010 18:12 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

а вообще, ребяты, лучше думать не только о себе, и создавать для нового вопроса новую тему. Например, а как же ловятся исключения? или: как ввести число?

Автор:  Гость [ Пн май 03, 2010 21:02 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Гость писал(а):
[quote="Alexander]
Еще можно поиграться )[/quote]
Код:
REQUIRE NUMBER?   ~mak\lib\fpcnum.f

: ?INT-INPUT (  - n f )
   PAD 16 ERASE 
   PAD DUP 12 ACCEPT  NUMBER? INVERT THROW 
;
: INPUT ( - n )
      BEGIN
         ['] ?INT-INPUT CATCH DUP IF CR ." INCORRECT" 1 THROW THEN
      0= UNTIL ;
: MAIN
  BEGIN CR ." A=" ['] INPUT CATCH 0= UNTIL
  BEGIN CR ." B=" ['] INPUT CATCH 0= UNTIL
  CR ." A+B="
  D+
  D.
;
MAIN
[/quote]


Если ввести больше 12 цифр - 1000000000000 то почему работает неправильно?

Автор:  mOleg [ Пн май 03, 2010 21:53 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

Гость писал(а):
Если ввести больше 12 цифр - 1000000000000 то почему работает неправильно?

потому что используется NUMBER? скорее всего возвращающий то число одинарной длины, то число двойной длины.
это как раз один из тех моментов, на который намекал WingLion ;)

P.S.
вы бы все-таки входили как пользователь.

Автор:  Alexander [ Вт май 04, 2010 13:01 ]
Заголовок сообщения:  Re: вопросы чайника, заход №2

проблема в сворачиваниии числового диапазона в кольцо.
Если вы действительно хотите оперировать какими-то числами в произвольном диапазоне и не думать ни о чем, то придется посмотреть что делали люди до того. Например, FSL(Forth Scientific Library) содержит что-то подобное в строках файла big.f, или взять полиномиальное представление чисел с заданным основанием системы счисления.
Код:
\ вводим число, по окончании ввода на вершине стека число двойной размерности
: ?INPUT (  -  | d )
    PAD 23 BLANK            \ заполнять обязательно пробелами, и ничем иначе
    PAD 21 ACCEPT           \ собственно ввод
    PAD SWAP NUMBER?        \ преобразование строку ввода в число
    1- ?DUP IF  1- THROW    \ генерируем исключение в случае ошибки преобразования
    ELSE  S>D  THEN ;       \ если число одинарной размерности, то его преобразуем

\ обработчик ввода   
: (INPUT) ( - d )
    ['] ?INPUT CATCH         \ защищаем ввод, так как неизвестно, что может твориться в ЭВМ
    ?DUP IF CR ." INCORRECT" \ уведомляем пользователя о неправильном вводе
            THROW  THEN ;    \ заставляем вызвавшее слово, повторить процедуру сначала

: INPUT ( xt - d )   
    BEGIN
        DUP EXECUTE         \ отображаем приглашение ввода
        ['] (INPUT) CATCH
    0= UNTIL  ROT DROP ;    \ удаляем токен-указатель на приглашение ввода

\ различные сообщения выводимые на экран
: ."A="  CR ." A=" ;
: ."B="  CR ." B=" ;
: ."A+B="  CR ." A+B=" ;

\ собственно тело программы
: MAIN
   ['] ."A=" INPUT
   ['] ."B=" INPUT
   ."A+B=" D+ D. ;

вот такой вот получился код, преследуя универсальность он сильно раздулся
Попробуй использовать это определение, может имелось ввиду особенность работы слова преобразователя, сообщая что не так числа преобразуются:
Код:
: ?INPUT (  -  | d )
    PAD 22 BLANK            \ заполнять обязательно пробелами, и ничем иначе
    PAD 21 ACCEPT           \ собственно ввод
    [CHAR] , OVER PAD + C!  \ допишем знак для нужного преобразования
    PAD SWAP 1+ NUMBER?     \ преобразование строку ввода в число
    2- THROW ;              \ теперь это выход с уведомлением о том, как прошло преобразование

Страница 2 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/