ПРИМЕРЫ ПРОГРАММИРОВАНИЯ В Д С С П - 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