[an error occurred while processing this directive]
.сс
.шп6
13 ПРОЦЕДУРЫ
.шп14
13.1 Создание программы
.шп0
Если у нас есть идея для программы, мы должны думать в двух направлениях:
- Что мы хотим делать?
- Как нам это делать?
Для этого необходимо разделить программу на отдельные компоненты, например: заголовок, указания, показы, вводы и ответы.
Затем мы решаем, как мы можем заставить компьютер сделать это,
На наше мышление влияет язык, которым мы пользуемся, т.е. идеи которые мы можем выразить. Какой смысл иметь хорошую идею, если мы не можем вырзить ее словами? Язык должен быть частью решения, а не частью проблемы.
В Комале есть способ помочь разбить программу на отдельные этапы: для этого можно использовать процедуры.
Процедура - это комплект програмных команд, которые определяют какое-либо задание. Процедуру можно ввести в действие, вызвав ее название.
Например, в программе могут быть такие строки:
110 assign_variables 120 select_background_colour 130 select_teht_colour
Каждая строка указывает на то, что необходимо выполнить процедуру. Названия процедур обычно объясняют то, что эти процедуры будут делать. Названия должны подчиняться тем же правилам, что и переменные.
Вот очень простой пример того, что может содержать процедура select_background_colour (выбрать цвет фона):
1000 PROC select_background_colour 1010 CLS 1020 PRINT TAB( 10,5);"Background Colour" 1030 PRINT TAB( 13,10);"0. Black" 1040 PRINT TAB( 13,12);"1. Red" 1050 PRINT TAB( 13,14);"2. Green" 1060 PRINT TAB( 13,16);"3. Yellow" 1070 PRINT TAB( 10,20); 1080 INPUT "Your Choice 0-3 > ":choice 1090 COLOUR 128 + choice 1100 END PROC select_bakground_colour
Процедура начинается ключевым словом PROC и названием. Процедура кончается ключевыми словами END PROC и названием. Между END, PROC и названием процедуры должны быть пробелы.
Когда процедура вызывается, программа переводится в эту процедуру, а затем выводится из нее. Одна и таже процедура может быть вызвана в программе несколько раз.
Процедура имеет только одну входную точку и только одну выходную. Программа переводится в процедуру в ее начале и выводится в конце. Когда программа выводится для показа на экране команды внури процедуры отделяются двумя пробелами.
После END PROC нет необходимости ставить название процедуры. Оно будет поставлено автоматически. Это практически помогает, когда названия процедур, стоящие после END PROC, особенно длинные.
Програмные строки внутри процедур выполняются только, когда вызывается название процедуры.
.шп14
13.2 Пример программы
.шп1
Если мы хотим создать программу, котоая проэкзаменует время нашей реакции, нижеследующее можно рассматривать, как этапы программы.
1. Выбор режима.
2. Указания показа.
3. Пауза длиной в произвольный отрезок времени.
4. Показ символа и установка времени на 0.
5. Измерение времени реакции.
6. Показ результата.
При создании программы нужно хорошо представлять себе что программа должна делать.
Разбив программу на маленькие этапы, можно легко справиться с каждым из них, если записать их как процедуры.
Это образует так называемый "анализ сверху вниз". В свою очередь каждый этап можно разбивать на более простые шаги, пока мы не увидем как выполнять эти простые шаги.
Ниже приведен пример программы таймера реакции, которая демонстрирует использование процедур. В программе часто используется символ комментария // для того, чтобы разбить программу на секции и добавить комментарии.
Когда пограмма выводится для показа, она должна содержать достаточное количество комментариев, чтобы можно было ясно видеть структуру программы и то, что происходит. Хотя это и занимает много памяти компьютера, но ее имеется достаточно и лучше писать хорошие ясные программы, чем непонятные, занимающие мало памяти. Хорошо структурированную программу с понятными комментариями проще писать и ее можно на много быстрее исправить, если в ней будут ошибки.
В программе используется команда *fx. Эти команды контролируют многие внутренние свойства и эффекты ОС ОНИКС. Это свойства машины, а не Комала. Эти команды описаны в данном руководстве в секции Команды *fx Часть III.
Введите auto и следующую программу. (Так как в ней использован оператор TIME, она будет работать только с модулем RS232 или часов.)
100 // REACTION TESTER 110 // 120 MODE := 6 130 // 140 Main program structure 150 // 160 display_instructions 170 pause 180 show_symbol 190 measure_responce_time 200 display_result 210 // 220 // That's all! 230 // Now for the procedures. 240 // 1000 PROC display_instructions 1010 PRINT TAB( 3,5);"Press SPACE when you see a *" 1020 END PROC display_instructions 1030 // 1100 PROC pause 1110 delay := RND( 1500,3500) 1120 FOR pause := 1 TO delay DO 1130 NULL 1140 NEXT pause 1150 END PROC pausE 1160 // 1200 PROC show_symbol 1210 PRINT TAB ( 18,12);"*" 1220 TIME := 0 1230 END PROC show_symbol 1240 // 1300 PROC measure_responce_time 1310 // next line removes any stored key presses 1320 *FX 21,0 1330 responce¤ *- GET¤ 1340 wait := TIME 1350 END PROC measure_responce_time 1360 // 1400 PROC display_result 1410 PRINT TAB( 5,21);"You reacted in "; 1420 PRINT ;wait / 100;" seconds" 1430 END PROC display_result 1440 // 1500 END
Запустите программу, но еще не вводите new.
Введите LIST ,999
Обратите внимание, что с помощью чисел от 1000 и выше мы легко отделяем структуру основной программы от процедур.
Примечание: некоторые пункты в последующих секциях составлены для использования в данной программе.
.шп14
13.3 Изменение режима
.шп0
Слово MODE не должно присваиваться строке программы внутри процедуры. Когда встречается такая строка, на экране появляется сообщение об ошибке Not allowed (не разрешено).
.шп14
13.4 Очистка
.шп0
Если вы нажмете РЕД или программа встретит STOP внутри процедуры, то вам не разрешается изменять режим, пока вы не введете CLEAR. Это так сделано, чтобы с вводом CONT можно было продолжить программу, если это потребуется. Команда убирает из памяти компьютера все переменные пользователя, за исключением резидентных целых постоянных от а# до z#.
.шп14
13.5 EDIT (редактровать)
.шп0
Введите
edit
EDIT - это команда для вывода программы для просмотра. Ее можно использовать с номерами, чтобы определить пределы показываемой части программы, например:
EDIT 1100,1150 покажет строки от 1100 до 1150 включительно. EDIT 1340 покажет только строку 1340. EDIT 1000, покажет все строки от 1000 и выше.
Введите
EDIT ,210
должна показать все строки до 210. Обратите внимание на EXЕC.
.шп14
13.6 EXЕC (выполнить)
.шп0
Технически указание EXEC procedure_name должно использоваться для вызова и запуска процедуры. Все EXEC в программе обычно видны когда используется EDIT.
EXЕC вставляется автоматически при вводе строки. Однако, при выводе программы для просмотра EXЕC не выводится. Если вы введете EXЕC в строку программы, то это EXЕC всегда будет появляться при просмотре.
.шп14
13.7 Просмотр более длинных программ.
.шп0
Если в программе больше строк, чем может вместить экран, то при полном ее просмотре вы можете прочитать только ее последние строки. Первые строки можно просмотреть с помощью команды LIST ,240, или нажимая клавишу РЕД.
Есть еще один способ просмотреть - это сделать паузу во время вывода. Нажмите клавишу УПР и не отпуская ее, нажмите клавишу N и отпустите их. Когда вы начнете просматривать программу, вы увидете, что будет показана только одна "страница". Чтобы просмотреть следующую страницу, нужно нажать один раз любую клавишу. Попробуйте сделать это.
Если вы хотите остановить просмотр на какой-либо определенной странице, вы можете использовать клавишу РЕД.
Чтобы выйти из режима страничного просмотра, можно нажать клавишу УПР и, удерживая ее, нажать О, а затем отпустить обе клавиши.
.шп14
13.8 Использование процедур в прямом режиме
.шп0
При условии, что какая-либо программа была только что просмотрена, исправлена или запущена, то, находясь в прямом режиме, из этой программы можно вызвать любую процедуру.
Если у вас в компьютере все еще есть программа таймера реакции, то введите
list
cls
а затем
show_symbol
чтобы выполнить процедуру.
.шп14
13.9 Итоговые упражнения
.шп0
Ответы находятся в главе 43.
1. Какие поправки вы бы сделали в программе таймера реакции из секции 13.2, чтобы в случайной позиции в любом ряду от 6 до 20 появилась *?
2. Какие дальнейшие поправки нужно сделать, чтобы в режиме 1 в красном цвета появилась *, а в желтом - указание?
3. Соберите следующие процедуры в последовательность, которая удовлетворяла бы тестовой программе.
display_response
mark_answer
assign_variables
ask_question
disrlay_tnstructions
input_answer
4. Какая команда выведет для показа программу без названия и при этом будет показана команда EXЕC?
5. Какие переменные не уничтожаются при вводе CLEAR?
6. Если программа прерывается в средине процедуры, какую команду надо использовать для изменения режима?
7. Если вы используете УПР N для просмотра в страничном режиме, а затем вводите list, как можно просмотреть следующую страницу?
8. Как выйти из страничного режима?
9. Как можно прервать и задержать просмотр?
Что не правильно в следующих строках программы?
10. 200 proctest
11. 200 PROC EDIT
12. 300 endproctest
.шп14
13.10 Выводы
.шп0
1. Процедура вводится в действие вызовом ее назввания или EXEC, за которым следует название процедуры.
2. Когда вызывается часть программы, перед процедурой появляется EXEC, но не появляется ее название.
3. Процедура определяется между строками с PROC и END PROC, за которыми следует название процедуры.
4. Не нужно ставить название процедуры после END PROC. Оно ставится автоматически.
5. Есле программа прерывается на средине прцедуры, то перед присвоением нового режима нужно ввести CLEAR, при условии, что не используется другая процедура.
6. MODE не может быть присвоен внутри процедуры, если только не используется второй процессор.
7. УПР N и УПР О можно использовать во время просмотра программы для входа в страничный режим и выхода из него.
8. Процедуру можно вызвать в прямом режиме при условии, что ее только что просмотрели, исправили или запустили.
.сс
.шп6
14 Хранение, загрузка и запуск программ
.шп0
Если вы напечатали длинную прогрмму, как например, таймер реакции в главе 13, то вам, возможно захочется ее сохранить для использования в будущем.
.шп14
14.1 Прсомотр каталогов
.шп0
Команда *CAT является командой для подачи на экран каталога программ, которые имеются на вашей дискетте. Эту программу можно использовать, если вы хотите посмотреть сохранились ли на ней программы.
.шп14
14.2 Имена файлов
.шп0
Имя файла используется для любой прогрммы или группы данных, которые находятся на вашей дискетте. Имя файла - это название программ, под которым они сохраняются или вводятся. В дисковой системе имя файла может иметь десять букв. Оно не должно содержать пробелов и знаков препинания.
.шп14
14.3 Сохранение на дискетте
.шп0
(Если ваш диск не расформатирован, обратитесь к руководству по ОС ОНИКС).
Вставьте дискетту в дисковод.
Введите
*cat
На экране должен появиться каталог записанных на дискетте программ.
Введите
save Title
Title - файловое имя программы.
Дальнейшее указание *cat покажет, что название программы находится в каталоге программ на дискетте.
.шп2
Без предупреждения
.шп0
Если вы выбрали файловое имя, которое в вашем каталоге уже существует, то при записи новой программы с этим же именем вы потеряете оригинал. При этом не появляется никакого предупреждающего сообщения о том, что такое имя существует, если только файл не защищен. Подробную информацию о закрытии и открытии файла можно найти в руководстве по ОС ОНИКС в секции *ACCESS.
.шп14
14.4 Загрузка с диска
.шп0
Вставьте дискетту, затем
load Title
где Title название программы.
Можно запустить программу.
.шп14
14.5 Уничтожение файла на дискетте
.шп1
Команда delite Title удалит программу с названием Title из каталога программ, если программа не защищена.
.шп14
14.6 Комбинированая загрузка и запуск
.шп0
Команда
run Title
загрузит и запустит программу с названием Title.
Эта команда эквивлентна команде CHAIN "Title" в BBC BASIC.
.сс
.шп6
15 Решения
.шп0
В этой секции мы узнаем о ключевом слове IF.
.шп14
15.1 Выполнять, повторять и решать
.шп0
При составлении прогрммы на самом низком уровне мы имеем три основных блока. Во первых, есть простые операторы типа PRINT или INPUT. Во вторых, имеется возможность повторять несколько операторов, в циклах FOR... NEXT... . В третьих, основной чертой компьютера является способность решать, выполнять или нет, какой-либо комплект операторов.
Все эти три особенности могут быть использованы для формирования процедур, которые охватывают основную структуру программы.
.шп14
15.2 Отношения
.шп0
Решение должно основываться на условии, которое может быть верным или ложным. Когда мы пишем программу, мы не знаем, какое будет принято решение, но наша программа должна быть готова к различным возмжностям. Условие - это отношение между двумя величинами. Можно сравнивать многими способами. Используются следующие символы.
Символ Значение = то, что слева от символа равно тому, что справа. Заметьте, что символ представляет равенство, и поэтому перед ним нет : . < То, что слева символа меньше того, что справа. > То, что слева символа больше того, что справа. <= То, что слева символа меньше или равно тому, что справа. >= То, что слева символа больше или равно тому, что справа. <> То что слева символа не равно тому, что справа IN Строка слева от символа содержится в строке справа от символа.
.шп14
15.3 Использование условий.
.шп0
Введите прямую комнду
if 2 < 3 then print "I believe that"
С помощью клавиш со стрелками и КОПИЯ введите
if 2 > 3 then print "I believe that"
В этот раз ничего не должно было случиться, потому что условие 2 > 3 - ложное и поэтому компьютер не выполнил команду PRINT.
.шп1
Когда нужно выполнить только одно действие, можно испльзовать одиночную строчную комнду IF... THEN... .
.шп0
А сейчас, используя копирующие возможности с каждым из символов
>= <= и <>
введите аналогичные команды IF... THEN.
.шп14
15.4 Сравнение строк
.шп0
Все символы известны компьютеру, как числа. Это значит, что мы можем сравнивать буквы таким же способом, используя отношения <,> и = , чтобы определить появляется ли один символ раньше другого, или нет.
Компьютер сравнивает буквенные коды ASCII, которые организованы в алфавитном порядке. Буквы нижнего регистра имеют более высокие коды ASCII, чем заглавные буквы.
Введите
if "AAA" < "AAB" then print "True"
и
if "AAA" < "AAa" then print "True"
и
if "TOM" < "TIM" then print "True"
.шп2
Использование IF... THEN... в программе
.шп0
Введите следующую программу
10 mode :=6 20 print ''"Intelligence Test" 30 pintt ''"In which city is the Tower of London?"'' 40 input "Your answer is > ":reply¤ 50 print ''"You have "; 60 if reply¤ <> "LONDON" then print "not"; 70 print "passed the test."'
А сейчас запустите несколько раз программу с правильными и неправильными ответами.
.шп2
Верхний и нижний регистры
.шп0
Затем снова запустите программу, в которой ответ - "London".
Строка "London" не та же, что "LONDON" и компьютер сочтет ее неправильной.
.шп2
Опускание THEN
.шп0
Измените строку 60, оставив ее без THEN
60 IF reply¤ <> "LONDON" PRINT "NOT";
А теперь просмотрите строку 60 с помощью ввода list 60
Обратите внимание, что THEN вставлено в строку.
.шп1
При вводе указания IF мохно опускать THEN. Оно будет вставлено автоматически.
.шп0
.шп14
15.5 Длинная форма IF
.шп0
Когда нам необходимо следовать за несколько результатами, мы должны использовать другую форму IF. Нам не разрешается иметь несколько отдельных команд на одной строке, поэтому команды, которые должны выполняться, не могут появиться после этого THEN. Им даются отдельные строки, при этом используется маркер END IF, чтобы показать, что список закончен. END IF имеет свою собственную строку. Смотрите строки от 1310 до 1340 на следующей странице.
Введите new и следующую программу.
100 // Five question test 110 // 120 correct := 0 130 MODE :=6 140 FOR question := 1 TO 5 DO 150 make_up_question 160 ask_question 170 take_in_answer 180 mark_and_respond 190 NEXT question 200 give_score 210 // 1000 PROC make_up_question 1010 first := RND( 2,9)// random number 2 to 9 1020 second := RND( 2,9) 1030 answer := first * second 1040 END PROC make_up_question 1050 // 1100 PROC ask_question 1110 CLS 1120 PRINT TAB( 5,5);"What is "; 1130 PRINT ;first ;" times ";second"; ?" 1140 END PROC ask?question 1150 // 1200 PROK take_in_answer 1210 PRINT TAB( 5,8); 1220 INRUT "Your answer > ":reply 1230 END PROC take_in_answer 1240 // 1300 PROC mark_and_respond 1310 IF reply = answer THEN 1320 PRINT 'TAB( 5);"Correct" 1330 correct :+1 1340 END IF 1350 IF reply <> answer THEN PRINT 'TAB( 5);"Sorry, it should be ";answer 1360 PRINT 'TAB( 5);"Press Space Bar" 1370 pause¤ := GET¤ 1380 END PROC mark_and_respond 1390 // 1400 PROC give_score 1410 CLS 1420 PRINT TAB( 5,5);"You got "; 1430 PRRINT ;correct;" right out of 5." 1440 END PROC give_score 1500 END
Просмотрите программу и обратите внимание на то, что команды на строках 1320 и 1330 выделены двумя дополнительными позициями.
Запустите программу и еще раз просмотрите ее.
.шп14
15.6 ELSE
.шп0
В строке 1350 мы используем тест противоположный тесту в строке 1310. Команды являются альтернтивми. Мы можем сделать это более ясным с помощью ключевого слова ELSE.
Сделайте следующие изменения и дополнения.
1340 else 1350 print 'tab(5);"Sorri, it should be ";answer 1355 end if
Просмотрите программу. Обртатите внимание, что ELSE встречается в строке с IF и в строке END IF и, что строки между ELSE и END IF выделяются двумя позициями.
Запустите программу, чтобы показать, что она все еще работает.
.шп14
15.7 Итоговые упражнения
.шп0
Что неправильно в командах IF в следующем:
1.
190 IF reply = answer THEN 200 PRINT "Correct" 210 correct :+1 220 endif
2.
180 IF reply < answer THEN PRINT "Too low" 190 wrong :+ 1 200 END IF
3.
220 ELSE PRINT "Wrong"
4.
170 IF reply¤ = answer¤ THEN PRINT "correct" 180 ELSE 190 PRINT "Wrong" 200 END IF
5.
150 IF reply > 9 THEN 160 PRINT "Too high" 170 END IF 180 ELSE 190 PRINT "OK"
6.
140 IF this = that THEN PRINT "Correct" 150 END IF
В последующих заданиях программы-ответы должны быть короткими и им не нужны процедуры.
7. Напишите программу для ввода двух строк и распечатайте их в алфавитном порядке.
8. Расширьте программу в вопросе 7 так, чтобы слова before или after между словами так, чтобы они соответствовали логике, пример
CHICKEN before EGG (цыпленок до яйца)
NIGHT after DAY (ночь после дня)
Ответы содержатся в главе 43.
.шп14
15.8 Выводы
.шп0
1. Следующие отношения могут быть использованы могут быть использованы в условных операторах:
= равно
< меньше
<= меньше или равно
> больше
>= больше или равно
<> не равно
IN - одна строка, содержащаяся в другой
2. Когда выполняется одиночное укзание и, если определенное условие верное, Можно использовать одну строку. Она примет следующий вид
IF... THEN...
если THEN было опущено, оно будет вставлено автоматчески.
3. Когда выполняются несколько указаний и, если условие верное, то нужно использовть многостроковую структуру IF. Она примет вид
IF... THEN Command 1 Command 2 и т. д. END IF
Опущенное THEN будет вставлено.
END IF, между которыми должен быть пробел, отмечают конец операторов, которые должны быть выполнены, если условие удовлетворяется.
Все операторы внутри этой структуры выделяются двумя позициями
Строки с несколькими операторами не разрешены.
4. Когда вполняется комплект альтернативных операторов, и если условие не удовлетворяется , то можно использовать оператор ELSE. ELSE должно иметь свою собственную строку. Одиночная строка IF.. THEN не может предшествовать ELSE. Оператор ELSE появляется на строке с IF и END IF.
IF... THEN ... ELSE ... END IF
.ст комал8
[an error occurred while processing this directive]