[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]