            ПРИМЕРЫ ПРОГРАММИРОВАНИЯ В   Д С С П - 8 0

ПРИМЕР 1.
[F1 - вычисляет 3*X*X-4*X+2]
   : F1 [X] C [X,X] 3 * [X,3*X] 4 - [X,3*X-4]
        * [3*X*X-4*X] 2 + [3*X*X-4*X+2] ;

использование F1
* 25 F1 . D  вк    1777
* -9 F1 . D  вк     281


ПРИМЕР 2.
[F2 - вычисляет A2*X*X-A1*X+A0]
   : F2 [A0,A1,A2,X] C E4 E3  [A0,X,A1,X,A2] * + [A0,X,A2*X+A1]
        * + [A2*X*X-A1*X+A0] ;

использование F2
* 1 2 3 4 F2 . D  вк      57
* 1 2 -3 4 F2 . D  вк     -39


ПРИМЕР 3.
[FG - факториал N, если N>0, иначе 0]
   : FG [N] C   BR+ FCT T0   [N! или 0] ;
[FCT - факториал N]
   : FCT [N] C 1- C  DO P  D [N!] ;
   : P [F,K] E2 C2 [K,F,K] * E2 1- [F*K,K-1] ;

использование FG
* -5 FG . D  вк       0
* 5 FG  . D  вк     120


ПРИМЕР 4.
[CHRK - число вхождений данной литеры во введенном тексте]
   VAR CHR [код литеры]
   : CHRK [] CHRIN TEXT KOUT [] ;
[CHRIN - задать литеру, TEXT - ввод и обработка текста,
 KOUT - выдача числа вхождений]
   : CHRIN [] CR ."  Введите литеру - " TIB [код] ! CHR [] ;
   : TEXT [] CR ."  Введите текст " CR CR 0   RP G1  [K] ;
   : KOUT [K] CR CR ."Число вхождений '" CHR TOB ."' равно" . D [] ;
[G1 - обработка литеры]
   : G1 [K] TIB C 10 = EX+  CHR = IF+ 1+ [K1] ;

использование CHRK
* CHRK  вк
  Введите литеру - П
  Введите текст

ЭТО ПРИМЕР НА ИСПОЛЬЗОВАНИЕ ДССП ДЛЯ ОБРАБОТКИ ТЕКСТОВОЙ ИНФОРМАЦИИ  вк

Число вхождений 'П' равно      3
*
ПРИМЕР 5.
[SORT - расположить в порядке возрастания элементы вектора байтов X(1:N)]
   VAR N  10 ! N
   N BYTE VCTR X
   : SORT [] START N DO FORWD [] ;
   VAR J
[START - начальная установка, FORWD - шаг вперед, J - указатель компонент]
   : START [] 0 0 ! X  0 ! J [] ;
[X(0):=0, наименьшее возможное значение; J:=0]
   : FORWD [] PUSH [X(J),X(J+1)] > IF+ ADJUST !1+ J [] ;
[PUSH - взять очередную пару компонент. Если не упорядочена,
 то ADJUST - упорядочить]
   : PUSH [] J X [X(J)] J 1+ X [X(J),X(J+1)] ;
   : ADJUST [] J RP BACK [J] ! J [] ;
[BACK - шаг назад, упорядочивая]
   : BACK [] PUSH [X(J),X(J+1)] > BR+ SWAP EX !1- J [] ;
[если упорядочена, то SWAP - обменять значения компонент пары,
 иначе EX - выход]
   : SWAP [] PUSH [X(J),X(J+1)] POP [] ;
[POP - вернуть пару в обратном порядке]
   : POP [X(J),X(J+1)] J ! X J 1+ ! X [] ;

[USORT - использование SORT]
   : USORT [N] ! N ASSIGN SORT DISPLAY [] ;
[ASSIGN - присвоить значения элементам массива,
 DISPLAY - выдать упорядоченный массив на терминал]
   : ASSIGN [] CR ."Ведите" N . D ." элементов массива"
            CR  1 N DO PA D [] ;
   : PA [I] TIN C2 ! X 1+ CR [I+1] ;
   : DISPLAY [] CR ."Упорядоченный массив"   1 N DO PD D [] ;
   : PD [I] CR C X . D 1+ [I+1] ;

использование USORT
* 5 USORT  вк
Ведите    5 элементов массива
3  вк
7  вк
5  вк
22  вк
15  вк

Упорядоченный массив
      3
      5
      7
     15
     22
*


ПРИМЕР 6.
[НОД - наибольший общий делитель натуральных чисел M,N]
   : НОД [N,M]  RP ЦД  D [НОД] ;
[ЦД - от делимого и делителя к делителю и остатку]
   : ЦД  [делимое,делитель] E2 C2 / [делитель,частное,остаток]
         E2 D [делитель,остаток] C EX0 ;

использование НОД
* 48 72 НОД . D  вк      24
* 225 650 НОД . D  вк       25
*
ПРИМЕР 7.
[OCDECODE - выдает восьмеричный и десятичный коды вводимых литер]
   : OCDECODE []  RP PP  [] ;
   : PP [] CR SP TIB ." - "  C  B8 3 TON .", "  C  B10 3 TON 10 = EX+ [] ;

использование OCDECODE
* OCDECODE  вк
 1 -  61,  49
 A - 101,  81
вк -  12,  10
*


ПРИМЕР 8.
[ДИАЛОГ: вопрос - ответы - резюме]
B8
   : ДИАЛОГ [] ВОПРОС ОТВЕТЫ-РЕЗЮМЕ [] ;
   : ВОПРОС [] CR ."Как Вы предполагаете использовать ДССП?
  1. Для вычислений
  2. Для управления
  3. Для обработки текстов" [] ;
   : ОТВЕТЫ-РЕЗЮМЕ []  RP AR  [] ;
[AR - получение ответа и выдача резюме]
   : AR [] CR ."    Дайте номер ответа - " TIB
        BR  #1 R1   #2 R2    #3  R3    ELSE R4  [] ;
   : R1 [] CR ."ДССП не ориентирована на вычисления" EX [] ;
   : R2 [] CR ."Вы на верном пути" EX [] ;
   : R3 [] CR ."ДССП поможет Вам!" EX [] ;
   : R4 [] CR ."Такой ответ не предусмотрен" [] ;
B10

использование ДИАЛОГ
* ДИАЛОГ  вк
Как Вы предполагаете использовать ДССП?
  1. Для вычислений
  2. Для управления
  3. Для обработки текстов
    Дайте номер ответа - 7
Такой ответ не предусмотрен
    Дайте номер ответа - 3
ДССП поможет Вам!
*


ПРИМЕР 9.
[COPYT - копировать перфоленту по байт с кодом 10 включительно]
   : COPYT []  RP PRNB  [] ;
[PRNB - считать и отперфорировать байт, проверить окончание]
   : PRNB []  RDB C PNB 10 =  EX+ [] ;


ПРИМЕР 10.
[INSTR - ввести с перфоленты массив байтов STRING длины 80]
   80 BYTE VCTR STRING [объявление массива]
   : INSTR [] RDT [байт]  1 ! STRING  2 ' STRING 79 RDS [] ;
ПРИМЕР 12.
[PLOT - строит график функции F(X), F>0, от X1 до X2, X1<X2]
   : PLOT [ук.F,X1,X2] 1+ C2 -   DO LINE  DD [] ;
[LINE - строка для текущего значения X]
   : LINE [ук.F,X] CR #I TOB C C3 EXEC [ук.F,X,F(X)]
          1-   DO ."  "   #* TOB 1+  [ук.F,X+1] ;

использование PLOT при F=X*X+1, X1=-2, X2=5
* : F [X] C * 1+ [F(X)] ;  вк
* '' F -2 5 PLOT  вк
I        *
I  *
I*
I  *
I        *
I                  *
I                                *
I                                                  *
*


ПРИМЕР 13.
[BINPUT - ввод с терминала массива байтов, заданного указателем в стеке,
 длина не более 80]
   : BINPUT [адрес A(0)] CR 80 TIS [] ;

использование BINPUT
* 80  BYTE VCTR ROW  вк
* 0 ' ROW BINPUT  вк
1234567890!"#$%&'()0абвгдежзиклмнопрстуфхцчшщьыъэюя  вк
*

[BOUTP - вывод на терминал массива байтов, заданного указателем в стеке,
 длина не более 80]
   : BOUTP [адрес A(0),длина] CR ."содержимое массива: "  TOS [] ;

использование BOUTP
* 0 ' ROW 25  BOUTP   вк
содержимое массива: 1234567890!"#$%&'()0абвгд
*


ПРИМЕР 14.
[BF - выдает значение булевской функции F=X&^Y&^Z V ^X&Y&Z]
VAR X  VAR Y  VAR Z
   : BF [] INPUT CALC OUTPUT [] ;
[INPUT - ввод X,Y,Z; CALC - вычисление; OUTPUT - вывод результатов]
   : INPUT [] CR ."X=" TIB #0 - ! X
                 .", Y=" TIB #0 - ! Y
                 .", Z=" TIB #0 - ! Z [] ;
   : CALC [] X Y NOT & Z NOT & X NOT Y & Z & &0 [F] ;
   : OUTPUT [F] ."     F=" 1 TON [] ;

использование BF
* BF  вк
X=1, Y=0, Z=1    F=0
* BF  вк
X=0, Y=1, Z=1    F=1
*
ПРИМЕР 15.
[Q1 - пример использования программных и аппаратных прерываний.
 Программа завершается по прерыванию от клавиатуры]
B8
   INT TRAP EX! NOP   [программное прерывание EX! - конец работы]
   60 LINK EX!  [программное прерывание EX! связывается
                 с аппаратным по вектору 60]
   : Q1  [] EON EX! A   INTON  CR  RP NOP [] ;
[A - реакция на программное прерывание EX!]
   : A []  INTOFF  177562 @B D CR ." КОНЕЦ " [] ;
[INTON, INTOFF - открытие и закрытие прерываний от клавиатуры]
   : INTON  []  177560 6 !BI1 [] ;
   : INTOFF []  177560 6 !BI0 [] ;

использование Q1
* Q1  вк
 D
КОНЕЦ
*


ПРИМЕР 16.
[Q2 - пример использования программных и аппаратных прерываний.
 Программа постоянно отображает на терминале последний введенный символ,
 завершение программы по нажатию клавиши 0]
B8
   VAR KOD  #. ! KOD  [код символа]
   TRAP EX! NOP       [программное прерывание EX! - конец работы]
[REACT - обработка прерывания от клавиатуры]
   INT : REACT 177562 @B ! KOD  KOD #0 = IF+ EX! ;
   60 LINK REACT

   : Q2 []   EON EX! A   INTON   CR   RP WORK   [] ;
[WORK - выдача одного символа]
   : WORK [] 10000   DO NOP   KOD TOB SP [] ;
[A - реакция на программное прерывание EX!]
   : A []  INTOFF  CR  ." КОНЕЦ " [] ;
[INTON, INTOFF - открытие и закрытие прерываний от клавиатуры]
   : INTON  []  177560 6 !BI1 [] ;
   : INTOFF []  177560 6 !BI0 [] ;

использование Q2
* Q2  вк
. . . . .  1  1 1 1 1 1  A  A A A A A A  0
КОНЕЦ
*
ПРИМЕР 11.
Отладка программы вычисления многочлена с использованием редактора текстов.

* CAT <вк>                                            [распечатка каталога]

                    К А Т А Л О Г   Ф А Й Л О В

        МОЖНО ИСПОЛЬЗОВАТЬ ФАЙЛЫ С НОМЕРАМИ ОТ 2 ДО 43.

 3. Многочлен
 5. Инструкция
20. Отладчик

    ПОСЛЕ ИЗМЕНЕНИЯ КАТАЛОГА НЕ ЗАБУДЬТЕ ЗАПИСАТЬ ЕГО В 1 И 44 ФАЙЛЫ!

* KE IE 3 <вк>                           [очистка буфера и ввод 3-го файла]
строк      0      6                 [РТ сообщает, что в 3-ем файле 6 строк]
* Е <вк>                            [вход в режим экранного редактирования]

           [в режиме экранного редактирования работа по инструкции к РТ/Э/]
---------------------------------------------------------------------------
| строк  6                                                                |
| B10                                                                     |
| PROGRAM $POLYNOM                                                        |
|  [F - вычисление функции    F(X)=5X*X+3X+1  по заданному в стеке        |
|       значению  X, с выводом значения функции на терминал ]             |
| : F [X]  C 5 * 3 +  [X,5X+3] * 1+ [5X*X+3*X+1 .  D [] ;                 |
| UNDEF                                                                   |
| строк  6                                                                |
---------------------------------------------------------------------------
                                   [в буфере РТ находится данная программа]

* PF  <вк>        [выполним содержимое буфера, т.е. скомпилируем программу]
* 2 F <вк>                            [выполним процедуру F с аргументом 2]
                   [процедура выполнилась, но результат на экран не выдан.]
* ..  <вк>    1 поз.                               [посмотрим, что в стеке]
[      1 ]
                [итак: в стеке одна позиция - результат вычисления функции]
* D E  <вк>                      [очистим стек и посмотрим текст программы]
---------------------------------------------------------------------------
|. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .|
|. . . ОШИБКА В ПРГРАММЕ: ПРОПУЩЕНА СКОБКА, ЗАКРЫВАЮЩАЯ КОММЕНТАРИЙ. . . .|
|. . . . . . . . . . . . . . ИСПРАВИМ ЕЕ . . . . . . . . . . . . . . . . .|
|. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .|
---------------------------------------------------------------------------

                                                      [исправленный текст:]
---------------------------------------------------------------------------
| строк  6                                                                |
| B10                                                                     |
| PROGRAM $POLYNOM                                                        |
|  [F - вычисление функции    F(X)=5X*X+3X+1  по заданному в стеке        |
|       значению  X, с выводом значения функции на терминал ]             |
| : F [X]  C 5 * 3 +  [X,5X+3] * 1+ [5X*X+3*X+1] .  D [] ;                |
| UNDEF                                                                   |
| строк  6                                                                |
---------------------------------------------------------------------------

* O <вк> MX0  3          [вывод текста на старое место, можно   OE 3 <вк> ]
* PF  <вк>                                         [скомпилируем программу]
удалены п/с  $POLINO
* 2 F <вк>      27              [снова выполним процедуру F с аргументом 2]
* ..  <вк>   0 поз.              [на экран выдан результат; посмотрим стек]
*                                [в стеке ничего нет; программа отлажена]
PROGRAM $ПУТЬ B10
VAR I
VAR J
VAR S
VAR F
VAR N 10 ! N
N N 2 ARR WAY
0 !!! WAY
10 1 2 ! WAY
2  2 4 ! WAY
1  2 5 ! WAY
3  3 2 ! WAY
4  1 3 ! WAY
1 ! S  4 ! F

: PUT [] 0  S  RP PUT1  [] ВЫВОД [] ;
: PUT1 [...] ! I [..] I EX0    1 ! J  N DO PUT2 [..,J1,...,Jn] ;
: PUT2 [..] |I,J| IF+ PUT21  !1+ J [..,J?] ;
: PUT21 [..] |S,J| BR+ Меньше? Новый [..,J?] ;
: Меньше? [..] |S,I|+|I,J| |S,J| > IF0 Новый [..,J?] ;
: Новый [..] |S,I|+|I,J|  S J ! WAY  J [..,J] ;
: |S,I|+|I,J| [] |S,I| |I,J| + [новое расстояние от S до J] ;
: |S,I| [] S I WAY [текущее расстояние от S до I] ;
: |S,J| [] S J WAY [текущее расстояние от S до J] ;
: |I,J| [] I J WAY [расстояние от I до J] ;
: ВЫВОД ."
Минимальное расстояние от вершины" S 2 TON
." до вершины" F 2 TON ." равно" S F WAY 4 TON ;

: VARR 1 10 DO VARR1 D CR
."  I=" I 2 TON ."  J=" J 2 TON
."  S=" S 2 TON  ."  F=" F 2 TON .. ;
: VARR1 CR 1 10 DO VARR2 D 1+ ;
: VARR2 C2 C2 WAY 4 TON 1+ ;
'' VARR \SE
UNDEF
