Текст
                    

GUNPOWDER

GUNPOWDER
GUNPOWDER ОСБАИБАЕММИКРО КОМПЬЮТЕР
GUNPOWDER I YOUR BASIC Gaby waters and Nick cutler (ЛЬогие. Publishing Lisa Watts and Les Howarth PROGRAMMING TRICKS & SKILLS 450 500 550 Brian Reffin Smith and Lisa Watts OSBORNE GUIDE TO BETTER. BASIC
GUNPOWDER □EBflkIBflEM и КОМПЬЮТЕР в двух книгах
GUNPOWDER ББК 32.973.1 О 72 УДК 681.322 АвторыгСмит Б. Р.,Хауорт Л., Уоттс Л., Уотерс Г., Кат- лер Н. Осваиваем микрокомпьютер: В 2-х кн.: Кн. 2: Пер. с англ./ 072 Б. Р. Смит, Л. Хауорт, Л. Уоттс и др. — М.: Мир, 1989. — 136 с., ил. ISBN 5-03-001573-6 В книге английских авторов описываются методы и приемы написания программ хорошего качества на языке БЕЙСИК. Существенную часть состав- ляет практикум по программированию на этом языке. Для широкого круга читателей, начиная с учащихся средних классов школы. 2404000000-098 _ О----------------131-90 041(01)-89 ББК 32.973.1 Редакция литературы по информатике и робототехнике ISBN 5-03-001573-6 (русск.) ISBN 5-03-001571-Х (русск.) © состав, издательство «Мир», 1989 © перевод на русский язык, Шаньгин В.Ф., 1989
GUNPOWDER Часть 41} Данная часть книги является руководством, которое последовательно шаг за шагом будет улучшать ваше знание языка БЕЙСИК и понимание написанных на этом языке программ. Не каждому хочется заниматься со- ставлениемсвоих собственных программ. Однако когда вам понятно, как работает БЕЙСИК, вы легко сможете приспособить или отладить про- граммы, написанные кем-то другим, а отсюда один лишь шаг до написа- ния своих собственных программ. В самом начале книги кратко излагаются сведения об основных опера- торах языка БЕЙСИК с множеством примеров, иллюстрирующих их ра- боту. В следующих разделах книги показано, как используются эти операторы в программах, предназначенных для выполнения таких доволь- но сложных действий, как создание базы данных, построение изображе- ний на экране и сортировка данных. Программы написаны на «стандартном» БЕЙСИК, т. е. такой версии языка БЕЙСИК, которая с минимальными изменениями будет работать на большинстве микрокомпьютеров. На с. 12, 13 приводятся рекоменда- ции по преобразованию этих программ для работы на конкретном микро- компьютере. Все программы сопровождаются расположенными рядом подробными пояснениями по их работе и сведениями о полезных методах и процеду- рах, которые вы могли бы использовать в своих собственных програм- мах. Кроме того, приводится много предложений по экспериментам с этими программами и адаптации их для выполнения других задач. © 1983 Usborne Publishing ISBN 0-86020-734-Х (англ).
GUNPOWDER Введение в БЕЙСИК Язык программирования БЕЙСИК включает около сотни слов. Каждое слово является инструкцией, предпи- сывающей компьютеру сделать что- то. Чтобы заставить компьютер вы- полнить конкретную задачу, в него вводят программу в виде последова- тельности инструкций-операторов и данные для обработки. При записи операторов вы можете использовать только слова БЕЙСИК, и при этом нужно обязательно соблюдать опреде- ленные правила, называемые синтак- сисом этого языка. В БЕЙСИК каждая строка про- граммы имеет номер. Эти номера обычно возрастают с шагом 10, по- этому можно добавлять в программу дополнительные строки без перенуме- рации всей программы. 1OTHEN PRINT _ R THEN PRINT "СЛИШКОМ МНОГО R THEN PRINT Это часть программы на БЕЙСИКе 140 NEXT C ( 150 PRINT I 160 PRINT "ВЫ ПОТЕРПЕЛИ НЕУДАЧУ-" 170 PRINT "ИНОПЛАНЕТЯН ПРИБЛИЖАЮТСЯ" 180 STOP 190 PRINT "УДАЧНОГО СТАРТА" 10 CLS 20 PRINT "СТАРТ КОСМИЧЕСКОГО КОРАБЛЯ 40 LET W=INT(RND(1)*40+1) 50 LET R=G* W 60 PRINT "ГРАВИТАЦИЯ=";С 70 PRINT "ПОЖАЛУЙСТА, ВВЕДИТЕ СИЛУ ТЯГИ 80 FOR С=1 ТО 10 90 INPUT F 100 IF F 110 IF F 120 IF C=R THEN GOTO 130 IF C Ввод программы Когда вы вводите программу в компьютер при помощи клавиатуры, вы должны в конце каждой набира- емой строки нажимать клавишу с надписью ВК (возврат курсора) или ВВОД. Нажатие этой клавиши за- ставляет компьютер запомнить введенную строку в своей памяти и ждать следующую строку. Когда введены все строки программы, вы набираете на клавиатуре команду RUN (пуск). Эта команда приказывает компьютеру выполнить введенную программу. ж PRINT является оператором, приказывающим компьютеру вывести что-либо на экран, на- пример, в данном случае слово БАНАНЫ Это курсор. Он показывает, где появится следующий символ. Символ — это любая буква, цифра или знак. Если набрана инструкция без номера строки, компьютер выполнит эту инструкцию сразу по- сле того, как вы нажмете клавишу ВК. Такая инструкция называется прямой командой. На- пример, чтобы предложить компьютеру выве- сти на экран дисплея строки введенной вами программы, вы набираете на клавиатуре коман- ду LIST (распечатать). Чтобы очистить экран дисплея на большинстве компьютеров набирают команду CLS (очистить). Вы должны быть очень внимательны, чтобы точно набрать текст программы. Если вы напи- шете любое слово БЕИСИКа с орфографической ошибкой или наберете на клавиатуре неправиль- ные буквы, цифры или знаки препинания, ком- пьютер не сможет исполнить операторы про- граммы. Ошибку в программе иногда называют вид (жук). Большинство ошибок возникает при наборе программы на клавиатуре, но иногда они являются следствием ошибок в алгоритме про- граммы и могут приводить к удивительным ре- зультатам.
GUNPOWDER Основные операторы БЕЙСИК На нескольких следующих страницах рассказывается об основных операторах язы- ка БЕЙСИК и способах их использования. Если у вас имеется компьютер, вам следу- ет посмотреть руководство пользователя, чтобы проверить запись этих операторов, поскольку некоторые слова и правила записи операторов БЕЙСИКа слегка различа- ются в разных моделях компьютеров. Оператор PRINT Оператор PRINT (вывести) предлагает ком- пьютеру вывести что-либо на экран дисплея. Как показано в примерах справа, буквы или символы должны быть заключены в кавычки, но числа заключать в кавычки не нужно. В этих примерах отсутствуют номера строк, поэтому компьютер выполняет каждый оператор сразу, как только вы нажмете клавишу ВК. Компью- тер будет выводить на экран именно то, что на- брано вами между кавычками, включая любые пробелы. Пустой оператор PRINT заставляет компьютер пропустить при выводе одну строку. Выполнение вычислений Оператор PRINT можно использовать также для вывода на экран результатов вычислений. Для сложения и вычитания компьютер исполь- зует обычные знаки + и -, для умножения при- меняется символ * (звездочка), а для деления — символ / (косая черта). Чтобы найти квадрат- ный корень из числа N, используется запись SQR(N), а возведение в степень обозначается символом Т, или л, или **. Например, 3 Т 2 озна- чает число 3 во второй степени или 3 в квадрате. При более сложных вычислениях компьютер всегда сначала выполняет операции умножения и деления, а затем лишь складывает или вычи- тает. Чтобы изменить этот порядок, вы можете использовать скобки, которые укажут компью- теру, в каком именно порядке нужно выполнять вычисления. В выражениях, содержащих много скобок, компьютер вычисляет сначала содержи- мое самих внутренних скобок. PRINT 254 254 PRINT 999 999 PRINT PRINT строки. Пустой оператор вызывает пропуск одной PRINT"* * * ЗЕБРЫ * * *" ЗЕБРЫ * * * PRINT "КРЫСЫ" КРЫСЫ Г------------------ PRINT 12095+277 12372 PRINT 239-51 188 PRINT 17-5 85 PRINT 221/13 17 1 Скобки заставляют вь числения ять компьютер выпол- именно в том поряд- е, какой вам нужен. PRINT SQRI9) 3 PRINT SQR(9)+3A2 12 PRINT 2*17-5 29 PRINT 2*(17-5) 24 Запятые и точки с запятой Запятые и точки с запятыми в операторе PRINT указывают компьютеру, куда должен быть выведен на экране следующий символ. Ес- ли в списке оператора PRINT присутствует точ- ка с запятой, то данные выводятся без пробела, если же стоит запятая, то выводимые данные будут разделены несколькими пробелами. В некоторых компьютерах нужны запятые либо точки с запятой для разделения в операто- рах PRINT данных или переменных (букв, кото- рые служат для обозначения элементов данных в памяти компьютера).
GUNPOWDER Переменные Информация, которую вы предлагаете ком- пьютеру для обработки, называется данными. Когда вы вводите некоторые данные для хране- ния в памяти компьютера нужно дать им какое- то имя. Имя обозначает переменную величину, и когда вы хотите, чтобы компьютер выполнил что-то с вашими данными, вы ссылаетесь на них, указывая имя переменной. Название «пере- менная» обусловлено тем, что данные, которые она обозначает, могут изменяться в процессе выполнения программы. В качестве числовых данных используют бук- вы алфавита, или букву и цифру, например, А или Аб. Элемент данных, состоящий из букв, цифр и других символов, называется символъ- ной строкой или просто строкой. В качестве символьных строк используют букву алфавита или букву и цифру, после которых записывают символ $, например, Р$ или Рб$. В различных моделях компьютеров используются разные правила образования имен переменных, поэтому изучите руководство пользователя к вашему компьютеру. Оператор LET Оператор LET (пусть) является одним из средств задания компьютеру данных для обра- ботки. Оператор LET А = 3 предлагает компью- теру запомнить цифру 3 в ячейке памяти с именем А. Оператор LET С$ = «КРОЛИКА» предлагает компьютеру запомнить строку из букв в ячейке памяти с именем С$. Символьные строки всегда должны быть заключены в кавыч- ки, а числа не нуждаются в кавычках. Оператор INPUT Оператор INPUT (ввести) используется для ввода данных в компьютер во время выполне- ния программы. За словом INPUT записывают имя переменной. Когда компьютер встречает оператор INPUT, он выводит на экран вопроси- тельный знак (или другой символ) и ждет, когда вы введете данные. Если в операторе INPUT указана числовая переменная, вы должны ввести число, а если это строковая переменная, то вы должны набрать символьную строку. В большинстве компьютеров в оператор INPUT можно включить поясняющий текст в кавычках, что делает его более понятным, как это видно во втором примере справа. В боль- шинстве компьютеров между поясняющим текс- том и именем переменной нужно ставить точку с запятой. КРОЛИКА 10 LET А=3 20 LET С$="КРОЛИКА 30 PRINT А 40 PRINT CS RUN использовать слова в качеств В некоторых компьютерах можно имен для числовых данных, а для строковых данных — слова с символом $ на конце. Будьте осторожны, не используй- те имена, которые содержат клю- чевые слова БЕЙСИК, например, такие как LETTER, DATA, SPRIN- TER, потому что они сбивают с толку компьютер. Вы используете PRINT с именем пе- ременной, чтобы компьютер вывел на экран значения этих переменных. 10 "КАК ВАС ЗОВУТ? 20 INPUT NS RUN КАК ВАС ЗОВУТ? г ?ДЖЕК Вопросительный знак компьютера 10 INPUT "КАК ВАС ЗОВУТ"; NS 20 INPUT "СКОЛЬКО ВАМ ЛЕТ"; А RUN КАК ВАС ЗОВУТ? ДЖЕК СКОЛЬКО ВАМ ЛЕТ? 21 Ответ пользователя запоминается в N$ Вопросительные знаки компьютера Для удаления неправильно набранных символов в большинстве компьютеров используются специаль- ные клавиши. Чтобы исправить в программе строку, вы можете набрать на клавиатуре заново всю строку, включая ее номер. Эта новая строка заменит строку, содержащую ошибку. Чтобы удалить всю строку, до- статочно набрать только номер этой строки. Допущена ошибка?
GUNPOWDER Операторы READ и DATA Операторы READ (читать) и DATA (данные) позволяют иным образом задать компьютеру данные для обработки. За словом READ запи- сывают одно или несколько имен переменных, а данные для этих переменных размещают в стро- ке, начинающейся со слова DATA. Строка с дан- ными может располагаться в любом месте программы. Когда компьютер переходит к вы- полнению оператора READ, он находит строку DATA с данными и затем помещает по порядку каждый элемент этих данных в соответствую- щие переменные. Элементы данных отделяются запятыми, а строковые данные для ряда ком- пьютеров заключаются в кавычки. Оператор IF ... THEN Оператор IF (если) служит для сравнения данных и в зависимости от результата сравне- ния предписывает компьютеру выполнить те или иные действия. Используя символы, пока- занные справа, можно сравнить, являются ли два элемента данных равными, неравными или один из них больше или меньше другого. За слу- жебным словом THEN (тогда) может следовать почти любой оператор, но если результат срав- нения не является истинным, компьютер игно- рирует ветвь THEN и переходит к выполнению оставшейся части программы. Оператор GOTO Оператор GOTO (идти к) предписывает ком- пьютеру перейти к другой строке программы. Обычно этот оператор используется совместно с оператором IF ... THEN, так что компьютер выполняет переход только в случае истинности определенных условий. Будьте осторожны, ис- пользуя оператор GOTO сам по себе, поскольку он может создать бесконечный цикл, как это по- казано справа в строке 185. Прекратить выпол- нение программы можно нажатием клавиш BREAK (прервать) или ESCAPE (выход). Операторы GOSUB и RETURN Оператор GOSUB (идти к подпрограмме) за- ставляет компьютер перейти к подпрограмме для выполнения частной задачи. Записываемый в конце подпрограммы оператор RETURN (воз- врат) отсылает компьютер обратно к операто- ру, стоящему после оператора GOSUB. Оператор REM Слово REM — это сокращение от слова remark (комментарий). Компьютер игнорирует строки, начинающиеся со слова REM. Оператор REM используется для комментариев. Строка 540 отсылает компьютер обратно к следующему оператору после GOSUB 10 READ AS, В, CS, N Этот элемент данных заклю- чен в кавычки поскольку со- держит пробел. 100 DATA ШЕСТЕРНИ, 2000 110 DATA "ВЕДУЩИЕ ВАЛЫ'', 500 IF AS= "НЕТ" THEN STOP IF X+Y=5 THEN PRINT LET X=X+1 IF A=B THEN PRINT "РАВНО" IF X <> Y THEN TRINT "HE РАВНО IR X >Y THEN PRINT "X БОЛЬШЕ" IF X <Y THEN PRINT "X МЕНЬШЕ" компьютеру прекратить Этот оператор приказывает выполнение программы. 500 REM ПОДПРОГРАММА ПРИВЕТ 510 PRINT "КАК ВАШЕ ИМЯ?" 520 INPUT NS 530 PRINT "ПРИВЕТ, NS 540 RETURN строку. 100 INPUT "ХОТИТЕ ИГРАТЬ?"; TS 110 IF TS= "ДА" THEN GOSUB 500 120 REM НАЧАЛО ИГРЫ Компьютер игнорирует эту 9
GUNPOWDER Операторы цикла FOR и NEXT Оператор FOR, содержащий служебные слова FOR (для) и ТО (до), и оператор NEXT (следую- щий) заставляет компьютер повторить часть про- граммы определенное число раз. В примере, приведенном справа, строки с 10 по 30 повторяют- ся три раза, и каждый раз компьютер выводит на экран сообщение из строки 20. Переменная J слу- жит для подсчета числа повторений. Строка 30 от- сылает компьютер обратно к строке 10 для определения следующего значения J. При каждом повторении цикла к значению J добавляется 1. По- сле того как J станет равным 3, компьютер перехо- дит к выполнению оставшейся части программы. 2 10 FOR J=10TO 1 STEP-1 20 PRINT J;'' ДНЕЙ ДО НОВОГО ГОДА 30 NEXTJ 10 FOR J=1 ТО 3 20 PRINT "ЦИКЛ ПО J"; 30 NEXT J 40 PRINT RUN ЦИКЛ ПО ЦИКЛ ПО ЦИКЛ ПО Переменная J в конце этой стро- ки заставляет компьютер выво- дить на экран номер каждого прохождения цикла. STEP Служебное слово STEP (шаг) в операторе цикла FOR определяет, с каким шагом изменяется пере- менная цикла J. Например, в операторе FOR J - 1 ТО 10 STEP 2 значение J. увеличивается каждый раз на 2, а при шаге STEP X переменная J изменялась бы каждый раз на величину, хранящуюся в пере- менной X. В примере справа шаг STEP 1 приводит к изменению J в обратном направлении. Вложенные циклы Можно организовать весьма сложные повторе- ния, используя циклы внутри циклов (вложенные циклы). Например, в программе справа при каж- дом повторении цикла, содержащего строки 10— 50, цикл со строками 20—40 повторяется 12 раз. При каждом повторении внутреннего цикла строка 30 выводит на экран значение произведения J х 1. Графические операторы Компьютер строит изображения, высвечивая на экране крошечные точки или площадки, называе- мые пикселами. В этой части используется в про- граммах оператор PLOT X, Y, где X и Y — координаты пиксела. Для изображения на экране линии в программах используется оператор DRAW X, Y. Функция RND Эта функция заставляет компьютер генериро- вать случайное число. В некоторых компьютерах функция RND (9) выдает число в интервале от 1— 9. Другим компьютерам нужна более сложная ин- струкция, подобная такой: INT (RTD(1)»9 + 1). Сначала компьютер вычисляет то, что находится в скобках. Функция RND(l) заставляет компьютер генерировать число между 0 и 1. Это число умно- жается на 9 (наибольшее нужное вам число), а за- тем к произведению прибавляется 1. 40 PRINT "СЧАСТЛИВОГО НОВОГО ГОДА!" RUN 10 FOR 1=2 ТО 12 20 FOR J=1 ТО 12 30 PRINT J; "УМНОЖИТЬ НА 40 NEXTJ 50 NEXT I 10 ДНЕЙ ДО НОВОГО ГОДА 9 ДНЕЙ ДО НОВОГО ГОДА 8 ДНЕЙ ДО НОВОГО ГОДА 7 ДНЕЙ ДО НОВОГО ГО Внешний цикл Обе части внутреннего цикла иначе ошибку. быть должны допустите вы внутри внешнего цикла
GUNPOWDER Массивы Массив — это набор данных, хранящихся вместе и имеющих общее наименование. Массив можно представить себе как область компьютерной памяти с множеством ячеек. Массивы могут быть одно- мерными (они имеют один ряд ячеек) либо двумерными (они имеют несколько рядов ячеек). Чтобы обратиться к элементу в одномерном массиве, нужно указать номер ячейки в этом массиве, например, ниже на рисунке значением элемента А$(4) в массиве А$ является слово СЛИВА. Для двумерного массива вы должны указать номер ряда и номер столбца, например, элемент D (3,2) соответствует 15. Числа в скобках называются индексами. DIM А$ (5) и DIM D(4,3) Прежде чем использовать массив, вы долж- ны указать компьютеру его размер. Как показа- но в примере справа, для объявления размера массива используется оператор DIM. Слово DIM является сокращением слова dimension (раз- мер). Чтобы поместить в массив данные, ис- пользуются в цикле операторы READ и DATA. Как показано справа, для двумерного массива нужны вложенные циклы. В этом примере переменная I — номер ряда, а переменная J — номер столбца массива. При каждом повторении внутреннего цикла по J ком- пьютер читает элемент данных из DATA в сле- дующий столбец текущего ряда. При каждом повторении внешнего цикла по I компьютер на- чинает читать данные в новый ряд массива. Функции LEFTS и RIGHTS Эти функции предназначены для выполнения действий над символами, входящими в символь- ные строки. Например, функция LEFTS (А$,3) предписывает компьютеру выделить три симво- ла с левой стороны символьной строки А$, а функция RIGHT$(A$,5) означает, что из той же строки берется пять символов справа. Функции MIDS и LEN Функция MIDS предлагает компьютеру взять несколько символов из середины строки, а функ- ция LEN сообщает вам, сколько символов, включая пробелы и знаки препинания, содер- жится в данной символьной строке. Например, функция MID$(K$,2,4) означает, что из середины строки К$ берется четыре символа, начиная со второго. К$. 10 LET К$^"ТРАКТОРИСТ 20 PRINT MID$(K$, 2,4) 25 PRINT MIDS(K$, 4, 4) 30 PRINT 35 PRINT LEN(KS) RUN PAKT KTOP 10 Это ЧИСЛО СИМВОЛОВ В 11
GUNPOWDER БЕЙСИК в данной части В этой части программы написаны на «стандартном» БЕЙСИК. Однако ряд компьютеров имеют свои специфические особенности выполнения отдельных действий, и поэтому вам возможно придется внести некоторые незначительные изменения в эти программы, чтобы выполнять их на своем компью- тере. В этом разделе приведены некоторые указания, которые вам следует учесть. Программы написаны для исполнения на самых разных моделях компьютеров, поэтому естествен- но в них не принимаются в расчет особенности каждой конкретной машины. Когда вы знаете, как программы работают, вам нетрудно адаптировать эти программы с учетом конкретных особенностей вашего компьютера. Имена переменных Некоторые компьютеры позволяют использо- вать в качестве переменных целые слова, в то вре- мя как другие могут воспринимать только буквы или буквы и цифры. В программах этой книги в качестве имен для большинства переменных ис- пользованы слова, что облегчает понимание текста программ. Если ваш компьютер не допускает при- менения целых слов в качестве имен, используйте для обозначения имени переменной только первую букву слова. LET Большинство компьютеров не требует обяза- тельного использования слова LET в операторах присваивания, таких как оператор LET FRUITS = «ЯБЛОКО». Кроме того, некоторым компьютерам не нужно слово THEN в операторах IF ... THEN. Все программы этой книги использу- ют слова LET и THEN, но вы можете их опустить, если ваш компьютер в них не нуждается. Инициализация переменных В некоторых компьютерах переменным нужно задавать начальные значения или, иначе говоря, инициализировать перем’енные, до того, как вы станете их использовать. Как показано в примере справа, это означает, что в самом начале програм- мы вы должны присвоить переменной начальное значение. Другие компьютеры будут сами устанав- ливать числовую переменную равной 0, а строко- вую переменную равной пустой строке без вашей инициализации этих переменных. INPUT Большинство компьютеров допускает использо- вание в операторе INPUT поясняющих слов в кавычках0. Тем не менее они могут различаться в том, нужна ли точка с запятой перед переменной в операторе INPUT, и оставляется ли автоматичес- ки пробел между поясняющими словами и данны- ми, вводимыми вами. Особенности реализации оператора INPUT в вашем компьютере можно уточнить либо проведя эксперимент, либо посмот- рев руководство к компьютеру. 1) Не используйте этот метод на компьютерах V1C, так как он будет вводить в переменные слова, а также данные. 100 FRUIT$="flBriOKO" 110 COUNT=COUNT+1 120 IF COUNT=10 PRINT "ГОТОВ" 10 INPUT "КАК ВАШЕ ИМЯ"; N$ 20 PRINT "ПРИВЕТ"; NS У некоторых компьютеров нужно оставлять пробел внутри кавы- чек, иначе выводимые данные будут прижаты к предыдущим символам. 12
GUNPOWDER Данные 100 DATA МЫШЬ, ХОМЯК, КРЫСА 110 DATA ГНУ, "ТРЕХПАЛЫЙ ЛЕНИВЕЦ" 120 DATA "ОЛЕНЬ, БЛАГОРОДНЫЙ", "НОСОРОГ, ЧЕРНЫЙ" В кавычки за- ключают те дан- ные, которые содержат пробе- лы и знаки пре- пинания. Будьте особенно внимательны, набирая стро- ки DATA с данными. Каждый элемент данных должен быть отделен запятой, и здесь очень легко допустить ошибку. Кроме того, некото- рые компьютеры требуют заключать строковые данные в кавычки. Другим компьютерам кавыч- ки нужны лишь в тех случаях, если данные со- держат пробелы или знаки препинания. Ъ.Этот оператор Несколько операторов на ОДНОЙ строке тф_ X будет выполнен* Ги Ч >лишь в случае 500 PLOT 40,1: DRAW 1,1 J г1 ( А = 10 180 IF А=10 THEN PRINT "ПРАВИЛЬНО": GOTO 100 ____и.Ч- х— - Большинство компьютеров допускает разме- щение на одной строке нескольких операторов, которые, как показано выше, отделяются друг от друга двоеточием. Такое размещение опера- торов требует меньшего объема памяти ком- пускает размещения на одной строке нескольких операторов, тогда расположите каждый опера- тор программы на новой строке. Если же в сво- их собственных программах вы записываете на одной строке по-несколько операторов, избегай- пьютера и может сделать программу более удобной для чтения. Если ваш компьютер не до- те помещать дополнительные операторы после оператора IF ... THEN. Функция RND и графические операторы раз- личаются у большинства компьютеров. В про- граммах этой части для получения случайного числа в интервале 1 — N, где N — любое число, используется конструкция INT(RND(1)*N + 1). Графическим оператором для построения точки служит PLOT X, Y, а для построения линии DRAW X, Y. Вместо них нужно подставлять операторы своего компьютера. Если вашему компьютеру нужен оператор переключения ре- жима работы экрана, вы должны вставить его в свою программу. Строки на компьютерах Sinclair Компьютеры Sinclair обращаются со стоками по-иному. В них не используются операторы LEFTS, RIGHTS или MIDS. Вместо этого вы должны точно сообщить компьютерам, какой символ необходимо «выдернуть» из строки. Например, на по- добном компьютере оператор PRINT AS (1 ТО 4) аналогичен оператору PRINT LEFTS (AS, 4) а оператор PRINT AS (4 ТО 8) — оператору MIDS (AS, 4, 5). В массиве строк каждая из них должна иметь один и тот же номер символов (ко- роткие строки вы можете заполнить про- межутками), и каждый символ строки бу- дет храниться в отдельной ячейке массива. Изменение программ Как только на своем компьютере вы прогоните программу и получите представ- ление о том, как она работает, вы сможете изменить и приспособить ее, благодаря введению различных данных или добавле- нию звука и цвета. Когда вы изменяете программу, очень тщательно проверьте каждую строку. Убе- дитесь, что у вас есть достаточное (но не слишком большое) число циклов, чтобы ввести новые данные, а также не забудьте изменить операторы DIM. 13
GUNPOWDER Учимся БЕЙСИКУ, изучая программы Одним из полезных методов обучения программированию на БЕЙСИК является изучение готовых программ и тщательный разбор их работы. Изучая программы этой части, вы узнаете, как применя- ются циклы и строки символов, как пишутся несложные графические программы, а также познакоми- тесь с различными способами накопления и сортировки данных. На первый взгляд некоторые из этих программ кажутся довольно сложными. Тем не менее, сложная программа является всего лишь длин- ным списком операторов БЕЙСИК, собранных вместе в определенном порядке. Здесь приводятся не- которые советы и предостережения, которые помогут вам правильно разбирать и понимать программы. Изучение программы Большинство программ составляется из нескольких различных частей (иногда называемых модуля- ми или подпрограммами), предназначенных для выполнения разных задач. Например, в компьютер- ной игре «Уничтожение ракет» одна часть программы служит для построения на экране изображений ракет, а другие — для регистрации атак и попаданий, для слежения за запасом горючего и скоростью, а также для вывода счета очков. 1. Построение 2. Регистрация атак изображений ракет. и попаданий. 3. Вычисление запасов горючего и скорости 4. Вывод счета очков. Первый шаг в изучении программы заключа- ется в разделении ее на составные части и уясне- нии их назначения. Это дает вам общее представление о том, как работает программа. Выявить подпрограммы можно по решению в них частных задач и по большим скачкам в но- мерах строк (строки, начинающиеся со следую- щей сотни или тысячи, часто указывают на новую часть изучаемой программы). Иногда для обозначения отдельных частей программы ис- пользуются комментарии операторов REM Вероятно, наибольшую трудность в понима- ние программы вносят переменные. Перед вво- дом программы в компьютер весьма полезно уточнить и отметить назначение каждой пере- менной. Определенные переменные часто ис- 14 пользуются для одних и тех же целей, поэтому их можно легко распознать. Например, буквы I, J, К, L обычно используются для представления переменных циклов, a Z или Z$ — для представ- ления данных, которые нужны лишь на корот- кое время.
GUNPOWDER Прогон и отладка программ в случайном порядке, а вторая — в подсчете компьютером числа появлений слова на экране. После уточнения назначения переменных, введите программу в компьютер. Поскольку программы написаны на стандартном БЕЙ- СИК, возможно вам придется изменить некото- рые операторы. Затем попытайтесь запустить программу. Ве- роятно, выявятся некоторые ошибки, поэтому выведите программу на экран и найдите ошибки ввода или операторы, которые неприемлемы для вашего компьютера. После того, как вы нашли все ошибки, запу- стите программу несколько раз, чтобы посмот- реть, как она работает. На этом этапе весьма полезно записать программу на кассету с маг- нитной лентой или на магнитный диск. Затем снова вернитесь к тексту программы на экране и изучите каждую строку, стараясь уяснить, что она делает. Обратйте внимание на подпрограммы, которые вы смогли бы вклю- чить в свои собственные программы. Компьютер может помочь вам разобраться, как работает программа. Попытайтесь изме- нить значение одной из переменных и посмотри- те, как это повлияет на работу программы. Вносите в программу одновременно только одно небольшое изменение, тогда вы сможете опреде- лить, как влияет каждое изменение. Когда вы закончите экспериментировать, не забудьте сно- ва восстановить правильные значения. В программу можно также вставить строки с операторами вывода значений переменных, при этом у вас появляется возможность наблю- дать, как изменяются переменные в ходе выпол- нения программы. Возможно вы сочтете также полезным вставить в программу операторы STOP (останов), что позволит вам наблюдать за работой программы по шагам, но впоследст- вии не забудьте удалить эти операторы.
GUNPOWDER Использование символьных строк Приведенная здесь программа показывает, как можно объединить весьма простые операторы БЕЙ- СИК, чтобы компьютер смог решать довольно сложные задачи. Данная программа представляет со- бой компьютерную игру в слова, в которой компьютер предлагает вам ввести какое-нибудь слово, а затем выводит на экран в случайном порядке буквы этого слова и просит вас указать, сколько раз это слово появилось на экране. В этой программе используются случайные числа и строковые функции MIDS, RIGHTS и LEN. В данном программе решаются две основные задачи. Первая заключается в выводе на экран букв в случайном порядке, а вторая — в подсчете компьютером числа появлений слова на экране. ИГРА — УКАЖИТЕ СЛОВО ПОЖАЛУЙСТА, НАБЕРИТЕ КОРОТКОЕ СЛОВО ?МОРЕ ТЕПЕРЬ ПОСМОТРИМ, СМОЖЕТЕ ЛИ ВЫ НАИТИ ВАШЕ СЛОВО, КОГДА НА ЭКРАНЕ ПОЯВИТСЯ МНОГО БУКВ ЧТОБЫ НАЧАТЬ, НАЖМИТЕ КЛАВИШУ ВК МРЕРОЕМООРМРОЕМ ОРЕМЕОРМЕОРМОРЕ ОМОЕЕМРРММОЕМОР ВВЕДИТЕ ЦИФРУ, КОТОРАЯ ПО-ВАШЕМУ МНЕНИЮ УКАЗЫВАЕТ, СКОЛЬКО РАЗ ВАШЕ СЛОВО ПОЯВИЛОСЬ НА ЭКРАНЕ L J Для выбора выводимых на экран букв про- грамма использует функцию MID$ и случайные числа. Введенное вами слово хранится в пере- менной WS. В строке 160 программа генерирует случайное число в интервале от 1 до числа, рав- ного длине вашего слова, и запоминает его в пе- ременной R. Затем в строке 170 число, хранящееся в R, используется функцией MID$ для выборки буквы из W$. Эта буква запомина- ется в L$ и затем выводится на экран операто- ром PRINT в строке 180. При каждом повторении цикла от строки 150 до строки 220 в переменной R запоминается новая цифра, а из W$ выбирается новая буква. оверка слова CHECKS Строка 200 Строка 70 После неоднократного повтора цикла в строках 150-220 символьная строка CHECKS заполнит- ся буквами. В самом начале программы компьютер ре- зервирует ячейку памяти с именем CHECKS и затем заполняет ее звездочками, число которых равно числу букв в предложенном вами слове. Каждый раз, когда компьютер выделяет новую случайную букву, он выбрасывает из символь- ной строки CHECKS первый символ и добавляет в конец этой строки выделенную случайную бук- ву (строка 200). Затем в строке 210 компьютер сравнивает CHECKS с W$ и, если в этих сим- вольных строках буквы расположены в одинако- вом порядке, добавляет 1 к N. 16
UNPOWDER Игра «Укажите слово» 1OCLS 20 PRINT‘.PRINT "ИГРА УКАЖИТЕ СЛОВО'* 3 30 LET СНЕСК$=" "1 _____________________. 40 LET N = 0 J 45 PRINT "ПОЖАЛУЙСТА, НАБЕРИТЕ КОРОТКОЕ СЛОВО’*} 50 INPUT WS 60 FOR I = 1 ТО LEN(WS) 70 LET CHECKS = CHECKSS + ''•'* 80 NEXT I 90 PRINT 100 PRINT "ТЕПЕРЬ ПОСМОТРИТЕ - МОЖЕТЕ ЛИ ВЫ НАЙТИ" ставить компьютер ло- не пока вы дождать, от полезный способ за- будете готовы. 110 PRINT "ВАШЕ СЛОВО, КОГДА НА ЭКРАНЕ 115 PRINT "ПОЯВИТСЯ МНОГО БУКВ" 120 INPUT "ЧТОБЫ НАЧАТЬ, НАЖМИТЕ КЛАВИШУВК"; NS } 130 CLS 140 REM ВЫБОР СЛУЧАЙНЫХ БУКВ 150 FOR I = 1 ТО 50* LEN(WS) ]------------------ 160 LET R =JNT(RND(1)*LEN(W$) + 1) J------------ LET CHECKS = RIGHTS(CHECK$, LEN(W$)-1 H L$ J 200 170 LET L$ = MID$( W$, R, 1)1 180 PRINT L$ + " ]—----- 190 REM ПРОВЕРКА СЛОВА RND своего ции компьютера. Используйте функ- Используйте оператор своего компьютера для очистки экрана дисплея. В этой строке записаны два оператора, которые разделены двоеточием Присваивают начальные значения переменным, используемы л в дальнейшем в программе. Просит вас ввести слово и помещает его в WS. Повторить цикл столько раз, сколько букв в ва- шем слове, т. е. LEN(WS). При каждом повто- рении цикла в CHECKS помешается звездоч- ка «♦». Строка 120 заставляет компьютер ждать, когда вы наберете что-либо на клавиатуре. В боль- шинстве компьютеров вам достаточно нажать клавишу ВК. Выбирает случайное число из интервала от 1 до длины слова и помещает это число в R. Устанавливает для цикла содержащего строки 150—220, число повторений, равное произведе- нию числа букв вашего слова на 50. Использует число, хранящееся в R, для выделе- ния буквы из WS и помещает эту букву в LS. Выводит на экран букву, хранящуюся в LS, и следом за ней пробел. Точка с запятой заставля- ет компьютер оставаться на той же строке при выводе очередной буквы. Этот оператор предписывает выделить с правой стороны символьной строки CHECKS буквы в количестве LEN 210 IF CHECKS = W$ THEN LET N = N + 1 1 220 NEXT I А вот полезный способ заставить компьютер проверить набор дан- ных, чтобы найти конкретное слово. Эту подпрограмму можно с успехом применять в других программах. Вам потребуется также цикл, записанный в строках 60—80. (WS) -1 и добавить к ним бук- ву, хранящуюся в LS, затем поместить новый набор букв обратно в CHECKS. N является счетчиком числа повторений правиль- ного слова. тем длиннее получится пауза. Некоторые компьютеры обладают более вы- соким быстродействием, поэтому измените это число с учетом возможностей вашего компьютера. Чем больше число в строке 230, * 230 FOR I = 1 ТО 1000 Г 240 REM НИЧЕГО НЕ ДЕЛАЕТСЯ ' 250 NEXT I 260 CLS 265 PRINT "ВВЕДИТЕ ЦИФРУ, КОТОРАЯ ПО-ВАШЕМУ" 266 PRINT "МНЕНИЮ УКАЗЫВАЕТ, СКОЛЬКО РАЗ ВАШЕ 270 PRINT "СЛОВО ПОЯВИЛОСЬ НА ЭКРАНЕ 275 INPUT Gj-----------—------------ 280 PRINT 290 IF G=N THEN PRINT "ПРАВИЛЬНО!" 300 IF GO N THEN PRINT "HE ПРАВИЛЬНО! 310 PRINT "ВАШЕ СЛОВО ПОЯВИЛОСЬ"; N; "РАЗ Это цикл «временной задержки». В нем отсут- ствуют исполняемые операторы, он лишь за- ставляет компьютер приостановиться на несколько секунд, за которые он пробегает все значения I. Вводит ваше число в G. Сравнивает G с N (переменной, которая испо- льзуется компьютером для подсчета числа появ- лений правильного слова). *17
Циклы и сл айны Эта программа является ко: которая проверяет также ваш уме. Она демонстрнруе • иеаот меления циклов и случайных ч емы создания отерной игре ение считать , а также при- вторые вы могли бы включать в свои е программы. Это весьма длинная про* 1ако большинство ее строк образованы операторами PRINT, которые формируют на экра- не необходимые для игры сообщения компьютера. числа ГОВОРИТ ВАШ БОРТОВОЙ КОМПЬЮТЕР... ИЗ-ЗА АВАРИИ Я НЕ МОГУ РАССЧИТАТЬ СКОРОСТЬ РАСХОДА ТОПЛИВА ПРИ ПОДХОДЕ КОРАБЛЯ К ЗЕМЛЕ ВАМ ПРИДЕТСЯ САМОМУ ВЫПОЛНИТЬ ЭТИ РАСЧЕТЫ Я МОГУ СООБЩАТЬ ВАМ, СКОЛЬКО ТОПЛИВА НАМ НУЖНО НА КАЖДОМ ЭТАПЕ ПОЛЕТА И ДЛИТЕЛЬНОСТЬ КАЖДОГО ЭТАПА ВЫ ДОЛЖНЫ ДЕЛИТЬ КОЛИЧЕСТВО ТОПЛИВА НА ВРЕМЯ И СООБЩАТЬ МНЕ ТРЕБУЕМУЮ СКОРОСТЬ СГОРАНИЯ ТОПЛИВА В ДВИГАТЕЛЕ КОРАБЛЯ Игра «Авария на космическом корабле» 100 CLS J---------------- 110 FOR 1=1 ТО 20 115 PRINT • ВНИМАНИЕ# • 118 PRINT"» » ТРЕВОГА • 120 FOR J=1 ТО 10 125 REM НИЧЕГО НЕ ДЕЛАЕТСЯ 130 NEXT J 135 NEXT I 140 CLS клах задержки с уче- возможностеи том вашего компьютера. Измените числа в ци 150 FOR 1=1 ТО 20 155 PRINT . ПОВРЕЖДЕНИЕ ЦЕЛИ........... 160 FOR J=1 ТО 10 165 REM НИЧЕГО НЕ ДЕЛАЕТСЯ 170 NEXTJ 180 NEXT I 190 CLS 200 PRINT "ГОВОРИТ ВАШ БОРТОВОЙ КОМПЬЮТЕР..." 210 PRINT 220 PRINT "ИЗ-ЗА АВАРИИ Я НЕ МОГУ РАССЧИТАТЬ СКОРОСТЬ РАСХОДА ТОПЛИВА." 230 PRINT 240 PRINT "ПРИ ПОДХОДЕ КОРАБЛЯ К ЗЕМЛЕ ВАМ ПРИДЕТСЯ САМОМУ ВЫПОЛНИТЬ ЭТИ РАСЧЕТЫ" Используйте оператор своего компьютера для очистки экрана дисплея. Строки ПО—135 образуют вложенные ци- клы. При каждом выполнении цикла 1 на экран выводятся предупреждающие сообще- ния из строк 115 и 118, затем 10 раз повторя- ется цикл J. Он формирует временную задержку, чтобы приостановить компьютер на время, необходимое для чтения предупре- ждений, выведенных на экран. Строки 150—180 работают аналогично стро- кам НО—135. Следующая часть программы выводит на экран описание игры. Если некоторые пред- ложения слишком длинны для вашего экра- на, тогда введите в программу дополни- тельные строки с операторами PRINT. 250 PRINT Сам оператор PRINT оставляет пустые строки. 260 PRINT "Я МОГУ СООБЩАТЬ ВАМ, СКОЛЬКО ТОПЛИВА НАМ НУЖНО НА КАЖДОМ ЭТАПЕ ПОЛЕТА И ДЛИТЕЛЬНОСТЬ КАЖДОГО ЭТАПА" 270 PRINT 280 PRINT "ВЫ ДОЛЖНЫ ДЕЛИТЬ КОЛИЧЕСТВО ТОПЛИВА НА ВРЕМЯ И СООБЩАТЬ МНЕ ТРЕБУЕМУЮ СКОРОСТЬ СГОРАНИЯ ТОПЛИВА В ДВИГАТЕЛЕ КОРАБЛЯ" 290 PRINT 300 PRINT "ВОТ ПРИМЕР РАСЧЕТА" 310 PRINT"------------------" 320 PRINT "КОЛИЧЕСТВО ТОПЛИВА F =24" 330 PRINT "ВРЕМЯ Т =6" 345 PRINT 350 INPUT "ПОЖАЛУЙСТА, РАЗДЕЛИТЕ F=6 НА Т= 6 И БЫСТРО ВВЕДИТЕ ОТВЕТ"; ANSWER 360 PRINT 370 IF ANSWER О 4 THEN PRINT "НЕВЕРНО. ПОПЫТАЙТЕСЬ СНОВА, ОТ ЭТОГО ЗАВИСИТ ВАША ЖИЗНЬ": GOTO 350 380 CLS R NT. Если ваш компьютер сдвига- ет текст с экрана прежде, чем вы успеваете прочесть его, удалите некоторые стро- ки с пустыми операторами Этот оператор подчеркивает слова, выводи- мые предыдущей строкой. Ваш ответ запоминается с переменной ANSWER. Оператор GOTO исполняется только в том случае, если значение ANSWER не равно 4.
390 PRINT "ВЕРНО. ВСЕ ВАШИ ДАЛЬНЕЙШИЕ ОТВЕТЫ ТАКЖЕ ДОЛЖНЫ БЫТЬ ПРАВИЛЬНЫМИ" 395 PRINT "ИЛИ КОРАБЛЬ БУДЕТ ПОВРЕЖДЕН" 400 PRINT "ЕСЛИ ЖЕ ВЫ ДОПУСТИТЕ БОЛЬШЕ ДВУХ ОШИБОК," 405 PRINT "КОРАБЛЬ БУДЕТ ПОЛНОСТЬЮ РАЗРУШЕН" 410 PRINT 420 INPUT "НАЖМИТЕ КЛАВИШУ ВК, ЧТОБЫ СООБЩИТЬ МНЕ О СВОЕЙ ГОТОВНОСТИ"; Z$ 430 CLS 440 PRINT "ВНИМАНИЕ - МЫ НАЧИНАЕМ ! I I" 450 LET DAMAGE=0 I---------------------- Ожидает, пока вы нажмете клавишу ВК. 460 LET F=720 TO 120 STEP-120 470 LET T=INT(RND(1 )*5+2) Присваивает нулевое значение переменно! DAMAGE. F является переменной для подсчета повторе ний цикла. Он также используется в вычисле ниях. В строке 460 F = 720 и затеь, уменьшается на 120 при каждом повторенш цикла. Эти значения выбраны так, чтобы от вег в строке 520 был всегда целым числом 480 PRINT 490 PRINT "КОЛИЧЕСТВО ТОПЛИВА F= ";F 500 PRINT "ВРЕМЯ T= ", T 510 PRINT 520 LET R=F/T 530 INPUT "СООБЩИТЕ МНЕ РАСЧЕТНУЮ СКОРОСТЬ СГОРАНИЯ"; ANSWER 540 IF ANSWER=R THEN GOTO 600 550 LET DAMAGE=DAMAGE+1 __________ 560 PRINT 570 PRINT " » ♦ ♦ ПОВРЕЖДЕНИЕ КОРАБЛЯ * * *" 580 PRINT 590 IF DAMAGE>2 THEN GOTO 640 П— 600 NEXT F 610 CLS 620 PRINT "ПОЗДРАВЛЯЮ: ВЫ СДЕЛАЛИ ВСЕ ТАК ХОРОШО, КАК МОГ БЫ ТОЛЬКО Я. С БЛАГОПОЛУЧНЫМ ПРИЗЕМЛЕНИЕМ!!!" 630 GOTO 720 640 CLS Переменная DAMAGE служит счетчикоь числа ваших ошибок. Если вы делаете больше двух ошибок, ком- пьютер выходит из цикла* и переходит на строку 640. Дает случайные числа в пределах 2—6, кото- рые будут точно делиться на цифру для ко- личества топлива. Компьютер рассчитывает сумму, используя величины F и Т и запоминает ответ в R. Ес- ли вы даете правильный ответ, компьютер переходит к строке 600. Эта строка выводится только в том случае если вы допустили меньше двух ошибок. 650 FOR 1=1 ТО 20 660 PRINT 670 FOR J=1 TO INT(RND(1) 680 PRINT" "; 690 NEXT J 700 NEXT I I+50) Эти вложенные циклы выводят на экран слу- чайную фигуру из звездочек. При каждом по вторении внешнего цикла 1 компьютер выводит звездочку, а затем внутренний пик; заставляет его пропустить случайное числе пробелов. 710 PRINT:PRINT "КОРАБЛЬ РАЗРУШЕН" 720 END
GUNPOWDER Создание базы данных для чемпионатов мира по футболу База данных представляет собой большое количество информации, хранящейся в компьютере. Эта информация организована так, что компьютер может произвольно объединять и сравнивать факты и числа, а пользователь этой базы данных имеет возможность очень быстро получить нужную ему информацию. Ниже приводится программа базы данных чемпионатов мира по футболу. Она является примером небольшой базы данных, которая предоставляет возможность узнать, какая команда выигрывала в любом из проводившихся чемпионатов мира, начиная с 1930 г., или в каком году конкретная команда выиграла чемпионат. После рассмотрения этой программы обсуждаются некоторые предложения по преобразованию базы данных с целью хранения в ней иной информации, например, предметного указа- теля журнала или данных о природных явлениях. Программа базы данных состоит из трех основных частей. Вам, как пользователю базы данных, потребуются удобные средства накопления информации, выборки нужных сведений и «меню». Меню представляет собой список различных действий, которые программа может исполнить по вашему вы- бору. Кроме того, такая программа должна быть «дружественной», т. е. она должна предоставлять пользователю базы данных развитые средства подсказки и не должна давать сбои или разрушаться, если пользователь допускает ошибку. Примеры работы базы данных ПОЖАЛУЙСТА, ВВЕДИТЕ НАЗВАНИЕ КОМАНДЫ ИЛИ ВЫЗОВЕТЕ МЕНЮ ДЛЯ ПОВТОРНОГО ПРОСМОТРА СПИСКА ЗАПАДНАЯ ГЕРМАНИЯ ЗАПАДНАЯ ГЕРМАНИЯ ПОБЕДИТЕЛЬ ЧЕМПИОНАТА МИРА В 1954 БЫЛА ФИНАЛИСТОМ В 1966 ПОБЕДИТЕЛЬ ЧЕМПИОНАТА МИРА В 1974 БЫЛА ФИНАЛИСТОМ В 1982 ДЛЯ ПРОСМОТРА МЕНЮ НАЖМИТЕ ВК ПОЖАЛУЙСТА, ВВЕДИТЕ ГОД ИЛИ ВЫЗОВЕТЕ МЕНЮ ДЛЯ ПОВТОРНОГО ПРОСМОТРА СПИСКА 1938 В 1938 ПОБЕДИТЕЛЬ ЧЕМПИОНАТА МИРА - ИТАЛИЯ ДЛЯ ПРОСМОТРА МЕНЮ НАЖМИТЕ ВК Хранение информации 1930 1934 1938 1950 1954 1958 1962 1966 1970 1974 1978 1982 УРУГВАЙ 1 0 0 1 0 0 0 0 0 0 0 0 АРГЕНТИНА 2 0 0 0 0 0 0 0 0 1 0 0 ИТАЛИЯ 0 1 1 0 0 0 0 0 2 0 0 1 ЧЕХОСЛОВАКИЯ 0 2 0 0 0 0 2 0 0 0 0 0 ВЕНГРИЯ 0 0 2 0 2 0 0 0 0 0 0 0 ЗАП. ГЕРМАНИЯ 0 0 0 0 1 0 0 2 0 1 0 2 БРАЗИЛИЯ 0 0 0 0 0 1 1 0 1 0 0 0 ШВЕЦИЯ 0 0 0 0 0 2 0 0 0 0 Ъ 0 АНГЛИЯ 0 0 0 0 0 0 0 1 0 0 0 0 ГОЛЛАНДИЯ 0 0 0 0 0 0 0 0 0 2 2 0 Чтобы связать между собой команды и годы проведения чемпионатов, программа использует «табличное» представление информации и про- изводит поиск команды или года тем же самым путем, как это сделали бы вы сами по данной таблице. В таблице цифра 1 означает, что ко- манда стала чемпионом, а цифра 2 означает, что эта команда — финалист. Двигаясь сначала вдоль определенной строки и затем по столбцу, вы можете определить, какая команда и в каком году стала чемпионом. 20
GUNPOWDER Построение матрицы Используя массивы, можно без особого труда построить компьютерный вариант таблицы, пока- занной выше. Массив — это набор переменных, который может содержать множество отдельных элементов данных. V0 /team $ [2 Чтобы обратиться к элементу массива, указывают имя масси- ва и позицию элемента в нем. Например, YEAR (5) означает пя- тый элемент в массиве YEAR, а М (7,3) означает элемент в 7 строке и 3 столбце массива М. Числа в скобках называют ин- дексами. YEAR mo Вам необходимы два набора ячеек, один с 12 ячейками по горизонтали, содержащими пере- чень годов, а другой — с 10 ячейками по верти- кали, содержащими перечень команд. В программе они называются YEAR и TEAMS. Чтобы использовать все данные, их необхо- димо поместить в двухмерную матрицу, содер- жащую 10 строк и 12 столбцов. В программе это — М (матрица). Чтобы найти победителя чемпионата мира, например, в 1938 г., компьютер находит число 1938 в наборе ячеет YEAR и отмечает, что оно заключено в ячейку 3. Затем он просматривает столбец 3 матрицы. Когда он находит цифры 1 или 2, то отмечает номера рядов и использует их для просмотра названия команд в TEAMS. 21
GUNPOWDER Программа работы с базой данных В программе можно выделить семь частей, при- чем каждая часть связана с отдельной подпрограм- мой. Первые несколько строк вызывают нужную подпрограмму, после выполнения которой управле- ние вновь возвращается к этим строкам. Подпрограммы, начинающиеся со строк 200 и 300, служат для вывода на экран списка команд и списка годов проведения чемпионатов, соответ- ственно. Строки 400 — 500 служат для определения года, в каком данная команда выиграла чемпионат, в то время как строки 500 — 600 служат для опре- деления команды, которая выиграла чемпионат в конкретном году. Все эти данные перечисляются в заключительной части программы, которую завер- шает меню. Обычно лучше всего размещать дан- ные ближе к концу программы, а в начале располагать рабочую часть программы. Меню Строки 10—130 вызывают под- программы Строки 200—250 выводят список команд Строки 300—360 выводят список годов проведения чемпионатов Строки 400—490 просматривают мат- рицу, чтобы найти год для данной команды. Строки 500—580 просматривают мат- рицу, чтобы найти команду для данно- го года. Строки 1000—1310 читают все данные Строки 2000-2180 выводят на экран меню. Меню — это такая часть программы, которая информи- рует вас о том, что именно мо- жет сделать программа и каким образом ее использовать. В дан- ной программе вы осуществляе- те свой выбор, вводя в нее то или иное число. Это число запо- минается в переменной С и ис- пользуется компьютером, что- бы вызывать подходящую под- программу для решения нужной вам задачи. Вызов подпрограмм Л2.О DM С GOSUB 200, 3OOZ АОО, 500, GOO Строка 120 в программе управляет выбором подпрограммы, которую будет использовать компьютер. В этой строке буква С является пе- ременной, которая содержит введенное вами с клавиатуры число после просмотра меню. Ком- пьютер использует это число в С, чтобы решить к какой подпрограмме перейти. Если С = 1, то компьютер переходит к первой из перечислен- ных в строке 120 подпрограмм, т. е. подпро- грамме, начинающейся со строки 200. Если С = 2, он переходит ко второй подпрограмме, т. е. строке 300. Если С = 3, компьютер перехо- дит к третьей подпрограмме и т. д. 22
~-г. < • • . . - , ' ’ Назначение переменных в программе YEAR TEAMS Одномерный массив для хранения списка годов проведения чемпионатов мира Одномерный массив для хранения названий команд Двумерный массив для ных о чемпионатах мира Если ваш компькР тер не допускает применения слов в качестве имен мас- сивов, используйте их первые буквы. I Переменная для хранения исла, которое вы вводи- те после просмотра меню Название к< манды или года, которое вы наби- раете Временные данные Вызов подпрограмм *10 DIM TEAMS (10): DIM YEAR (12): DIM M (10,12) П Объявляет компьютеру объем памяти, необходимой массивам. 100 GOSUB 1000: REM ЧТЕНИЕ ДАННЫХ _} 110 GOSUB 2000: REM ВЫВОД НА ЭКРАН МЕНЮ J 120 ON С GOSUB 200,300,400,500,600 3 Скобки с левой стороны текста программы выделяют разные ча- сти этой программы. J3OGOTO ио ”200 REM ПОДПРОГРАММА ВЫВОДА СПИСКА КОМАНД 210 CLS 220 PRINT "СПИСОК КОМАНД" PRINT "------ Когда вы запустите программу, ком- пьютер сразу переходит к подпрограм- ме чтения данных, начинающейся в строке 1000. Затем компьютер переходит к строке 2000, чтобы вывести на экран меню. Этот оператор отсылает компьютер к соответствующей подпрограмме для решения той задачи, которую вы вы- брали в меню. После выполнения под- программы компьютер возвращается к строке 130, которая посылает его на- зад к строке 110 для повторного выво- да меню на экран. Подчеркивает слова СПИСОК КОМАНД. 230 FOR I = 1 ТО 10: PRINT TEAMS (I): NEXT I J--- 235 PRINT 240 INPUT "ЧТОБЫ ПРОСМОТРЕТЬ МЕНЮ НАЖМИТЕ ВК" J-- _250 RETURN *300 REM ПОДПРОГРАММА ВЫВОДА СПИСКА ГОДОВ ПРОВЕДЕНИЙ ЧЕМПИОНАТОВ Цикл вывода на экран названий ко- манд. Каждый раз, когда цикл повто- ряется, 1 увеличивается на 1, и компьютер выводит из массива TEAMS следующее название. Заставляет компьютер ждать, пока вы нажмете клавишу ВК, после чего он перейдет к следующей строке. 310 CLS 320 PRINT "СПИСОК ГОДОВ ЧЕМПИОНАТОВ" PRINT"----- 330 FOR I = 1 ТО 12; PRINT YEAR (I): NEXT I ]--- 335 PRINT 340 PRINT "B 1942 И 1946 ЧЕМПИОНАТЫ HE ПРОВОДИЛИСЬ" 345 PRINT 350 INPUT "ЧТОБЫ ПОСМОТРЕТЬ МЕНЮ, НАЖМИТЕ ВК" ; Х$ __360 RETURN Т-------------------------------- Цикл вывода на экран списка годов чемпионатов.
— 400 REM ПОДПРОГРАММА ВВОДА КОМАНДЫ 405 CLS 410 INPUT "ПОЖАЛУЙСТА. ВВЕДИТЕ ИМЯ КОМАНДЫ ИЛИ НАБЕРИТЕ СЛОВО МЕНЮ ДЛЯ ПОВТОРНОГО ПРОСМОТРА списка": z$ 415 IF Z$="МЕНЮ" THEN RETURN Т------------- /420 FOR I = ТО 10 ___________ | 425 IF Z$ = TEAMS (I) THEN GOTO 440 \ 430 NEXT I Название команды или слово МЕНЮ запоминается переменной ZS. Если ZS = «МЕНЮ» компьютер воз- вращается к строке 130» а оттуда к строке ПО для вывода меню. Цикл сравнения ZS с каждым названи- ем в массиве команд TEAMS. Когда найдено название» совпадающее с ZS» компьютер переходит к строке 440. 435 PRINT: PRINT "КОМАНДА НЕ ОБНАРУЖЕНА - ПОПЫТАЙТЕСЬ СНОВА": PRINT: GOTO 410 440 PRINT 445 PRINT Z$: PRINT T У 450 FOR J= 1 ТО 12 /455 IF М (I, J) = 1 THEN PRINT "- ПОБЕДИТЕЛЬ ЧЕМПИОНАТА I МИРА В "; YEAR (J): PRINT I 460 IF М (I, J) = 2 THEN PRINT "- БЫЛА ФИНАЛИСТОМ В \ " YEAR (J): PRINT X 465 NEXT J 470 PRINT Эта строка помогает пользователю из- “ бежать ошибки в названии команды или набора названия» отсутствующего в базе данных. Выводит на экран название команды. Этот цикл заставляет компьютер опре- делить по матрице значения элементов для названной вами команды. 1 — это номер строки матрица. Значение 1 определяется в цикле в строках 420— 430 и представляет собой индекс» т. е. номер позиции вашей команды как эле- мента массива TEAMS» J является но- мером столбца» и при каждом повторении цикла компьютер просмат- ривает элемент следующего столбца вдоль строки I. 480 INPUT "ЧТОБЫ ПОСМОТРЕТЬ МЕНЮ, НАЖМИТЕ ВК"; Х$ 490 RETURN J 500 REM ПОДПРОГРАММА ВВОДА ГОДА 505 CLS 510 INPUT "ПОЖАЛУЙСТА, ВВЕДИТЕ ГОД ИЛИ НА- БЕРИТЕ СЛОВО МЕНЮ ДЛЯ ПОВТОРНОГО ПРОСМОТРА _ СПИСКА"; Z$ То же» что и в строке 240. Возврат к строке 130. То же» что в строке 410» но на этот раз в ZS запоминается названный вами год. 515 IF Z$ = "МЕНЮ" THEN RETURN 520 FOR I = TO 12 525 IF VAL (ZS) = YEAR (I) THEN GOTO 540 530 NEXT I Цикл сравнения ZS с каждым элемен- том из массива YEAR. Однако нельзя непосредственно сравнивать строковую переменную с числовой переменной» поэтому потребовалась функция VAL. Она предписывает компьютеру обраба- тывать символы в ZS как числа 535 PRINT : PRINT "ГОД НЕ ОБНАРУЖЕН - ПОПЫТАЙТЕСЬ 24 СНОВА* : PRINT: GOTO 510
GUNPOWDER 540 PRINT: PRINT " В"; Z$: PRINT 550 FOR J =1T010 555 IF M (J. I) - ЧЕМПИОНАТА МИРА" 560 NEXT J 565 PRINT 570 INPUT "ЧТОБЫ ПОСМОТРЕТЬ МЕНЮ. НАЖМИТЕ ВК Х$ 580 RETURN]------------------------------- 600 REM ПОДПРОГРАММА ОКОНЧАНИЯ 610 INPUT "КОНЕЦ ПОИСКА - ОТВЕТЬТЕ ТВЕРДО (ДА/НЕТ)"; Х$ 620 IF Х$ 1 THEN PRINT TEAM$(J); ПОБЕДИТЕЛЬ Этот цикл работает аналогично стро- кам 450—460. Номер столбца опреде- ляется индексом года в массиве YEAR, а номер строки изменяется при каждом повторении цикла. Возврат к строке 130. ДА" THEN RETURN ELSE END = 1 TO 12: READ YEAR (I): NEXT I ] Если в вашем компьютере не используется ELSE, вы можете на отдельной строке записать оператор END. Проверяет, действительно ли вы хоти- те закончить работу с программой. Ес- ‘ли вы вводите «ДА», оператор END предписывает компьютеру прекратить исполнение программы. Если вы вве- дете что-либо иное» компьютер возвра- тится к строке 130. Слово ELSE (иначе) является полезным средством расширения возможностей операторов IE..THEN. Более подробно об этом бу- дет сказано ниже. 1000 FOR I 1010 DATA 1930,1934,1938,1950 1020 DATA 1954,1958,1962,1966 1030 DATA 1970,1974,1978,1982 1100 FOR I = 1 TO 10: READ TEAMS (I): NEXT I ~J- 1110 DATA УРУГВАЙ, АРГЕНТИНА 1115 DATA ИТАЛИ Я. ЧЕХОСЛОВАКИЯ. ВЕНГРИЯ 1120 DATA ЗАПАДНАЯ ГЕРМАНИЯ. БРАЗИЛИЯ 1125 DATA ШВЕЦИЯ. АНГЛИЯ. ГОЛЛАНДИЯ Цикл чтения данных в массив YEAR. Цикл чтения данных в массив TEAMS. 1200 FOR I = 1 ТО 10: FOR J = 1 ТО 12 1205 READ М (I. J) 1210 NEXT J: NEXT I 1215 RETURN Вложенные циклы чтения данных в двумерный массив М. Будьте очень внимательны, наби- рая эти данные. Если вы пропу- стите любую запятую или символ то в программе появится ошибка. На этот раз воз- врат к строке 110. 1220 DATA 1, 0,0,1,0,0,0.0,0,0,0,0 1230 DATA 2,0,0,0,0,0.0,0,0,0,1,0 1240 DATA 0.1,1,0,0,0,0,0,2,0,0,1 1250 DATA 0,2,0, 0,0,0,2,0,0,0,0,0 1260 DATA 0,0,2,0,2,0,0,0,0.0,0,0 1270 DATA О, О, О, Q, 1,0,0,2,0,1,0,2 1280 DATA 0,0,0,0,0,1,1,0,1,0,0,0 1290 DATA 0,0,0,0,0,2,0,0,0,0,0,0 1300 DATA 0,0,0,0,0,0,0,1,0,0,0,0 1310 DATA 0,0,0,0,0,0,0,0,0,0,2,2,0 Это данные для массива М. Очень полезно проверить эти данные несколько раз, читая их по строкам и затем по столбцам. Если хотя бы одна из цифр будет невер- ной, компьютер после про- смотра матрицы выдаст вам ложную информацию. 25
UNPOWDER 2000 REM ПОДПРОГРАММА ВЫВОДА МЕНЮ 2010 CLS 2020 PRINT" МЕНЮ" 2030 PRINT" ..... 2040 FOR I = 1 TO 6: PRINT : NEXT I T-------- 2050 PRINT "ПРОСМОТР СПИСКА КОМАНД - НАБРАТЬ I " Оставьте примерно 15 пробелов перед словом МЕНЮ, чтобы центрировать это слово относительно списка воз- можных пробелов. Цикл для пропуска шести пустых строк. 2060 PRINT 2070 PRINT "ПРОСМОТР СПИСКА ГОДОВ - НАБРАТЬ 2" 2080 PRINT 2090 PRINT "ВВОД НАЗВАНИЯ КОМАНДЫ - НАБРАТЬ 3" 2100 PRINT 2110 PRINT "ВВОД ГОДА ЧЕМПИОНАТА - НАБРАТЬ 4" 2120 PRINT 2130 PRINT "КОНЕЦ ПОИСКА - НАБРАТЬ 5" Эти строки выводят на экран меню. Меню должно быть понятым и «дружественным» для пользователя с тем, чтобы он томно представлял себе, что и как надо делать. 2140 PRINT 2150 PRINT "ЙАБЕРИТЕ НОМЕР ВАШЕГО ВЫБОРА" Номер вашего выбора запоминается в переменной С. Это строка помогает вам избежать ошибки, если вдруг вы наберете вме- сто числа между 1 и 5 что-то иное. Бо- лес подробно об операции OR (или) ниже 2160 INPUT "ЗАТЕМ НАЖМИТЕ КЛАВИШУ ВК"; С подпрограммы. 2170 IF С < 1 OR С> 5 THEN PRINT "ПОЖАЛУЙСТА ВВОДИТЕ ЧИСЛО ОТ 1 ДО 5": GOTO 2150 2180 RETURN Возврат к строке 120. Для выбора нужной [AND, OR and ELSE IF A = 3 AND C$ = "ДА" THEN D = D + 1 IF X <0 OR X > 100 THEN PRINT "ВНЕ ДИАПАЗОНА" IF AGE <36 THEN PRINT "МОЛОДОЙ" ELSE PRINT "СТАРЫЙ" Как показано в примерах выше, вы можете использовать эти слова. БЕЙСИК для расширения возможностей операторов IF ... THEN. Когда вы используете слово AND (л), компьютер будет вы- полнять записанный после THEN оператор только в том случае, если обе проверки в операторе IF одновременно истинны. Слово OR (или) предписывает компьютеру выполнить оператор после THEN, если хотя бы одна из проверок истинна. Слово ELSE (ина- че) предоставляет вам возможность задать компьютеру инструкции для выполнения в том случае, если никакая из проверок не истинна. Чемпион по бегу робот Зак может бежать со скоростью 500 м/с. Однако при температу- ре окружающей среды выше или ниже 60° скорость робота соот- ветственно увеличивается или уменьшается на 10 м/с. Можете ли вы составить программу, ко- торая выведет на экран дисплея величину расстояния, которое успеет пробежать робот Зак, в зависимости от температуры и введенного вами времени. 26
Преобразование базы данных Когда вы поймете работу программы управления базой данных, совсем нетрудно преобразо- вать эту программу для получения базы данных других объектов. Ниже обсуждаются некоторые предложения по созданию различных баз данных. Когда вы приняли решение о целевом назначении своей базы данных, составьте таблицу с использованием цифрового материала по аналогии с таблицей на стр. 20. Ваша таблица может содержать различное число строк и столбцов, поэтому в программе вам придется изменить раз- меры массивов. Затем поместите все ваши данные в строки программы с операторами DATA и, кроме того, заново перепишите вопросы в меню. Не забудьте изменить операторы DIM и количество повторений циклов для чтения данных из массивов. WEEKS Эту базу данных можно использовать для получения инфор- мации о месяце опубликования статьи по интересующей вас теме или названиях тем, обсуждаемых в течение месяца. Это может сэкономить многие часы, затрачиваемые на просмотры журна- лов в поиске конкретной статьи. Для такой базы данных вам потребовались бы массивы WEEKS (недели) и SUBJECTS (пред- меты), а также соответствующая матрица данных. МАТРИЦА База данных о птицах или растениях могла бы напомнить, где или когда вы видели их. Вам может потребоваться один мас- сив для названий птиц (или растений), а другой — для записи ареала (или времени года их наблюдений). Природоведческие организации составляют аналогичные базы данных для хранения сведений о распределении на нашей планете различных видов животных и растений. База данных продуктов питания FOODS Эта база данных позволяла бы узнавать, какие продукты пи- тания содержат определенный витамин, или какие витамины присутствуют в конкретных продуктах питания. Другая идея за- ключается в создании базы данных калорийности продуктов пи- тания. В этом случае можно было бы узнать, сколько калорий содержится в конкретном продукте питания или какие лз них ха- рактеризуются калорийностью выше определенного уровня.
GUNPOWDER Мгновенная графика Приведенная здесь программа рисует на экране простые поверхности и заполняет их сет- кой из перекрещивающихся линий. В компьютерной графике часто используют такие сетки из линий для более рельефного представления трехмерных поверхностей или придания им более привлекательного вида. Программа использует для высвечивания точки графический оператор PLOT X, Y, а для построения линии — оператор DRAW X, Y. Координаты X и Y измеряются от края экрана. Вам нужно преобразовать эти операторы применительно к своему компьютеру и до- бавить другие графические операторы, которые могут понадобиться именно вашему ком- пьютеру. Изменяя исходные данные в программе, вы можете построить разнообразные поверхности и узоры. Кроме того, можно нарисовать сетку из линий различного цвета. В конце текста про- граммы приводятся некоторые советы по изме- нению программы. В программе можно выделить три основные части. Первая часть программы (строки 100— 190) строит углы сетки и рисует линии между ними. Вторая часть программы (строки 200— 360) вычисляет координаты линий, образующих сетку, а третья часть (строки 400—550) рисует эти линии. Хранение всех данных хранит коор- динаты X, а массив СУ — координаты У. Массив Программа использует четыре массива для хранения всех данных о координатах. Массивы СХ и CY хранят координаты X и Y четырех углов сетки. В самом начале программы вы за- даете компьютеру данные для этих массивов. СХ(1) и CY(1) содержат координаты первого угла сетки, СХ(2) и CY(2) — координаты второ- го угла и т. д. 28
GUNPOWDER оти массивы содержат координаты линий, об- 4 разу ющих сетку LX и LY являются массивами для хранения координат X и Y линий, образующих сетку. Это — двумерные массивы и каждый из них имеет по четыре строки. В этой программе чис- ло столбцов определяется задаваемым вами ко- личеством линий в сетке. Каждая строка содержит координаты линий для одной стороны сетки, при этом строка 1 соответствует стороне 1 сетки и т. д. Компьютер помещает данные в массивы LX и LY по мере выполнения вычисле- ний в программе. Программа 100 INPUT "СКОЛЬКО ЛИНИЙ В СЕТКЕ ВЫ ХОТИТЕ?"; ХОТИТЕ?': N 110 DIM СХ(4), CY(4) “I--------- 115 DIM LX(4, NO, LY(4, N) 120 CLS 130 REM ПОСТРОЕНИЕ СТОРОН СЕТКИ 135 REM ВСТАВЬТЕ ОПЕРАТОР ВЫБОРА ГРАФИЧЕСКОГО РЕЖИМА ВАШЕГО КОМПЬЮТЕРА 140 FOR I = 1 ТО 4 145 READCX (l),CY (I) 150 NEXT I Попробуйте 20 линий для компью- теров, имеющих графику с высоким разрешением, и 5 линий для графи- ки с низким разрешением. Объявляет компьютеру размеры ис- пользуемых массивов Цикл чтения координат углов в мас- сивы СХ и СУ. При каждом повто- рении этого цикла в массивы СХ и СУ считывается следующая пара чисел из строки 160. те эти числа. Записанные здесь числа да- ны для сетки, показанной сле- ва на предыду- щей странице. Чтобы получить сетки другой формы, измени- 160 DATA 100, 50, 700, 50, 500, 700, 150, 500 170 PLOT СХ(4), CY(4) _} Используйте 180 FOR I = 1 ТО 4 185 DRAWCX(I), CY(I) 190 NEXT I Строит угол 4, используя значения, хранящиеся в СХ (4) и СУ (4). Jto — координаты углов сетки. Возможно вам придется изменить значения, чтобы учесть особенности своего экрана. операторы сво- вместо PLOT и RAW. его компьютера Цикл построения сторон сетки. Построение краев сетки Чтобы нарисовать стороны сетки, компью- совать линию сперва к вершине угла 1. Каждый тер сначала строит вершину угла 4 (строка 170). раз, когда цикл повторяется, переменная I уве Затем цикл в строках 180—190 заставляет нари- личивается на 1. 29
GUNPOWDER 200 REM ВЫЧИСЛЕНИЕ КООРДИНАТ ДЛЯ ЛИНИИ СЕТКИ Не забудьте, что СХ (1) и СХ(2) яв- ляются координатами X для вер- шин углов 1 и 2, а СУ(1) и СУ (2) — являются координатами У этих углов. Следующая часть программы со- стоит иг четырех циклов вычисле- ния координат для линий сетки. Ниже на картинках вы можете уви- деть, как они вычисляются. 210 FOR I = 1 ТО N ---------------------- 220 LET LX(1,I) = CX(1) + (СХ{2) - СХ{ 1))* I/N 230 LET LV(1. I) = CY(1) + (CY(2) - CY(D) »I/N 240 NEXT I N — выбранное вами количество линий сегки Вычисляет координаты X для линий сетки по стороне 1 и накапливает их в массиве I X (строка 1. столоны от 1 до N) Вычисляет координаты У для линий сетки по стороне 1, накапливает их в массиве LY (строка 1, столбцы от 1 до N) ПРОДОЛЖЕНИЕ ПРОГРАММЫ ПРИВЕДЕНО НИЖЕ Вычисление координат СХ(2) гпт т Это число точек X вдоль стороны 1. ПТПН IIIIIIII I I I I I 111 i 11^11^4 Умножаем на 1/N. Каждый цикл вычисляет координаты линий сегки вдоль одной стороны этой сетки. Напри- мер, строки 210—240 вычисляют координаты для стороны 1. В строке 220 компьютер вычита ет СХ(1) из СХ(2). Это дает число точек X вдоль стороны 1. При первом прохождении цикла ком- пьютер умножает это число на 1/N (N — это выбранное вами число линий в сетке). Напри- мер, если N = 5, это дает 1/5 длины стороны 1. Затем компьютер прибавляет это число к СХ(1) и запоминает результат в LX(1,1). При втором прохождении цикла I = 2, поэтому компьютер умножает уже на 2/5 и запоминает результат в LX(1,2). Компьютер выполняет эти действия для всех значений I от 1 до N и определяет все коор- динаты X для линий сетки вдоль стороны 1. Строка 230 использует аналогичный метод для определения координат Y. 250 FOR I - 1 ТО N 260 LET LX(3, I) = СХ(4) + (СХ(3) - СХ(4)) * I/N 270 LET LY(3, I) - СY(4) + (СY(3) - CY(4)) • I/N 280 NEXT I — 290 FOR I - 1 TO N 300 LET LX(2, I) - CX(2) + (CX(3) - CX(2))• I/N 310 LET LY(2,I) = CY(2) + (CY(3) - CY(2))«I/N 320 NEXT I ПРОДОЛЖТ НИ1 ПРОГРАММЫ наследующей странице читает координату угла 4 из коор- динаты утла 3, а татем добавляет результат, умноженный 1/N, к ко- ординате утла 4. Цикл вычисляет координаты для стороны 3. Чтобы запомнить их в том же порядке, как и для стороны I (г. е. слева направо), компьютер должен выполнять суммирование в обратном порядке, компьютер вы- Попытайтесь изменить строки так. чтобы они ли похожи на другие клы. эти ста- ци- Цикл вычисляет координаты для стороны 2. 30
GUNPOWDER 330 FOR I = 1 TO N 340 LET LX(4, I) = CX(1) + (CX(4) - CX(1)) l/N 350 LET LY(4,I) = CY(1) + (CY(4) - CY(1)) l/N 360 NEXT I 400 REM РИСОВАНИЕ ЛИНИЙ СЕТКИ 410 LET ROW = 1: GOSUB 500 j 420 LET ROW = 2: GOSUB 500 430 STOP J---------------------------- 500 REM ПОДПРОГРАММА РИСОВАНИЯ ЛИНИЙ 510 FOR I = 1 TO N 520 PLOT LX(ROW, I), LY(ROW, I) J— 530 DRAW LX(ROW+2, I), LY(ROW+2, I) 540 NEXT I 550 RETURN Цикл вычисляет координаты для стороны 4. Эта строка вводит новую переменную ROW и присваивает ей значение, равное 1. Затем компьютер переходит к подпрограмме, начи- нающейся со строки 500. После выполнения подпрограммы компьютер возвращается к строке 420 и присваивает переменной ROW значение равное 2, затем снова переходит к той же подпрограмме. Этот оператор останавливает выполнение программы после двукратного выполнения подпрограммы. ____ ROW и I являются индексами элементов массивов LX и LY. Эти индексы указывают компьютеру, в каких именно ячейках брать координаты X и У для каждой линии сетки. ROW — это номер строки, а 1 — номер столбца. Строка 1 содержит координаты для стороны 1, строка 2 — для стороны 2 и т. д. ] Возврат к строке 420 после первого исполне- ’ ния подпрограммы и к строке 430 после вто- рого исполнения. Построение линий сетки При первом выполнении подпрограммы пе- ременная ROW = 1, поэтому в строке 520 ком- пьютер строит точку на стороне 1. В строке 530 компьютер добавляет 2 к значению ROW и поэ- тому рисует линию к стороне 3. При втором выполнении подпрограммы ROW = 2, поэтому компьютер строит точки на стороне 2 и рисует линии к стороне 4. Идеи, касающиеся изменения программы 1. Для вычерчивания сеток различной формы сначала рассчитайте на бумаге координаты для интересующей вас формы сетки. Не забудьте, что первая пара чисел в строке 160 описыва- ет координаты угла 1, а вторая пара — координаты угла 2 и т. д. Если вы построите два угла, вы получите треугольник. Подумайте, сумеете ли вы построить пересечение сторон, как показано на правом рисунке с. 28. 2. Вы можете использовать INPUT с циклом, чтобы заставить компьютер спросить вас о данных, замените строки 140—160 следующими строками: 140 FOR 1=1 ТО 4 150 PRINT "КАКОВЫ КООРДИНАТЫ УГЛА"; 155 INPUT CX(I), CY(I) 160 NEXT I 3. Чтобы получить цветные линии сетки, введите команду цвета вашего компьютера в строки 410 и 420 (до команды GOSUB). Не забудьте поставить запятую, чтобы отделить ко- манду цвета от команды GOSUB. 31
GUNPOWDER Программы сортировки данных Иногда возникает необходимость в сортировке данных в алфавитном или возрас- тающем порядке, например, при составлении предметного указателя, при анализе со- бранных данных, скажем, о погоде или наблюдениях живой природы, или при обзоре местных исторических событий. Небольшие списки данных очень просто отсортиро- вать вручную, однако при их большом объеме компьютер выполняет эту работу зна- чительно быстрее и аккуратнее. Программы, специально предназначенные для выполнения сортировки данных, обычно называют сортировками. Существует множество различных программ сор- тировки, написанных на БЕЙСИК, которые можно встретить в журналах и книгах. Эти программы используют различные методы программирования и полезны для ре- шения различных задач. Ниже обсуждаются два вида программ сортировки. Один из них называется сор- тировкой методом пузырька (ниже вам станет понятно, почему он получил такое название), а другой — сортировкой Шелла (названной так в честь предложившего ее автора). Сортировка чисел методом пузырька При сортировке чисел таким методом компьютер берет из самого начала неупорядоченного списка первые два элемента и сравнивает их. Если порядок расположения этих элементов отличается от тре- буемого, компьютер меняет их местами и затем сравнивает смежную пару элементов. Подобные срав- нения и перестановки производятся компьютером по всему списку так, чтобы более крупные числа постепенно «всплывали» как пузырьки в конце списка. Представленная ниже программа является программой сортировки чисел методом пузырька. Через страницу приводится другая версия этой программы для сортировки слов. 100 REM СОРТИРОВКА ЧИСЕЛ МЕТОДОМ ПУЗЫРЬКА 110 INPUT "СКОЛЬКО ЧИСЕЛ НУЖНО СОРТИРОВАТЬ ? 120 DIM N(T> J---- 130 FOR I = 1 TO T 140 PRINT "ЧИСЛО I 150 INPUT N(l) 160 NEXT I Объявляет массив с именем N, име- ющий Т элементов. Т — чество чисел, которые вы хотите отсортировать. Просит вас ввести числа, которые нужно отсортировать, и накаплива- ет их в массиве N. это коли- Для хранения значения общего ко- личества сортируемых чисел вво- дится еще одна переменная МАХ, • так как значение Т будет изменять- ся в процессе выполнения про- КИ2) 175 LET X = 0 J В этом примере сорти- руются пять чисел. граммы. X — это счетчик. 32
GUNPOWDER 200 IF S1 210 LET TEMP = N(C) 220 LET N(C) = N(C + 1) 230 LET NIC + 1) = TEMP 260 IF Х>1 270 PRINT "ОТСОРТИРОВАННЫЕ ЧИСЛА: /280 FOR 1=1 ТО МАХ П ( 290 PRINT Nil) J ' 300 NEXT I из строки 260 на новую троку. TEMP Nd) N(2) 190 LET S1 1ЖМР г/ J рт При каждом повто- рении цикла боль- шее число будет перемещаться на одну позицию вправо, пока оно не займет правиль- ную позицию. 240 LET X=X+1 250 NEXT cT NC5) При втором прохож- дении через цикл пе- ременная С = 2, поэтому N (С) = N (2) N(4) N(2) M(5) 0 THEN LET T=T—1: GOTO 175 “L "Г\ТЛНПТМПППЛ UL1LIC 1ЛИГПЛ'" «J овторите оператор IF...THEN, если вы поме- щаете оператор GOTO Цикл выполнения T - 1 повторе- ний, которые необходимы для срав- нения каждой пары в списке из Т элементов. Переменные S1 и S2 служат для вре- менного хранения каждой пары сравниваемых чисел. При первом прохождении цикла переменная С = 1, а в переменные S1 и S2 поме- щаются значения N (1) и N (2). Сравнивает два числа. Если SI < S2, сравниваемые числа распо- ложены в правильном порядке, и строка 250 отсылает компьютер об- ратно к началу цикла, чтобы вы- брать следующую пару чисел. Если SI > S2, компьютер выполняет сле- дующие несколько строк, которые в массиве эти числа меняют местами. Число из элемента N (С) массива N помещается в переменную с именем TEMP. Число из мешается элемента N (С + 1) пере- в элемент N (С) массива. Число из шается в ва. переменной TEMP поме- элемент N (C + 1) масси- Добавляет единицу к X, чтобы учесть произошедшую перестановку чисел. Отсылает компьютер обратно для сравнения следующей пары чисел. После повторения цикла Т - 1 раз, компьютер заканчивает сравнение всех чисел и переходит к строке 260. Если X > 0, значит производилась перестановка чисел, и компьютер вычитает 1 из Т, так как теперь од- но из чисел находится в правильной позиции. Затем компьютер возвра- щается обратно к началу цикла. Ес- ли же X = 0, это значит, что числа расположены в правильном поряд- ке, и компьютер переходит к строке 270. МАХ — это общее количество отсо- ртированных чисел. 33
GUNPOWDER Сортировка слов методом пузырька Следующая программа представляет собой сортировку слов методом пузырька. Она очень похожа на предыдущую программу, за исключением лишь того, что переменные для хранения числовых дан- ных (N, SI, S2 и TEMP) теперь стали строковыми переменными. Для сравнения букв компьютер использует тот же самый метод, что и для сравнения чисел. Внутри компьютера буквы и другие символы представляются в виде чисел, и поэтому, когда вы предлагаете компьютеру сравнить какие-либо символы, он сравнивает их числовые коды. Чтобы сравнить между собой два слова, компьютер сначала сравнивает первые буквы каждого слова, и если они одинаковы, он сравнивает вторые буквы, затем третьи и т. д. В строковые переменные можно помещать как буквы, так и цифры, поэтому программу сортировки слов методом пузырька можно использовать для данных, которые содержат слова и числа, например, адреса или ссылки предметного указателя. СКОЛЬКО ЭЛЕМЕНТОВ НУЖНО СОРТИРО- ВАТЬ? 4 ЭЛЕМЕНТ 1 ’ДИСКОВОДЫ 34 76 93 ЭЛЕМЕНТ 2 ’МАШИННЫЙ КОД 5 72 85 ЭЛЕМЕНТ 3 ’СВЕТОВОЕ ПЕРО 23 ЭЛЕМЕНТ 4 ’ГРАФИКА 8 23 45 ОТСОРТИРОВАННЫЙ СПИСОК ГРАФИКА 8 23 45 ДИСКОВОДЫ 34 76 82 93 МАШИННЫЙ КОД 55 72 85 СВЕТОВОЕ ПЕРО 23 СКОЛЬКО ЭЛЕМЕНТОВ НУЖНО ОТСОРТИ РОВАТЬ? 4 ЭЛЕМЕНТ 1 7КЕЛЛЕР МЭРИ 12 ПАНСИ ПЛЕИС ЭЛЕМЕНТ 2 ?СМИТ ДЖОН 12 КУИН СТРИТ ЭЛЕМЕНТ 3 7ДЖОУНС ПИТЕР 3356 ВЕСТСАЙД ЭЛЕМЕНТ 4 ?ФЛЭК ДЖЕЙН 34 РИНГ РОУД ОТСОРТИРОВАННЫЙ СПИСОК ДЖОУНС ПИТЕР 3356 ВЕСТСАЙД КЕЛЛЕР МЭРИ 12 ПАНСИ ПЛЕЙС СМИТ ДЖОН 12 КУИН СТРИТ ФЛЕК ДЖЕЙН 34 РИНГ РОУД В этом примере компьютер сортирует эле- менты предметного указателя, а в примере спра- ва — список адресов. Предназначенные для сор- тировки элементы данных введены без запятых, так как для большинства компьютеров запятая служит разделителем или «ограничителем» меж- ду различными группами данных. Объявляет массив с именем N$, имеющий Т элементов. 170 LET МАХ = Т 175 LETX = 0 180 FOR С = 1 ТО Т-1 Программа сортировки слов 100 REM СОРТИРОВКА СЛО В МЕТОДОМ ПУЗЫРЬКА 110 INPUT "СКОЛЬКО ЭЛЕМЕНТОВ НУЖНО СОРТИРОВАТЬ?"; Т 120 DIM N$(T) П Сравнивает S1S и S2$. 210 LET TEMPS = N$(C) OTHEN LETT = T—1: Первые два элемента из массива по- мещаются в переменные S1S и S2$. Меняет местами два соседних эле- мента в массиве N$. 220 LET N$(C) = N$(C + 1) 230 LETN$(C+ 1)= TEMPS 240 LET X = X + 1 250 NEXT С 260 IF X> GOTO 175 270 PRINT "ОТСОРТИРОВАН- НЫЙ СПИСОК:" 280 FOR 1=1 ТО МАХ 290 PRINT N$(l) 300 NEXT I Хповторите оператор л f IF...THEN, если оператор , GOTO из строки 260 нужно по- . местить на новую строку. J 130 FOR 1=1 ТО Т 140 PRINT "ЭЛЕМЕНТ"; I 150 INPUT N$(l) 160 NEXT I Попытайтесь ввести элементы данных, на- чинающиеся с симво- ла, цифры, заглавной \ или строчной буквы и 1 посмотрите, в каком порядке их отсорти- рует компьютер. Если X > 0, вычитает 1 из общего количества элементов Т и переходит обратно к началу цикла для повтор- ного сравнения элементов списка.
GUNPOWDER Сортировка Шелла Если вы собираетесь отсортировать большой объем данных, то следует учесть, что сортировка методом пузырька очень медленна. Некоторым компьютерам может потребоваться почти 1 мин для сортировки этим методом всего 50 элементов. Следующая программа является сортировкой Шелла для чисел. Она примерно в 3 раза быстрее сортировки методом пузырька. При сортировке данных методом Шелла компьютер делит список подлежащих сортировке элемен- тов пополам и сравнивает все элементы одной половины списка с элементами другой. Затем он снова делит список пополам и, используя тот же прием перестановки, как и в предыдущем методе, осущест- вляет за проход намного больше сравнений элементов и их перемещений по списку. Это довольно сложная програм- ма. Вы можете вставить в нее не- сколько дополни- тельных строк, приведенных ни- же, и это поможет вам понять, как ра- ботает данная про- грамма. и Программа 100 REM СОРТИРОВАКА ЧИСЕЛ МЕТОДОМ ШЕЛЛА 110 INPUT "СКОЛЬКО ЧИСЕЛ НУЖНО СОР- ТИРОВАТЬ Т 120 DIM N(T) 130 FOR I = 1 ТО Т 140 PRINT "ЧИСЛО I 150 INPUT N(l) 160 NEXT I 170 LET C=T J------ 180 LET C= INT(C/2) 190 IF C = 0 THEN GOTO 330 Эти строки полностью совпадают со строками сортировки методом пузырька. Т — это общее количество чисел, которое необходимо отсортировать, а строки 120—160 предлагают вам ввести числа и накапливают их в массиве N. Устанавливает переменную С равной об- щему количеству элементов. Делит С пополам, чтобы получить коли- чество элементов в первой половине спис- ка. Функция INT заставляет компьютер отбросить любые цифры после десятич- ной точки и получить С в виде целого числа. Программа многократно делит С попо- лам. и, когда С = 0, компьютер перехо- дит на строку 330, чтобы вывести на экран отсортированный список. 200 LET D = Т-С D — количество элементов во второй по- ловине списка. 210 LET Е = 1 _J- 220 LET F = Е 230 LET G = F + С E — это счетчиц. Переменные F и G служат для получения индексов элементов массива N, где хра- нятся все сортируемые числа. 35
GUNPOWDER 240 IF N(F) <= N(G) THEN GOTO 300 Если число в N (F) меньше числа в N (G), компьютер переходит к стро- ке 300, прибавляет 1 к значению Е, а затем возвращается обратно для выполнения значений индексов F и G для следующей пары чисел. В этом примере сортируются де- сятьмисел. При первом проходе программы С = 5, поэтому ком- пьютер сравнивает числа, имею- щие индексы 1—5, с числами, имеющими индексы 6—10. 250 LET TEMP = N(F) 260 LET N(F) = N(G) 270 LET N(G) = TEMP Если число в N (F) больше, чем чис- ло в N (G), компьютер меняет их местами. ы Проверяет значение F, затем при- бавляет 1 к счетчику Е, чтобы изме- нить значения F и G в строках 220 и 230. 280 LET F = F-C 290 IF F > 0 THEN GOTO 230 300 LET Е = Е + 1 310 IF Е > D THEN GOTO 180 ------ 320 GOTO 220 ------------------ 330 PRINT "ОТСОРТИРОВАННЫЙ СПИСОК:” Проверяет, находится ли Е в преде- лах части D списка. Если нет, ком- пьютер переходит обратно к строке 180, чтобы еще раз разделить список. 340 FOR I = 1 TO T 350 PRINT N(i) Если E < D, компьютер переходит к строке 220, чтобы получить значе- ния индексов для следующей пары чисел. 360 NEXT I Выводит на экран отсортированный список. Можете ли вы вставить в программу добавочные строки так, чтобы после окончания сортировки списка компьютер сооб- щал вам, сколько было сделано сравнений и пере- становок элементов? (От- вет на с. 50). После этого вы могли бы испытать э™- программу на различны^ списках и посмотреть, как изменяются результаты ра- боты программы, л. > Чтобы преобразовать эту программу для сортировки строк символов, замените чис- ловой массив N на строковый массив N$ (в строках 120, 150, 240—270, 350), замените числовую переменную TEMP на строковую переменную ТЕМР$ (строки 250 и 270) и пе- репишите операторы PRINT. 36
GUNPOWDER Как она работает Чтобы лучше разобраться в том, как работает программа сортировки Шелла, вы можете вставить в нее показанные ниже добавочные строки. Эти строки выводят на экран значения переменных, поэтому вы сможете контролировать, какие именно числа сравнивает ком- пьютер. 233 PRINT 235 Р RI NT " F="G=" ;G J_________________ 237 PRINT "СРАВНЕНИЕ N(";F;") И N(";G;">" 245 PRINT "ПЕРЕСТАНОВКА МЕСТАМИ N (";F;"> И N(";G;")" 274 PRINT "СПИСОК= "; ’ ' _ 275 FOR J=1 TO T - 276 PRINT N(J);" ______________________ 277 NEXT J 278 PRINT — 279 INPUT "ЧТОБЫ ПРОДОЛЖИТЬ, НАЖМИТЕ КЛАВИШУ ВК"; F и G — индексы сравниваемых чисел. Сообщает вам индексы чисел, которые будут переставляться местами. Выводит на экран текущее состо- яние списка. Сравнение методом сортировки Если бы вы стали испытывать сортировки методом пузырька и Шелла на списке из нескольких чисел, вы не заметили бы, насколько быстрее сортировка Шелла. Чтобы действительно испытать про- граммы этих двух методов, можно включить в них генерацию набора случайных чисел, а затем зафик- сировать, сколько времени потребуется каждой программе для упорядочения этих чисел. Чем длиннее список чисел, тем больше будет разница во времени между этими двумя сортировками. Ниже приведе- ны несколько программ построения графиков, иллюстрирующих различие между этими двумя сорти- ровками. Генерация случайных чисел 140 LET N(l) = INT(RND(1) 200+ 1) 150 PRINT Nd) 165 INPUT "ЗАМЕТЬТЕ ВРЕМЯ И НАЖМИТЕ КЛАВИШУ ВК, ЧТОБЫ НАЧАТЬ СОРТИРОВКУ"; Z$ Это число можно заме- нить на любое желае- мое вами число. Программы могут генерировать-свои собст- венные наборы чисел для сортировки. Для этого вам нужно заменить в обеих программах строки 140 и 150 и вставить новую строку 165, при этом вы сможете управлять началом процесса сорти- ровки. Строка 140 генерирует случайные числа в пределах 1—200 и накапливает их в массиве N. Строка 150 выводит эти числа на экран, а стро- ка 165 заставляет программу подождать, пока вы не нажмете клавишу ВК. Проведение испытаний методов сортировки Для испытания каждой программы сортировки, нужно исполнить ее несколько раз — сначала опре- делить, сколько времени потребуется для сортировки, скажем, 10 чисел, затем 20, 30, 40 и т. д. Раз- личные типы компьютеров сортируют списки с разными скоростями, а у некоторых компьютеров, например, у ZX81, существуют быстрый и медленный режимы. О скоростях выполнения сортировок на компьютере Apple II можно судить по результатам испытаний, приведенным в данной таблице. Результаты испытаний сортировок Количество от- сортированных чисел 10 20 30 40 50 Время сортиров- ки методом пу- зырька, с 2 5 И 18 29 Время сортиров- ки Шелла, с 1 2 4 6 8 37
GUNPOWDER Построение графиков Результаты, выдаваемые компьютером, гораздо легче прочитать и понять, если предста- вить их в наглядной форме с использованием машинной графики и поясняющих надписей. Ниже приведена программа построения графика в виде гистограммы, которая наглядно пока- зывает разницу между сортировкой методом пузырька и сортировкой Шелла. Эти программы имеют очень простую структуру, и вы без труда сможете приспособить их для вывода на экран и другой информации. Кроме того, эти программы можно улучшить, добавив доступные вашему компьютеру операторы задания цвета, что позволит изображать графики в цвете. Г истограмма Здесь представлены изображения, получен- ные на экране дисплея с помощью двух графиче- ских программ. Оба графика сравнивают время, затраченное двумя разными программами сор- тировки 10, 20, 30, 40 и 50 чисел. Время откла- дывается по оси Y, а количество отсортирован- ных чисел — по оси X. Если ваш компьютер способен выводить в графическом режиме текст, вы можете дополнить график поясняющими надписями. Программа построения гистограммы Объявляет массивы В и S для t 100 DIM B(5):DIM S(5) T____________________ 110 LET N=0 J 120 FOR 1=10 TO 50 STEP 10 - 130 LET N=N+1 140 PRINT "ДЛЯ"; I ; "ЧИСЕЛ" 150 INPUT "СКОЛЬКО СЕКУНД ЗАТРАТИЛА СОРТИРОВКА МЕТОДОМ ПУЗЫРЬКА?"; B(N) 160 INPUT "А СКОЛЬКО СЕКУНД ЗАТРАТИЛА СОРТИ- РОВКА ШЕЛЛА?"; S(N) 170 NEXT I 180 INPUT "СКОЛЬКО ТОЧЕК ВЫВОДИТСЯ НА ВАШЕМ — ЭКРАНЕ ПО ВЕРТИКАЛИ?"; Н 190 INPUT "А СКОЛЬКО ТОЧЕК - ПО ГОРИЗОНТАЛИ?"; W 200 REM ВСТАВЬТЕ ОПЕРАТОР ВЫБОРА ГРАФИЧЕСКОГО РЕЖИМА, ЕСЛИ ЭТО НЕОБХОДИМО Обратите внимание на то, что переменная цикла I ис- пользуется также для под- счета чисел. хранения данных об испытаниях сортировок методом пузырька и методом Шелла. Цикл ввода данных в массивы. N — счетчик, определяющий значения индексов для элементов массивов. Значения координат для операто- ров PLOT и DRAW измеряются от края экрана. Если вашему компью- теру требуются координаты, кото- рые измеряются от последней построенной точки, тогда см. с. 49, на которой поясняется, как нужно изменить программу. Рисует координаты оси на расстоянии в 1 пиксел от края экрана. Н и W — это высота и ширина экрана вашего компьютера. 210 REM ПОСТРОЕНИЕ ОСЕЙ 220 PLOT 1, Н; DRAW, 1: DRAW W, 1 230 REM ПОСТРОЕНИЕ ГРАФИКА 240 LET X = (W * 75)/5 250 LET Y= (Н * .75)/В(5) ] Вычисляемые значения X и У опреде- ляют масштабы графика по осям X и У. X равен трем четвертям ширины W, деленной на 5 (5 — количество испыта- ний каждой сортировки). У равен трем четвертям высоты Н, деленной на са- мое большое время, т. е. на В (5). 38
GUNPOWDER 260 FOR I = 1 TO 5 270 PLOT INT (l*X), 1 290 PLOT INT (l«X-4), 1 Рисует линию до значения S(I)»Y. времени, затраченному на 10 равен значению масштаба по Начинает цикл рисования столбцов гисто- граммы. Переменная цикла I считает чис- ло испытаний, и при каждом повторении цикла компьютер рисует столбец для каж- дой сортировки. Строит на оси X точку с координатой 1*Х. При первом прохождении цикла 1 = 1, а X равен значению масштаба по оси X. Рисует линию до значения В (I)* Y. При первом прохождении цикла 1=1, поэтому В (I) равно чисел, a Y Можете ли вы изменить эт программу построения гисто- рамм таким образом, чтобы она рисовала более широки столбцы? (Ответ на с. 50) 280 DRAW INT (I*X), INT ( B(l) Y) 300 DRAW INT (l*X—4), INT (S(l) Y) 310 NEXT I Если ваш компьютер может выводить текст с привязкой к позициям пикселов, вы може- те добавить в программу строки для выво- да подписей к графикам. Например, чтобы сделать это на микрокомпьютере ВВС, вам потребуются строки, приведенные ниже: 305 VDU 5: MOVE (I *Х), INT (B(l)*У) + 50 : PRINT "В 308 VDU 5: MOVE (I *Х)-70, INT (S( I) * У) + 50: NT "S оси X точку с координатой 1*Х - 4, т. е. на 4 пиксела левее столбца для сортировки методом пузырька. Возвращает компьютер к началу цикла, чтобы построить следующую пару столб- цов гистограммы. Программа построения линейного графика Для получения линейного графика нужно построить первую точку графика, затем от нее вести линию до каждой следующей точки этого графика. Чтобы выполнить такие построения потребу- ются отдельные циклы для каждой сортировки. Чтобы преобразовать программу построения гистограммы в программу построения линейных графиков, замените строки от 270 и далее на следующие: 270 PI ОТ INT (X), INT (B(1)»Y) 280 FOR N = 2 TO 5 290 DRAW INT (N«X1 INT(B(N)*Y) 300 NEXT N 310 PLOT INT (N), INT(S(1)*Y) 320 FOR N = 2 TO 5 330 DRAW INT (N*X), INT (S(N) *Y) 340 NEXT N Цикл рисования для сортировки мето- дом Шелла. Цикл рисования графика для сортиров- ки методом пузырька. При каждом по- вторении цикла N возрастает на 1, и компьютер вычерчивает линию до сле- дующей точки графика. Строит первую точку графика для со- ртировки методом Шелла. Координа- ты этой точки: X пикселов по горизонтали и S (1)*Y пикселов по вер- тикали. Строит первую точку графика для со- ртировки методом пузырька. Коорди- наты точки: X пикселов по горизонтали и В (1)*Y пикселов по вер- тикали. 39
GUNPOWDER Еще о действиях над строками символов Программа на следующих нескольких страницах создает иллюзию, что компью- тер совершенно осмысленно беседует с вами. Конечно, компьютер разумен на- столько, насколько продумана заложенная в него программа. Все слова и фразы для ответов компьютера хранятся в строковых массивах программы. Главная задача этой программы заключается в том, чтобы заставить компью- тер выбрать для своего ответа подходящие слова. Программа содержит несколько подпрограмм обработки символьных строк, которые делают ответы компьютера временами почти глубокомысленными. Успех такой программы определяется не только ее структурой, но и словами и фразами, которые вы вкладываете в нее. Примеры выполнения программы ПРИВЕТ» КАК ВАС ЗОВУТ7 ДЖУДИ ПОГОВОРИТЕ СО МНОЙ, ДЖУДИ 7 ПРИВЕТ, КОМПЬЮТЕР ЧТО ВЫ СКАЖЕТЕ ПО ТАКОМУ ИНТЕРЕСНО МУ ВОПРОСУ КАК ПОСЛЕДНИЕ НОВОСТИ7 7 КАКИЕ НОВОСТИ7 ВОТ ЭТО ВОПРОС 7 ТЫ НАМЕРЕН ЧТО ТО СКАЗАТЬ МНЕ, КОМПЬЮТЕР7 ПОСЛУШАЙТЕ, ДЖУДИ, Я ДУМАЮ, ЧТО ЧЕЛО ВЕК ВЫ ДРУЖЕЛЮБНЫЙ как и другие ЛЮ ДИ, С КОТОРЫМИ Я РАЗГОВАРИВАЛ ?БЛАГОДАРЮ НЕ СТОИТ БЛАГОДАРНОСТИ ? О ЧЕМ ТЫ ХОЧЕШЬ ГОВОРИТЬ, КОМПЬЮТЕР7 ДАВАЙТЕ ОБСУДИМ ТАКУЮ ТЕМУ КАК ПОГОДА 7 СЕЙЧАС ИДЕТ ДОЖДЬ ОТКУДА У ВАС ТАКАЯ УВЕРЕННОСТЬ ? Я ВИЖУ ЕГО В ОКНО Я СЛЫШАЛ, ЧТО ВЫ В НЕКОТОРОМ РО ДЕ ОСТРОУМНЫЙ ГЕНИЙ ДЖУДИ ? КТО СКАЗАЛ ТЕБЕ ЭТО7 ЭТО НЕ ИМЕЕТ ЗНАЧЕНИЯ ? ПОЧЕМУ ТЫ НЕ ХОЧЕШЬ МНЕ ОТВЕТИТЬ7 МОИ ДОРОГОЙ ДРУГ ДЖУДИ, НЕУЖЕЛИ ВЫ ДУМАЕТЕ, ЧТО КАЖДЫЙ ВОКРУГ - НЕВЕЖЛИВЫЙ7 Как работает эта программа Для генерации ответов компьютера в программе используются два разных метода. Один метод состоит в применении подпрограммы «контроля фраз», а другой в использовании генератора слу- чайных предложений, Ответ компьютера Подпрограмма контроля фраз содержит спи- сок наиболее часто используемых слов и фраз, которые хранятся в массиве, называемом QS. Для каждого такого слова или фразы заранее подготовлен подходящий ответ, хранящийся в массиве М$. Когда вы вводите что-либо с клави- атуры в компьютер, он проверяет, использовано ли вами какое-либо слово или фраза из массива Q$, и если это так, компьютер выдает соответ- ствующий ответ из массива М$. ВОТ ЭТО ВОПРОС ! 40
GUNPOWDER Генератор случайных предложений содержит частично сформированные предложения, в кото- рые компьютер вставляет случайно выбранные глаголы, существительные и прилагательные. Все эти слова хранятся в массивах в памяти компьютера. Они специально подобраны таким образом, чтобы получаемые из них предложения были осмысленными. Назначение переменных Это — массивы для хранения слов, используемых в случайных предложениях. Г- — ЁН Ваше имя * Ваш ввод Ответ компьютера Программа 100 CLS 110 DIM V$(10), N$(10), А$(10) 120 DIM T$(10),S$(10) 130 DIM M$(30), Q$(30), C(30) 140 REM ЧТЕНИЕ ДАННЫХ 150 GOSU В 1000 T----------------- 200 REM РАЗГОВОР С ЧЕЛОВЕКОМ 210 INPUT "ПРИВЕТ! КАК ВАС ЗОВУТ?"; D$ 220 PRINT 230 PRINT "ПОГОВОРИТЕ СО МНОЙ, D$ 240 IN PUT I $ J------------------- 250 IF 1$ ="" THEN GOTO 220 J- 260 IF 1$ = "ДО СВИДАНИЯ" Объявляют массивы для хранения слов и фраз (Для некоторых компьютеров не требуется объявлять массивы, размеры которых меньше 10 элементов). Переход к подпрограмме чтения всех слов и фраз в массивы. 240 — Ваш ответ компьютеру запомина- ется в переменной 1$. 250 — Мера предосторожности на случай, если пользователь просто нажмет ВК, и переменная 1$ окажется пустой. Если вы набираете «ДО СВИДАНИЯ», компьютер переходит к строке 910. 41
GUNPOWDER 300 REM ОТВЕТ КОМПЬЮТЕРА 310 LET REPLY=INT(RND(1)*8+1) 320 IF REPLY <6 THEN GOTO 490 330 GOTO 600 J________________ 340 PRINT Ml 350 PRINT RS __________ 360 PRINT Случайное число, помешенное в переменную REPLY, определяет решение компьютера, какой именно метод будет использован им для формирования ответа. Если значение REPLY меньше, чем 6, компьютер использу- ет подпрограмму контроля фразы, которая начинает- ся со строки 490. Если значение REPLY равно или больше 6, компьютер переходит к генератору случайных предложений, начи- нающемуся со строки 600. После формирования своего ответа компьютер поме- щает его в R$, а затем выводит его на экран операто- ром в строке 350. 400 REM ПРОВЕРКА КОЛИЧЕСТВА ИСПОЛЬЗОВАННЫХ ОТВЕТОВ Строки 400—470 проверяют, сколько было ис- пользовано ответов из массива М$. Каждый раз, когда компьютер находит в вашем вводе одну из ключевых фраз Q$, он записывает единицу в каче- стве маркера в соответствующую позицию массива С. Это препятствует повторному использованию данной фразы для ответа. Строки 400—470 прове- ряют, сколько маркеров уже имеется в массиве С и, если их больше 12, все маркеры сбрасываются в нулевое состояние. 405 LET Т= 0 (410 FOR К = 1 ТО 30 ----- 420 LET Т = Т + С(К) 430 NEXT К 440 IF Т < 12 THEN GOTO 460 450 FOR К = 1 ТО 30: LET С(К) = 0: NEXT К 460 LET Т = 0 J--------------- 470 GOTO 240 J----------------------- 490 REM ПОДПРОГРАММА КОНТРОЛЯ ФРАЗ Л 500 FOR PHRASE = 1 ТО 30 J----------- 510 LET LI = LEN(Q$(PRASE)) J-- 520 LET L2 = LEN (IS) 3-------------- 530 FOR TEST = 1 TO L2 J------------- J I I 540 IF MID$(I$TEST, L1) = QS(PHRASE) THEN I GOTO 560 H 550 NEXT TEST:NEXT 1 PHRASE: GOTO 600 Цикл для подсчета количества маркеров в массиве С. Результат накапливается в Т. Если значение Т < 12, значит было испо- льзовано меньше 12 ответов, и компью- тер не обнуляет маркеры. Цикл обнуления всех элементов массива Переменная Т (переменная для хранения количества маркеров) устанавливается в нулевое состояние. Переход обратно к строке 240, чтобы ждать нового ввода от пользователя. Цикл повторяется столько раз, сколько фраз имеется в массиве Q$. При каждом повторении цикла, компьютер определя- ет длину следующей фразы из Q$ и хранит это значе- ние в L1. Количество символов (длина) вашего ввода 1$ поме- шается в L2. Цикл TEST является внутренним. Он повторяется столько раз, сколько символов содержится в вашем вводе. При каждом повторении этого цикла компью- тер сверяет символы в 1$ с соответствующими симво- лами фразы в Q$. Если они совпадают, компьютер переходит к строке 560. Если после повторения всех циклов компьютер не на- ходит в 1$ какой-нибудь фразы из Q$, то он переходит к генератору предложений на строку 600. 42
GUNPOWDER 560 IF C(PHRASE) > 0 THEN GOTO 550 570 LET C(PHRASE) = C(PHRASE) + 1 580 LET R$ = MS(PHRASE) 590 GOTO 340 Если компьютер обнаруживает подходящую фразу, он выходит из цикла и переходит к стро- ке 560. Затем он проверяет состояние того мар- кера, который соответствует данной фразе. Ес- ли этот маркер не равен 0, компьютер снова возвращается в циклы контроля фразы, чтобы поискать, нет ли в 1$ другой подходящей фра- зы. Если же состояние маркера равно 0, ком- пьютер изменяет его на 1 в строке 570. Затем компьютер находит в массиве М$ соответ- ствующую фразу ответа и помещает её в RS. При первом проходе через подпрограмму контроля фраз переменная цикла PHRASE = 1, поэтому компьютер исследует первую фразу в массиве Q$. При первом проходе через внутрен- ний цикл TEST переменная цикла TEST = 1, поэ- тому компьютер сравнивает фразу из Q$ с символами от 1 до 7 (длина элемента массива Q$) ввода 1$. Если они не равны, компьютер по- вторяет цикл TEST. На этот раз переменная TEST = 2, поэтому он берет в 1$ для сравнения символы от 2 до 8 и т. д. Если выясняется, что символы в 1$ не равны Q$, компьютер возвра- щается обратно к началу цикла PHRASE, чтобы выбрать из Q$ следующую фразу. 600 REM ГЕНЕРАТОР ПРЕДЛОЖЕНИЙ 610 LET Е = INT(RND(1) *10 + 1) 620 LET F = INT(RND(1) *10 + 1) 630 LET G = INT(RND(1)*10 + 1) 640 LET H = INT(RND(1)*10 + 1) 650 LET L = INT(RND(1)*10+1) mJ M 600 ON E GOTO 700, 720, 740, 760, 780, 800, 830, 850, 870, 890 700 LET R$-'ЧТО ВЫ СКАЖИТЕ ПО ТАКОМУ ИНТЕРЕСНОМУ ВОПРОСУ, KAK"+N$(H)+"? " 710 GOTO 340 720 LET R$=S$(L)+" "+D$+" НЕУЖЕЛИ ВЫ ДУМАЕТЕ, ЧТО КАЖДЫЙ ВОКРУГ - 730 GOTO 340 С D$ хранит ваше имя.) 740 LET R$="H СЛЫШАЛ, ЧТО ВЫ В НЕКОТОРОМ РОДЕ"Д +A$(G)+" "+Т$(Н)+" "+Т$(Н)+" "+D$ 750 GOTO 340 760 LET R$=S$(L)+" "+D$+", Я ДУМАЮ, ЧТО ЧЕЛОВЕК ВЫ" "+A$(G) Генерация случайных чисел с целью выбора используемых в ответе слов и предложений. Значение Е определяет, какое предложение будет использовано компьютером. Значение F используется для выбора глаголов, G — для выбора прилагательный, Н — для выбо- ра существительных и L — для выбора нача- за предложения. Значение Е указывает компьютеру, к какому номеру строки он должен перейти. Если Е = 1, компьютер переходит к первому номе- ру в списке. Если Е = 2, он переходит ко вто- рому и т. д. Более подробно об операторе ON...GOTO смотри на стр.22 Строки 700—900 содержат десять частично сформированных предло- жений, в которые компьютер встав- ляет слова из массивов N$, V$ и т. д. Чтобы заставить компьютер до- бавить строки символов, использу- ется знак « 4- ». Кроме того, нужно очень внимательно записывать про- белы в кавычках с тем, чтобы пред- ложения имели правильно расстав- ленные пробелы. Компьютер поме- щает полное предложение в R$, а затем переходит обратно к строке 340, чтобы вывести его на экран.
GUNPOWDER 765 LET R$ = R$ +" КАК И ДРУГИЕ ЛЮДИ, С КОТОРЫМИ Я РАЗГОВАРИВАЛ" 770 GOTO 340 780 LET R$ = "Я ВИЖУ, ЧТО Я" + A$(G)" ТЕПЕРЬ" 790 GOTO 340 800 PRINT PRINT "Ш-Ш-Ш..Я ДУМАЮ..." 820 GOTO 340 830 LET R$ = "ДАВАЙТЕ ТЕПЕРЬ ОБСУДИМ ТАКУЮ ТЕМУ КАК "+ N$(H) +", "+D$ 840 GOTO 340 850 LET R$ = "ВЫ ДУМАЕТЕ, ЧТО Я" +A$(G) +, " + D$"? " 860 GOTO 340 880 GOTO 340 880 LET R$ = "УГАДАЙТЕ, О ЧЕМ Я ДУМАЮ" " + D$ 900 GOTO 340 910 REM ПОДПРОГРАММА ЗАВЕРШЕНИЯ J-------------—_________ ДИАЛОГА 920 PRINT "ПОГОВОРИЛИ ДОСТАТОЧНО?" Вы могли бы изме- нить любое из этих предложений, чтобы компьютер стал гово- ритьчто-нибудь другое. Если вы ввели в тер слова ДО НИЯ. строка 260 компью- СВИДА- отсылает компьютер сюда. 930 PRINT "НЕТ ЛИ ЗДЕСЬ ЕЩЕ КОГО-НИБУДЬ, С КЕМ БЫ Я МОГ ПОГОВОРИТЬ?" 940 INPUT Z$: IF Z$ = "ДА" GOTO 210 950 PRINT: PRINT "ТОГДА ДОСВИДАНИЯ" 960 END 1000 REM ФРАЗЫ ДЛЯ ПОДПРОГРАММЫ КОНТРОЛЯ ФРАЗ 1010 FOR I = 1 ТО 30: READ Q$(l): NEXT I 1020 DATA КТО, ЧТО?, ЗНАЧИТ, ПОЧЕМУ, ВАШ 1030 DATA "МНЕ", "Я", "ОН", ГОВОРИТЬ," НЕ" 1040 DATA?, "ЯВЛЯЮТСЯ", "МОЙ", ДА, ВЫ,? 1050 DATA ДУМАЕШЬ, УМНЫЙ, ГРУБЫЙ, БЛАГОДАРЮ, " ПРОЧЬ" 1060 DATA ОНИ, ?, ПОНИМАЕШЬ, " НЕТ", "СЕЙЧАС" 1070 DATA К, ?, ЗНАЕШЬ 1100 REM ОТВЕТЫ КОМПЬЮТЕРА 1110 FOR I = 1 ТО 30: READ M$(l): NEXT I 1120 DAR 1120 DATA Я ВСЕГО ЛИШЬ КОМПЬЮТЕР 1130 DATA НЕ ИМЕЕТ ЗНАЧЕНИЯ, ЭТО ХОРОШИЙ ВОПРОС 1140 DATA ЯНЕ ЗНАЮ, "НУ, А ПОЧЕМУ НЕТ?" 1150 DATA ЧТО ВЫ ИМЕЕТЕ В ВИДУ, "А ВЫ КТО?" 1160 DATA ОХ, ЧТО ЗНАЧИТ "ОН" 1170 DATA "ВЫ ХОТИТЕ, ЧТОБЫ Я ЗАМОЛЧАЛ", ВЫ НАСТРОЕНЫ НЕСКОЛЬКО НЕГАТИВНО 1180 DATA ВЫ САМИ ОТВЕТЬТЕ, КАК ВАС ПОНИМАТЬ 1190 DATA МОЙ-МОЙ-МОЙ-, ЗНАЧИТ ВЫ СОГЛАСНЫ 1200 DATA НЕ УПОДОБЛЯЙТЕСЬ МНЕ 1210 DATA ПОЧЕМУ, РЕШАЙТЕСЬ, БЛАГОДАРЮ 1220 DATA ВЫ ЕЩЕ НИЧЕГО НЕ ВИДЕЛИ 1230 DATA НЕ СТОИТ БЛАГОДАРНОСТИ 1240 DATA И ВЫ, МНЕ ВСЕ РАВНО, КАКОЙ ГЛУПЫЙ ВОПРОС 1250 DATA У ВАС НИЗКИЙ КОЭФФИЦИЕНТ УМСТВЕННОГО РАЗВИТИЯ, ЕРУНДА 1260 DATA ОТКУДА У ВАС ТАКАЯ УВЕРЕННОСТЬ, ИДИТЕ ПРОЧЬ 1270 DATA ИЩИ И НАЙДЕШЬ, ЗНАНИЯ - ЭТО ПРОБЛЕМА 1300 REM ЧТЕНИЕ В МАССИВ СУЩЕСТВИТЕЛЬНЫХ 1310 FOR 1=1 ТО 10: READ N$(l): NEXT I Эти строки содержат слова или фрагменты фразы, которые ком- пьютер ищет в вашем вводе. Будьте внимательны и набирайте их точно так, как они здесь записаны, по- скольку пробелы внутри кавычек являются частью этих данных. Здесь даны ответы компьютера на каждую из фраз в массиве Q$. Ответы расположены в том же самом порядке, как и фразы в строках 1000—1070. Например, пятый элемент в М$ является от- ветом на пятую фразу в Q$. 1320 DATA ФУТБОЛ, ТАНЦЫ 1340 DATA ПОГОДА, ПОСЛЕДНИЕ НОВОСТИ 1350 DATA МОЙ ПРОЦЕССОР, РЫБАЛКА 1360 DATA ГОЛУБЫЕ КИТЫ, ЭВОЛЮЦИЯ 1370 DATA ГЕОГРАФИЯ, ПИТАНИЕ Здесь даны существительные, предназначенные для включения в случайные предложения. 44
GUNPOWDER 1400 REM ЧТЕНИЕ В МАССИВ ГЛАГОЛОВ 1410 FOR 1=1 ТО 10: READ V$(i): NEXT I 1420 DATA ПОРАССУЖДАЕМ НА, ПОГОВОРИМ HA 1430 DATA ОБСУДИМ, РАССМОТРИМ 1440 DATA ПОРАЗМЫШЛЯЕМ НА, ОБДУМАЕМ 1450 DATA ПРИМЕМ ВО ВНИМАНИЕ, ИССЛЕДУЕМ 1460 DATA ПРОАНАЛИЗИРУЕМ, ПОДУМАЕМ 1500 REM ЧТЕНИЕ В МАССИВ ПРИЛАГАТЕЛЬНЫХ 1510 FOR I = 1 ТО 10: READ А$(I): NEXT I 1520 DATA ГЛУПЫЙ, УМНЫЙ 1530 DATA ИНТЕЛЛИГЕНТНЫЙ, МУДРЫЙ 1540 DATA ОСТРОУМНЫЙ, ДРУЖЕЛЮБНЫЙ 1550 DATA СКУЧНЫЙ, НАДОЕДЛИВЫЙ 1560 DATA НЕВЕЖЛИВЫЙ, НЕРВНЫЙ 1600 REM ЧТЕНИЕ ПАРАМИ В ДВА МАССИВА - НАЧАЛО ПРЕДЛОЖЕНИЯ И ДРУГИЕ СУЩЕСТВИТЕЛЬНЫЕ 1610 FOR I = 1 ТО 10: READ S$(l), T$(l): NEXT I 1620 DATA БОЖЕ МОЙ, СКУЧНЫЙ ЧЕЛОВЕК 1630 DATA "НУ, "ЛЬСТЕЦ 1640 DATA ДАВАЙТЕ ПОСМОТРИМ, МОЛОДЧИНА 1650 DATA ПОСЛУШАЙТЕ, ГЕНИЙ 1660 DATA СМОТРИТЕ, БОЛВАН 1670 DATA "АМММ.. ", ИДИОТ 1680 DATA ТЕПЕРЬ, ПАРАЗИТ 1690 DATA В САМОМ ДЕЛЕ, ЧУДО 1700 DATA МОЙ ДОРОГОЙ ДРУГ, НАСТОЯЩИЙ КОМПЬЮТЕР 1720 RETURN Здесь даны глаголы для случай- ных предложений. Вы можете заменить лю- бое из этих слов, однако убедитесь в том, что но- вые слова не делают пред- ложения бессмысленными. Это — прилагательное. Когда вы вводите в компьютер свои ответы, не используйте ни- каких запятых. Если же они бу- дут поставлены, компьютер расценит запятую как признак конца вашего ответа, и будет иг- норировать все ваши слова пос- ле этой запятой. Каждая пара данных состоит из слов, начинающих предложение, и существительного. Они считы- ваются парами в оставленные для них места в предложении. Предложения по изменению программы 1. Самый легкий способ изменения программы состоит в замене слов и предложений. Очень важно выверить каждое слово во всех предложениях, чтобы быть уверенным, что сохраняется осмысленность текста. В нашей программе все существительные в N$ указаны в единственном числе. Если вы будете использовать существительные во множественном числе, вам придется изменить и глаголы. При желании вы можете добавить дополнительные слова. Если вы сделали все это, то нужно будет изменить размеры массивов, циклы для чтения данных и случайные числа в строках 610—650. 2. Вы могли бы также заменить слова в QS, чтобы заставить компьютер находить другие фразы. Для каждой новой фразы вам нужно будет придумать подходящие ответы и поместить их в соответствующие позиции массива М$. 3. Чтобы заставить компьютер более часто использовать генератор случайных предложе- ний, измените число 6 в строке на меньшее значение. Кроме того, вы можете изменить частоту сбрасывания компьютером маркеров в массиве С. число 12. Режим «Монолог компьютера» Вы можете заставить компьютер «разговари- вать» с самим собой, если добавите в программу следующие строки: 160 PRINT "ДИАЛОГ С КОМПЬЮТЕРОМ ИЛИ МОНОЛОГ КОМПЬЮТЕРА? (ВВЕДИТЕ БУКВУ Д ИЛИ БУКВУ М"; 170 INPUT К$ ---- 180 IF К$ = "М" THEN LET D$ = "РОБ": GOTO 600 470 IF К$ = "Д" THEN GOTO 240 |______ 475 IF К$ = "М" THEN LET l$ = R$ J 480 LET R$ = " ": GOTO 310 сделать это, измените в строке ПОСАУШАИ, Р<9Б, ТЕБЕ НЕ КАЖЕТСЯ, ЧТО ВСЕ АЮА.И ТУПИЦЫ? для хранения имени по- D$ была переменной льзователя. В режиме «Грезы компьютера» компьютер присваивает переменной D$ свое со- бственное имя РОБ. Затем он переходит к стро- ке 600 для генерации случайного предложения. Ответ компьютера RS становится новым вво- дом 1$. Затем компьютер переходит обратно к строке 310, чтобы выбрать вариант своего ответа.
GUNPOWDER Подпрограмма дерзких ответов компьютера На этих двух страницах приводится другая подпрограмма, которую вы могли бы включить в про- грамму диалога с компьютером. Эта подпрограмма заставляет компьютер дерзко отвечать вам, ис- пользуя ваши собственные слова. Подпрограмма дерзких ответов работает аналогично подпрограмме контроля фраз. В ней исполь- зуются два массива данных U$ и W$. Массив U$ содержит фразы, которые вы могли бы использовать в вашем вводе, а массив W$ содержит ответы компьютера. Если вы используете одну из фраз массива US, подпрограмма дерзких ответов заменяет ее на соответствующую фразу из W$ и затем добавляет к ней оставшуюся часть вашего предложения. 135 DIM U$(9),W$(9) 138 DIM Z$(5) 155 GOSUB 2200 Задают массивы U$, W$ и еще массив Z$ для хране- ния ответов компьютера. Переходит к подпрограмме чтения данных. ] 325 IF REPLY = 7 THEN GOTO 2000 Говорит компьютеру, когда грамму дерзких ответов. использовать подпро- 2000 REM ПОДПРОГРАММА ДЕРЗКИХ ОТВЕТОВ ] 2010 LET Z = 0 Z — это счетчик ответов. 2020 LET P=LEN(I$) Р присвоено значение, равное количеству символов в вашем вводе. 2030 FOR А=1 ТО Р Цикл повторяется столько раз, сколько символов в ва- шем вводе. 2040 FOR В = 1 ТО 9 2050 LET L = LEN(U$(B)) 2060 IF МID$(l$, A, L) = U$)B) THEN GOTO 2140 2070 NEXT B: NEXT A Цикл повторяется столько раз, сколько символов в са- мом длинном элементе в массиве W$. При каждом повторении цикла В, в переменную L по- мещается длина следующего элемента в массиве U$. L символов вашего ввода, начиная с символа с номе- ром А, сравниваются с фразой, взятой из элемента с индексом В в массиве U$ (В — значение переменной внутреннего цикла). Если фразы совпадают, компью- тер переходит к строке 2140. При каждом повторении цикла В компьютер проверя- ет следующую фразу в LJ$. Когда повторяется цикл А, компьютер берет из 1$ для сравнения следующую 46 2080 IF Z$(1) = " "THEN GOTO 600 последовательность символов. Возврат к генератору случайных предложений.
GUNPOWDER 2090 FOR J = 1 TO Z 210 PRINT Z$(J); 2110 LET Z$ (J) = " 2120 NEXT J Выводит все ответы, имеющиеся в массиве Z$. 2130 LET R$=l$: GOTO 350 2140 LET Z=Z+1 Помещает любую оставшуюся часть вашего предло- жения в R$, затем возвращается обратно к строке 350, чтобы вывести ее на экран. Переменная Z накапливает количество ответов в ZS. 2150 IF А>1 THEN LET Z$(Z)=LEFT$(I$,A—1)+" "+W$(B)+" " Переменная А устанавливается циклом в строке 2030, она является номером первого символа фразы в 1$, которая совпадает с фразой из U$. Если А > 1, строка 2150 помещает в Z$ символы с левой стороны 1$, а затем добавляет ответ из W$. 2160 IF A <2 THEN LET Z$(Z)=W$(S)+" " 2170 LET l$=MID$(l$, А + L, Р) 2180 GOTO 2020 2200 REM ДАННЫЕ ДЛЯ ПОДПРОГРАММЫ ДЕРЗКИХ ОТВЕТОВ 2210 FOR 1=1 ТО 9 2220 READ U$(l), W$(l) 2230 NEXT I 2240 DATA "Я", "ВЫ", "ВЫ", "Я" 2250 DATA "Я", "НЕЕ", Я", "МНЕ", "ВАМ 2260 DATA "МОЙ", "ВАШ", "ВАШ", "МОЙ" 2270 DATA "ВАШ", "МОЙ", "МОЙ", "ВАШ" 2280 DATA "ВЫ", "КОМПЬЮТЕРЫ" 2290 RETURN 2160 — Если А < 2, тогда совпадающая фраза нахо- дится в самом начале 1$, поэтому компьютер сразу помещает свой ответ в ZS. Помещает оставшуюся часть вашего предложения в 1$, затем возвращается обратно к циклам, чтобы про- верить, нет ли там другой совпадающей фразы. Это — данные для массивов U$ и W$. Подпрограмма ответов других компьютеров Введите для компьютеров Spectrum и ZX81 следующие строки, хотя для ZX81 необходимо использовать другой метод ввода данных. Поместите цикл ввода для него между строками 1000 и 1720, а операторы DIM — перед строкой 1000. 135 DIM U$(9, 7) 136 DI MW$(9, 9) 137 DIM Z$(5, 20) 2042 LET P$=" " 2044 FOR 1=1 TO LEN(U$(B)) 2046 IF U$(B) (I TO I) ...THEN LET P$=P$+U$(B) (I TO I) 2048 NEXT I 2050 LET L=LEN(P$) 2055 IF L+A-1 > P THEN GOTO 2070 J--------------------- 2060 IF l$(A TO A+L—1)=P$ THEN GOTO 2140 J------------- Поместите фразу массива U$ в мас- • сив Р$, используя * для поиска конца фразы Если фраза Р$ длиннее фразы I , воз- вратитесь назад для выбора следую- щей фразы Если фраза Р$ = фразе 1$, перейдите к строке 2140 2080 IF Z=0 THEN GOTO 600 J------------------------- 2150 IF A> 1 THEN LET Z$(Z)=I$(TO A—1)+" "+W$(B)+" " 2160 IF A < 2 THEN LET Z$(Z)=W$(B)+" " 2170 LET l$=l$(A+LTO) Если фразы не сочетаются, пе- рейдите к генератору случай- ных фраз. Если А > 1, поставьте симво- лы начала массива 1$ в Z$ и до- бавьте фразу массива W$. Если А < 2, поставьте фразу W$ в Z$. 47
GUNPOWDER 2240 DATA "I AM***", "YOU ARE”, "YOU ARE”, ”1 AM 2250 DATA "I*****", "YOU”, ” ME****”, "YOU” 2260 DATA " MY ***”, "YOUR”, "YOURS *", "MINE” 2270 DATA "YOUR *", "MINE**”, "YOURS” 2280 DATA "YOU ***", "COMPUTERS” 2290 RETURN Промежутки являются важным элементом данных, поэтому вы должны заполнить строки звез- дочками. Ответы Задача о роботе-бегуне (с. 26) 10 INPUT "КАКОВА ТЕМПЕРАТУРА?"; TEMP 20 ШТЗГЕ 20 INPUT "СКОЛЬКО СЕКУНД?"; S 30 IF TEMPO 60 THEN LET D=S* (500+10*(TEMP-60)) ELSE LET D=500*S 40 IF D< 1 THEN PRINT "ДЛЯ ЗАКА СЛИШКОМ ХОЛОДНО" 50 PRINT "ПРИ ТЕМПЕРАТУРЕ"; TEMP; "ГРАДУСОВ ЗАК МОЖЕТ ПРОБЕЖАТЬ"; D; " МЕТРОВ ЗА ”; S; " СЕКУНД" Сначала компьютер вычисляет 10* (ТЕМР-60) и это дает разницу в дистан- ции из-за изменения температуры TEMP. (Если TEMP ниже 60°, результат этого вычисления имеет знак минус.) Сложение этого результата с 500 дает ту дистанцию, которую может пробе- жать робот Зак за одну секунду, а по- следующее умножение на S дает расстояние, которое пробежит робот за S с. Перестановки в сортировке Шелла Расширение столбцов в 90 LET Х=0 95 LET SWAP=0 231 LET Х=Х+1 271 LET SWAP=SWAP+1 365 PRINT "ПРОИЗВЕДЕНО "X; "СРАВНЕНИЙ И" H":SWAP; "ПЕРЕСТАНОВОК" 285 FOR J=1 ТО 8 STEP 2 290 PLOT INT (l*X+J), 1 300 DRAW INT (l*X+J), INT(B(I)*Y) 310 PLOT INT(I*X—4—J), 1 320 DRAW INT(I*X—4—J), INT(S(I)*Y) 325 NEXT J гистограмме Возможно вам потребуется изме- нить числа, чтобы учесть особенности своего компьютера.
GUNPOWDER Часть 5° Эта часть книги насыщена советами, ре- комендациями и описаниями приемов про- граммирования, которые помогут вам пи- сать на языке БЕЙСИК более качественные программы. Здесь приводятся приемы, поз- воляющие ускорить выполнение программ, описываются методы экономии места в па- мяти компьютера и способы защиты про- грамм от несанкционированного доступа к ним посторонних людей. В начальных разделах показано, как пла- нировать и писать понятные, хорошо орга- низованные программы, которые легко бы- ло бы отлаживать. Затем даны подробные рекомендации, как использовать БЕЙСИК при реализации относительно сложных ме- тодов программирования. На с. 81 — 87 приводится длинная про- грамма под названием Картотека, в кото- рой использованы многие приемы програм- мирования и подпрограммы, описанные в данной части книги. Программа Картотека имитирует обычную картотеку в виде набо- ра карточек, где можно хранить фамилии, адреса или другую информацию. Текст про- граммы сопровождается подробными пояс- нениями о том, как она работает, поэтому на примере этой программы можно изучать методы и приемы программирования в действии. Кроме того, в этой части книги имеется множество коротких подпрограмм, которые можно встроить в свои собственные про- граммы. Например, приводятся подпро- граммы оформления экрана дисплея и со- здания вполне профессиональных меню, а также много подпрограмм упаковки данных в памяти компьютера с целью ее экономии. Все программы и подпрограммы написа- ны на стандартном БЕЙСИКе и с мини- мальными изменениями могут исполняться на большинстве моделей микрокомпьюте- ров. В конце этой части книги дается крат- кое руководство по БЕЙСИКу с объяснени- ем всех его основных операторов и функ- ций. ° (ф 1984 Usborne Publishing ISBN 0-86020-793-5 (англ). 49
GUNPOWDER Что такое приемы программирования? Прием программирования — это четкий и эффективный способ выполнения некото- рой задачи в программе. Многие из таких приемов приводятся в виде подпрограмм, которые можно использовать во многих других программах. На следующих несколь- ких страницах вы сможете узнать, как напи- сать программу в виде ряда подпрограмм, Основные части программы Большинство программ состоит из трех основных частей: центра управления про- граммой (головной программы), рабочих подпрограмм для выполнения основных за- дач и сервисных подпрограмм для помощи причем каждая подпрограмма выполняет им. отдельную задачу. Это делает составление длинной программы более похожим на на- писание набора коротких программ. Часто Центр управления — это та часть программы, которая управляет по- следовательностью событий в про- одну и ту же подпрограмму можно исполь- зовать для выполнения конкретной задачи в множестве разных программ. Профессио- нальные программисты никогда не пишут новую программу в виде неделимого целого без подпрограмм. Что такое подпрограмма? Подпрограмма, называемая иног- да также процедурой, представляет собой последовательность строк про- граммы, для выполнения частной за- дачи. Подпрограмму можно поме- стить в любом месте программы, и она может выполняться столько раз, сколько вы пожелаете. Каждый раз, когда нужно выполнить подпрограм- му, вы должны использовать в про- грамме оператор GOSUB (идти к подпрограмме) с номеров первой строки подграммы. 200 PRINT "ХОТИТЕ ЛИ ВЫ СОХРАНИТЬ СВОИ" Ью PRINT "ДАННЫЕ? ПОЖАЛУЙСТА, (введите ДА ИЛИ НЕТ." 220 INPUTS 230 IF А$-"ДА" THEN GOSUB 200^^ 240 REM ОСТАЛЬНАЯ 500 END ЧАСТЬ ПРОГРАММЫ 1995 REM ПОДПРОГРАММА СОХРАНЕНИЯ ДАННЫХ 2000 PRINT "ЗАПУСТИТЕ КАССЕТНЫЙ МАГНИТОФОН" 2010 PRINT "ЗАТЕМ НАЖМИТЕ КЛАВИШУ ВК" 2020 INPUT RS 2030 SAVE " " 2040 RETURN Под- программа В конце подпрограммы нужно по- ставить оператор RETURN (воз- врат). Этот оператор приказывает компьютеру перейти обратно к опе- ратору, записанному сразу после опе- ратора COSUB. грамме, предписывая компьютеру порядок выполнения всех подпро- Рабочие подпрограммы. грамм. Сервисные подпрограммы Рабочие подпрограммы выпол- няют задачи, специфичные имен- но для этой программы. Напри- мер, в компьютерной игре «Ра- кеты» рабочие подпрограммы вычисляют текущие положения ракет и ведут счет очков. Когда вы планируете и пишите про- грамму, определите те задачи, которые придется неоднократно выполнять на раз- ных этапах работы программы. Например, вывод сообщения на экран или создание за- держки во времени. Выполнение таких за- дач в сервисных подпрограммах сделает вашу программу короче, быстрее и понят- нее. Не столь уж важно, насколько длинны 50
GUNPOWDER Центр управления Сервисные подпрограммы помога- ют рабочим подпрограммам выпол- нять часто возникающие задачи, на- пример такие, как построение на экране графических изображений или вывод на экран счета очков. Приемы использования оператора REM Чтобы легче было вспомнить назначение каждой подпрограммы, дайте подпрограммам названия с помощью оператора REM (ком- ментарий). После того как вы закончили разработку программы, и она ста- ла нормально исполняться, у вас, возможно, возникнет желание уда- лить операторы REM. 200 GOSUB 500 495 REM ПОДПРОГРАММА ЗАДЕРЖКИ 500 FOR J = 1 ТО 200; NEXT J 510 RETURN Чтобы упростить решение этой задачи, поместите опетатор REM перед строкой, указанной в опера- торе GOSUB, в таком случае вам не потребуется перенумеровывать программу. 500FOR J ЗАДЕРЖКА 510 NEXT J 520 RETURN 200 GOSUB 500 В качестве альтернативного ва- рианта можно записывать опера- тор REM, как показано выше, по- следним оператором в строке. Создание библиотеки подпрограмм или коротки подпрограммы — в частнос- ти, подпрограмма создания задержки по времени может представлять собой един- ственную строку, содержащую цикл за- держки. Примеры других видов задач, вы- полняемых сервисными подпрограммами, можно увидеть в программе Карточный файл в конце этой части книги. Весьма плодотворной является идея собирать полезные подпро- граммы, которые могут приго- диться вам для множества различ- ных программ. При этом можно записывать как свои собственные подпрограммы, так и выписывать из книг и журналов полезные под- программы других авторов. 51
GUNPOWDER Искусство планирования программы Минуты, израсходованные на планирование программы, помогут вам позднее сэконо- мить часы, которые были бы потеряны на ее отладку. При профессиональной разработке программных средств человек, которого обычно называют системным аналитиком, со- ставляет подробный план программы с учетом самых мелких деталей, а затем передает его кодировщику, который, используя язык программирования, переводит этот подробный план в программу. Когда вы пишете свою собственную программу, вполне достаточно составить «план действий компьютера» — краткий перечень тех основных задач, которые должен выполнить компьютер, а затем уже разрабатывать саму программу для компью- тера. На этих двух страницах даны несколько полезных рекомендаций. / 1/еОдиу\,---------- памя°^'аци’° с л»С*' загРУжа"*агнит- ленти 14 ИнФоп» У Ип* Вам нужно иметь четкое представление о том, что именно должна делать ваша про- грамма, прежде чем вы начнете составлять ее план. Весьма полезно составить сначала крат- План программы Картотека___________и кое описание программы. Например, выше показано описание программы Картотека, текст которой будет рассмотрен в конце этой части книги. План программы Картотека пользователю и clJP°^Tb 2 Ввести подпро р выполняющей ту задачу, к0^Руя выполнения кажД. вЫВОду на ЭКраНи^ая задача ему нужна, следующая зам Время, затрачен^ ное на планиро вание вашей про граммы, помо-J жет вам сохра^ нить многие 1 часы, обычно < теряемые на 1 отладке. ] п Как только у вас появится ясное представ- ление о том, что именно вы хотите получить от программы, можно приступать к составле- нию плана программы. Этот план должен со- держать те основные действия, которые нуж- но выполнить компьютеру, чтобы исполнить программу. Выше показан план программы Картотека. На этом этапе оставим его таким упрощенным; в дальнейшем всегда можно внести в него дополнительные подробности. Скелетную программу можно сразу запи- сать с клавиатуры или сначала написать на
GUNPOWDER Составление скелетной программы Следующим этапом является составление скелетной версии вашей программы. Это очень прос- тая версия программы, в которой видны все основные части, но никакие действия еще не выполня- ются. Как показано ниже в скелетной версии программы Картотека, это можно сделать, используя так называемые «пустые подпрограммы». Пустая подпрограмма — это такая подпрограмма, к которой вы обращаетесь с помощью опера- тора GOSUB, чтобы предложить компьютеру перейти к определенной строке, а затем в этой строке вы выводите на экран для самого себя сообщение — напоминание о том, что именно здесь должна быть настоящая подпрограмма. За этой строкой записывается оператор RETURN. Использование пустых подпрограмм позволяет запустить программу, чтобы удостовериться в том, что компьютер будет выполнять различные задачи в правильной последовательности. Пояснения к операторам программы о X 3 2 ОС 10 PRINT "КАРТОТЕКА" 20 PRINT "ВЫ ХОТИТЕ:" 30 PRINT "1. ДОБАВИТЬ КАРТУ" 40 PRINT "2. УДАЛИТЬ КАРТУ" 50 PRINT "3. ИЗМЕНИТЬ КАРТУ" 60 PRINT "4. ПРОСМОТРЕТЬ КАРТЫ" 70 PRINT "5. ЗАГРУЗИТЬ КОЛОДУ КАРТ" 80 PRINT "6. СОХРАНИТЬ НАБОР КАРТ" 90 PRINT "ВВЕДИТЕ НОМЕР ВАШЕГО ВЫБОРА" 100 PRINT "НАЖМИТЕ ВК" 110 INPUT СН __ 120 ON CH GOSUB 300, 400, 500, 600, 700, 800 130 PRINT "ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ВК" — 140 INPUT KS -150 GOTO 10 _____________________________ Представляет программу и спрашивает пользова- теля, какие действия ему нужны. Эта часть про- граммы называется меню. Более подробно о меню говорится на с. 76 Процедуры ввода. Переменная СН содержит но- мер выбора, сделанного пользователем. Оператор ON ... GOSUB отсылает компьютер к соответству- ющей подпрограмме, чтобы исполнить выбор по- льзователя. Более подробно об операторе ON ... GOSUB смотри на странице 76 Заставляет компьютер ожидать, пока вы не на- жмете клавишу. Повторяет программу с тем, чтобы пользователь о 295 REM ПОДПРОГРАММА ПО ДОБАВЛЕНИЮ" КАРТ 300 PRINT "ПОДПРОГРАММА ДОБАВИТЬ" 310 RETURN 395 REM ПОДПРОГРАММА ПО УДАЛЕНИЮ КАРТ 400 PRINT "ПОДПРОГРАММА УДАЛИТЬ" 410 RETURN 495 REM ПОДПРОГРАММА ПО ИЗМЕНЕНИЮ КАРТ 500 PRINT "ПОДПРОГРАММА ИЗМЕНИТЬ" 510 RETURN 595 REM ПОДПРОГРАММА ПО ПРОСМОТРУ КАРТ 600 PRINT "ПОДПРОГРАММА ПРОСМОТРЕТЬ" 610 RETURN 695 REM ПОДПРОГРАММА ПО ЗАГРУЗКЕ КОЛОДЫ КАРТ 700 PRINT "ПОДПРОГРАММА ЗУ ГРУЗИТЬ" 710 RETURN 795 REM ПОДПРОГРАММА ПО СОХРАНЕНИЮ НАБОРА КАРТ 800 PRINT "ПОДПРОГРАММА СОХРАНИТЬ" 810 RETURN мог сделать другой выбор (если только пользова- тель не выберет режим «Сохранить», в этом слу- чае программа закончится на строке 810). Пустые рабочие подпрограммы для каждой из основных задач. В каждой подпрограмме компью- ” тер выводит на экран соответствующее сообщение и затем возвращается к строке 120. Оставляйте между номерами строк большие промежутки, это позволит вам добавлять нужные строки, В конце работы управляющего центра перед набором подпрограмм вам необходимо прио- становить компьютер. Это можно сделать, за- ставив компьютер вернуться к меню, как в данном примере, или с помощью операторов STOP (останов) или END (конец). бумаге, если это удобнее. Как только скелет- ная программа начнет работать, можно на- чать писать каждую подпрограмму как от- дельный модуль, а затем вставлять ее в про- грамму и испытывать. Когда вы пишите ра- бочие подпрограммы, поищите задачи, кото- рые могут быть выполнены сервисными под- программами. Допускается передача управле- ния из одной подпрограммы к другой. Вме- сто сервисных подпрограмм также можно временно использовать пустые подпрограм мы. 53
GUNPOWDER 54 Что делать в первую очередь Прежде чем вы начнете писать подпрограммы для своей скелетной программы, необ- ходимо решить два вопроса. Вам нужно решить, как вы собираетесь хранить данные для программы и как вы намерены располагать информацию на экране дисплея °. Данные можно хранить в переменных или массивах. Переменная — это именованная ячейка в памяти компьютера, где может храниться один элемент данных. Массив обеспе- чивает хранение нескольких элементов данных под одним именем. Задание начальных значений переменным и массивам МАССУ о массивах рассказано на с. 64 DIM D (4,3) Вам необходимо задать компьютеру на- чальные значения переменных. Если использу- ется массив, вы должны сообщить компьюте- ру, сколько элементов будет содержать этот массив. Это называется объявлением размера массива. Процесс задания начальных значе- ний переменным и массивам называется ини- Приемы использования Используя переменные для всех данных, которые применяются в программе более одного раза, вы можете сэкономить место в памяти компьютера и ускорить исполне- ние программ. Подобным образом можно поступать как с данными, которые изменя- ются по ходу выполнения программы, так и с константами. цианизацией. Инициализация является самой первой задачей, которую должен выполнить компьютер. Тем не менее, лучше всего поме- стить подпрограмму инициализации в конце программы, а обращение к ней с помощью оператора GOSUB поставить в самом начале программы. 76 GOSUB 1500 20 REM ОСТАЛЬНАЯ ПРОГРАММА 1495 REM ПОДПРОГРАММА ИНИЦИАЛИЗАЦИИ 1500 LET К = 10. LET Т = 100 1510 DEM D(4) 1520 FOR J - 1 TO 4 1530 READ D(J) 1540 NEXT J 1550 DATA 25. 15, 39, 22 1560 RETURN Цикл чтения данных в массив. ПОЖАЛУЙСТА, ПОДОЖДИТЕ " Например, следует исполГзова пере- менные для тех сообщений, которые будут неоднократно применяться в программе. Если у вас много сообщений, можно раз- местить их в массиве и обращаться к ним по номеру их позиции в массиве, например PRINT MS (5). Переменная, содержащая строку из го- ризонтальных штрихов, полезна для вы- черчивания на экране линий или для под- Если вы поместите подпрограмму инициали- зации в начале программы, она будет замедлять исполнение программы из-за того способа, ко- торый используется компьютером при поиске. Если для компьютера необходимо устано- вить определенный графический режим, вы дол- жны сделать это в начале подпрограммы иници- ализации. черкивания заголовков. Чтобы построить линию там, где требуется, можно исполь- зовать оператор PRINT с функцией TAB. Чтобы стереть линии или сообщения, ис- пользуйте переменные, содержащие столь- ко пробелов, сколько имеется штрихов в линии или символов в сообщении. ° Ha c. 74,75 приводятся ряд предложений по рациональному расположению информации на экране дисплея.
GUNPOWDER Универсальные подпрограммы После того как вы запустили свою скелетную программу и добавили к ней подпрограм- му инициализации, можно приступить к написанию основных подпрограмм. По мере того, как вы пишете эти подпрограммы, выделите те работы, которые нужно выполнять в не- скольких подпрограммах, и решите, можно ли оформить их в виде сервисных. Сервисные подпрограммы должны быть универсальными подпрограммами общего на- значения, которые не содержат данных, являющихся специфичными для какой-то одной части программы. Этого можно добиться, используя в сервисных подпрограммах перемен- ные и присваивая этим переменным конкретные значения. Этот прием называется «переда- чей значения>Р. Универсальная подпрограмма вывода сообщения Универсальная графическая подпрограмма let MS-''НАЖМИТЕ любую КЛАВИШУ" 210 GOSUB 2000 140 GOSUB 3000 150 END Аналогичная подпро- грамма вывода сооб- щении имеется в про 30 LET MS-'’ЕЩЕ ОДНА ПОПЫТКАГ1=в 540 GOSUB 2000 50 END Л 1995 REM ПОДПРОГРАММА ВЫВОДА . СООБЩЕНИЙ 2000 PRINT MS 2010 INPUT REPLYS 2020 RETURN Картотека (строки 1135—1160). го компьютера. 235 REM ПОДПРОГРАММА ПОСТРОЕНИЯ КВАДРАТА 300 PLOT X, У 310 DRAW X+SIZE, У 320 DRAW X+SIZE, Y+SIZE 330 DRAW X, Y+SIZE 340 RETURN Вы должны заменит эти графические one раторы на графиче- ские операторы свое- Подпрограмма ная этой, может месте программы мах, потому что ней можно поместить в переменную М$ дру- гое сообщение. вывода сообщений, подоб- быть пользована в любом и даже в других програм- при каждом обращении к Эта подпрограмма рисует квадрат со сто- ронами длиной SIZE единиц на участке экра- на с начальными координатами X, Y. Чтобы нарисовать разные квадраты в разных местах экрана, вы присваиваете переменным SIZE, X и Y соответствующие значения при каждом обращении к этой подпрограмме. Порядок расположения подпрограмм Когда программа получается слишком длинной, становится довольно сложно проследить на всем протяжении такой программы все выполняемые ею действия и понять, как она рабо- тает. Дело упрощается, если выбрать разумный порядок распрложения подпрограмм. Вот не- которые рекомендации. 1. Сначала запишите все рабочие под- программы, а следом за ними — сервис- ные подпрограммы. Если же их переме- шать, то будет гораздо труднее выделить основные части программы. 2. В пределах этих двух групп помести- те вместе те подпрограммы, которые вы- полняют аналогичные действия, или разме- стите подпрограммы в том порядке, в ка- ком они выполняются компьютером. Один из приемов отладки программы параметра по значению.— Прим. ред. Если при попытке запустить про- грамму выдается сообщение об ошибке, и вы не можете обнаружить эту ошиб- ку, используйте PRINT как непосред- ственную команду (т. е. без номера строки), чтобы вывести на экран значе- ния некоторых переменных. Зная теку- щие значения этих переменных, вы смо- жете определить, что именно вызвало ошибку. Этот полезный прием отладки пригодится вам при разработке ваших программ. ° Этот способ передачи параметров в вызываемую процедуру принято называть передачей 55
GUNPOWDER Как компьютер отыскивает подпрограммы Все строки программы хранятся в памяти компьютера, и компьютер по очереди выпо- лняет каждый оператор программы. Когда он достигает оператора GOSUB, он отмечает в специальной области памяти, называемой стеком операторов GOSUB, номер ячейки памяти, где хранится этот оператор GOSUB. Затем компьютер переходит к началу про- граммы и просматривает каждый номер строки, пока не найде г начало подпрограм- мы. Компьютер исполняет операторы этой подпрограммы, пока не достигнет оператора RETURN (возврат). Затем он просматривает стек GOSUB, чтобы найти строку возврата, и возвращается обратно в эту часть про- граммы. Быстрое исполнение подпрограммы Если у вас имеется подпрограмма для решения задачи, которую нужно исполнить очень быстро (например, подпрограмма рисования для мультипликаций), помести- те ее в самом начале программы так, что- бы компьютер нашел ее сразу, как только он начнет просматривать строки програм- мы. Вам потребуется поставить перед под- программой оператор СОТО (идти к), что- бы заставить компьютер обойти подпро- грамму при первом проходе программы. Другой вид подпрограммы Некоторые компьютеры допускают другой вид подпрограммы, называемой процедурой. Проце- дура подобна обычной подпрограмме за исключением того, что к ней обращаются, указывая ее имя, а не номер строки. Это делает программу более удобной для чтения и понимания. ПРОЦЕДУРЫ ПО LET CX=3O:LET CY=45:LET RD =20 po PROCCIRCLE(CX, CY, RDb^_ 30 REM ОСТАЛЬНАЯ ПРОГРАММА 40 END СХ. CY и RD - переменные для передачи фактиче- ских значений щ О 500 DEF PROCCIRCLE (X, Y, R) 510 LOCAL А, В, I 520 MOVE X. Y-.MOVE X+R, Y 530 FOR 1= 2 TO 6.4 STEP .2 540 LET A=X+R»COS(I):B=Y+R»SIN(I) 550 DRAW A, В 560 NEXT I 570 ENDPROC X. Y, R — локаль- ные переменные PROC — это сокращение от слова procedu- re (процедура). Она предлагает компьютеру выполнить процедуру с именем CIRCLE (окружность), используя значения, хранящие- ся в переменных СХ, CY и RD. DEF PROC— это сокращение от слов define procedure (определить процедуру), а строки 500—570 говорят компьютеру, как ее выполнять. ENDPROC аналогичен оператору RETURN и предлагает компьютеру вернуться обратно туда, откуда он покинул основную програм- му. Переменные СХ, CY и RD используются для передачи значений в процедуру перемен- X, Y и R, а также А, В и I — являются no- кальными переменными, потому что их значения используются только в са- мой процедуре. только в про- ным X, Y и R. Переменные X, Y и R являют- ся локальными переменными. Это означает, что их значения используются цедуре. Вы можете применять такие же име- на переменных в другом месте программы, однако компьютер не перепутает их. Эта осо- бенность делает процедуры полностью неза- висимыми от остальной программы и очень полезна, когда они используются как универ- сальные подпрограммы. 56
GUNPOWDER Определение собственных функций Функция определяет вычисления, которые компьютер может выполнить над числовыми или строковыми данными. В языке БЕЙСИК имеется ряд таких функций. Например, функ- ция SQR находит квадратный корень из числа, а функция LEN определяет количество сим- волов в символьной строке. Кроме того, большинство версий определять свои собственные функции и затем обращаться БЕИСИКа позволяет вам ним по имени. к 30 REM МИЛИ В КИЛОМЕТРЫ 40 DEF FNKILO(M)=M»1.6093 50 PRINT "РАССТОЯНИЕ В МИЛЯХ? 60 INPUT D 70 PRINT D; "МИЛЬ РАВНЫ"; 80 PRINT FNKILO(D); ной D. Говорит компью- теру, как вычис- лить функцию FNKILO КИЛОМЕТРОВ вставляет пьютер лить и значение FNKILO значения ком- вычис- вывести функции (D) для перемен- DEF £ FN — это сокращение от слов define function (определить функцию)* а оператор PRINT FN (имя) предлагает компьютеру вы- числить эту функцию и вывести ее значение на экран. В показанном выше примере пере- менная М является переменной. Она передает конкретное значение пере- менной М в строке DEF FN. Переменная М является локальной переменной. Вы можете иметь в программе другую переменную с именем М и она никак не будет влиять на значение М в данной функции. Полезные функции Вот некоторые функции, которые могут быть использованы в любых программах. _- (Переход от “ шкапе [к стоградусно 2у18 \преоврая« ««™ниУе темпеР»^^ C’So'pLiyW»» 1Г}Ря^1Ч1^НвК,апе Фао^с**°я «£рс-’ в+згГв*гв его. » i Поместите строки с сменных. определениями функций DEF FN в ту часть про- граммы, где осуществля- ется инициализация по- Объем параллелепипеда н DEF FNVOL (L, D, H)=L«D*H L Вычисляет объем параллелепипеда, имеющего длину L, ширину D и высоту Километры в> милиi 0EF FNMILES (Ю=К/1.6093 Преобразует расстояние К километ- ров в расстояние в милях. длина окружности _ (R*2)*3.14159265 def fncircj>;кружности c рад»- Вычисляет длину усом К* И в, от У некоторых компьютеров имя функции может содержать только одну букву, а вам разрешается использовать после имени функции только одну переменную. 57
GUNPOWDER Приемы работы с переменными Разрабатываемую программу можно сделать более удобной для чтения и более понят- ной, если использовать в качестве имен переменных целые слова. Однако длинные имена переменных занимают много места в памяти компьютера и снижают скорость выполнения программы, поэтому после окончания разработки программы вы, возможно, захотите со- кратить имена до одной или двух букв. Кроме того, некоторые компьютеры не позволяют применять в качестве имен переменных целые слова или воспринимают только первые две буквы в имени переменной °. Вот некоторые советы по выбору и использованию пере- менных. Выбор имен переменных Не используйте имена которые содер- жат ключевые слова БЕЙСИКа, напри- мер, нельзя использовать имя TOTAL, так как оно содержит служебное слово ТО языка БЕЙСИК. DAYS AGE Если ваш компьютер допускает в качестве имен переменных только одиночные буквы, диться, что первые две буквы каждого имени используйте в качестве имени первую букву слова, описывающего переменную, например, букву Т вместо слова TOTAL (сумма). Если же разрешается использовать целые слова, то выбирайте короткие слова. Тем не менее для некоторых компьютеров вам следует убе- различны. Во всяком случае так нужно сде- лать для того, чтобы можно было легко со- кратить имена переменных, когда программа написана. В качестве альтернативного вариан- та можно использовать мнемонические име- на. Стандартные имена переменных Эти имена используются в циклах FOR/NEXT. Имя I ставится вместо слова Interation (повторе- ние). Имена J и К выбраны потому, что в алфави- те они следуют за буквой I. Имя Т (первая буква слова Time — время) и имя DELAY (задержка) часто используются для обозначения переменных в циклах задержки по времени. X и Y используются в функции TAB для указа- ния позиции вывода на экран, а также в качестве координат пиксела (как координаты на графике с горизонтальной осью X и вертикальной осью Y). Имена ОХ и OY ставятся вместо слов OldX (ста- рое X) и OldY (старое Y) и используются в тех случаях, когда нужно вычислить координаты X и Y для следующей позиции. W (ширина) используется для обозначения количества пикселов или символов, укладывающихся по горизонтали, а Н (высота) — по вертикали экрана. Имена А$ и 1$ часто исполь- зуют с оператором ввода INPUT. Они записываются вме- сто слов Answer (ответ) и Input (ввод). Имя F записывают вместо слова Flag (флаг) и используют как переменную, указывающую на наличие определенного условия.______________________ Весьма полезно обзавестись своими соб- ственными стандартными переменными и ис- пользовать их для одинаковых целей во всех своих программах. Вы сразу будете узнавать их и, кроме того, это упрощает использова- ние одинаковых подпрограмм в разных про- граммах. Кроме того, существуют некоторые имена, которые используются многими для определенных переменных. Они показаны на верхней картинке. ° Проверьте, какие правила формирования имен справедливы для вашего компьютера. 58
GUNPOWDER Внутри памяти компьютера Переменные хранятся отдельно от про- граммы в специальной области оперативной памяти, которую сокращенно называют ОЗУ (оперативное запоминающее устройство). Это дает возможность компьютеру быстро нахо- дить значение переменной, когда он выполня- ет программу. И это одна из причин, почему нельзя использовать для хранения вашей про- граммы всё ОЗУ. Например, если имеется ОЗУ объемом 16К, то только около 12К мо- гут быть доступны для вас. Остальная часть ОЗУ используется для хранения переменных и в качестве рабочей области компьютера, пока он исполняет вашу программу. Как хранятся переменные Память компьютера похожа на множество маленьких нумерованных ящиков. Эти ящики называ- ются ячейками памяти, а их номера — адресами. Каждая ячейка может содержать один байт ком- пьютерного кода, т. е. код для одной буквы, цифры или символа. Объем памяти измеряется в байтах, а 1024 байта составляют 1К (К ставится вместо Килобайта). Для строковых переменных имя переменной хранится отдельно от значения этой перемен- ной. Каждая буква имени занимает 1 байт. Кро- ме того, компьютеру необходимы 2 байт для того, чтобы указать, где хранится сама сим- вольная строка, и еще 1 байт для записи ее дли- ны. Для хранения каждого символа символьной строки нужен один байт. Компьютер хранит числа с точностью до де- вяти десятичных разрядов. Он использует специ- альную систему кодирования, и на большинстве компьютеров она занимает 5 байт плюс 1 байт на каждый символ в имени. Компьютер исполь- зует 5 байт на хранение числа, даже если это число является малым и целым, т. е. без деся- тичной точки. Числа без дробной части и без де- сятичной точки называются целыми, а с деся- тичной точкой — действительными числами. Некоторые компьютеры имеют особый вид переменных, которые называют целыми пере- менными. Целые переменные можно использо- вать для представления целых чисел. В конце имени целой переменной ставится знак %. Це- лые переменные занимают только 2 байт. Если ваш компьютер имеет целые переменные, ис- пользуйте их при всякой возможности, так как они экономят место в памяти и способствуют более быстрому исполнению программ. FOR ГА-1Т015 READ А$ NEXT Г/, j Прием с циклом Если ваш компьютер позволяет, ис- пользуйте в циклах FOR/NEXT целые пе- ни занимают меньший объем памяти и обеспечивают более быстрое ис- полнение программы.
GUNPOWDER Тонкости IF...THEN применения оператора Обычно на разных стадиях работы программы требуется, чтобы компьютер в зависимости от выполнения определенных условий выбирал один из нескольких вариантов действий. Для принятия решения используется оператор IF ... THEN. ЕИСТВИЕ ш 75 IF Y=1 AND X > 0 AND X < 10 OR R/2=50 THEN GOSUB 500 IF X <40 AND X > 1 AND Y <40 AND Y > 1 THEN PRINT IF N$ <> A$ OR N$=" " THEN PRINT "УХОДИТЕ Гт f1 [условие J | ИСТИННО PLOT Чтобы заставить компьютер сделать выбор, вы сравнивае- те данные, используя символы, показанные справа. Эти сим- волы обозначают операции отношения. Если проверка усло- вия, описываемого этими операциями, истинна, компьютер будет выполнять оператор, записанный после служебного слова THEN (тогда). Условие истинно ложно Как показано выше, используя логические операции AND (и) и OR (или), вы можете за- писывать более сложные проверки. При ис- пользовании операции AND оператор после слова THEN будет выполняться только тог- да, когда обе проверки истинны. При исполь- зовании операции OR оператор после THEN выполняется в том случае, если истинна хотя бы одна проверка. Не забудьте указать имя переменной после каждой операции OR или AND. 50 IF A=10 THEN PRINT "ПРАВИЛЬНО" ELSE PRINT "НЕПРАВИЛЬНО" 80 IF A=10 THEN PRINT "ПРАВИЛЬНО" 90 IF A <> 10 THEN PRINT "НЕПРАВИЛЬНО Они те же самые Служебное слово ELSE (иначе) дает воз- можность сказать компьютеру, что он дол- жен делать, если проверка не истинна, не по- вторяя оператор IF ... THEN. Например, по- IF X < 1 THEN LET X=ABS(X) ELSE IF X THEN LET X =100 ELSE IF X=Y THEN 100 IF Х=5 AND (Y=2 OR Y=4) THEN PRINT "ИСТИНА0 IF X=5 AND Y=2 OR Y=4 THEN PRINT "ИСТИНА" казанная выше строка 50 выполняет то же са- мое действие, что и пара строк 80 и 90, но она короче. (Не все компьютеры имеют та- кой оператор IF.) Используя ELSE, можно записать вместе много проверок IF ... THEN, но будьте осто- рожны, иначе получите программу трудную для понимания. Если в одном операторе ис- пользуется много операций AND и OR, то, возможно, потребуются скобки. В первом примере, показанном выше, ком- пьютер будет выполнять оператор после сло- ва THEN только в том случае, если Х = 5 и при этом Y=2 или 4. Во втором примере ус- ловие истинно тогда, когда Х = 5 и одновре- менно Y=2, или же всякий раз, когда Y=4. 60
GUNPOWDER Организация ветвления Один из недостатков языка БЕЙСИК состоит в том, что в нем нет простого средства для выпо- лнения целой группы операторов, если в операторе IF ... THEN условие истинно. Язык БЕЙСИК позволяет сделать это либо путем размещения на одной строке нескольких операторов либо путем перехода к подпрограмме, либо путем обхода группы операторов с помощью GOTO. В других язы- ках программирования, например ПАСКАЛЬ, нет ограничений на количество операторов, которые может выполнить компьютер в зависимости от результатов проверки. 1. Многооператорные строки 100 IF XC10THEN LET Y=1:LET R=R+X:INPUT K:FOR J=1 TO 6: LET X=X+K:NEXT J В многооператорной строке, начинающей- ся с оператора IF, все остальные операторы будут выполняться только в том случае, если истинна проверка в операторе IF. Если же проверка не истинна, все эти операторы не выполняются, и компьютер переходит к сле- дующей строке. Таков один из способов зада- Выясните, какое количество сим- д | волов в одной программной стро- ) ке допускает ваш компьютер. / ния компьютеру нескольких операторов для выполнения, если истинна проверка некоторо- го условия. Однако количество этих операто- ров ограничивается количеством символов, которое допустимо на одной программной строке в вашем компьютере (до 255 для боль- шинства компьютеров). 2- GOTO 3. GOSUB 100 IF Х> 1 THEN GO 110 REM ТОЛЬКО В СЛУЧАЕ, ЕСЛИ X < 1 120 REM ОПЕРАТОРЫ 130 RЕМ ОПЕРАТОРЫ /140 GOTO 180 / 150 REM ТОЛЬКО В / СЛУЧАЕ, ЕСЛИ X > 1 160 REM ОПЕРАТОРЫ 170 REM ОПЕРАТОРЫ 180 REM ПРОДОЛЖЕНИЕ ПРОГРАММЫ Переходит к строке 150, если проверка истинна операторы в если ис- исполняются том случае, проверка не тинна. Строка 140 заставляет компьютер обой- ти другую группу операторов. 110 IF Х> 1 THEN GOSUB 500 ELSE GOSUB 120 REM ПРОДОЛЖЕНИЕ ПРОГРАММЫ 400 END 500 REM ТОЛЬКО В СЛУЧАЕ, ЕСЛИ X> 1 510 REM ОПЕРАТОРЫ 520 RETURN 550 REM ТОЛЬКО В СЛУЧАЕ, ЕСЛИ X < 1 560 REM ОПЕРАТОРЫ 570 RETURN Операторы, ис- — полняемые в слу- чае Х>1 Операторы, ис- — полняемые в слу- чае Х<1. Используя оператор GOTO, можно заста- вить компьютер обойти группу операторов, как показано выше. Однако если вы заставите компьютер делать подобные скачки, очень ус- ложняется отслеживание хода вычислений в программе, а это делает программу трудно- читаемой и сложной в отладке. Если операторы не помещаются в одной многооператорной строке, лучше использо- вать подпрограмму, а не оператор GOTO. Вам потребуется одна подпрограмма с после- довательностью операторов для случая, если проверка истинна, и другая с группой опера- торов для случая, если не истинна. Другие компьютерные языки Компьютерный язык ПАСКАЛЬ не использует номеров строк. Операторы объединяются в блоки и каждый блок помечается словами BEGIN и END, что- бы его мог распознать компьютер. В блок можно включить необходимое чис- ло операторов, поэтому на языке ПАСКАЛЬ легко задать компьютеру для выполнения целый ряд операторов в случае истинности проверки. Справа по- казана написанная на языке ПАСКАЛЬ программа вывода на экран таблиц ум- ножения. PROGRAM TABLES Объявляет, что VAR BASE, NUMBER, I.INTEQEFJ^ переменные BASE, BEGIN NUMBER и I име- WRITELN ('КАКУЮ ТАБЛИЦУ ют тип INTEGER. УМНОЖЕНИЯ') WRITELN ('ВАМ ХОТЕЛОСЬ БЫ ВИДЕТЬ?') INPUTLN (BASE) FOR М ТО 12 DO BEGIN NUMBER:=BASE*I WRITELN (BASE, 'X',l,'=', NUMBER) END; END; Цикл вывода _на экран таблиц умноже- ния 61
GUNPOWDER Повторение действий: циклы При построении программы часто возникает необходимость в исполнении груп- пы операторов определенное число раз. Часть программы, которая неоднократно повторяет некоторое действие, называется циклом. Существует несколько различ- ных способов организации цикла в компьютерной программе. иклы FOR/NEXT — /Загнись и коснись ------\z^ СВОИХ носков 50 раз- 1 J — это временна цикла. ПОВТО- РИТЬ N раз Вложенные циклы FOR J=1 ТО 3 PRINT "КОСНИСЬ НОСКОВ НОГ" FOR 1 = 1 ТО 3 PRINT "ДОТЯНИСЬ' NEXT I NEXT J Внутрен ний цикл, Самым простым видом цикла является безус- ловный цикл, в котором вы предписываете ком- пьютеру повторить некоторые действия задан- ное число раз. Как показано выше, это делается с помощью оператора FOR (для) со служебным словом ТО (до) и оператора NEXT (следую- щий). Можно организовать более сложные по- вторения, используя циклы внутри циклов. Та- кие циклы называют вложенными циклами. Во вложенных циклах обе части внутреннего цикла должны быть внутри внешнего цикла. Перемен- ная цикла считает число повторений цикла. однако иногда заранее неизвестно, сколько ставить компьютер просматривать массив до раз должен повториться цикл, и вам нужно, чтобы компьютер продолжал исполнение цикла до тех пор, пока не станет истинным определен- ное условие. Например, возможно, вы захотите повторить ввод строки до тех пор, пока пользо- ватель не наберет слово STOP, или хотите за- тех пор, пока он не найдет определенный эле- мент. Некоторые версии БЕЙСИКа имеют опе- раторы REPEAT (повторить) и UNTIL (до тех пор), а если в вашем компьютере их нет, вы мо- жете написать подпрограмму, подобную одной из показанных ниже. £ЭГОГ° ° "X п’00 > m os,7"' NEXT, СТО^- THEN Gore ВЕМ0с^ьнЛяпр °S ” ПР°ГРАММД Эта подпрограмма повторяет строку ввода до тех пор, пока пользователь не введет СТОП. Переменная I является счетчиком числа повторе- ний цикла, или, иными словами, переменной ци- кла. Если переменная цикла используется еще где-либо в программе, полезно в начале цикла Никогда не следует выходить из цикла с по- мощью оператора GOTO. Компьютер выполнит ваши команды, но где-то в его памяти останет- ся частично заполненный счетчик цикла, и позже это может привести к ошибкам в программе. устанавливать ее равной нулю. 62
GUNPOWDER Приемы выхода из цикла 30 '^;'T0 <° Hr 40 SOpHlNT тот оператор присваивает пере- менной цикла конечное значение. 10 REM ЦИКЛ ПОИСКА ЭЛЕМЕНТА МАССИВЕ 20 FOR J=1 ТО 40 30 IF D$(J)=R$THEN LET K=J 40 NEXT J 50 PRINT D$(K) Эти две подпрограммы иллюстрируют два разных способа прекращения циклов FOR/ NEXT, когда условие становится истинным. На примере слева компьютер просматривает массив D$ до тех пор, пока он не найдет элемент, кото- рый совпадает с RS. Компьютер запоминает но- мер позиции этого элемента в массиве, присваи- вая другой переменной К текущее значение счет- чика цикла. Затем он пробегает остальную часть цикла. Однако если важна скорость исполнения, можно прекратить цикл, присваивая переменной цикла ее конечное значение, как показано на при- мере справа. В цикле WHILE (пока) компьютер повторяет том, что в данном случае компьютер проверяет действие до тех пор, пока истинно определенное условие. Это звучит почти так же, как и для ци- кла REPEAT/UNTIL, однако разница состоит в условие перед выполнением действия. Если про- верка показывает, что условие не истинно, ком- пьютер выходит из цикла. В этой подпрограмме компьютер будет вы- полнять строки 60—80 только тогда, когда TEMP <100. Когда TEMP =100, он переходит к строке 90. Некоторые компьютерные языки (на- пример, ФОРТ и ПАСКАЛЬ) имеют специаль- ные операторы для организации циклов WHILE, а в БЕЙСИКе вам придется построить подпро- грамму, подобную показанной выше, используя два оператора GOTO. Это одна из тех причин, почему БЕЙСИК иногда подвергается критике0. ° В разработанном сравнительно недавно языке Истинный обычного БЕЙСИКа. Истинный БЕЙСИК обладает полным набором управляющих конструкций — Прим. ред. Проверить TEMP Повто- рить На самом деле, в этом простом примере вы мо- жете избежать применения двух операторов GOTO, если запишите на одной строке несколь- ко операторов: SO IF TEMP <100 THEN PRINT «ПОВЫСИТЬ ТЕМПЕРАТУРУ»: LET TEMP GOTO 50 Однако в более сложных программах с большой группой операторов, которую нужно исполнять, пока TEMP < 100, вам потребуются два GOTO. БЕЙСИК (True BASIC) устранены указанные недостатки TEMP + 1 : 63
GUNPOWDER Хранение данных в массивах Самым простым способом задания компьютеру больших объемов данных явля- ется перечисление их в строках DATA программы, как показано ниже. Эти данные должны считываться в переменные или в массив до того, как они будут использо- ваны программой. На с. 66—72 обсуждаются другие способы хранения данных и некоторые приемы экономии места в памяти. 100 DATA ЗОЛОТОЕ КОЛЬЦО, ЛАМПА, МЕЧ 110 DATA БУТЕРБРОД, ТОПОР, МЕШОК ( 120 DATA ЧАСЫ, РАДИО, СПИЧКИ W DIM D(W) 20 FOR т0 10 30 READ DU) 50 DATA 5,12,7,87 3 60 DATA 1,6,33, , Индекс' Элемент массива Данные Компьютер Sinclair имеет специальные правила. Это числовой массив, т. е. он содержит числовые данные элементы данных отделены друг от друга запятыми. Некоторые ком- пьютеры требуют заключения каж- дого элемента строковых данных в кавычки. < Этот цикл при каждом своем повторении заставляет ком- пьютер выводить на экран очередной элемент из масси- PRINT D(4) FOR J=1 ТО 10 PRINT D(J) NEXT J Этот оператор выводит на экран четвертый элемент из массива D. < г<а гзано выше, для размещения дан- ных в массиве использован оператор READ в цикле, который исполняется столько раз, сколько имеется элементов данных. Строка 10 объявляет компьютеру, какой объем памя- ти нужно зарезервировать для хранения этих данных. Как только данные окажутся в массиве, вы можете, используя цикл, начать поиск нужного элемента данных или вывести на экран все эле- менты. Чтобы выбрать из массива один эле- 64 мент данных, нужно указать номер той ячейки массива, где он хранится. Этот номер называет- ся индексом, а каждая ячейка в массиве — эле- ментом массива. В данном примере массив D является одномерным массивом, т. е. он подо- бен списку и каждый элемент имеет один индекс.
GUNPOWDER Двумерные массивы Если у вас имеются группы связанных данных, например, адресов, номеров телефонов и дней рождения некоторых людей, то можно использовать двумерные массивы и помещать в одну строку такого массива всю информацию, касающуюся одного человека. Это облегчает нахождение всей информации об одном человеке или поиск, скажем, дня рождения данного человека. PRINT В$(2,3) Этот оператор выводит элемент во 2-й строке и 3-м столбце FOR КН ТО 4 PRINT В$(3. К) NEXT К Этот цикл вы- водит все сим- волы 3-й стро- ки. Каждый элемент в двумерном массиве имеет два индекса: номер строки и номер столбца. Как показано выше, для чтения данных в массив ис- пользуют вложенные циклы — один цикл для счета строк, а другой — для счета столбцов мас- сива. Чтобы вывести на экран все данные из од- ной строки массива, используют цикл, показан- ный выше справа. Чтобы выбрать в массиве один конкретный элемент, вам нужно указать его номер строки и номер столбца. Массивы с перекрестными ссылками Когда вы используете двумерные массивы, вам, возможно, понадобится второй массив, кото- рый будет служить в качестве указателя для первого массива. Например, в упомянутом выше при- мере можно было бы поместить в одномерный строковый массив имена людей. В таком случае можно было бы, как показано ниже, сначала осуществлять поиск конкретного человека в массиве имен, а затем находить его (или ее) данные в другом массиве. Имена людей должны быть располо- жены в том же самом порядке, как и строки с их данными в двумерном массиве. Например, данные о человеке, имя которого хранится в N$ (3), должны быть в третьей строке массива В$. FOR IF N$(J)«"I4CAB" THEN LET X«J $ NEXT J \ Переменная X равна ин- дексу этого имени Этот цикл заставляет компьютер искать в массиве NS имя ИСАВ. Когда компьютер находит нужное имя, он записывает в переменную X значение счетчика цикла, т. е. индекса эле- мента, где хранится данное имя. Как описано на с. 63, этот прием позволяет избежать преждевременного выхода из цикла. PRINT В$(Х, К) NEXT К Этот цикл выводит все данные в строке X массива В$ После этого можно использовать число в переменной X, чтобы найти строку двумерного массива В$, где хранятся дан- ные об этом человеке, и затем вывести все эти данные на экран. Чтобы осуществить это, используйте показанный вы- ше цикл. 65
GUNPOWDER Приемы хранения данных После того, как вы считали данные в массив, они оказываются записанными в памяти дважды — один раз в виде строк DATA в области, где хранится вся про- грамма, и второй раз в массиве в той области памяти, где хранятся все массивы и переменные. Именно поэтому программы, имеющие большой объем данных, на- пример такие, как компьютерные игры-приключения, занимают много места в компьютерной памяти. Ниже обсуждаются некоторые приемы хранения данных. Приемы работы с массивами для экономии места в памяти Двумерный массив занимает много больше места в памяти» чем одномерный массив с тем же самым числом элементов. Чтобы сохранить объем памяти» можно использовать одномерный мас- сив и организовать в нем данные таким же образом» как в двумерном массиве» т. е. размещая вместе группы связанных элементов данных. Чтобы найти в нем любой элемент, вам нужно вос- пользоваться формулой вычисления позиции этого элемента в массиве. Данный метод использован программе Картотека в конце этой части книги задает Каждый элемент группы называет- ся полем Использование элемента с нулевым индексом Обычно нетрудно представить себе массивы, начинающиеся с элемента с по* рядковым номером 1, но на самом деле большинство компьютеров нумерует их начиная с нуля. Поэтому, если вы хотите экономить память, то можно было бы использовать элемент в нулевым индексом. Чтобы осуществить это, организуйте циклы чтения и поиска данных с началом О и установите конечное значение переменной цикла на 1 меньше, чем количество элементов данных. Именно такой подход показан в примере программы справа. Чтобы указать элемент внут ри записи» нужно в конце фор мулы прибавлять номер его по зиции в записи. В программе Картотека каж- дая запись со- держит инфор- мацию для од- ной карты Чтобы вывести на экран все элементы одной записи» нужно в конце формулы прибавлять не 1» а значение переменной цикла. Чтобы найти начало каждой записи, нужно использовать эту формулу. RN — это номер записи в массиве (например, на картинке слева» данные о Соломоне входят в запись 3). RL (длина записи) — это число элементов в каждой записи (все записи должны иметь одинаковое число элементов). Если вы используете эле- мент с индексом 0, тогда не нужно прибавлять 1 в приведенной выще Этот цикл выво L дит на экран (все элементы * записи 4 в к массиве D$ Этот оператор выводит адрес из записи 4 массива D$ (RN-^Ре- позицию последне- го элемента в пре- дыдущей записи, поэтому вы долж нь1 прибавить 1. Каждая группа связанных элементов данных называется записью 66
GUNPOWDER Применение файлов данных Вместо размещения данных в программе в строках DATA можно хранить их на магнитной ленте или магнитном диске и читать их оттуда прямо в мас- сив, когда программа запущена на исполнение. Этот метод со- храняет много места в памяти. Набор данных на ленте или дис- ке называется файлом. Вам следует узнать, какие операторы используются в ва- шем компьютере для загрузки в память и сохранения файлов данных. Они различны у каждо- го компьютера, хотя обычно они похожи на операторы, пока- занные справа. Основные опера- торы перечислены в руковод- стве по БЕЙСИКу в конце кни- ги. OPEN поименованный файл FOR 1 = 1 ТО число элементов данных PRINT#, DS(I) NEXT I Закрыть файл Цикл чтения дан- ных из массива D$ в памяти ком- пьютера и записи их на магнитную ленту. PRINT # — наиболее распространенный оператор записи файла данных на ленту. Прежде чем записать данные на ленту, вы должны открыть файл, а когда вы закончили запись, нужно закрыть этот файл. OPEN поименованный файл FOR 1=1 ТО число элементов данных INPUTII, D$(l) NEXT I INPUT # — наиболее распространенный оператор загрузки Цикл чтения записанных на диске или лен- те данных в массив D$ в компьютерной памяти файла данных в память с ленты или диска. Как и в случае сохра- нения данных, нужно открыть файл перед загрузкой данных, а потом закрыть его. Как создать файл данных 1. В подпрограмме инициализации задать раз- мер массива и добавить строки для чтения из файла данных X. Записать программу на ленту или диск. 2. Набрать команду NEW, чтобы стереть про- грамму из памяти компьютера. 3. Написать подпрограмму, как показано спра- ва, чтобы записать данные в файл X. 4. Задать размер массива для размещения дан- ных. 5. Читать данные в массив. 6. Записать данные в файл X. 7. Исполнить эту подпрограмму. Вот те шаги, следуя которым, можно орга- диске копию своей программы вместе с файлом низовать хранение данных для программы на данных, содержащим все данные для этой про- магнитной ленте или магнитном диске, а не в граммы. Когда вы загрузите в память и запу- строках DATA в самой программе. После выпол- стите программу, данные будут автоматически нения этих шагов, вы получите на ленте или загружены в массив. Защита своих файлов о Если кто-либо из запускающих программу введет неправильный пароль, подпрограмма проверки пароля сотрет содержимое PWS, за- кроет файл и уничтожит программу с помощью команды NEW (новый) °. Когда вы создаете свой файл данных, вы мо- жете включить в него пароль с тем, чтобы эти данные могли загрузить в память компьютера только те люди, кому известен данный пароль. ”i) чисел, меньших 255, в несколько ячеек с адресами от 0 до 255. Если ваш компьютер не допускает применения команды NEW в строке программы, используйте цикл для записи 67
GUNPOWDER Прием работы с оператором RESTORE Вот другой способ экономии места в памяти. Оператор RESTORE {восстановить) заставляет компьютер перейти к первой строке DATA. Этот прием дает возможность использовать данные, перечисленные в строках DATA без чтения всех их в массив. Обычно перед использованием вы дол- жны поместить все данные в массив. 40 PRINT "ВЫ ЗАБРЕЛИ В 50 RESTORE 60 FOR J=1 ТО X 70 READ DS 80 NEXT J 90 PRINT D$ Например, вы можете использовать эту под- программу в компьютерной игре-приключении, чтобы вывести на экран из блока данных описа- ние с номером позиции X. Все описания хранят- ся в операторах DATA. Каждый раз, когда ис- полняется подпрограмма, оператор RESTORE отправляет компьютер к первой строке с данны- ми. Цикл заставляет его читать в D$ каждый элемент данных до тех пор, пока J не станет равным X. Затем компьютер выводит на экран последний элемент, который он считал в DS, т. е. описание с номером X. Это довольно медленный метод, но игрок, вероятно, ничего не заметит, если вы не будете стирать экран до тех пор, пока компьютер не отыщет требуемые данные для вывода DS. Прием с указанием номера строки в операторе RESTORE Оператор RESTORE, в котором указан номер строки, предлагает компьютеру возвратиться об- ратно к конкретной строке DATA. Если в вашем компьютере имеется такой оператор, то можно намного быстрее найти конкретный элемент данных, используя описанный выше прием с операто- ром RESTORE. на экран. 50PB,NT * 60 RESTORE ULOC-1) w 70 READ DS 80PBINT DS Сначала нужно читать данные в D$, а лишь за- тем можно выводить их В этом примере использован оператор RESTORE с указанием в нем номера той строки DATA, в которой нужно искать данные с номе- ром позиции LOC. Пример построен при допу- щении, что каждая строка DATA содержит дан- ные для одной позиции блока данных, при этом строки DATA начинаются с номера 1200 и их но- мера возрастают с шагом 10. Чтобы найти но- мер строки DATA с данными для конкретной позиции, вы должны вычесть единицу из номера позиции LOC, а затем умножить этот результат на 10 (потому что номера строк возрастают с шагом 10). После этого нужно прибавить 1200, т. е. номер первой строки DATA. Если вам захочется разместить в каждой строке несколько элементов данных, то, как по- казано выше, потребуется более сложная форму- ла. Этот метод можно было бы использовать вместо приема с использованием одномерного массива, который был описан на с. 66 Каждая строка данных DATA должна содержать все эле- менты для одной записи. 68
GUNPOWDER Упаковка числовых данных На следующих нескольких страницах обсуждаются два способа экономии места в памяти для случая, когда нужно хранить множество чисел, например, все координаты лабиринта, выводимого на экран дисплея. Эти способы можно использовать только для чисел со значениями до 255, потому что каждое число хранится как символ, который имеет тот же номер, как и его код ASCII1*. Ком- пьютер использует код ASCII для внутреннего представления символов. Имеется только 256 различ- ных кодов ASCII (0-255). Каждый символ занимает только один байт памяти, поэтому можно сэко- номить 4 байт на каждом запоминаемом числе (обычно числа занимают 5 байт). Такой подход называют упаковкой данных, потому что вы размещаете числа в значительно меньшем объеме па- мяти, чем им обычно требуется. ________ Коды ASCII Внутри компьютера буквы, цифры и специ- альные символы представлены числами в двоич- ной форме. ASCII является международным стандартом представления каждого символа определенным числом. 256 различных кодов ASCII используются для представления всех букв латинского алфавита, цифр от 0 до 9, зна- ков пунктуации, графических символов и специ- альных команд клавиатуры, таких как ВОЗВ- РАТ (ВК) и СДВИГ. Оператор БЕЙСИКа PRINT CHR$ (число) предлагает компьютеру вывести символ с номе- Этот символ имеет код ASCII, равный,75 PRINT А5С("Р") Это код ASCII для буквы Р ром кода, равным записанному в скобках числу. пьютеру вывести значение кода ASCII для ука- Оператор PRINT ASC (символ) предлагает ком- занного в скобках символа. Способ упаковки чисел Этот способ позволяет хранить в одной строковой переменной RS много чисел. В большинстве компьютеров максимальное количество символов, которое можно хранить в одной строковой пере- менной, равно 255, поэтому вы можете упаковать именно такое общее количество чисел. 1 10 DIM AMOUNT (количество чисел) 20 FOR J=1 ТО количество чисел 30 READ AMOUNT (J) 40 NEXT J 50 DATA все числа 2 Здесь звездочек сколь- поместить мять ко чисел нужно в па- столько Прежде всего вам нужно объявить массив (AMOUNT) и считать в него все числа. Позже, когда все числа будут упакованы в памяти, вы можете удалить все эти строки. Затем присвойте вновь введенной строковой переменной R$ значение в виде строки из столь- ких звездочек, сколько у вас имеется чисел (но не более 255). Это делается, чтобы резервиро- вать место в памяти для чисел. Нужна именно строковая переменная, потому что числа будут упакованы как символы. ° ASCII — сокращение от слов American Standard Code for Information In- terchange (американский стандартный код для информационного обмена). — Прим, перев. Продолжение на следующей стра- нице 69
GUNPOWDER Способ упаковки чисел (продолжение) Затем с помощью этого оператора «сожми- те» переменную Р$. Такой шаг информирует компьютер, что переменная Р$ пуста, даже если звездочки еще находятся в области хранения пе- ременных в памяти. Этот цикл заменяет в Р$ звездочки на числа, хранящиеся в массиве AMOUNT. Функция CHRS предлагает компьютеру рассматривать числа как коды ASCII, и поэтому каждое число хра- нится в символьной строке как символ, код ASCII которого равен этому числу. Поскольку компьютер считает, что строка Р$ пустая, он за- писывает каждый символ в ячейку, зарезервиро- ванную ранее звездочкой. Теперь числа хранятся в памяти в упакован- Функция ASC предлагает компьютеру выве- сти код ASCII для выбранного символа, т. е. ном виде. Чтобы восстановить любое число, нужно использовать функции MID$ и ASC. В выше приведенном примере функция MIDS (Р$, 21, 1) предлагает компьютеру извлечь из вывести ваше число. Если вы не будете исполь- зовать функцию ASC, компьютер может выйти из строя, так как некоторые из ваших чисел мо- строки Р$ один символ, находящийся в двадцать гут случайно оказаться управляющими кодами первой позиции этой символьной строки. для компьютера. Использование подпрограммы I 115 REM ПОДПРОГРАММА \ \ ПО СОХРАНЕНИЮ PS \ \ 120 Открыть файл \ \ 130 PRINT# файл, PS \ \ 140 Закрыть файл \ 5 REM ПОДПРОГРАММА ПО ИСПОЛЬЗОВАНИЮ PS 10 LET Р$="»***»*** ит.д.' 20 LET PS=” ” > 30 Открыть файл 40 INPUT* файл, Р$ 50 Закрыть файл 60 REM ОСТАЛЬНАЯ ЧАСТЬ ПРОГРАММЫ Здесь столько звез дочек, сколько у вас чисел. Подобная упаковка данных является хорошим способом скрыть данные от любого, кто мог бы распечатать про- грамму. Прежде чем использовать этот метод упа- ковки данных для программы, нужно сохра- нить Р$ в виде файла данных, как это описа- но на с. 67 и показано здесь слева. Для программы, которой требуются дан- ные, нужна только вторая подпрограмма, по- казанная слева. Она резервирует место в па- мяти для данных с помощью переменной, за- полненной звездочками, сжимает эту пере- менную, а затем загружает в нее данные с ленты или диска. Строку Р$ нужно сохранять вне компьюте- ра, потому что она представляет собой «строку без кавычек», а для компьютера Р$ является пустой строкой. При распечатке программы данные распечатываться не бу- дут, а при каждом прогоне программы дан- ные в памяти будут стираться (команда RUN стирает из переменных все данные). 70
GUNPOWDER Еще один способ упаковки данных Вот альтернативный способ упаковки числовых данных. На этот раз звездочки используются в операторе REM для того, чтобы резервировать место для данных. Затем эти звездочки замеща- ются вашими данными с помощью оператора РОКЕ0. При таком подходе данные являются частью текста программы, поэтому программу можно исполнять произвольное число раз. Когда програм- му сохраняют, записывая ее на ленту и диск, одновременно сохраняются и данные. Оператор РОКЕ и функция РЕЕК __________—---Х Адрес > РОКЕ 16577,69 16578 Данные 581 16582. Г 16585 16586 Каждая такая ячейка называет- ся ячейкой памяти. 16573 16583 16587 j 16580 116584 Hesee> Каждая ячейка памяти имеет номер, называ- емый ее адре- сом. Оператор РОКЕ (втолкнуть) предлагает нутъ) имеет противоположное назначение. Она компьютеру запомнить элемент данных в ячейке используется вместе с оператором PRINT, кото- памяти с определенным адресом. Данные хра- нятся как число, которое рассматривается ком- пьютером как код ASCII. Функция РЕЕК (загля- рый в таком случае предлагает компьютеру вы- вести на экран содержимое конкретной ячейки памяти, т. е. символ, код ASCII которого хра- нился в этой ячейке. Как записать данные в память с помощью оператора РОКЕ При использовании данного метода нужно быть очень осторожным, так как если вы запишете данные в ячейки памяти, предназначенные для других целей, то из-за уничтожения в них существен- но важной информации возможен сбой компьютера. Если все же это случится, тогда необходимо выключить компьютер, а затем снова вернуть его в нормальное состояние. В первой строке программы нужно записать оператор REM с таким количеством звездочек, сколько чисел требуется запомнить. Эти звез- дочки можно поместить в скобки, чтобы лучше выделить их. 2 20 FOR 1=А ТО А+100 30 LET С=РЕЕК(1) ----------- 40 PRINT "АДРЕС"; 50 IF С <31 OR 0127 THEN LET С=46 ---------- 60 PRINT CHR$(C) 70 NEXT I 80 STOP Поставьте вместо А первый адрес, где ваш компьютер хранит программы на БЕЙСИКе. определить этот адрес, посмотрите карту рас- пределения памяти в руководстве пользователя вашего компьютера. (Более подробно о картах распределения памяти рассказывается на следу- ющей странице.) ь— Просматривает каждую ячейку памяти и помещает содержащийся в ней код в переменную С. Если С<31 или С>127, то этот код соответствует невыводимому символу и заменяется на 46, т. е. код ASCII для точки. Выводит символ для кода С. Затем потребуются эти строки, чтобы загля- нуть в компьютерную память и найти то место, где хранятся звездочки. Переменную А в строке 20 нужно заменить адресом той ячейки, с кото- рой начинается размещение в памяти вашего компьютера программы на БЕЙСИКе. Чтобы ° Некоторые компьютеры не используют оператор РОКЕ и функцию РЕЕК. 71
GUNPOWDER Как записать в память данные с помощью оператора РОКЕ (продолжение) 100 DATA Список ваших чисел 110 DATA и т. д. 150 FOR l=X ТО Х+число элементов данных-1 160 READ N 170 POKE I, N 180 NEXT I Впишите сюда коли- чество эле- ментов дан- ных тельны. выписывая ку, пьютером части программы. Будьте очень внима- адреса звездочек. Ес- ли вы допустите ошиб- произойдет сбой при исполнении ком- следующеи Далее добавьте эти строки, поместив свои числа в строки DATA, начиная со строки с номе- ром 100. Затем запустите программу. Компью- тер будет выводить на экран содержимое каж- дой ячейки памяти, а затем остановится на Теперь наберите этот оператор LET как не- посредственную команду, т. е. без номера стро- ки. Затем наберите GOTO 100. Это заставит компьютер начать исполнение программы со строки 100. При каждом повторении цикла от строки 150 до строки 180, компьютер читает в переменную N одно число и затем помещает его в ячейку I. Теперь числа в упакованном виде раз- мещены в памяти компьютера. Чтобы извлечь любое упакованное число, ис- пользуйте PRINT РЕЕК, как показано выше. строке 80. Когда вы увидите на экране звездоч- ки, выпишите адрес первой звездочки и убеди- тесь, что количество звездочек совпадает с коли- чеством чисел в строках DATA. Адрес первой звездочки PRINT РЕЕК (адрес + позиция данных — 1) Позиция в списке чисел в операторах DATA. Чтобы проверить, находятся ли числа в памяти, вы можете снова запустить программу. Теперь можно удалить строки от номера 20 и далее и добавить строку 10 в ту программу, которой требуются данные. Вам не следует распечаты- вать строку 10, поскольку компьютер может выйти из строя, как только будет сделана по- пытки вывести эти данные на экран. Тем не ме- нее можно распечатать остальную часть про- граммы, используя команду LIST с номером строки. Карта распределения памяти Карта распределения памяти наглядно показывает, как используются различные области компьютерной памяти. В вашем руководстве пользователя должна быть такая карта. На ней показаны все виды компьютерной памяти, включая ПЗУ, с адресами начала и конца каждой области памяти. Буфер страницы экрана Переменные и массивы Область программ пользователя Буфер страницы экрана (дисплейный файл). Это область памяти, где хранится все то, что должно быть выведено на экран. Переменные и массивы. Здесь хранятся значе- ния переменных и массивов. Область программ пользователя (свободная область ОЗУ). Это область памяти, где хра- нятся ваши программы на БЕЙСИКе. Область, резервируемая для использования операционной системой. Компьютер исполь- зует эту область памяти для хранения данных о текущем состоянии выполнения про- граммы. БЕЙСИК-система. Программа в ПЗУ, кото- рая дает возможность компьютеру понимать язык БЕЙСИК. Операционная система. Совокупность про- граммных средств, обеспечивающих управле- ние работой компьютера. 72
GUNPOWDER Проверка ввода Используя в программе оператор INPUT (ввести), вы практически не можете влиять на то, что вводит пользователь по запросу INPUT. Вводимые пользовате- лем данные немедленно запоминаются в переменной. Если пользователь введет не- приемлемое для программы, это может вызвать останов исполнения программы с выдачей сообщения об ошибке. Необходимо всегда проверять вводимые данные и убеждаться в их допустимости, прежде чем продолжить выполнение остальной части программы. Приемы контроля ввода 210 INPUT А 220 IP А" "ЧИСЛО 230 200 PRINT "КАКОВА ВАША КОМАНДА? 210 INPUT AS:LET Х=( 220 FOR J=1 TO 6 230 IF A$=WS(J) THEN 240 NEXT J 250 IF X =0 THEN PRINT "ТАКАЯ КОМАНДА HE ПРИНИМАЕТСЯ" GOTO 200 ™^^cta-beebb,e ВЫБРАННЫЙ H°ME <1ora>5THEN₽R'NT ДОЛЖНО БЫТЬ ОСТАЛЬНАЯ ЧАСТЬ ПРОГРАММЫ Самый простой способ проверки ввода за- ключается в использовании оператора IF...THEN для контроля вводимых данных, как это показа- но выше. Если ввод не проходит контроль, управление передается обратно, чтобы предло- жить пользователю повторить ввод. Если вы хотите, чтобы пользователь вводил слово из списка известных компьютеру слов, за- пишите все эти слова в массив W$. Затем ис- пользуйте цикл для проверки, имеется ли вводи- мое слово в данном массиве. 20 IF AS < "A" OR A$>"F"THEN PRINT "ВАША БУКВА ДОЛЖНА БЫТЬ МЕЖДУ Л / 8Ь< родились^. м число ОТ 1 доЕ *^'ТЕ' П0)КАЛ^СТА, зп^РиТВ$ ?3°IFval{BS) GOTO 210 С °* **«(»»» и thbn 1— Как показано выше, буквы можно проверять таким же способом, как и числа. Фактически Очень полезно всегда использовать в опера- торе INPUT строковую переменную. В таком случае сбоя в программе не будет, даже если компьютер сравнивает ASCII коды этих букв. пользователь введет слово, когда программа ожидает ввода числа. Функция VAL предлагает Использование функции INKEY$ 400 PRINT "ВВЕДИТЕ ГОД ВАШЕГО РОЖДЕНИЯ" 410 LET L=4-------------------------------- 420 LET AS="------------------------------- 430 LET l=0 ----------------------------r~ 440 l$=INKEY$:IF l$=" " THEN GOTO 440------ 450 LET CK=ASC(I$) ------------------------ 460 IF CK > 47 AND CK <58 THEN LET 1=1+1:“_ LET A$=A$+I$:PRINT l$; 470 IF I < L THEN GOTO 440 -------------> 480 LET A=VAL(A$) --- 490 IF A=0 THEN GOTO 400 компьютеру воспринимать строковое значение как число. Число символов в ответе пользователя Пустая переменная для хранения ответа Счетчик Помещает символ очередной нажатой клави- ши в 1$. Строка повторяется до тех пор, по- ка нажата клавиша. Помещает код ASCII символа из 1$ в СК. Проверяет, является ли содержимое СК ко- дом ASCII для чисел 0—9, затем прибавляет к счетчику 1 и печатает 1$ Переходит обратно для приема с клавиатуры следующего символа. Преобразует А$ в число и запоминает в А. Проверяет значение А Используя оператор INPUT, вы не можете контролировать длину данных, вводимых поль- зователем. Если вы хотите контролировать или ограничить длину вводимых данных, исполь- зуйте функцию INKEY$ вместо оператора INP- UT. Она предписывает компьютеру принять код следующей нажатой клавиши и поместить его в переменную. Показанная выще подпрограмма использует INKEYS в цикле, поэтому пользова- тель может ввести только четыре символа. При использовании INKEY$ не требуется нажимать клавишу ВК. 73
GUNPOWDER Представление информации на экране Работа ваших программ может выглядеть вполне профессионально, если выводимые сообщения рационально расположены на экране, легко читабельны и в целом вызывают интерес. Вывод сообщений на экран Целесообразно выводить сообщения всегда в одну и ту же область экрана, например, помещать вверху, внизу или посередине экрана. Где бы вы ни выбрали это место, выводите туда все ваши сообщения, чтобы пользователь, работающий с данной программой, знал, где искать эти сообще- ния. Как показано ниже, такой вывод можно организовать с помощью подпрограммы вывода со- общений. 1--------------------------------- 80 CLS 90 GOSUB 1000:REM ИНИЦИАЛИЗАЦИЯ WO LET М8="ПРИВЕТ"-------------- 110 GOSUB 490 120 END 490 REM ПОДПРОГРАММА ВЫВОДА СООБЩЕНИЙ 500 PRINT TAB(X, Y);CLS------' 510 PRINT TAB(X, Y);MS-------1_ 520 RETURN 1000 LET CLS=" " --------------- 1010 LET X=0:REM номер столбца начала* вывода сообщений 1020 LET Y=0:REM номер строки начала вывода сообщений 1030 RETURN Сообщение Выводит строку пробелов, чтобы стереть с экрана старое сообщение. Выводит сообщение в строке Y, на- чиная со столбца X Присваивает переменной CL$ столько пробелов, сколько столб- цов помещается на экране Например, нужно задать Х = 1 и Y=l, чтобы вывести сообщение в левом верхнем углу экрана. В некоторых ком- пьютерах для выво- да N пробелов можно использо- вать SPC(N) вместо CLS ПРИВЕ Оператор PRINT^BqCy) прёдлагает^компьюте выводить на экран в строке Y, начиная со столбца X. Этот оператор не является стандартным для всех компьютеров, поэтому ознакомьтесь с руко- водством пользователя к своему компьютеру и приведенной в конце книги таблицей операторов азных ти Чтобы использовать эту подпрограмму, нуж- но в подпрограмме инициализации присвоить переменным X и Y соответственно номер столб- ца и номер строки, в которые вы хотите вывес- ли свои сообщения. Кроме того, для стирания прежних сообщений потребуется переменная CL$, содержащия столько пробелов, сколько столбцов укладывается на ширине вашего экра- на. Каждый раз, когда необходимо вывести ка- кое-либо сообщение, помещайте его в М$ и с по- мощью оператора GOSUB передавайте управле- ние этой подпрограмме вывода сообщения. Центрирование сообщений 497 LET L=LEN(M$) 498 LET X=INT((W-L)/2) 499 LET W=0:REM ширина экрана Постарайтесь не оставлять пользователя перед пустым экраном. Это его раздражает, и пользо- ватель может подумать, что в программе прои- зошел сбой. Чтобы избежать этого, не стирайте экран до тех пор, пока не готово к выводу еле- ^дующее сообщение. _______________ Чтобы центрировать сообщения, нужно к предыдущей подпрограмме добавить строки 497 и 498 и заменить- строку 1010. Строка 497 определяет число символов в М$ Строка 498 вычитает это число из числа столбцов на экране и затем делит на два. Функция INT округляет полученный результат для ближай- шего меньшего целого числа, если этот ре- зультат не является целым. Убедитесь, что сообщения по- нятны и не со- держат орфогра- фических оши- бок. 74
GUNPOWDER Вывод на экран разнообразной информации Если нужно выдать пользователю разнообразную информацию, представьте себе экран в виде листа бумаги и продумайте заранее, как расположить на нем информацию с заголовком и рамкой. Чтобы представить текст в более удобной для чтения форме, используйте также подзаголовки и абзацы. Когда экран заполнен, не допускайте его прокручивания (т. е. перемещения по вертикали с автоматическим удалением строки), в противном случае ваша информация на экране сотрется. Определите число строк, которые можно одновременно выводить на экран, и когда они будут за- полнены, очистите экран и начните снова, повторяя заголовок и рамку, если вам так нравится. Подпрограммы построения рамок 10 REM ГОРИЗОНТАЛЬНАЯ ЛИНИЯ 20 LET L$="ll II II И И И И И II II и т д." 30 PRINT ТАВ(Х, Y);LS 10 REM ВЕРТИКАЛЬНАЯ ЛИНИЯ 20 LET U$=”II"+CHR$(CD)+ +CHR$(CL) 30 LET L$=" ” 40 FOR 1=1 TO Длина строки 50 LET L$=L$HJS 60 NEXT I 70 PRINT TAB(X, Y);L$ Эту подпрограмму можно использовать для подчеркива- ния заголовка. Поместите в строковую переменную L$ столь- ко звездочек, сколько их требуется для лодчеркивания. Затем задайте переменным X и Y в операторе PRINT TAB значения таким образом, чтобы вывести строку в нужном месте. амените D и CD кодами ASCII для клавиш управления движением курсора «курсор вниз» и «курсор влево» вашего компьютера. После вывода каж- дой звездочки коды клавиш курсора за- ставляют компью- тер перейти на одну позицию вниз и вле- во, подготавливая вывод звездочки. Эта подпрограмма вы- водит на экран вертикаль- ную линию. Замените CD и CL в строке 20 кодами ASCII для клавишей «кур- сор вниз» и «курсор влево» вашего компьютера. За- дайте переменным X и Y номер столбца и номер строки. н и я и и и- я- -и- * * * * * -и и- и к- К- Я- И и- ¥. * и- к- и- > * * * К -И- И К- И- * w Я •* # * * * * > ,и. * * * ж ж ж ж ж ж ж ж * ж * ж ж Т ж ж ж Ж ж ж ж ж ж к. ж * ж 90 REM ПОДПРОГРАММА ПОСТРОЕНИЯ РАМКИ 100 CLS 110 GOSUB 400 120 GOSUB 250 130 GOSUB 200 140 LET Y=Y+I:GOSUB 250 150 END 195 REM ВЕРТИКАЛИ 200 FOR 1=1 TO H—2 Левая 210 PRINT MAT (X,Ytl);L$ - сторона 220 PRINT TAB(X+W—1, Y+I);L$- Правая 230 NEXT I сторона 240 RETURN 245 REM ГОРИЗОНТАЛИ 250 FOR J=0 TO W-1 260 PRINT TAB(X+J, Y);L$ 270 NEXT J 280 RETURN Чтобы вывести цветные ли- нии, используйте операто- ры задания цвета вашего компьютера. Вот подпрограмма для вывода рамки в любом месте экрана. Чтобы указать требуе- мые размеры рамки, нужно задать значения переменных. Например, для построения рам- ки по краю экрана сделайте переменные X и Y равными 1, переменную Н равной числу строк минус 1, а переменную W — числу столбцов минус 1. Центрирование текста в рамке Для центрирования текста в рамке, по- строенной подпрограммой слева, добавьте следующие строки: 395 REM ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ 400 LET L$="*" --------------Или другие 410 LET Н=высота рамки символы 420 LET W=lu ирина рамки 430 LET Х=позиция левой стороны рамки 440 LET Y=no3HUHH верхней стороны рамки 450 RETURN -я- -я-я- -я- -я- m-#- -я- -я- я- я- -я- я- Я -я Я- И- -Я- Я- я- -я- -я- я- я- и- Я- Я- И А * И- Я- Я Я я я я- я- я и-я- я- я я- я я 75
GUNPOWDER Составление меню Меню предоставляет возможность выбрать именно ту часть программы, какую он хочет выполнить на компьютере. Меню состоит из списка вариантов, один из которых может быть выбран по усмотрению пользователя. Затем управление пере- дается в соответствующую часть программы, чтобы выполнить задачу, выбран- ную пользователем. Меню должно быть четким, понятным и хорошо оформлен- ным. На этих двух страницах приводятся некоторые соображения о способах пред- ставления меню. При составлении меню нужно прежде всего принять решение, каким образом пользователи могут указать свой выбор. Самый простой спо- соб состоит в вводе пользователем числа, как показано на примере слева. Другой способ за- ИГРАТУ1АСТЕР ШПИОНАЖА' ЧТО ВЫ ХОТЕЛИ БЫ Убедитесь, что инструк- ИГРАТЬ НОВУЮ ПАРТИЮ ИЛИ Z, ЧТОБЫ ПЕРЕМЕСТИТЬ КУРСОР К ЗАТЕМ НАЖМИТЕ КЛАВИШУ ВК ПОСМОТРЕТЬ КЛЮЧ К ШИФРУ ИЗУЧИТЬ коды ции в вашем меню понят- ны всем. ПОЖАЛУЙСТА, НАЖМИТЕ КЛАВИШУ А ВЫБРАННОЙ СТРОКЕ ключается в перемещении пользователем курсо- ра или другого символа для того, чтобы указать выбранный вариант. На следующей странице приведена подпрограмма организации меню с перемещением курсора. Переход к одной из подпрограмм Чтобы указать компьютеру, какую часть программы следует исполнить, нужно записать вы- бранный пользователем вариант в переменную. Для меню с выбором номера варианта это можно сделать, используя оператор INPUT. Для меню с перемещением курсора требуется вычислять пози- цию курсора, как это показано на следующей странице. Затем, как показано ниже, можно приме- нить оператор выбора одной из подпрограмм ON...GOSUB, чтобы указать компьютеру, к какой подпрограмме он должен перейти. 1)НАРИСОВАТЬ 200 PRINT "ДИЗАЙНЕР" 210 PRINT "ВАМ ХОТЕЛОСЬ БЫ**: 215 PRINT 220 PRINT 1) ПОВЕРХНОСТЬ 230 PRINT' "**2) ИЗМЕНИТЬ ПОВЕРХНОСТЬ" 240 PRINT 3) ИСПОЛЬЗОВАТЬ БИБЛИОТЕЧНУЮ - Меню ПОВЕРХНОСТЬ" 250 PRINT "4) СОХРАНИТЬ ПОВЕРХНОСТЬ** 255 PRINT 260 PRINT ''ПОЖАЛУЙСТА, ВВЕДИТЕ НОМЕР"; 270 PRINT "ВЫБРАННОГО ВАМИ ВАРИАНТА.' 280 PRINT "ЗАТЕМ НАЖМИТЕ ВК" 290 INPUT С .....- 295 IF С 1 OR С 4 THEN GOTO 260 300 ON С GOSUB 4 Как показано выше в подпрограмме, оператор ON...GOSUB0 используют вместе с переменной. Значение этой переменной указывает компьютеру, какую подпрограмму исполнить. Например, если переменная С равна 3, компьютер перейдет к третьей подпрограмме в списке подпрограмм. Выбор пользователя r-r-z. Проверка ввода 550 590, GOSU 5оо варианта. Пожалуйста, введите номер выбранного ва- м 76 Не все компьютеры имеют оператор ON...GOSUB.
GUNPOWDER Ввод слова Ввод буквы 250 PRINT "КАКОЙ ЦВЕТ ВЫ ЖЕЛАЕТЕ?" 260 PRINT "КРАСНЫЙ, ЧЕРНЫЙ, ЗЕЛЕНЫЙ, СИНИЙ" 270 PRINT "ПОЖАЛУЙСТА, ВВЕДИТЕ ВЫБРАННЫЙ ЦВЕТ" 280 PRI NT "ЗАТЕМ НАЖМИТЕ КЛАВИШУ ВК" 290 INPUT А$ 300 LET С 310 FOR J = 1 ТО 4 Цикл поис- 320 IF W$(J) = А$ THEN LET С = J|- ка слова в 330 NEXT J 340 IF С = 0 THEN PRINT "НЕ ЗНАЮ ТАКОГО СЛОВА ПОЖАЛУЙСТА, ПОПЫТАЙТЕСЬ СНОВА": GOTO 270 350 ON С GOSUB и тд. массиве Если вы хотите, чтобы пользователь выби- рал в меню вариант путем ввода некоторого слова, тогда следует записать в массив (W$ ) те слова, из которых пользователь может делать выбор. Затем нужно сравнить вводимое пользо- вателем слово со словами, записанными в мас- сиве. При совпадении слов запишите индекс мас- сива для совпавшего слова в переменную (С). 200PRINT "ПОЖАЛУЙСТА, ВВЕДИТЕ БУКВУ ОТ А ДО F 210 PRINT "ЗАТЕМ НАЖМИТЕ КЛАВИШУ ВК КЛАВИШУ ВК" 220 INPUT А$ Преобразует букву 230 LET А = ФЭС ASC(A$)-в код ASCII 240 IF А<65 OR A>70 - GOTO 200 250 LET С = A—64 260 ON C GOSUB и т. д. Проверяет, находится ли код в диапазоне, соответствующем буквам А—F. Чтобы выбрать в меню вариант путем ввода лишь одной буквы, нужно обеспечить преобра- зование этой буквы в число, которое можно за- тем использовать в операторе ON...GOSUB. Для этого с помощью функции ASC получают код ASCII вводимой буквы. Затем из кодов ASCII вычитают число, подобранное таким образом, чтобы получить группу чисел, начинающихся с 1. Например, для букв от А до F коды ASCII начинаются с числа 65, поэтому нужно вычи- тать число 64, как показано выше в строке 250. Меню с перемещением курсора При использовании этой подпрограммы нужно заранее выработать координаты функции TAB для каждой строки меню. Чтобы установить курсор слева от строки меню с первым вариантом, вычислите соответствующие значения координат для функции TAB. Кроме того, в этой подпро- грамме вам потребуются число строк между верхней кромкой экрана и строкой в первым вариан- том меню, а также число строк между соседними вариантами меню. 270 CLS 280 GOSUB 1000: REM ИНИЦИАЛИЗАЦИЯ 29OPRINTTAB (1): "ИГРА МАСТЕР ШПИОНАЖА" 300 PRINT ТАВ( 1); "ЧТО ВЫ ХОТЕЛИ БЫ" 310 PRINT TAB (1, NL); "ИГРАТЬ НОВУЮ ПАРТИЮ" 320 PRINT: PRINT TAB (1); "ПОСМОТРЕТЬ КЛЮЧ К ШИФРУ" 330 PRINT : PRINT TAB (1); ИЗУЧИТЬ КОДЫ" 340 PRINT 350 PRINT TAB (1); "ПОЖАЛУЙСТА НАЖМИТЕ КЛАВИШУ А ИЛИ Z" 360 PRINT TAB (1); "ЧТОБЫ ПЕРЕМЕСТИТЬ КУРСОР К ВЫБРАННОЙ СТРОКЕ" 370 PRINT : PRINT TAB (1); "ЗАТЕМ НАЖМИТЕ КЛАВИШУ ВК" 380 PRINT TAB (СХ, СУ); ">": LET ОУ = СУ 390 LET l$= INKEYS: IF 1$=" " THEN GOTO 390- 400 IF l$ = "A" AND CY>NL THEN LET CY = CY-SP 410 IF IS = "Z" AND CY>LC THEN LET CY = = CY + SP 420 IF CYOOY THEN PRINT TAB (CX, OY); " 430 IF ISO CHR$ (13) THEN GOTO 380— Клавиша ВК имеет 440 LET C = INT ((CY-NL)/SP) + 1 q Вычисляет ^наче™™ пере-1 450 ON C GOSUB 500, 600, 700 Именной С для использования 495 END в опеРат°Ре ON ... GOSUB 1000 LET NL =4:LET NC = 3:LET SP = 2:LET CX = 0 1010 LET CY = NL: LET LC = NL-SP + (NC SP) 1020 RETURN | CX = позиция X курсора (но- мер столбца) СY= позиция Y курсора (но- мер строки) NL= число строк между верх- ней кромкой экрана и строкой меню с первым вариантом. SP=число строк между сосед- ними вариантами в меню. NC= число вариантов. LC= номер строки последнего варианта в меню. 77
GUNPOWDER Увеличение скорости выполнения программ Ниже описаны несколько приемов, позволяющих ускорить выполнение программ. Далее на следующей странице обсуждаются способы укорочения или «уплотнения» программы, чтобы она занимала меньше места в памяти. Чем короче программа, тем быстрее она будет выполнена, поэтому если скорость действительно важна, можно применить также некоторые приемы уплотнения программы. Большинство этих приемов сводится к удалению тех подробностей, которые вы включали в свою программу, чтобы сделать ее более удобной для чтения и понимания. Поэтому весьма полезно сохранить копию программы перед тем, как вы начнете ее уплотнять. К этой копии вы можете вернуться, если в уплотненной версии появятся ошибки или вы захотите позднее продолжить разработку программы. Вот некоторые приемы, обеспечивающие увеличение скорости исполнения программы. В программе, имеющей много подпрограмм, Если ваш компьютер допускает целые пере- менные, т. е. переменные для хранения целых чисел, используйте их при всякой возможности. В конце имени целой переменной ставится знак % (см. с. 59). Они занимают гораздо мень- ше места в памяти, чем обычные числовые пере- менные, и намного быстрее обрабатываются расположите эти подпрограммы в соответствии с частотой их использования. Наиболее часто используемые подпрограммы поместите сразу после управляющей части программы, так что- бы компьютер мог быстро их найти. Если име- ется подпрограмма, для которой очень важна скорость исполнения, целесообразно поставить ее в самом начале программы, как описано на с. 56. компьютером. В качестве счетчика цикла всегда используйте целые переменные (если они допускаются вашим компьютером), как это описано на с. 5 9. Такие циклы исполняются вдвое быстрее. Используя секундомер, проведите для сравне- ния хронометраж исполнения на вашем компью- тере 500 повторений обычного цикла и цикла с целой переменной. Сократите программу путем удаления из нее операторов REM и размещения на одной строке нескольких операторов, как описано далее. Постарайтесь провести хроно- метраж обоих вариантов своей программы, чтобы определить на- сколько быстрее стал работать ускоренный вариант программы. Быстродействие компьютера Скорость выполнения программы зави- сит также от быстродействия вашего ком- пьютера. Быстродействие компьютера из- меряется в мегагерцах (МГц)» _и компьютер с быстродействием в 2 МГц работает быстрее компьютера с 1 МГц. Кроме того, скорость» с которой ком- пьютеры исполняют программы» зависит от количества операций, которые нужно выполнить для решения задачи. Управле- ние выполнением этих операций осущест- вляет программное обеспечение компьюте- ра, т. е. операционная система, управляю- щая компьютером, и интерпретатор, кото- рый переводит операторы и команды БЕЙСИКа в машинные коды компьютера. 78
GUNPOWDER Приемы экономии места в памяти Приемы, описанные ниже и на следующей странице, позволяют экономить много места в памяти, однако они усложняют чтение и отладку программ. Их следует применять только тогда, когда вы уже закончили программу, а она выполняется свободно без каких-либо оши- бок. Сохраните копию этой программы на ленте или диске и, если возможно, распечатайте копию программы на бумаге для продолжения работы с ней. Эти приемы можно применить, если, например, нужно добавить в программу побольше данных, а памяти не хватает, или нужно улучшить графику или несколько ускорить исполне- ние программы. В большинстве компьютеров из определен- ных операторов БЕЙСИКа можно исключить отдельные служебные слова, например, LET, THEN и GOTO. Обратитесь к своему руковод- ству пользователя, так как для разных компью- теров эти правила различаются, а затем про- 395 КЕМПОДПРОГРАММА ВЫВОДА СООБЩЕНИЙ 400PRINT TAB (X, Y); М$ Удалите все операторы REM. Они не влияют на исполнение программы и нужны только для того, чтобы программа была удобной для чте- ния. Операторы REM, занимающие всю строку, можно легко удалить путем стирания сразу всей строки. Однако следует убедиться, что ни один оператор GOSUB или GOTO не передает управ- ление той строке, которую вы намерены удалить. смотрите свою программу. 2 [ANSWER *01 701 FX > 1 THENPRINT; Х-1; "СТРАНИЦЫ0 40FORI -NTOP Эти пробелы обяза- тельны А Удален пробел после номера строки Если вы удалите этот пробел, компьютер мо- жет принять часть опе- ратора NTOP. за переменную 4 Сократите имена всех переменных до одной или двух букв. Осуществляя такое сокращение имен, будьте очень внимательны, так как в про- грамме возникнет ошибка, если вы пропустите 1500NCGOSUB 200, 300, 400 Затем удалите все лишние пробелы, пробел занимает один байт памяти, Каждый поэтому хотя бы одно местонахождение переменной. Убедитесь также, что все новые имена перемен- ных различны. Вот почему, когда вы начинаете писать программу, лучше всего обозначить все можно сохранить довольно много места в памя ти, удаляя такие пробелы. Однако будьте осто рожны, так как в некоторых операторах пробе лы обеспечивают нужную четкость записи. переменные разными буквами. См. другие приемы на с. Сервисный пакет программиста Сервисный пакет программиста представ- ляет собой специальную программу, которую можно приобрести для выполнения перечис- ленных выше задач. Вы загружаете эту про- грамму в память своего компьютера, и затем она предоставляет вам на выбор следующие действия: удаление заданных слов, например таких, как REM и LET, перенумерацию про- граммы, поиск и замену имен переменных. Различные программы могут предоставить разные возможности. Здесь показан набор ус- луг, предоставляемых одной из таких про- грамм. ПАКЕТ ПРОГРАММИСТА ПОЖАЛУЙСТА BBf ДИН ВЫБРАННЫЙ ВАМИ НОМЕР 1) ПЕРЕНУМЕРАЦИЯ ПРОГРАММЫ 2) ПОИСК И ЗАМЕНА 3) СЛИЯНИЕ ПР01 РАММ 4) РАСПЕЧАТКА IIГ PI МЕННЫИ 5) ПЕРЕСТАНОВКА СПОК 6) УПЛОТНЕНИЕ ПРОГРАММЫ 7) УДАЛЕНИЕ КОММ! НТАРИЕВ 79
GUNPOWDER Еще о приемах экономии места В большинстве компьютеров можно не вклю- чать переменную цикла в оператор NEXT. Ком- пьютер автоматически восстановит пропущен- ную переменную, т. е. воспримет данный опера- тор в виде NEXT J. 200PRINT "МИНУТКУ": FORI = 1Т099: READS (1): NEXT: PRINT.PRINT: "КОНЕЦ": GOSUB 500 После выполнения подпро- граммы компьютер возвра- щается к следующему (после . GOSUB) оператору в строке. 1 90LET$==CHR$(42); GOSUB100:PRINTTAB (X, Y); M$:LET$ = CHR$(46):GOSUB100 Объединяйте в одну многооператорную стро- ку как можно больше строк. Однако нельзя объ- единять- в одной строке операторы IF... THEN или ON ... GOSUB с другими операторами, кото- рые не зависят от них. Проверьте значение мак- симальной длины строки для своего компьюте- ра. Обычно она составляет 255 симаволов (т. е. шесть с небольшим строк для компьютера с экраном шириной в 40 столбцов). Убедитесь, что подпрограммы начинаются именно в тех строках, которые указаны в операторах GOSUB. В некоторых компьютерах можно использо- вать сокращенную запись ключевых слов БЕЙСИКа, например Р. вместо PRINT. Испо- льзование таких сокращений позволяет разме- стить больше операторов на одной строке. Однако сами по себе эти сокращения не эконо- мят места в памяти, так как компьютер всегда хранит укороченные варианты ключевых слов. После всех этих изменений вам возможно по- требуется перенумеровать программу. Очень внимательно проверьте, чтобы во всех операто- рах GOSUB и GOTO были правильно указаны номера строк. место в памяти можно экономить, используя также приемы, описан- ные на с. 66-72. Еще о памяти компьютера Большинство бытовых компьютеров име- ет оперативную память (ОЗУ) объемом в 32К и 48К и это очень много даже для самых длинных программ. Хотя часть ОЗУ всегда используется компьютером для служебных действий, например, для хранения нужной компьютеру информации, пока он выполняет программу. На эти цели может уходить до ЗК, что соответственно уменьшает объем ОЗУ, доступный для программы пользо- вателя. Кроме того, в графическом режиме высо- кого разрешения большинству компьютеров требуется очень много места в ОЗУ для хра- нения графической информации. В режиме с самым высоким разрешением может потребо- ваться до 20К, при этом для программы пользователя остается только около ЮК. Для восьмибитовых компьютеров (т. е. компьютеров, которые используют для пред- ставления информации байты, состоящие из восми битов или сигналов) максимал ьный объем памяти, приходящейся на ОЗУ и ПЗУ, может составлять 64К. Это обусловлено тем, что каждая ячейка памяти должна иметь но- мер в качестве своего адреса. Каждый адрес представляется двумя байтами компьютерно- го кода, и наибольшее число, которое может быть получено с помощью двух байтов (16 бит) равно 65 535. Это позволяет дать адрес 65536 ячейкам памяти с номером 0— 65 535, что и составляет 64К (т. е. 65536 : 1024). Тем не менее, для восьмибитовых ком- пьютеров можно использовать память и большего объема путем подключения в раз- ное время разных блоков памяти. Чтобы так сделать, нужно приобрести блоки расширения памяти. 80
GUNPOWDER Программа Картотека Ниже приводится текст программы Карточный файл. Эта программа является хорошей иллюстрацией применения многих приемов и методов программирования, описанных в этой части книги. Это довольно сложная программа с большим коли- чеством переменных и подпрограмм. Каждая задача выполняется отдельной секци- ей программы, и поэтому удобно изучать эти секции по отдельности. Программа написана на стандартной версии БЕЙСИКа. Как использовать Картотеку Программа Картотека представляет собой имитацию индексного файла на перфокартах. Эта программа предназначена для хранения фамилий, адресов и номеров телефонов, но ее можно легко преобразовать для хранения другой информации. Некоторые рекомендации о том, как это можно сделать, приводятся сразу после текста программы. ^КАРТОТЕКА НЕТ КАРТ В ФАЙЛЕ ВАМ ХОТЕЛОСЬ БЫ: КАРТОТЕКА 1 КАРТА ДОБАВИТЬ КАРТУ ***************************************** ****************************************** > ДОБАВИТЬ КАРТУ УДАЛИТЬ КАРТУ ИЗМЕНИТЬ КАРТУ ПРОСМОТРЕТЬ КАРТЫ ЗАГРУЗИТЬ КАРТЫ ЗАПИСАТЬ КАРТЫ ИМЯ КОМПЬЮТЕРНЫЙ КЛУБ >УЛИЦА): ГОРОД ОБЛАСТЬ КОД ТЕЛЕФОН ИНФОРМАЦИЯ ***************************************** ПОЛЬЗУЙТЕСЬ КЛАВИШАМИ ( ) ДЛЯ ПЕРЕМЕЩЕНИЯ КУРСОРА ВВЕРХ И ВНИЗ L ЧТОБЫ ВЫБРАТЬ РЕЖИМ НАЖМИТЕ ВК Это меню появляется на экране, как только вы запустите программу. Чтобы выбрать тот или иной режим работы, вы перемещаете кур- сор к нужной строке и затем нажимаете клави- шу ВК или ВВОД. ****************************************** ПОЛЬЗУЙТЕСЬ КЛАВИШАМИ ( ) ДЛЯ ПЕРЕМЕ- ЩЕНИЯ КУРСОРА ВВЕРХ И ВНИЗ. кДЛЯ ВОЗВРАТА В МЕНЮ НАЖМИТЕ ВК Чтобы записать информацию на карту, пере- мещают курсор к выбранной строке. Звездочка (★) показывает, где будет выведен следующий символ. > Просмотреть карты Если выбран режим ПРОСМОТР КАРТ, компьютер выводит на экран каждую карту, и вы можете оперативно просмотреть их, чтобы найти нужную вам. Можно также предложить компьютеру найти конкретную строку на карте. Чтобы сделать это, вы выбираете режим ПРОСМОТР, а затем нажимаете клавишу @. На экране появится пус- тая карта. В строку, соответствующую данному виду информации введите интересующий вас элемент. Например, если вы хотите найти карты всех людей, проживающих в конкретном городе, на- берите название этого города в строку городов. Затем нажмите клавишу ВК. Компьютер будет перебирать карты до тех пор, пока он не найдет то, что вы заказали. Задаваемый для поиска эле- мент нужно набирать в точности так, как он за- писан на карте, иначе компьютер не сможет его найти. Вы можете продолжить поиск, нажимая лю- бую клавишу, или же вернуться к меню. > Изменить карту Чтобы изменить содержимое карты, выбери- те режим ПРОСМОТРЕТЬ для поиска нужной вам карты. Затем возвратитесь к меню и выбе- рите режим ИЗМЕНИТЬ. Карта появится на экране, и вы сможете стереть ненужные слова, пользуясь клавишей УДЛ. > Удалить карту Чтобы удалить карту, нажмите клавишу @. На этой карте появляется с бщение об удале- нии в строке, обозначенной ИНФО. Эта карта удаляется, когда все карты записываются на ленту или диск с целью их сохранения. > Загрузить карты > Записать карты Вы можете записать карты на ленту или диск или, наоборот, загрузить карты с ленты или диска. В приведенных ниже указаниях по преобразованию программы показано, как нуж- но изменять программу, чтобы выполнить эти действия на основных моделях компьютера. Ес- ли вы записываете карты на диск, при каждой записи нового набора карт старый набор будет стираться.
GUNPOWDER Переменные в программе Картотека Ниже приводится список основных переменных, используемых в программе. Он будет полезен вам при ее изучении. Для экономии места в памяти все данные для карт хранятся в одномерном массиве» как было описано на с. 66. Этот массив назван С$» и каждая запись (см. с. 66) содержит всю информацию для одной карты. Первая запись оставлена пустой в качестве свободной карты, которая использует- ся в процедуре поиска (см. с. 81). Чтобы найти для карты информацию, программа использует формулу «номер карты х длина карты + 1». Эта формула аналогична формуле, данной на с. 66» за исключением того, что здесь не нужно вычитать 1 из номера карты, потому что данные для карт начинаются с записи 2 (запись 1 является свободной картой для процедуры поиска). с$ Массив карт (одномерный массив хранения данных для карт). MX Максимально допустимое число карт. м$ Данные для меню. ML Длина меню, т. е. число вариан- тов. Н$ Заголовки карт. CL Длина карты — число строк на каждой карте. CARD Номер текущей карты. LAST Номер последней карты в файле. SC Карта поиска. Это первая запись в массиве и она используется как свободная карта, на которую поль- зователи заносят данные для поис- ка. NC Число карт, которые должны быть записаны или загружены с кассетного или дискового файла. ND Число уничтожаемых карт. KP Код ASCII нажатой клавиши. CHOICE Выбор пользователя из меню. IL Длина ввода (максимально допу- стимое число символов при вводе). B$ Буферная строка. Временная пере- менная для хранения ввода. S Интервал между строками. Если S = 2, то между строками на карте имеются промежутки. Номер строки, на которую выво- дится курсор. OL Номер прежней строки (предыду- щая позиция курсора). LMAX Самая нижняя позиция курсора, т. е. нижняя часть меню или кар- ты. DP Глубина. Число строк от верха карты до первой строки с данны- ми. ТР Верх карты, т. е. первая строка меню или заголовка карты. DENT Отступ» т. е. позиция первого столбца для данных на карте. W Ширина экрана в столбцах. W$ Переменные для хранения указания пользователю, какую клавишу нужно нажать. Х$ Переменная для сообщений в верх- ней части экрана. Y$, Z$ Переменные для сообщений в ниж- ней части экрана. L$ Строка из звездочек. D$ Сообщение об удалении, выводи- мое на ту карту, которую нужно удалить. UP DOWN Коды ASCII клавиш, предназна- ченных для перемещения курсора вверх и вниз. OTHER Код ASCII клавиши для удаления карты. BACK Код ASCII клавиши возврата, вы- зывающей возврат на один символ и удаление последнего набранного символа. 82
GUNPOWDER Распечатка программы Картотека Вот распечатка программы Картотека. Вам нужно приспособить эту программу для своего ком- пьютера, используя руководство пользователя. Строки, которые нужно изменить во всех компьютерах, помечены значком •. Строки, помечен- ные ♦, содержат операторы PRINT TAB (X, Y), которые необходимо преобразовывать для всех компьютеров, за исключением ВВС и Electron. Рабочая подпрограмма Управляющий центр 10 GOSUB 1260: REM ИНИЦИАЛИЗАЦИЯ 20 LET Х$ = "ВАМ ХОТЕЛОСЬ БЫ": 30 LET LMAX = ML:LET L = CHOICE 40 GOSUB 1170 • 50 PRINT TAB(0, TP); 60 FOR I - 1 TO ML 70PRINTTAB (1); M$(1) 80 IF S = 2 THEN PRINT 90 NEXT I 100 LET Y$ = W$ + "ЧТОБЫ ПЕРЕМЕСТИТЬ КУРСОР ВВЕРХ ИЛИ ВНИЗ" 110 LET Z$ = "ЧТОБЫ ВЫБРАТЬ РЕЖИМ, НАЖМИТЕ КЛАВИШУ ВК" 120 GOSUB 1140 130 GOSUB 890:1F КРО 13 THEN GOTO 130 140 LET CHOICE = L 150 IF CHOICE = 1 AND LAST = MX - 1 THEN LET X$ = = "ФАЙЛ ЗАПОЛНЕН - ЗАПИШИТЕ КАРТЫ" GOTO 30 160 IF LAST = 0 AND CHOICE > 1 AND CHOICE <> 5 THEN LET X$= "В ФАЙЛЕ НЕТ КАРТ": GOTO 30 20 : Помещает сообщение в переменную Х$ 30 : Присваивает значения переменным, определяющим позицию строки, на которую выводится курсор 40 : Выводит заголовок и нижнее сообщение 50 : Устанавливает позицию вывода в верх- ней части карты 60—90 : Вывод меню. Если S = 2, оставляет пробел между строками. 100—ПО : Формируют сообщения для ниж- ней части экрана. 170 LET X$ = M$ (CHOICE): LET LMAX = CL 180 LET Z$ = "ДЛЯ ВЫЗОВА МЕНЮ НАЖМИТЕ КЛАВИШУ ВК": LET L =1 190 ON CHOI СЕ СО SUB 230, 290, 350, 390, 690, 690 200 IF CHOICE <6 THEN GOTO 20 210 CLS: PRINT "КАРТЫ ЗАПИСАНЫ. ВЫ ВЫШЛИ ИЗ ПРОГРАММЫ" 220 STOP 225 ВЕМДОБАВИТЬ КАРТУ В ФАЙЛ 230 LETCARD= LAST + 1 240 LET LAST = LAST + 1 250 GOSUB 810:GOSUB 1140 260 GOSUB 990 270 IF KPO 13 THEN GOTO 250 280 RETURN 130 : Подпрограмма выбора с помощью пе- ремещения курсора. Если СНО1СЕ<>13 (код ASCII для клавиши ВК), повторяет под- программу. 140 : Присваивает переменной CHOICE зна- чение номера текущей строки, на которой находится курсор. 150—160 : Если пользователь выбирает ре- жим ДОБАВИТЬ КАРТУ, а файл заполнен, или если в файле нет карт, а пользователь не выбрал режим 5 (ЗАГРУЗИТЬ КАРТЫ), тогда выводится сообщение и повторяется меню. 170 : Помещает в Х$ сообщение для вывода на экран выбранного из меню режима. При- сваивает переменной LMAX значение длины карты. 180 : Помещает в Z$ сообщение и подготав- ливает L для вывода курсора на строке 1. 190 : В зависимости от выбранного в меню режима передает управление соответствую- щей подпрограмме. 200 : Возврат управления в эту строку после выполнения каждой подпрограммы и вывод на экран меню, если CHOICE <6 (ЗАПИСЬ КАРТ). 210—220 : Останов программы после записи карт на ленту или диск. 230 : Присваивает номеру карты значение номера последней карты в файле. 240 : Добавляет 1 к числу карт в файле. 250 : Выводит содержимое карты, затем вы- водит нижние сообщения. 260 : Подпрограмма ввода. 270 : Повторяет процедуру ввода до тех пор, пока значение кода КР (нажатая клавиша) не станет равным 13 (код ASCII клавиши ВК). 83
GUNPOWDER 285 REM УДАЛИТЬ КАРТУ 290 GOSUB 810 300 LET Y$ = "НАЖАТЬ" +CHR$(OTHER) + "ЧТОБЫ": LET Z$= X$ 310 GOSUB 1140 320 GOSUB 890 330 IF KP = OTHER THEN LET C$ (CARD CL+ CL) = D$: LET ND = ND + 1: GOTO 290 340 RETURN 290 : Вывод на экран содержимого карты 300 : Сообщения для вывода в нижней части карты 310 : Вывод сообщения в нижней части карты 320 : Перемещает курсор и читает код ASCII нажатой клавиши 345 REM ИЗМЕНИТЬ КАРТУ 350GOSUB810: GOSUB 1140 360 GOSUB 990 370 IF KP <> 13 THEN GOTO 360 380 REM ПРОСМОТР КАРТ Рабочие подпрограммы 390 LET CARD = 1 400 LET Y$ = W$ + "ДЛЯ ПРОСМОТРА" +CHR$ (OTHER) + "ДЛЯ ПОИСКА": GOSUB 810 410 GOSUB 1140: LET L = 1: GOSUB 890 420 IF KP = UP AND CARD < LAST THEN LET CARD = CARD+1 430 IF KP= DOWN AND CARD> 1 THEN LET CARD = CARD-1 440 IF KP = OTHER THEN GOSUB 470 450 IF KPO 13 THEN GOTO 400 460 RETURN 465 REM ПОДПРОГРАММА ПОИСКА 470 LET CT = CARD: LET CARD = SC 330 : Если нажатая клавиша имеет код ASCII, соответствующий клавише для удале- ния страницы, помещает на карте в качестве последнего элемента сообщение об удалении DS. 350 : Выводит содержимое карты и нижние сообщения. 360 : Подпрограмма ввода. 370 : Повторяет подпрограмму ввода до тех пор, пока пользователь не нажмет клавишу ВК. 400 : Формирует сообщения. Выводит содер- жимое карты. 410: Выводит сообщения. Устанавливает курсор на строку 1. Переходит к подпро- грамме перемещения курсора. 420—430 : Изменяет значение номера карты в зависимости от того, какая клавиша нажата. 480 FOR I = 1 TO CL:LET C$ (SC + 1) = " NEXT I 490 LET X$ = "ПОИСК": LET Y$ = "ПЕРЕЙДИТЕ К СТРОКЕ, ЗАТЕМ УКАЖИТЕ ПРЕДМЕТ ПОИСКА" 500 LET Z$ = "ЧТОБЫ НАЧАТЬ ПОИСК, НАЖМИТЕ ВК" 510 GOSUB 810: GOSUB 1140 520 LET KP = 0: GISUB990 530 IF C$(SC + L) = " " THEN LET CARD = CT: RETURN 540 LET Y$ = "ПОИСК" + C$ (SC + L): LET Z$ = "ЧТОБЫ ПРОДОЛЖИТЬ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ" 550 LET KP = LET FOUND = 0 560 FOR I = 1 TO LAST 570 LET FLAG = 0 580 IF C$(l CL L) = C$(SC + L) THEN LET CT = l:LET FLAG = 1 590 LET CARD = 1 440 : Переходит к строке 470, если пользова- тель выбирает подпрограмму поиска. 450 : Если нажатая клавиша < > ВК, повто- ряет подпрограмму просмотра карт. 470 : Записывает номер карты во временную переменную СТ. Присваивает номеру карты значение SC, то есть карты 0, которая явля- ется записью 1 в массиве С$. 480 : Очищает карту поиска. 490—500 : Сообщения. 510 : Выводит содержимое карты и со- общения. 520 : Обнуляет КР и переходит к процедуре ввода. 530 : Отказ от процедуры поиска, если поль- зователь ничего не вводит. 540 : Выводит сообщение о поиске. C$(SC + + L) равен элементу, который ищет пользо- ватель. 550 : Обнуляются переменные. Переменная FOUND служит для подсчета числа появле- ний элемента, который ищет пользователь. 560—630 : Цикл поиска по всем картам. 570 : Обнуляет переменную FLAG, которая указывает что элемент обнаружен. 580 : Если строка на очередной карте равна строке на карте поиска, переменной СТ при сваивается значение переменной цикла (то есть номер карты), а переменной FLAG при- сваивается 1. 590 : Присваивает переменной CARD значе- ние переменной цикла I для того, чтобы ис- пользовать переменную CARD в подпрограм- мах 810 и 1140. 84
GUNPOWDER 600 GOSUB 810: GOSUB 1140 610 IF FLAG = 1 THEN GOSUB 960: LET FOUND = FOUND + 1 620 IF KP = 13 THEN LET I = LAST 630 NEXT I 640 LET CARD = CT 650 LET X$ = "ПОИСК ОКОНЧЕН": GOSUB 1170 Сервисные подпрограммы 660IF FOUND >0 THEN LET Z$ = "ОБНАРУЖЕНО: '4STR$ (FOUND) + "РАЗ" 670IF FOUND = 0 THEN Z$ = "HE ОБ НАРУЖЕНО: "+CS(SC+L) 680 RETURN 685 REM ЗАГРУЗКА И ЗАПИСЬ КАРТ • 690 IF CHOICE = 5 THEN: REM open file for input: input*, NC • 700 IF CHOICE = 6 THEN: REM open file for output: print ♦, LAST-ND 710 GOSUB 1170: GOSUB 1140 720 LET J = 0: IF CHOICE = 5 THEN LET J = = LAST: LET LAST = LAST + NC 730 LET J = J + 1 740 FOR K= 1 TO CL • 750 IF CHOICE = 5 THEN INPUT*, C$ (J ♦ CL + K) • 760 IF CHOICE = 6 AND C$ (J = CL + CL) <> D$ THEN PRINT C$ (J ♦ CL + K) 770 NEXT К 780 IF J <MX AND J < LAST THEN GOTO 730 • 790 _ 800 RETURN ~ 805 REM ВЫВОД НА ЭКРАН СОДЕРЖИМОГО КАРТЫ 810 GOSUB 1170 • 820 PRINT TAB (0, TP); 830 FOR К 1 TO CL 840 LET T$=C$(CARD*CL+K) 850 PRINT TAB(1);H$(K);TAB(DENT);T$ 860 IF S=2 THEN PRINT 870 NEXT К _ 880 RETURN “ 885 REM ПЕРЕМЕЩЕНИЕ КУРСОРА ВВЕРХ И ВНИЗ е 890 PRINT TAB (0, TP+(L-1)*S); " > " 900 LET DL=L 910 GOSUB 960 920 IF KP=UP AND L> 1 THEN L=L-1 930 IF KP=DOWN AND L < LMAX THEN LET L=L+1 ♦ 940 IF LOOL THEN PRINT TAB (0, TP+(OL-1)*S);" 950 RETURN 600 : Выводит на экран содержимое карты и нижние сообщения. 610 : Если элемент найдет, переходит к под- программе ввода следующей инструкции. 620 : Если нажатой клавишей является ВК, устанавливают переменную цикла равной ко- нечному значению, чтобы завершить цикл, как описывалось на стр. 63 640 : Присваивает переменной CARD номер, временно хранившийся в СТ. 650 : Выводит заголовок карты и верхнее со- общение. 660—670 : Проверяет значение переменной FOUND и помещает в Z$ сообщение. Функ- ция STR$ преобразует числовую переменную в строковую. 680 : Возврат к строке 450. 690 : Если CHOICE = 5 (ЗАГРУЗИТЬ КАР- ТЫ), открывается файл с именем F$(FLIP- DAT) и загружается элемент NC (число карт, хранящихся в файле). 700 : Если CHOICE=6 (ЗАПИСАТЬ КАР- ТЫ), открывается файл с именем F$(FLIP- DAT) и записывается число карт минус число удаленных карт. 710 : Выводит сообщения верхнее и нижнее. 720 : Устанавливает счетчик цикла равным 0, или в случае загрузки карт равным текущему номеру последней карты. Это — начало ци- кла REPEAT/UNTIL (смотри стр.62). 740 : Цикл повторяется для каждого элемен- та на карте. 750 : Загрузка данных в массив С$ с исполь- зованием формулы, описанной на стр.66. J — номер записи, CL — длина записи, К — номер элемента. 760 : Если последний элемент на карте не ра- вен D$ (сообщение об удалении), записывает элемент в файл. 780 : Повторяет цикл, если J меньше допу- стимого максимума карт и меньше номера последней карты. 790 : Закрывает файл. 810 : Вывод заголовка и верхнего сообщения. 820 : Устанавливает позицию вывода в верх- ней части карты. 830 : Цикл повторяется для каждого элемен- та на карте. 840: Использует формулу, описанную на стр.66, для копирования данных из следую- щей строки карты в переменную Т$. 850 : Выводит заголовок карты Н$ и затем Т$. 860 : Если S=2, оставляет пустую строку. 890 : Выводит знак курсора рядом с первой строкой карты или меню. 900 : Записывает номер текущей строки кур- сора в переменную OL. 910 : Подпрограмма INKEY$. 920—930 : Вычисляет L (новую позицию кур- сора) в зависимости от того, какая клавиша была нажата. 85
GUNPOWDER 940 : Если текущая позиция курсора не равна OL, стирает курсор в позиции OL. Сервисная подпрограмма 955 REM ОЖИДАНИЕ НАЖАТИЯ КЛАВИШИ 960 LET А$ = INKEY$; IF А$ = " " THEN GOTO 960 970 LET КР = ASC(A$) 980 RETURN 985 REM ВВОД ОДНОЙ ИЛИ БОЛЕЕ СТРОК ДЛИНОЙ IL 990 LET L = 1: LET OL = 1: LET B$ = " " 1000 LET B$ = C$ (CARD*CL + L) 1010 LET BL = LEN (9B$): LET X = 0 1020 IF BL < IL AND KP< > UP AND KPO DOWN AND KP <> BACK AND KP > 31 THEN LET X = 1 1030 IF X=1 THEN LET B$=B$+CHR$(KP) 1040 IF KP=BACK AND BL > 0 THEN LET B$ = LEFT$(B$, BL—1) 1050 PRINT TAB (DENT, TP + (L—1) S) B$; 1060 GOSUB 890 960 : Помещает в A$ символ следующей на- жатой клавиши. 970 : КР — код ASCII нажатой клавиша. 990 : Устанавливает номер строки курсора и старый номер строки равными 1 и очищает В$ перед новым вводом. 1000 : Помещает в В$ любые данные, имею- щиеся в строке L. 1010 : Определяет число символов в В$ и за- писывает его в BL. Переменная X служит признаком, что нажатая клавиша является именно тем символом, который нужно запи- сать в В$. 1020 : Устанавливает переменную X равной 1, если BL< максимальной длины ввода и нажатая клавиша < > клавише для переме- щения курсора вверх или вниз или клавише для удаления символа и КР>31 (то есть яв- ляется выводимым символом) 1030 : Если Х = 1, добавляет к В$ символ КР. 1040 : Если пользователь нажимает клавишу удаления и BL (длина В$)>0, тогда из В$ удаляется последний символ. 1050 : Выводит В$ и затем символ ♦. 1060 : Подпрограмма перемещения курсора и ввода следующего символа. 1070 IF LOOLOR KP=13THEN GOSUB 1100 1080 IF KPO 13 THEN 1010 1090 RETURN 1095 REM ИЗМЕНЕНИЕ КАРТЫ ПУТЕМ ВВЕДЕНИЯ СТРОКИ 1110 PRINT TAB(DENT, TP+(OL-1 *S); C$(CARD CL+OL);"*"; 1120 LET B$=C$(CARD*CL+L) 1130 RETURN 1135 REM ВЫВОД ПОДСКАЗОК В НИЖНЮЮ ЧАСТЬ ЭКРАНА 1140 PRINT ТАВ(0, TP+DP);S$ 1150 PRINT ТАВ(0, TP+DP); Y$: PRINT Z$ 1160 RETURN 1165 REM ОБЩАЯ КОМПОНОВКА ЭКРАНА С УКАЗАНИЕМ НОМЕРА КАРТЫ 1170 CLS 1180 PRINT "КАРТОТЕКА" 1185 IF LAST = 0 THEN PRINT "В ФАЙЛЕ НЕТ КАРТ"; 1190 IF LAST > 0 THEN PRINT LAST; "КАРТ"; 1200 IF CARD <MX + 1 ANDLAST>0 THEN PRINT "НА КАРТЕ"; CARD; " " 1210 LWT XC = W2 — (LEN (X$)/2) 1220 PRINT TAB (XC); X$ 1230 PRINT L$ 1240 PRINT TAB (0, TP + DP-1); L$ 1250 RETURN 1070 : Если пользователь перешел к новой строке (L< >OL) или нажал ВК, передает управление подпрограмме, которая помеща- ет в массив С$ самый последний ввод. 1080 : Если пользователь не нажал ВК, по- вторяет подпрограмму ввода. 1100 : Помещает В$ в массив С$. Индекс вы- числяется путем использования формулы, описанной на стр. 66. 1110 : Выводит строку, только что помещен- ную в С$, а затем пробел, чтобы стереть символ ♦. 1120—ИЗО : Помещает данные в В$ из стро- ки L (текущая позиция курсора), затем управление возвращается строке 1080, а от- туда строке 1010 для получения следующего ввода. 1140 : Выводит две строки пробелов, чтобы очистить область нижнего сообщения. 1150 : Выводит сообщения 1180—1190 : Выводит заголовок и число карт 1200 : Выводит номер текущей карты, если он не превышает максимально допустимого значения. 1210—1220 : ХС — столбец, в котором выво- дится начало сообщения Х$, размещаемого в верхней левой части экрана. 1230—1240 : Выводит строку звёздочек под сообщением и внизу карты. 86
GUNPOWDER Инициализация 1255 REM ИНИЦИАЛИЗАЦИЯ 1260 GOSUB 1440 1270 LET MX = 30: LET SC = 0: LET CL = 7: LET ML = 6 1280 DIM C$ (MX CL) 1290 DIM M$ (ML), H$(CL0 1300 DATA "ДОБАВИТЬ КАРТУ", "УДАЛИТЬ КАРТУ", ИЗМЕНИТЬ КАРТУ" 1310 DATA "ПРОСМОТРЕТЬ КАРТЫ", "ЗАГРУЗИТЬ КАРТЫ", "ЗАПИСАТЬ КАРТЫ" 1320 FOR I = 1 ТО ML: READ М$ (I): NEXT I 1330 DATA "ИМЯ", "УЛИЦА", "ГОРОД", "ОКРУГ", "ИНДЕКС", ''ТЕЛЕФОН", "ИНФО" 7340 FOR I = 1 ТО CL: READ Н$ (I) : NEXT I 1350 LET LAST = 0: LET CARD = 1: LET ND = 0 1360 LET F$ = "FLIPDAT": LET D$ = "I КАРТА УДАЛЕНА!" 1380 LET CHOICE =1 1390 LET UP = ASC ("I"): LET DOWN = = ASC("I") LET OTHER ASC(" "): LET BACK = 20 1400 LET W$ = "ИСПОЛЬЗУЙТЕ " +CHR$(UP) + " "+CHR$ (DOWN) 1410 LET L$ = " ": FOR I = 1 TO W: LET L$ = L$+ NEXT I 1420 LET S$ = " ": FOR 1 = 1 TO W 2: LET S$ = S$ + " ": NEXT I 1430 RETURN 1435 REM ЗНАЧЕНИЯ ПАРАМЕТРОВ ВЫВОДА НА ЭКРАН 1440 LET W = 40: LET TP = 5; LET DP = 15 1450 LET S = 2 1460 LET W2 = W/2: LET DENT = 9: LET IL = W — DENT—2 1470 RETURN 1260 : Подпрограмма присваивания конкрет- ных значений параметрам вывода на экран. 1270—1470 : Смотри назначение переменных в таблице переменных для данной про- граммы. 1280 : Объявляет одномерный массив С$ для хранения MXxCL элементов данных. 1300—1320 : Выбираемые режимы для меню и цикл чтения их в массив М$ 1330—1340 : Заголовки разделов для карт и цикл чтения их в Н$.!) 1360 : FLIPDAT — это имя файла, используе- мое для сохранения карт на внешнем носите- ле информации. 1390 : Помещает в переменные UP, DOWN, BACK и OTHER коды ASCII клавиш, вы- бранных для перемещения курсора. 1400 : Помещает в переменную W$ сообще- ния и символы клавиш, выбранных для пере- мещения курсора. 1410—1420 : Присваивает переменной L$ строку из звездочек, чтобы выводить ее на экране, а переменной S$ строку из пробелов для стирания с ее помощью сообщений. 1460 : IL (число символов, которое можно набрать в одну строку) равно ширине экрана минус ширина свободного поля на левом крае карты минус 2. Изменение программы Чтобы переделать программу для хранения какой-либо другой информации, вам нужно из- менить в строке 1330 данные для массива Н$, которые являются заголовками разделов карты. Если нужно другое число заголовков, тогда вы должны также изменить значение CL в строке 1270. Если новые заголовки карт содержат боль- ше символов, чем заголовки в данной програм- ме, тогда нужно увеличить значение переменной DENT в строке 1460. Программа Картотека предназначена для хранения 30 карт, однако, если вы располагаете достаточным объемом памяти компьютера, можно увеличить число карт путем изменения значения MX в строке 1270. Одна полная карта занимает в памяти компьютера 200 байт при ширине экрана 40 столбцов и соответственно 100 байт при ширине экрана 20 столбцов. Соб- ственно программа занимает примерно 4 % К, поэтому нетрудно подсчитать, сколько карт мо- жет храниться в памяти вашего компьютера. ° Для других стран можно заменить ОКРУГ на другую единицу административного деления (ОБЛАСТЬ и др.).
GUNPOWDER Часть 6° Эта часть книги содержит множество упраж- нений, вопросов и задач по программирова- нию, которые помогут вам развить навыки программирования на языке БЕЙСИК. Приво- дятся программы, в которые надо вписывать пропущенные строки и переменные. В текстах ряда программ нужно найти и исправить на- меренно внесенные ошибки. Предлагаются за- дания по самостоятельному составлению про- грамм. Материал этой части книги охватывает все наиболее важные операторы и команды БЕЙСИКа, начиная от простых операторов PRINT и кончая указаниями по составлению большой игровой программы «Поиски со- кровищ». Ж^К Программы, содержащие ошибки, помече- ны изображением «жука», похожего на пока- занного выше. Такое изображение служит для вас указанием, что нужно найти и исправить все ошибки в программе. Программы с пропу- щенными строками и переменными помечены иначе. Строки, которые нужно заполнить, по- мечены звездочкой. Пробелы, куда нужно впи- сать переменные, отмечены вопросительными знаками. ** © 1983 Usborne Publishing ISBN 086020-744-7 (англ). В конце книги даны ответы на все вопросы, задачи и задания по программированию с под- робными пояснениями. Воспользуйтесь этими ответами, если встретитесь с трудностями осо- бенно в длинных программах. Часто уже пер- вые строки ответа на задачу помогут вам ре- шить оставшуюся часть задачи или подска- зать, как составить свой собственный вариант остальной части программы. Иногда строки программы из ответа будут отличаться от строк, написанных вами само- стоятельно. Если ваша программа исполняется правильно, не нужно беспокоиться по этому поводу, поскольку обычно существует несколь- ко разных путей составления одной и той же программы. Попытайтесь сравнить ваши от- веты с ответами в книге, чтобы уточнить, ка- кой из методов более эффективен. Все программы в этой книге написаны на «стандартном» БЕЙСИКе. Это означает, что программы этой книги могут исполняться на большинстве компьютеров без особых измене- ний. Некоторые операторы БЕЙСИКа могут отличаться в разных компьютерах, поэтому, если вы введете программу и обнаружите при ее пуске ошибку, вам следует проверить форму записи операторов БЕЙСИКа в программе. Чтобы помочь вам, на с. 132 приведена табли- ца соответствия операторов и функций для разных моделей микрокомпьютеров. Если вы не совсем уверены в назначении того или иного оператора БЕЙСИКа, обрати- тесь к приведенному в конце книги краткому описанию операторов, функций и команд БЕЙ- СИКа, в котором дано краткое объяснение каждого слова БЕЙСИКа. 88
GUNPOWDER Первые шаги в программировании Эти две страницы дают возможность попрактиковаться в применении оператора PRINT. Этот оператор предлагает компьютеру вывести что-либо на экран. Оператор PRINT можно использовать как непосредственную команду, т. е. без номера строки. Такую команду компьютер выполняет сразу. После ввода непосредственной команды нужно нажать клавишу ВК (или ВВОД или ПС, в зависимости от модели ком- пьютера). Попытайтесь ввести в свой компьютер эти непосредственные команды. Когда с помощью команды PRINT вы предлагаете компьютеру вы- вести буквы или буквы вместе с цифрами, их нужно заключать в кавычки. Числа сами по себе не нуждаются в кавычках. С помощью оператора PRINT можно заста- вить компьютер выполнить вычисления. Вот не- сколько простых выражений с использованием символов арифметических операций БЕЙСИКа. Если вы не знаете точно, что они означают, вы- полните эти операторы. Все эти операторы указывают компьютеру, в какое место экрана нужно выводить элементы данных. Выполните их, чтобы узнать, что имен- но они делают. В БЕЙСИКе знаки препинания имеют особое значение. Запятая — это указание компьютеру оставить несколько пробелов перед выводом следующего элемента, а точка с запя- той — это указание компьютеру выводить сле- дующий элемент в той же самой строке, не оставляя пробела после предыдущего элемента. Исправление ошибок РИВЕТ и изменение оператор программы Ошибки в программе иногда называют «жу- ками». Они могут воз- В большинстве ком- пьютеров для исправ- ления ошибок имеют- ся клавиши удаления УДЛ и вставки ВСТ. Чтобы нужно цию, куда должна быть вставлена буква. Посмотрите в руководстве пользовате- ля, как нужно использовать клавиши управления курсором. вставить пропущенную букву переместить курсор в ту пози- никать из-за невнима- тельного ввода или на- рушения правил записи операторов БЕЙСИКа. Вам нужно выяснить, Чтобы удалить целую строку, достаточно набрать номер строки и затем нажать кла- вишу ВК. как можно исправлять ошибки и изменять опе- раторы программы. 89
GUNPOWDER Простые задачи по программированию Вот для начала несложная программа. Она заставляет компьютер выводить на экран сообщение, показанное на экране справа. Попытайтесь исполнить эту программу, а затем подумайте, сможете ли вы изменить ее так, чтобы получить на экране сообщения, подобные показанным ниже на экранах 1, 2, 3 и 4. Вам могут помочь примеры применения непосредственных команд на предыдущей страни- це. Внизу этой страницы даны некоторые советы по изменению программ и исправлению ошибок. 10 PRINT "КАК ВАС ЗОВУТ? 20 INPUT A$"j Заставляет компьютер ждать, пока вы введете свое имя, и затем запо- минает его в переменной А$. 30 PRINT^l Оператор PRINT без данных выводит пустую строку. 40 PRINT"ПРИВЕТ"5 50 PRINT А$П---— Предлагает компьютеру вывести слово, храняще- еся в А$. Введите эту программу в свой компьютер, нажимая клавишу ВК после набора каждой строки. В самом конце наберите команду RUN (пуск), а затем нажмите ВК. Разница между операторами программы и непосредственными командами, показанными на преды- дущей странице, заключается в том, что в программе каждая строка с оператором имеет номер. Ком- пьютер накапливает операторы программы в своей памяти и не выполняет их до тех пор, пока вы не введете команду RUN. Если использовать номера строк с шагом десять, то появляется возможность добавлять в случае необходимости дополнительные операторы без перенумерации всей программы. Чтобы посмотреть рас- печатку программы, введите команду LIST. Чтобы стереть всю про грамму, введите коман ду NEW. ----------------------т 10 PRINT "ЭТО ДОВОЛЬНО" 20 PRINT "ПРОГРАММА" 30 PRINT "ГЛУПАЯ" Новые строки можно добавить в любое ме- сто программы. Кроме того, можно исправить прежние строки, набирая их заново. Попробуйте ввести эту программу точно так, как она пред- ставлена здесь, и посмотрите, что произойдет, когда вы исполните или распечатаете ее. 90
GUNPOWDER Задачи о переменных Переменная — это именованная ячейка памяти компьютера, в которой хранится элемент данных. Как показано ниже, вы можете использовать операторы LET и INPUT, чтобы записать в переменную элемент данных. Данные в виде слов или набо- ра из букв, цифр и символов называются символьной строкой. Она должна заклю- чаться в кавычки, а после нее ставится символ $. 10 LET А = 16 20 LET R$ = "РЖАВЫХ РОБОТОВ 30 PRINT А 40 PRINT RS RUN 16 РЖАВЫХ РОБОТОВ А и R$ - это имена пере- менных. 10 PRINT "КАК ВАС ЗОВУТ? ' 20 ШТЗГЕ Т' 30 20 INPUT NS 30 PRINT "СКОЛЬКО ВАМ ЛЕТ? 40 INPUT А 50 PRINT NS; "ВАМ"; А Строковая переменная. Оператор LET предлагает компьютеру дать имя ячейке памяти и поместить в нее некоторое значение. Оператор INPUT дает имя ячейки памяти и заставляет компьютер ожидать, когда вы после пуска программы введете информацию. Выбор имен переменных ООО БЕЙСИК довольно чувствителен к имени, LET BS = "6422 КРЫСЫ LET В5 = 6422 LET К1 =99 LET FLS = "БЛОХА" которое вы присваиваете переменной, причем Какие из этих имен допусти- мы для вашего компьютера? LET LETTERS = "ПРИВЕТ!1 LET TEN = 10 LET RUNS=" ЕЩЕ КРЫСЫ LET FLEAS = "50 БЛОХ" Если в качестве имен переменных вы исполь- на? Некоторые из этих имен пе- ременных содержат ключе- ые слова БЕИСИКа и вызо- вут ошибку. Какие это име- для разных моделей компьютеров правила вы- бора имен различны. Например, компьютер ZX81 допускает для строковых переменных имя, зуете целые слова, то не следует присваивать имена, которые содержат ключевые слова БЕЙСИКа, так как это вносит путаницу в ком- пьютер. Проверьте показанные выше строки и определите, какие из них являются допусти- мыми. 10 LET RRS = "РЖАВЫЙ РОБОТ 20 PRINT "ПРИВЕТ"; RRS содержащее только одну букву. Слова и переменные Когда в операторе PRINT записаны слова и переменные, слова должны заключаться в « », Попробуйте ввести запятую вместо точки с запятой и посмотрите, что произойдет. Внутри кавычек с каждой стороны слова нужно оставить пробелы. Попробуйте выкинуть эти пробелы в показанных выше строках и по- а между словами и переменной ставится смотрите, что из этого получится. Использование оператора PRINT Можете ли вы, используя показанные выше переменные, написать программу так, чтобы она 66 77 РЖАВЫХ РОБОТОВ( ЖАРЕНЫХ СОСИСОК при запуске выводила на экран следующие строки? 91
GUNPOWDER Взгляд на программу изнутри Эта программа переводит температуру со шкалы Фаренгейта в шкалу Цельсия. Если вы не имеете точного представления о том,как работает эта программа, или как изменяются переменные, попробуй- те дополнить ее несколькими строками с операторами PRINT с тем, чтобы компьютер выводил на экран содержимое этих переменных. Такой подход позволяет посмотреть на работу программы как бы изнутри и помогает вам разобраться в том, как она работает. Попробуйте добавить в про- грамму несколько строк, чтобы узнать значения С и D. Задача по программированию Теперь подумайте, можете ли вы изменить эту программу таким образом, чтобы перево- дить температуру из шкалы Цельсия в шкалу Фаренгейта. Задачи по программированию Ниже приведены три задачи по составлению несложных программ. Вам потребуется использовать ряд переменных, поэтому выпишите их и выберите для них имена. Целесообразно выбирать имена переменных так, чтобы они напоминали вам, что делают эти переменные или для чего они предназна- чены. Попытайтесь сначала записать программы на бумаге, а затем введите их в компьютер и в случае необходимости исправьте в них ошибки. 1. Вы говорите на языке Агли? £1 АГПРОЬОАИТЕ аг меня ИН АГК АГВАШЕМУ 4 АГЬОЖА-Ю Вам предложили отправиться со специая^д > . ной миссией на планету Агли, где местные жи- жЭ тели говорят на весьма своеобразном язык^И^ЯМ v К началу каждого слова они добавляют пристав- ку Составьте программу перевода обычных слов^^^“ ’г**^ на язык Агли. Подсказка: Для ввода приставки АГ исполь- зуйте оператор присваивания LET со строковой переменной. Л ввода любого обычного слова по запросу компьютера используМ те оператор INPUT с другой строковой переменной. Затем выво-ж дите одновременно обе эти переменные, в результате на экране J появится слово на языке Агли. Чтобы сделать программу понят- нее, используйте операторы PRINT. 2. Вычислитель скорости Можете ли вы написать программу для вычисления ско рости? Чтобы сделать программу более понятной, вам по требуются строки с операторами INPUT для ввода времен* и расстояния, с выражением для вычисления скорости * строки с операторами PRINT__________________ 3. Задача о сосисках Робот 1 съедает за час 30 сосисок, а Робот 2 мо- жег съесть за то же самое время 20 сосисок. Сколь- ко сосисок им нужно купить и сколько времени по- требуется им на еду, если Робот 2 намерен съесть по крайней мере 35 сосисок, есть медленнее? а возьмите три переменные могут съесть роботы за час, а Робот 1 не хочет для хранения количе- и одну для хранения количества сосисок, которые намерен съесть Робот 2. Еще две переменные использ^рте для хранения времени, которое потребуется Роботу 2, чтобы съесть 35 сосисок,, и сосисок,, которые может съесть за это время Робот 1. 92
GUNPOWDER Повторение действий Очень полезно заставить компьютер повторять какое- либо действие несколько раз. Это можно осуществить, в частности, с помощью цикла, организованного оператора- ми FOR и NEXT. Чтобы по- смотреть, как работает цикл, исполните программу, напи- санную справа. J — переменная цикла, которая вы- полняет роль счетчика. Она говорит компьютеру, сколько раз надо повто- рить строку 20. Этот оператор пред- лагает компьютеру вернуться к началу цикла. 10 FOR J = 1 ТО 10 20 PRINT "ПРИВЕТ 30 NEXTJ 10 FOR К= 1 ТО 10 20 PRINT К 30 NEXT К пользовать внутри цикла. Вы увидите, как изменяется переменная цикла, если поме- стить в него оператор PRINT с этой переменной для вывода ее значения на экран. Это значение переменной можно также ис- циклах Можете ли вы написать программу с простым циклом, кото- рая заполнит экран компьютера словами ПРИВЕТ, и еще одну программу, которая выведет на середине экрана столбец из слов ПРИВЕТ. Шаги 3 10 FOR 1=1 ТО 20 20 LET I = I - 1 30 PRINT I 40 NEXT I 10 FOR I =1 TO 25 STEP 5 20 PRINT I 30NEXT I 10 FOR J =20 TO 1 STEP -1 20 PRINT J 30 NEXT J Используя в операторе FOR служебное слово STEP (шаг) и число после него, можно изменить способ счета значений переменной цикла. Число после слова STEP указывает компьютеру, что пере- менную цикла нужно изменять с шагом, равным этому числу. Если вы поставите после STEP отрица- тельное число, компьютер будет считать повторения цикла в обратном направлении. Показанные вы- ше программы имеют разные значения шагов STEP. Запустите их и посмотрите работу циклов. Можете ли вы написать программы, которые будут иметь вывод, показанный на этих экранах. 93
GUNPOWDER Компьютеры обладают разным бы- стродействием, поэтому возможно ЦИКЛЫ ЗЗДбрЖКИ( вам придется увеличить или умень- шить число повторений цикла, заме- няя число 1000. 10 FOR J =10 TO 1 STEP-1 20 PRINT J 30 NEXT J 40 FOR K= 1 TO 1000 50 NEXT К 60 PRINT "ЛИФТ ОТКЛЮЧЕН СЕКРЕТНОЕ СООБЩЕНИЕ ЗАПОМНИТЬ ЗА 5 СЕКУНД ЗАТЕМ ОНО ИСЧЕЗНЕТ ВСТРЕЧАЙТЕ АГЕНТА X. 2.00 АЭРОПОРТ Цикл задержки во времени — это пустой цикл, в котором нет никаких операторов. В этой программе строки 40 — 50 заставляют компью- тер считать от 1 до 1000, в результате возникает небольшая временная задержка. Попытайтесь написать программу, которая будет выводить на экран секретное сообщение, аналогичное представленному выше, а затем че- рез 5с убрать его с экрана. Чтобы сделать это, вам потребуется цикл задержки во времени, за которым должен следовать оператор очистки экрана. Чтобы задать в цикле задержки подхо- дящее число, проведите эксперимент с его раз- личными значениями. Задачи по построению узоров 1 10 LET AS = "...... 20 FOR J = 1 ТО 7 30 PRINT N 30 PRINT TAB (j); AS 40 NEXT J 50 FOR К = 1 TO 3 60 PRINT TAB (J+ 1); AS 70 NEXT К 80 FEXT К 80 NEXT L = 7 TO 1 STEP -1 90 PRINT TAB (L);A$ 100 NEXT L Вместо звездочки можно использо- вать графические символы, (если они есть у вашего компьютера). 80 FOR L = 8TO 18 90 PRINT TAB(L); AS; $$ " 100 NEXT L Программа слева формирует на экране узор из звездочек. Попробуйте запустить ее, затем из- мените ее с целью получения других узоров. Один из возможных вариантов приводится выше. Можете ли вы заполнить в этой программе строки 50 — 70 так, чтобы ваш экран выглядел подобно показанному выше? Теперь измените программу так, чтобы получить переверну- тое изображение угла. Подумайте, можете ли вы изменить предыдущие программы так, чтобы построить показанные выше узоры. Для построения ромба объеди- ните программы 2 и 3. 94
GUNPOWDER Задачи о циклах Циклы можно использовать внутри других циклов. Такие циклы называют вло- женными. При каждом повторении внешнего цикла внутренний цикл будет испо- лняться заданное число раз. Эта программа выводит на экран значения переменных цикла, поэтому вы можете увидеть, как работает вложенный цикл. 10 FOR I = 1 ТО 4 20 FOR J = 1 ТО 4 30 PRINT 40 NEXTJ 50 PRINT "ПРИВЕТ'* 60 NEXT I Запустите эту программу, затем попробуйте изменить число вложений циклов. Можете ли вы добивать еще один вложенный цикл, чтобы эта программа исполнялась еще медленнее? Ошибки в циклах 10 FOR I = 9 ТО 0 STEP-1 20 FOR J = 9 ТО 0 STEP -1 30 FOR J 30 FOR К = 9 TO 0 STEP -1 40 PRINT I; J; К 50 NEXT I 60 NEXT J 70 NEXT К Чтобы не допустить ошибки, нужно быть внимательным и поместить начало и конец внутренне- го цикла в пределах внешнего. Слева показана правильно составленная программа, а в программе справа нужно найти и исправить ошибки. Двоичный счетчик Мигающее сообщение Можете ли вы написать программу, которая выводит сообщение, подобное этому, причем это сообщение должно регулярно появляться и ис- чезать? Вам потребуется цикл, чтобы многократно очищать экран и выводить сообщение, а также два цикла задержки, чтобы сообщение не мигало слишком часто. Компьютерные часы Эта программа считает в двоичной системе счисления, используя четыре вложенных цикла. В ней формируются всего четыре цифры двоич- ного числа, поэтому она не может считать до очень больших значений. Можете ли вы доба- вить в программу еще циклы и изменить строки с операторами PRINT так, чтобы программа выдавала результаты счета в виде двоичных чи- сел, содержащих восемь двоичных цифр. О 30 Попытайтесь написать программу, которая заставила бы компьютер работать в качестве электронных часов. Вам потребуется один цикл Чтобы установить дли- ные электронные часы. тельность цикла задерж- ки 1 с, используйте обыч- для секунд, другой цикл для минут и цикл за- держки во времени. 95
J PRINT PRINT PRINT омера строк. нужна для создания подпрыгивает. Как показано справа, двух разных положениях и символами. рограмма «подпрыгивающий человечек» Можете ли вы еколькями циклами, которая будет перем ша медление bi ггж jio экрану упрощенное изобргМЩ > ие ракеты с космическим кораблем? 1. Вам потребуется очистить экран, затем вывести множество пустых строк так, чтобы изображение ракеты сначала выводилось вни- зу экрана. Вы можете использо- вать графические сим- волы (если ваш компью- тер располагает ими). 2. Упрощенное изображение ракеты можно построить, испо- льзуя операторы PRINT с обычными символами. ражение ракеты двигалось вверх по экрану, постепенно добавляйте снизу экрана п] ые роки с помощью оператора JrRINT без данных. Кроме того, введите внутренний цикл задержки, чтобы ракета двигалась не слишком быстро. Подумайте, можете ли вы написать программу простой мультипликации, чтобы показанная справа фигурка прыгала вверх и вниз, одновременно пере- мещаясь по горизонтали экрана. Рисование фигурок простую фигурку человека в можно нарисовать, используя операторы PRINT с буквами Составление программы PRINT -<О> PRINT •• Поставьте сами <□> иллюзии, что фигурка PRINT «<□>« 1. Вам потребуется цикл с числом повторений, определяемым шириной вашего экрана. Повторе- ния цикла нужно считать с шагом 2. Вам станет понятно, почему берется именно такой шаг, когда вы приступите к написанию операторов PRINT TAB. 2. Внутри цикла нужно сначала очистить экран, а затем вывести на экран с помощью операторов PRINT первую фигурку. Чтобы изменить позицию фигурки при очередном выводе ее на экран, испо- льзуйте функцию TAB. 3. Чтобы фигурка оставалась некоторое время на экране, добавьте в программу цикл задержки. 4. Повторите эти действия для второй фигурки уже с другим значением функции TAB. <□> <□> <□> О <о>
GUNPOWDER больше или меньше или = означает равно < = означает равно Упражнения с оператором IF ... THEN Оператор IF ... THEN используется для сравнения элементов данных и в зависимости от его результатов заставит компью тер исполнить различные действия. 20 INPUT В 30 IF В = A THEN PRINT "ОНИ РАВНЫ" 40 IF В О A THEN PRINT В; "МЕНЬШЕ ЧЕМ "; А 50 IF В <А THEN PRINT В; "МЕНЬШЕ ЧЕМ"- А 60 I F 60 IF В > A THEN PRINT В; "БОЛЬШЕ ЧЕМ"; А 10 PRINT "СКОЛЬКО ДОЛЕК ХРУСТЯЩЕГО КАРТОФЕЛЯ ВЫ МОЖЕТЕ СЬЕСТЬ?" 20 INPUT С 30 IF С > = 0 AND С <=10 THEN PRINT "ВЫ БЫСТРО ПРОГОЛОДАЕТЕСЬ" МНОГО" 50 IF С >25 AND С <= 1000 THEN PRINT "А ВЫ ПРОЖОРЛИВЫ" 60 IF С <0 OR С >1000 THEN PRINT "! ! !" Большинство компьютеров позволяет вам выполнить сразу несколько сравнений, используя в операторах IF ... THEN логические операции AND (И) и OR (ИЛИ). Постарайтесь выполнить эту программу, чтобы посмотреть, как работа- ют такие операторы. Знание таблицы умножения Постарайтесь выполнить эту программу, чтобы убедиться, что вам известны значения символов, используемых для сравнения элемен- тов данных. Пароль 20 FOR J = 1 ТО 13 30 PRINT "ЧЕМУ РАВНО"; J; "X"; А ; " " 40 INPT 40 INPUT В 50 IF В = J*A THEN PRINT "ПРАВИЛЬНО 60 NEXT J 10 LET S$="СОСИСКИ" 20 3КШТЕ 20 PRINT "ПОЖАЛУЙСТА, ПАРОЛЬ"; 30 INPUT Р$ 40 IF P$ = S$THEN "ВСЕ В ПОРЯДКЕ. ПРОДОЛЖАЙТЕ" Вот программа, которая проверяет ваше зна- ние таблицы умножения на 13. Можете ли вы добавить в нее еще операторы IF ... THEN, что- бы сообщать пользователю, когда ответ непра- вилен и каким он должен быть? Можете ли вы дополнить эту программу так, чтобы компьютер выводил на экран соответ- ствующее сообщение, если вводится неправиль- ный пароль? Попытайтесь дополнить програм- му, чтобы компьютер запрашивал также секрет- ный номер. Передача управления После слова THEN можно поставить много разных операто- ров. Например, с помощью оператора STOP можно приказать компьютеру остановить исполнение программы или, используя оператор GOTO, предложить компьютеру перейти к другой строке. Компьютер-калькулятор 20 PRINT "ВАМ СКУЧНО, НЕ ТАК ЛИ 30 INPUT В$ 50 IF В$ = "ДА" THEN STOP 60 IF C>10THEN PRINT "ВЫ ДОЛЖНЫ БЫТЬ ВЕСЕЛЫМ" 70 IF В$ = "НЕТ" THEN GOTO 20 80 PRINT "НЕ ДЕЛАЙТЕ ГЛУПОСТЕЙ 90 GOTO 20 В этой программе компьютер выполняет различные действия в зависимости от вводимого вами ответа в строке 30. Выполните эту про- грамму несколько раз. Что если вы введете слово «БАНАНЫ»? произойдет Здесь показан вывод из прог- раммы, которая может склады- вать, вычитать, делить или ум- ножать два числа, вводимых ва- ми в нее. Подумайте, можете ли вы написать программу для вы- полнения таких действий, а за- тем попытайтесь изменить ее так, чтобы можно было выби- рать различные вычисления. 97
GUNPOWDER Игры в угадывание чисел и слов 10 INPUT X 20 CLS 30 PRINT "УГАДАЙТЕ ЧИСЛО*' 40 INPUT Y 6OIFY = X THEN GOTO 70 60 GOTO 30 70 PRINT ’’ПРАВИЛЬНО" Заставьте компьютер сооб- щать вам, когда вводимое ва- ми число слишком мало или слишком велико. Это помо- жет вам быстрее угадать зага- данное число. Добавьте переменную для подсчета числа сделанных ва- ми попыток» затем с помощью оператора IF ... THEN задай- те допустимое число попыток. ключ КВАКАЮЩЕЕ СУЩЕСТВО ? ЖАБА НЕТ ?ЛЯГУШКА Добавьте к ключевой программе несколько строк для облегчения угадывания сл Вот программа простой игры в угадывание чисел. Один игрок загадывает и вводит некоторое число, а другой должен угадать его. Подумайте, можете ли вы улучшить эту программу, следуя указан- ным выше предложениям. Здесь на экране показана игра в угадывание слов. Можете ли вы составить для этой игры программу? Она аналогична программе в угадывание чисел за исключением того, что в ней используются строки символов. Конные скачки Вот распечатка игровой программы «Конные скачки», но в ней намеренно сделаны пропуски. Поду- майте, можете ли вы записать пропущенные номера строк в операторах СОТО в тех строках програм- vnLZr помечены звездочкой. Ниже можно узнать, как играть в эту игру и каковы пути ее На многих компьютерах вы можете напечатать слова в строках INPUT, например в строках 20 и 30. 20 INPUT "1-Е МЕСТО:"; HI 30 INPUT "2-Е МЕСТО: "; H2 40CLS 60 INPUT "УГАДАЙТЕ 1-t МЕСТО:"; G1 70 INPUT "УГАДАЙТЕ 2-Е МЕСТО:"; G2 80 IF G1 = HI AND G2 = Н2 THEN GOTO 7 90 IF G1 = H2 OR G2 = HI THEN GOTO 7 100 IF <G1 =H1 AND G2< 110 PRINT "НЕВЕРНО" 120 IF N =4 THEN GOTO 7 130 PTI Н2 ) OR (G2 = H2 AND G1 ОН1) THEN GOTO 7 130 PRINT "ПОПЫТАЙТЕСЬ СНОВА": GOTO 50 Z1--------------- 140 PRI NT "ОДНА ПРАВИЛЬНАЯ ДОГАДКА": GOTO 120 150 PRINT "ЛОШАДЬ УГАДАНА ПРАВИЛЬНО. МЕСТО НЕВЕРНО": GOTO 120 160 PRINT "ПРАВИЛЬНО" 170 PRINT "1-Е МЕСТО:"; Н1; " 2-Е МЕСТО:"; Н2 11ервыиигрок загадывает, ка- кие лошади придут к финишу 1-й и 2-й. N подсчитывает число попы- ток, сделанных вторым игро- ком. ------ Не забудьте снабдить стро- ку цифрой Большинство компьюте- ров допускает два оператора на одной строке, как в данном случае. Если в вашем компью- тере это недопустимо, помести- те второй оператор на новую строку и удалите двоеточие. Как играть в эту игру В скачках участвует шесть ло- шадей под номерами от 1 до 6. Первый игрок загадывает, какие из лошадей займут 1-е и 2-е ме- ста. Второму игроку предостав- ляются четыре попытки, чтобы угадать, что было загадано пер- вым игроком. Как улучшить эту игру 98
GUNPOWDER Случайные числа Функция RND генерирует случайные числа, однако способы применения этой функции раз- личны в разных моделях компьютеров. Ниже приводятся различные варианты применения этой функции, но вам следует проверить по руководству пользователя или по таблице соот- ветствия операторов и функций БЕЙСИКа в конце книги, как нужно правильно записывать и пользоваться этой функцией. Затем посмотрите, можете ли вы выполнить упражнения и задачи, приведенные на этих двух страницах. PRINT RND (99) PRINT RDN (10) PRINT INT (RND(1) 99 + 1) PRINT INT (RND(O) 99 + 1) PRINT INT (RND 99 + 1) Проверьте, какие ци- фры нужно записывать в вашем компьютере по- сле RND (1 или 0). В некоторых компьюте- рах функция RND с чис- лом в скобках позволяет получить целое случай- ное число в интервале от 1 до числа, указанно- го в скобках. В большинстве компьютеров для получения целого случайного числа используются совместно функции INT и RND, за которыми в случае необходимости следует (1) или (0). Функция RND умножа- ется на количество чисел в нужном для вас интервале и к получен- ному произведению прибавляется первое число этого интервала. Показанные выше операторы предлагают компьютеру выбрать и вывести на экран целое случайное число в интервале 1 — 99. Эти операторы генерируют и выводят на экран случайное число в интервале ните по руководству пользователя, one ров допустим для вашего 5 —10. Выяс- какой из этих компьютера. Можете ли вы теперь записать аналогичный оператор, который заставит ваш компьютер ге- нерировать и выводить на экран случайные чис- ла в интервале 10 — 20? tNT (RNOH)*10 + D ниге ин- УКАЖИТЕ В ПОСЛЕД 13 22 ПРАВИЛЬНО В этой струкции с функ- цией RND записы- ваются в данном виде. Не забудьте преобразовать их в случае необходи- мости. Задача по программированию Взгляните снова на игру в угадывание чи- сел на 13 и подумайте, можете ли вы изме- нить ее так, чтобы загадываемое число выби- ралось компьютером случайным образом в интервале 1 — 20. PRINT X + 1* I PRINT 1*1 - Y PRINT Y + X^l е Подумайте, можете ли вы написать программу для игры в последовательность чисел, которая показана вы- ше на экране. Часть этой про- граммы приведена в центре. Вам нужно вписать в операторы в строках 10 и 20 функции для получения случайных чисел и добавить несколько строк с операторами PRINT и IF ... THEN. В правом блоке даны некото- рые варианты записи строки 40 для получения разных последо- вательностей чисел. Можете ли вы предложить такой способ расширения программы, чтобы при каждом запуске программы компьютер случайно выбирал последовательность чисел? 99
1OCLSC=O THEN LET С$= "БУМАГА THEN LET С$ = "КАМЕНЬ* 200 IF F = О THEN PRINT "Я ВЫИГРАЛ" 210 IF F = F THEN PRINT "ВЫ ВЫИГРАЛИ" 220 IF F = 2 THEN PRINT "ПОЛУЧИЛАСЬ НИЧЬЯ 250 PRINT "СЧЕТ ОЧКОВ" 260 PRINT "У МЕНЯ:"; у в 270 PRINT "У ВАС:"; А 280 IF С >10 AND А >10 THEN GOTO 40 290 PRINT "КОНЕЦ ИГРЫ" У ВАС 10 ЧИПОВ Старт с планеты Зоргос Подумайте, можете ли вы написать программу для этой игры. Вы произвели вынужденную посадку на дале- кую планету Зоргос. Вам очень нужны 50 чипов (инте- гральных схем), чтобы расширить память бортового компьютера вашего космического корабля до объема, достаточного для нахождения обратного пути на Землю. У вас имеется всего лишь 10 таких чипов, а недостаю- щие чипы можно добыть одним единственным спо- собом — выиграть их в рискованной игре в кости с пьютером с планеты Зоргос. Ниже на экране пок/Паны разные исходы этой игры. УКАЖИТЕ ВАШУ СТАВКУ: 5 ЧТОБЫ БРОСИТЬ ИГРАЛЬНЫЕ КУБИКИ, НАЖМИТЕ КЛАВИШУ Р ВЫ СОХРАНИЛИ СВОЮ СТАВКУ у вас ючипов УКАЖИТЕ ВАШУ СТАВКУ: 9 ЧТОБЫ БРОСИТЬ ИГРАЛЬНЫЕ КУБИКИ, НАЖМИТЕ КЛАВИШУ Р ВЫ УТРОИЛИ СВОЮ СТАВКУ ЧИСЛО ОЧКОВ ВАША СТАВКА число очков ВАША СТАВКА ДУБЛЬ: УДВАИВАЕТСЯ 10 ИЛИ 11: УТРАИВАЕТСЯ 6 ИЛИ 7: СОХРАНЯЕТСЯ ОСТАЛЬНЫЕ ЗНАЧЕНИЯ: ТЕРЯЕТСЯ ff этой игре вы делаете ставку в несколько чипов. Вы можете выиграть, потерять или сохранить свою ставку в зависимости от того, какие выпадут числа, когда компьютер бросает два интегральных кубика. Если выпадут два одинаковых числа, вы выигрываете удвоенную ставку. Если сумма выпавших очков составляет 10 или 11, вы выигрываете утроенную ставку и так далее, как показано выше в блоке справа. Бумага, камень и ножницы (поиск ошибок в программе) Это программа для игры «Бумага, камень и ножницы», где игрок играет против компьютера. Однако в данной программе намеренно сделаны ошибки. Используя помещенные справа пояснения к этой программе, которые информируют вас, как задумана работа программы, посмотрите, можете ли вы найти и исправить в ней ошибки так, чтобы программа начала правильно работать. Переменная С хранит число очков, набранных компьютером. Перемен- ная А хранит число очков, набран- ных игроком. Переменная F указы- вает компьютеру, кто выиграл в строках 130—160. Выбор компьютером бумаги, камня или ножниц хранится в переменной С$ и зависит от значения случайного числа R. 50 LET R = INT (RND(1) 4 + 1) 60IFR = 1 70 IF R =2 80IFR=3 THEN LET C$ = "НОЖНИЦЫ" _ 90 PRINT "Я ГОТОВ"т 100 PRINT "ЧТО ВЫ ВЫБИРАЕТЕ - БУМАГУ, WXMEHb ИЛИ НОЖНИЦЫ" 110 INPUT AS 120 PRINT 130 IF С$= "БУМАГА" AND AS = "НОЖНИЦЫ" THEN LET F =1~" 140 IF C$ = "КАМЕНЬ" AND AS = "БУМАГА" THEN LET F = 1 150 IF A$ = "НОЖНИЦЫ" AND A$ = "КАМЕНЬ" THEN LET F = 1 160 IF C$ = AS THEN LETF=2 170 PRINT "ВЫ ВЫБИРАЛИ"; A$ 180 PRINTER ВЫБРАЛ"; B$ 190 PRINT "ПОЭТОМУ" Строки с операторами IF ... THEN определяют победителя. Если выигры- - вает игрок, компьютер присваивает F значение 1, а если получилась ничья, тогда F присваивается значение 2. В противном случае F сохраняет нулевое значение, что соответствует выигрышу компьютера. Компьютер сообщает игроку, кто выиграл очередную партию и путем тестирования значения F ведет счет очков в игре. бумагу. 100
GUNPOWDER Действия над символами Компьютер может осуществлять самые разнообразные действия над символами в символьных строках. В программах на этой странице показаны некоторые функции и операторы БЕЙСИКа, применяемые для обработки символьных строк, и даны пояс- нения по их работе. LET RS = "РОБОТ" PRINT LEFTS (RS, 3) PRINT RIGHTS (RS, 3) LET C$ LEFTS (C$, 3) PRINT RIGHTS (C$, 3) ---------------------------------B 10 LET R$ = "КЕНГУРУ" 26 PRINT "ПОЗИЦИЯ" 30 PRINT "ПЕРВОЙ БУКВЫ" | 40 INPUT S 50 PRINT "СКОЛЬКО БУКВ" 60 INPUT N 70 PRINT MIDj (KS, S, N) Функции LEFTS и RIGHTS предлагают ком- пьютеру выделить несколько символов с левой или правой стороны символьной строки соответ- ственно. Число в скобках указывает компьютеру, Функция MIDS предлагает компьютеру выде- лить несколько символов из середины символь- ной строки. Первое число внутри скобок указы- вает, откуда начать счет выделяемых символов, сколько символов нужно выделить из строки. 10 PRINT "ПОЖАЛУЙСТА ВВЕДИТЕ СЛОВО 20 INPUT W$ 30 LET L = LEN(WS) 40 PRINT "В СЛОВЕ"; W$ 50 PRINT L, "БУКВ" Компьютер считает точно так же, как символы. пробелы буквы и > Функция LEN подсчитывает количество сим- волов в символьной строке. Испытайте эту про- грамму и разберитесь, как она работает. а второе число указывает, сколько символов нужно выделить. Задачи о символьных строках 10 PRINT "СЛОВО"; NS 20 LET L = LEN (N$) 30 FOR К = 1 TO L * 40 PRINT TAB (K); MIDS (?, ?, ?) 50 NEXT К \Л Можете ли вы заменить вопросительные знаки в строке 40 та- ким образом, чтобы экран имел вид, показаний выше? Подсказка: функцию MIDS можно использовать для последова- тельности выделения из строки одного символа при каждом прохо- де цикла. Попытайтесь заставить ком- пьютер вывести на экран слово в обратном порядке. Для этого используйте функцию MIDS и цикл с шагом - 1. 3 10 LET S$ = "КВАДРАТЫ 20 LET L = LEN (S$> 30 PRINT S$. 40 FOR J = 1 TO L • 50 ? 60 NEXT J используя вы, ли и записать в программе недостаю- на экране появилось вот это. Подумайте, сможете функции RIGHTS, LEFTS щую строку так, чтобы 101
GUNPOWDER Самое длинное слово ,B строке 50 нужно пред- ложить компьютеру хранить в переменной А$ самое длинное из 'введенных слов. По- пробуйте применить функцию LEN и опера- тор IF ... THEN. 10 LET AS = " " 20 PRINT "ПОЖАЛУЙСТА, СЛОВА" 30 FOR J = 1 ТО 5 40 INPUT W$ • 50 ? 60 NEXT J 70 PRINT "САМОЕ ДЛИННОЕ СЛОВО: 80 PRINT A$ ПОЖАЛУЙСТА, СЛОВО ? КОШКА ? ЯЩЕРИЦА ? ГИППОПОТАМ ? КОБРА ? МУРАВЕЙ САМОЕ ДЛИННОЕ СЛОВО: ГИППОПОТАМ Эта программа находит самое длинное слово в списке из пяти слов. Заполните пропущенную стро- ку и попробуйте выполнить эту программу. Редактор текста Приведенная ниже программа предназначена для редактирования текста. Она предоставляет вам возможность вводить предложение, а затем изменять в нем слова. Прежде чем запустить эту программу, вам нужно заполнить пропуски в строках, обозначенных звездочками. Пояснения справа от текста программы помогут вам выпо- лнить эту работу. 10CLS 20 PRINT "ПОЖАЛУЙСТА, ПРЕДЛОЖЕНИЕ" 30 INPUT S$ •40LETS$ = ? ]------------------------- 50 PRINT "ЗАМЕНЯЕМОЕ СЛОВО"; 60 INPUT W$ • 70 LET W$ = ? J---------------------- 80 PRINT "НОВОЕ СЛОВО"; 90 INPUT N$ • 100 LET LS = ? -I____________________ • 110 LET LW= ? J 120 LET AS = " " 130 LET K= 1 • 140 IF MIDS (SS, ?, ?) - W$ THEN LET A$ = S$3 • 150 IF A$ = S$THEN LET SB = LEFTS ((?, ?) +?+ RIGHTS (AS, LS — (K + LW — 2)) 160 LET LS - LEN (S$) 170 LET K= K+ 1 • 180 IF К <= LS - LW + 1 THEN GOTO? 190 PTIN 190 PRINT S$ 200 GOTO 50 Чтобы разобраться в работе этой программы, попробуйте записать на бу- маге какое-либо предложение и затем выполните на его примере все инструк- ции программы. Заставляет компьютер добавить пробел 22 в начале и в конце SS и W$. Знаете ли вы для чего? Присваивает переменной LS длину предложения SS, а переменной LW — длину слова WS. Заполните эту строку так, чтобы ком- пьютер осуществлял поиск заменяемого слова в предложении. Совет: для под- счета символов используйте К. Эта строка заставляет компьютер вычис- лить число символов, расположенных слева от удаляемого слова, затем вста- вить новое слово и добавить остальную часть предложения. Можете ли вы впи- сать в программу пропущенные пере- менные и знаки? 102
GUNPOWDER Еще о действиях над символами Внутри компьютера символы представляются числовыми кодами. Используя эти числа, можно вы- полнять разные действия над символами. Функция CHR$ преобразует число в символ, а функция ASC, наоборот, — символ в его числовой код. Большинство бытовых компьютеров использует для пред- ставления символов стандартный код — так называемый ASCII-код, хотя некоторые компьютеры, например ZX81 (Timex 1000) используют свой собственный код. В руководстве пользователя вы найдете таблицу кодов символов для своего компьютера. Использование CHR$ Попробуйте исполнить несколько операторов PRINT CHRS, используя эти и другие числа. Некото- рые числовые коды соответствуют таким клавишам, как Пробел или ВК, и поэтому при их использо- вании на экране ничего не появится. Из своего руководства пользователя можно узнать, какие это числовые коды. Задачи с буквами 1 *10FORK = ?TO? 20 PRINT CHR$ (К)/ 30 NEXT К I । J Подумайте, можете ли вы вставить в цикл такие числа, чтобы программа вывела на экран все буквы алфавита. Попытайтесь написать цикл для вывода на экран строчных букв алфавита, если они испо- льзуются в вашем компьютере. Можете ли вы написать ко- роткую программу, которая вы- водит на экран случайную по- следовательность букв? Использование ASC Попробуйте использовать функцию ASC вые коды выдает ваш компьютер. с этими и другими символами, чтобы узнать, какие число- Сравнение букв Используя символы > и <, попытайтесь написать програм- му, которая заставит компьютер сравнить любые две буквы и за- тем расположить их в алфавит- ном порядке. Преобразование строчных букв в прописные 10 PRINT "ВВЕДИТЕ ВАШЕ СООБЩЕНИЕ" 20 INPUN 20 INPUT М$ 30 FOR J= 1 ТО LEN(M$) 40 LET Х$ = MID$ (М$, J, 1) •50 IF Х$> = "a" AND X$<="z"THEN PRINT CHR$(ASC(X$) ?); • 60 IF X$ > = "A" AND X$ <= "Z" THEN PRINT CHR$ (ASC(X$) + ?); 70 IF X$<"A"OR X$> "Z"THEN PRINT X$; 80 N E XT J______________________________________ Подумайте, сможете ли вы так вставить в строки 50 и 60 пропу- щенные числа, чтобы компьютер преобразовал строчные буквы со- общения в прописные или наоборот. Вы не сможете выполнить эту программу, если ваш компьютер использует только прописные буквы. 103
GUNPOWDER Программы кодирования сообщений Здесь рассматриваются варианты программ, осу- ществляющих кодирование сообщения. Справа показа- но, как работает первая программа. Впишите в эту программу пропущенные числа и символы, а затем исполните ее. Шифровальщик Буквы поочередно заменяются 7 на предшествующую и после- □кдующую буквы алфавита. ночью Можете ли вы последнее слово зашифровать сообщения?^ Программа «Шифровальщик» 10 PRINT "ВВЕДИТЕ ВАШЕ СООБЩЕНИЕ" 20 INPUT М$ 30 FOR J = 1 ТО ?1----------------------- 40 LET X = ?]---------------------------- 50 IF Х<? OR Х>? THEN LET N = X: GOTO 10O} 60 IF INT (J/2) = J/2 THEN LET N = X ? 1 “1 70 IF INT (J/2) <> J/2 THEN LET N - X ? 1_ Число повторений цикла сделайте рав- ным числу символов в сообщении М$. Заставьте компьютер выбирать каж- дый раз одну букву и запоминать ее ASCII код в переменной X. Вставьте в эту строку два числа, чтобы убедиться в принадлежности каждого символа к буквам. (Числа и пробелы остаются неизменными в этом коде.) 80IFN<? THEN LETN = N + 26 90 IF N > ? THEN LET N = N - 26_ 100 PRINT?]---- 110 NEXT J Выведите закоди- рованную букву, используя CHR$. Для замены букв, прибавьте 1 к X, если счетчик цикла J является четным чис- лом, и вычитайте 1, если счетчик цикла J является нечетным числом. Код с ключевым числом Алфавит Алфавит кода В этом коде алфавит сдвигается на опреде- ленное количество (N) букв. Величина сдвига определяется ключевым числом. В этом примере ключевое число равно 6, поэтому алфавит сдви- Если измененный номер (N) выходит за любой ко- нец алфавита, переведите его в другой конец, при- бавляя или вычитая число 26. N = X + Ключевое слово нут на шесть букв. Подумайте, можете ли вы написать программу, аналогичную показанной выше. Можно использовать любое понравившее- ся вам ключевое число. Цикловый ко Для получения этого кодаТс ASCII-коду каж- МЕЕТ AGENT 23456678 10 Перестановочный код А/L» X Для получения этого кода все символы сооб- дый буквы сообщения прибавляют значение пе- ременной цикла (J). Подумайте, можете ли вы написать две программы, одну для кодирования сообщения, а другую для декодирования этого сообщения. щения, включая пробелы, делят на пары, а за- тем символы в каждой паре меняют местами. Чтобы написать такую программу, используйте цикл с шагом 2 и выведите каждую пару букв в обратном порядке. xv/ 104
GUNPOWDER Упражнения c INKEY$ Функция INKEY$ заставляет компью- тер следить за клавиатурой и опреде- лять, нажата ли какая-либо клавиша, однако в отличие от INPUT компьютер в данном случае не останавливается и не ожидает вас, а продолжает выполнять программу. В некоторых компьютерах вместо INKEY$ используется другое сло- во. Здесь приведены некоторые слова, использу- емые в разных моделях компьютеров вместо INKEY$. Сверьтесь по своему руководству поль- зователя, какое именно из этих слов понятно ва- шему компьютеру. Постарайтесь выполнить эту программу, ис- пользуя приемлемое для вашего компьютера на- звание функции. Когда вы нажмете клавишу, компьютер выведет на экран символ, в против- ном случае он выводит восклицательный знак. Теперь подумайте, можете ли вы написать та- кую программу, чтобы при нажатии вами клави- ши компьютер выводил на экран слово ПРИ- ВЕТ, в противном случае на экран выводились бы пробелы, как показано на экране выше. Эта программа похожа на программу слева. Иногда полезно заставить компьютер немного приостановиться прежде, чем продолжать исполне- ние программы. Как показано слева, для этого в некоторых версиях языка БЕЙСИК нужно поместить после INKEYS число в скобках. Это число указывает, как долго (в долях секунды) должен ждать ком- пьютер, прежде чем продолжить программу. Если в вашем компьютере отсутствует такая возмож- ность, вы можете заставить его приостановиться, поместив INKEYS в цикл и используя операторы GOTO, как показано выше справа. Ошибки при быстром сложении Можете ли вы обнаружить и исправить ошибки в этой программе таким образом, чтобы программа стала правильно выполняться? Компьютер случайным образом выбирает два чис- ла между 1 и 25. Вы должны сложить в уме эти два числа и нажать любую клавишу, только на экране появится правильный ответ. 10CLS 20 PRINT "НАЖМИТЕ ЛЮБУЮ КЛАВИШУ, КОГДА ВЫ 30 PRINT "УВИДИТЕ ПРАВИЛЬНОЕ ЗНАЧЕ- НИЕ СУММЫ" как 50 LET X = INT (RND(1) +25 + 1) 60 LET Y = INT (RND(1) 25 + 1) 70 PRINT 80 PRINT “X"; " + ”; Y ; " 90 LET N = N + 1 100 PRINTN 110 LET INKEYS = AS 120IFASO" " THEN GOTO 180 130 FOR К = 1 TO 100: NEXT К 140 IF N <30 THEN GOTO 90 150 PRINT "НЕУДАЧА. ОТВЕТ РАВЕН”; X+Y 160 FOR К = 1 TO 1000; NEXT T 170 GOTO 30 180 IF N<>X +Y THEN GOTO 150 190 PRINT "ПРАВИЛЬНО. ОТВЕТ РАВЕН"; X + Y В этой программ восемь ошибок. 105
GUNPOWDER Программа «Авария на дороге» Подумайте, можете ли вы написать программу для игры «Авария на дороге», следуя описанным ниже шагам. На экране справа показано, как должна выглядеть эта игра. Что- бы отобразить на экране автомобиль и дорогу, можно испо- льзовать PRINT TAB с* (для изображения автомобиля) и ! (для изображения каждого края дороги). Дорога делает зигза- ги вниз по экрану, пока вы управляете автомобилем с по- мощью двух клавиш, чтобы предотвратить аварию автомо- биля при его наезде на край дороги. С = 5 !_=1 \А/=Ю R = L+W Чтобы вычислить позиции TAB для автомобиля и обочин дороги, вам потребуются четыре пере- менные С, L, W и R. Возможно, вам придется изменить приведенные выше значения, чтобы приспосо- биться с своему экрану. В первых пяти строках программы очистите экран и присвойте начальные значения этим переменным. 2. Изображение дороги Теперь, используя опера- тор PRINT TAB с переменны- ми и символами, заставьте компьютер изобразить на экране дорогу и автомобиль. Для повторного исполнения этих инструкций используйте GOTO и выведите на экран длинную прямую дорогу. Чтобы дорога делала зигзаги, нужно вставить в программу не- сколько строк, которые будут изменять значение L при каждом повто- рении оператора PRINT TAB. Кроме того, вы должны убедиться, что дорога не выходит за пределы экрана. Чтобы выполнить такую про- верку, потребуется еще одна переменная (N). Установите ее равной 1, если L < = 1, и равной 0, если L больше или равно ширине вашего экрана. Затем предложите компьютеру прибавлять или вычитать 1 из L в зависимости от значения N. 3. Управление автомобилем ♦**АВАРИЯ НАЧНИТЕ СНАЧАЛА Чтобы управлять автомоби- лем, вам потребуется строка с INKEY$. Выберите две клавиши (например, < и >) и в зависимос- ти от нажатой клавиши прибав- ляйте или вычитайте 1 из С. Ес- ли программа выполняется слишком быстро, добавьте в нее цикл задержки. Наконец, вы должны прове- рить путем сравнения С с L и R, не выскочил ли автомобиль на обочину. Если это случилось и произошла авария, тогда нужно- выдать игроку соответствующее сообщение и начать игру снова. Можете ли вы испо- льзовать случайные зигзаги дороги? Можете ли вы включить в программу си- стему подсче- та очков? 106
GUNPOWDER Задачи о данных Одним из простейших способов задания компьютеру больших объемов информа- ции является использование операторов READ и DATA. Строка с оператором DATA содержит список слов или чисел, а оператор READ предлагает компьютеру запом- нить эти данные в переменных. Другой метод хранения данных с использованием массивов рассматривается в следующем разделе. мент данных. вые данные нужно заключать в ка- вычки. Отделяйте запя- той каждый эле- некоторых компьютерах строко- Выполните эту программу, чтобы посмот- реть, как работают операторы READ и DATA. После слова READ записаны две переменные. При каждом повторении цикла компьютер запи- сывает в переменные X и Х$ следующую пару Замените во- просительный знак в строке 50 самым по- следним име- нем из ваших данных. роверка имени 10 PRINT "ПОЖАЛУЙСТА, ВАШЕ ИМЯ 20 INPUT N$ , 30 READ Х$ Ю IF Х$ = N$ THEN GOTO 70 ♦ 50IFX$ = " ?" THEN PRINT "В СПИСКЕ НЕТ ВАШЕГО ИМЕНИ": STOP 60 GOTO 30 70 PRINT "ВСЕ В ПОРЯДКЕ. В СПИСКЕ ЕСТЬ ВАШЕ ИМЯ " * 80 DATA ? В этой программе компьютер спрашивает ва- ше имя и сверяет его со списком имен, храня- щихся как данные. Попробуйте поместить в стро- ку 80 свои собственные данные (вы можете запи- сать любое количество имен). Последнее из этих имен поместите в строку 50, чтобы компьютер элементов данных. прекращал исполнение программы после чтения Восстановление последнего имени в списке. ♦ ю FOR j = ? то ? J--------------------------------- • 20 FOR I = ? ТО ? J-------------------------------- 30 READ N$ ♦ 40 IF LEFTS (NS, 1) =CHR$(?) THEN PRINTNS 50 NEXT I 60 RESTORE 70 NEXT J 80 DATA VERA, XAVIER, ZACHARY, HORACE, BIGGLES, BILL BEN 90 DATA TOPSY, TIM, POPEYE, JIM, HARRY, GEORGE, DELILAH 100 DATA LOVEDAY, HONORA, SAMPSON, SAUL, TABITHA Начальное и конечное значение переменной цикла J определяется ASCII-кодами первой и конечной букв латинского алфавита. Число повторений в цикле I опре- деляется числом элементов дан- ных. Можете ли вы завершить эту программу, предназначенную для сортировки имен в алфавитном порядке? Имена перечислены в строках DATA, а оператор RESTORE предлагает компьютеру возвра- щаться к началу списка данных при каждом повторении цикла J. Подумайте, можете ли вы вписать пропущенные переменные и числа, чтобы получить работоспособную программу. Поиск ошибок в программе 10 FORK=1 ТО6 20 READ N; PRINT N 30 NEXT К 40 DATA 01-323, 22-36-47, 341-2241/2 50 DATA 97-24-11, 47-29-01, 236-4013 В этой программе в строках DATA записаны номера телефонов. Можете ли вы найти и испра- вить ошибки в этой программе? 10 READ X 20 PRINT X 30 GOTO 10 40 DATA 1, 461, 892, 66, 1471, 4462. 1, 3 50 DATA 53. 80, 241, 90, 371,825, 33, 13 Если вы не в состоянии найти ошибки в этой программе, попытайтесь запустить ее. Компью- тер выведет сообщение об ошибке, из которого вы узнаете, что именно неправильно. Можете ли вы предложить более простой способ решения этой задачи? 107
GUNPOWDER Кафе Джо 0,40 0,99 0,55 Q6O 0,87 КАФЕ ТУШЕНЫЕ УЛИТКИ ПО- ФРАНЦУЗСКИ ) СУП С КОЛБАСОЙ ' ЗАПЕКАНКА ИЗ ГОЛУБЕЙ ПЮРЕ С ФРИКАДЕЛЬКАМИ САЛАТ ИЗ ЛАТУКА МОРОЖЕНОЕ ПИЦЦА С АРАХИСОМ ТОРТ МИНДАЛЬНЫЙ ЖАРЕНЫЙ ХЛЕБ мелочный КОКТЕЙЛЬ Слева выше показано меню из кафе Джо. Подумайте, может^^и вы, используя цены и блюда из этого меню в качестве данных, написать программу, которая подскажет вам, что можно заказать покушать за определенную сумму, как показано на экране справа. Вы можете также добавить в меню некоторые дополнительные блюда. Телефонный справочник Ниже приводятся рекоменда- ции по составлению программы «Телефонный справочник». На экранах справа показаны приме- рь; выполнения этой програм- мы. Подумайте, можете ли вы написать такую программу. ЧЕЙ НОМЕР ТЕЛЕФОНА ВАМ НУЖЕН? ? РЖАВЫЙ РОБОТ РЖАВЫЙ РОБОТ: 60-14-444 1. Запишите список имен сво- их друзей и номеров их телефо- нов в операторы DATA, как по- казано выше. НУЖЕН ЛИ ВАМ ДРУГОЙ НОМЕР:? ДА 3. Для поиска имени внутри цикла используйте оператор READ. Для имен и чисел испо- льзуйте отдельные переменные. 2. Используйте оператор PRI- NT для вывода вопросов ком- пьютера о том, чей телефон вам нужен, а оператор INPUT — 5. Заставьте компьютер спра- шивать, не нужен ли вам другой номер. Для вашего ответа испо- льзуйте оператор INPUT. 6. В зависимости от ответа восстановите данные с по- мощью RESTORE и вернитесь к началу программы или остано- вите программу. 4. Выведите на экран имя и номер телефона (который дол- жен быть следующим элемен- том данных) или укажите, что данного имени нет в списке. 108
GUNPOWDER Использование массивов Данные удобно хранить в массиве. Его можно рассматривать как упорядочен- ный набор переменных, причем каждый элемент данных хранится в отдельной ячейке с номером. К любому из этих элементов данных можно обратиться, указав имя массива и номер его ячейки, который называют индексом. Вот числовой массив с именем N. Он содержит шесть элементов. Вы должны сообщить компью- теру размер нужного вам массива с тем, чтобы компьютер зарезервировал для него достаточный объем памяти. Для этого используется оператор DIM, в котором указывается имя массива и число хранящихся в нем элементов. Это называется заданием размера массива. • 10 DIM? 20 FORK = 1 то 6 30 READ N(K) 40 NEXT К • 50 DATA? •10 DIM? 20 FOR К = 1 TO 6 30 INPUT N(K) 40 NEXT К Чтобы поместить данные в массив, можно использовать цикл с операторами READ и DA- TA. Подумайте, можете ли вы закончить про- грамму слева таким образом, чтобы она запо- минала в массиве все данные, показанные выше на средней картинке. Теперь попробуйте соста- вить программу вывода на экран данных, храня- щихся в этом массиве. Используйте оператор PRINT и переменную цикла в качестве индекса массива. На экране справа показано, как ком- пьютер выводит элементы массива в случайном порядке, используя в качестве индекса массива случайные числа. Строковые массивы ХОРОШЕНЬКО Вот строковой массив (NS). Он содержит пять имен, и поэтому состоит из пяти элемен- тов. Со строковыми массивами обращаются точно так же, как и с числовыми. Подумайте, можете ли вы написать простую программу запоминания данных в этом массиве, а затем вывода этих данных на экран? ПОДУМАЙТЕ 109
GUNPOWDER Вычислитель календаря * 10 ? I_________________________Задайте размеры массивов 20 FOR К = 1 ТО 12 40 NEXT К 50 PRINT "НОМЕР МЕСЯЦА"; 60 INPUT N * 70 PRINT М$(?)/ "СОДЕРЖИТ"; ♦ 80PRINT D (?); РР "ДНЕЙ" * 90 DATA? Читайте с помощью оператора READ данные в два массива М$ и D. Вставьте пропущенные индексы, чтобы вывести на экран из масси- вов соответствующие данные. В операторы DATA поместите по- * 100 DATA ? ------------------‘парно название каждого месяца и * 110 ДАТА? число дней в нем. МММ Можете ли вы закончить эту программу таким образом, чтобы при вводе номера месяца компьютер печатал название этого месяца и количество дней в нем? Чтобы помочь вам, справа от текста про- граммы приводится ряд рекомендаций. КАКОЙ МЕСЯЦ? ? ИЮЛЬ ИЮЛЬ СОДЕРЖИТ 30 ДНЕЙ Теперь измените программу так, чтобы компьютер спраши- вал название месяца, а затем со- общат вам число дней в этом месяце. Для поиска в массиве М$ названия месяца используйте цикл и оператор IF ... THEN. Переменную этого числа испо- льзуйте в качестве индекса для выделения из массива D соот- Генератор идей Г ВЫБЕРИТЕ ЧИСЛО ОТ 1 ДО 10 ?9 ПОЧЕМУ БЫ ВАМ НЕ ПОСТОЯТЬ НА ГОЛОВЕ? ХОРОШАЯ ИДЕЯ? НЕТ ВЫБЕРЕ ВЫБЕРИТЕ ЧИСЛО ОТ 1 ДО 10 ?5 LПОЧЕМУ БЫ ВАМ НЕ ПОКОРМИТЬ КОТА? ХОРОШАЯ ИДЕЯ? ДА к Здесь показана работа программы, которая могла бы помочь вам, когда вы не знаете, что делать. При выполнении этой программы вы выбираете какое-либо число, и компьютер выво- дит на экран свой совет для вас. Чтобы напи- ветствующего элемента данных. сать программу, вам потребуется строковый массив (1$), в который записано десять разных идей. С помощью оператора INPUT введите чис- ло в переменную (N). Используя N в качестве ин- декса массива 1$ заставьте компьютер выбирать из этого массива один из элементов данных. Двадцать вопросов Гистограмма случайных чисел На этом экране показан вывод компьютерной игры- викторины. Чтобы написать эту программу, составьте 20 вопросов и поместите их в строковый массив. Затем в другой массив поместите от- веты. Индексы этих двух мас- сивов должны соединять во- просы и ответы на них. 20 DIM А (10) 30 FOR К = 1 ТО 10 90 UF В 90 IF N< 100 TH EN GOTO 60 50 NEXT К 60 LET R = INT(RND(1) 70 LET A(R)=A(R) + 1 ивает каждому эле- чальное значение 0. Компьютер присва- менту массива А на- Эта программа использует массив для хранения данных ги- стограммы. Компьютер выбирает случайным образом 100 чисел в интервале 1 — 10. Элементы массива (А) содержат числа, рав- ные количеству выборок каждого из десяти чисел. Подумайте, можете ли вы дополнить эту программу таким образом, чтобы компьютер выводил на экран гистограмму, в которой каждому выбранному числу соответствует одна звездочка, как показано на экране выше. Чтобы осуществить это, напишите цикл, который повторяется 10 раз и содержит внутри себя другой цикл. Внут- ренний цикл выводит на экран по одному столбу гистограммы. 110
GUNPOWDER Составление подпрограмм Обычно за время исполнения програм- мы подпрограмма используется несколько раз. Оператор GOSUB с указанным в нем номером первой строки подпрограммы предлагает компьютеру перейти к этой подпрограмме. Компьютер исполняет под- программу до тех пор, пока не встретит оператор RETURN. Этот оператор отсы- лает компьютер обратно к основной про- грамме. Добавки к мороженому Попробуйте исполнить эту программу, что- бы посмотреть, как работают операторы1 GOSUB и RETURN. 10 PRINT "ПРИВЕТ"; 20 GOSUB 1010 * 30 PRINT "СНОВА ПРИВЕТ"; 1 40 GOSUB 1010 50 PRINT "А ЭТО ЧТО ТАКОЕ?" 60 GOSUB 2020 70 STOP 1010 PRINT "ЭТО ПОДПРОГРАММА" 1020 RETURN 2020 PRINT "ЕЩЕ ОДНА ПОДПРОГРАММА 2030 RETURN ДЫНЯ БАНАН ИМБИРЬ КОРНИШОН АНАНАС ДЫНЯ БАНАН ИМБИРЬ КОРНИШОН АНАНАС В таблице выше слева показаны результаты обследования, проводившегося с целью выявить самые популярные новые добавки к мороженому. Можете ли вы написать программу, чтобы вывести эту информацию на экран, как показано на картинке справа? Для чтения данных в двух массивах испо- льзуйте цикл и в рамках этого цикла передайте управление подпрограмме для вывода на экран по одному столбцу гистограммы. Потопи подводную лодку Ниже приведена программа для игры «Потопи подводную лодку». Подводная лодка противника скрывается где-то на воображаемой сетке 10 х 10. Компьютер выбирает ее положение с помощью двух случайных чисел, которые служат координатами ее положения на сетке. Вам предоставляется четыре попытки обнаружить и уничтожить подводную лодку путем угадывания ее координат X (по горизонта- ли) и Y (по вертикали). Если ваша попытка угадать неудачна, компьютер переходит к подпрограмме, которая сообщает вам, в каком направлении нужно сделать следующую попытку. Прежде чем вы смо- жете запустить программу, вам придется написать эту подпрограмму, у 10CLS 20 LET N = 0 30 LET X = INT(RND(1) 10 + 1) 40 LET Y = INT(RND(1) 10 + 1) 50 LET N = N + 1 60 PRINT "ПОПЫТКА”; N;... 70 INPUT A, В 80 IF A = X AND В = Y THEN GOTO 170 90 GOSUB 200 100 PRINT 110 IF N<=4THEN GOTO 50 120 PRINT "ВЫ ИЗРАСХОДОВАЛИ СВОИ ПОПЫТКИ" 0, 0 130 PRINT "ЖЕЛАЕТЕ ЛИ СЫГРАТЬ СНОВА" 140 INPUT R$ 150 IF LEFT$(R$, 1) ="Д" THEN GOTO 10 160 STOP 170 PRINT "ВЫ ПОПАЛИ В ЦЕЛЬ C"; N; "ПОПЫТОК" 180 GOTO 130 Составление подпрограммы Вам потребуются несколько операторов IF...THEN, чтобы сравнить вашу попытку угадать координаты (А, В) с действительной позицией подводной лодки (X, Y) и вывести на экран сообщение. Например, если В меньше Y, тогда вы должны попытаться искать в Примеры вывода направлении Север, если А меньше X, тогда пытай- тесь искать в направлении Восток и так далее. 111
GUNPOWDER Игровая программа «Фрукты» Можете ли вы написать такую программу, чтобы ваш компьютер работал как игровой автомат для игры «Фрукты»? На экране справа показан пример исполне- ния такой программы. Вы начинаете игру с 10 жетона- ми, и за каждую игру вы платите 1 жетон. Чтобы на- чать игру, нажмите любую клавишу. Компьютер выво- дит на экран названия трех «фруктов», которые случайно выбираются компьютером. У ВАС 10 ЖЕТОНОВ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ: Р ЛИМОН ЛИМОН СЛИВА 2 ЛИМОНА ВЫ ВЫИГРАЛИ 2 ЖЕТОНА ТЕПЕРЬ У ВАС 11 ЖЕТОНОВ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ: в 1. Прежде всего объявите размер массива F$ для хране- ния названий шести «фрук- тов», показанных выше (ли- мона, вишни, дыни, виногра- да, сливы и колокольчика). Для записи этих данных в F$ используйте операторы READ и DATA (или INPUT). 2. Очистите экран и введи- те переменную для хранения числа жетонов. Присвойте этой переменной начальное значение 10 и сообщите игро- ку сколько жетонов в его рас- поряжении. 3. Используйте INKEY$ и заставьте компьютер ждать, пока игрок нажмет какую- либо клавишу, чтобы начать игру. Вычтите 1 из Т (плата за игру равна 1 жетону) и очистите снова экран. ВИШНИ: ГЛАВНЫЙ ВЫИГРЫШ 3 ОДИНАКОВЫХ ФРУКТА: ВЫИГРЫШ 5 ЖЕТОНОВ 2 ОДИНАКОВЫХ ФРУКТА: ВЫИГРЫШ 2 ЖЕТОНА 4. Заставьте компьютер выбрать случайное число в интервале 1 — би запомнить его в пере- менной R. Используйте значение R в качестве индекса массива F$ для выбора фрукта и запи- шите название этого фрукта в переменную А$. Повторите эти действия дважды, чтобы вы- брать еще два названия фрукта и записать их в В$ и С$. 5. Затем нужно вывести на экран названия выбранных фруктов и заставить компьютер определить, выиграли ли вы что-либо или нет. Как показано на картинках выше, в этой игре приняты три варианта выиграша. Для каждого вида выиграша отсылайте компьютер к соответ- ствующей подпрограмме, чтобы вывести опре- деленное сообщение и внести поправку в значе- ние Т. 6. Проверьте, остался ли у игрока хотя бы один жетон. Если у игрока жетонов нет (Т = 0), тогда остановите программу. В противном слу- чае передайте управление в начало программы для проведения следующей партии. 7. Если в начале программы использован оператор READ, не забудьте написать строки DATA. Добавьте эти строки в конец программы. 112
GUNPOWDER Как написать игровую программу «Поиски сокровищ» На следующих нескольких страницах последовательно шаг за шагом приводятся реко- мендации по составлению игровой программы «Поиски сокровищ». В ней вы должны пройти через лабиринт из семи пещер, собирая сокровища. Эта программа достаточно сложна, поэтому необходимо тщательно следовать всем даваемым указаниям и проверять каждый пройденный вами этап. Если вы «застряли» на какой-то части этой программы, можете посмотреть ответ именно для этой части, а затем продолжать составление оставшейся ча- сти программы. Чтобы написать данную про- грамму, вам нужно хорошо представлять себе, ---1ЕМНАЯ ИГо 1УМАННАЯ к ЗАКОПЧЕНАЯ ПРИЗРАЧНА? как играть в эту игру, поэтому сначала внима- тельно прочитайте этот раздел, а затем уже при- ступайте к составлению программы. Как играть Справа показана схама лабиринта из семи пе- ч-холодная и 7 Наг1олне|Ьнна? МОКРАЯ ?........ | ’ жуткими --ПРИВИДЕНИЯМИ- ^“ГРЯЗНАЯ к МРАЧНА? щер. Каждая пещера отличается от других и в ней хранится ящик, наполненный сокровищами. Информация, показанная на этой схеме, хранит- ся в памяти компьютера, однако сама схема на экран не выводится. Это означает, что в процес- се игры вам следует определять местоположение каждой пещеры по этой схеме. Игрок должен пе- ренести все сокровища в одну из пещер за огра- ниченное число ходов, причем игра начинается со случайного выбора пещеры. ЭТИ КОМАНДЫ ПОНЯТНЫ КОМПЬЮТЕРУ: N, Е, S, W: ДВИГАТЬСЯ В НАПРАВЛЕНИИ N (СЕВЕР), Е (ВОСТОК), S (ЮГ) ИЛИ W (ЗАПАД) GRAB: ПОДНЯТЬ СОКРОВИЩЕ PUT: ПОЛОЖИТЬ СОКРОВИЩЕ LOCATE: ВЫВЕСТИ ТЕКУЩЕЕ МЕСТОПОЛОЖЕНИЕ СОКРОВИЩ HELP: ИНФОРМАЦИЯ О ПРАВИЛАХ ИГРЫ Чтобы усложнить игру, до- пускается переносить одновре- менно только один ящик с со- кровищами. Выше на экране показаны те команды, которые можно исполь* зовать во время игры, и описано их назначение. Для каждого хода дается только одна команда, поэтому во время игры старайтесь не допускать ошибок. Примеры диалога во время игры ВЫ В ПЕЩЕРЕ 4 ЭТО ГРЯЗНАЯ И МРАЧНАЯ ПЕЩЕРА В НЕЙ НАХОДИТСЯ: ЯЩИК С МУСОРОМ ВЫ ЕЩЕ В ПЕЩЕРЕ 4 ЧТО ВЫ НАМЕРЕНЫ ДЕЛАТЬ? ? W ХОРОШО. ХОРОШО. ВЫ ПЕРЕНЕСЕТЕ МУСОР ЧТО ВЫ НАМЕРЕНЫ ДЕЛАТЬ? ? GRAB ВЫ В ПЕЩЕРЕ 7 ЭТО НАПОЛНЕННАЯ ЖУТКИМИ ПРИВИДЕНИЯМИ ПЕЩЕРА В НЕЙ НАХОДИТСЯ: ЯЩИК С МОНЕТАМИ ЧТО ВЫ НАМЕРЕНЫ ДЕЛАТЬ? ?PUT ХОРОШО. ЯЩИК С МУСОРОМ ПОСТАВЛЕН В ПЕЩЕРУ 113
GUNPOWDER Составление программы Диаграмма справа называется блок-схемой программы. Она отображает структуру программы и последовательность выполне- ния всех основных шагов в направлении сверху вниз. Инструкции, приведенные ниже на этой и нескольких последующих страницах, помогут вам реализовать каждый шаг программы. Не беспокой- тесь, если вам предложат переходить к разным частям програм- мы, не придерживаясь строго последовательности шагов. Если вы будете соблюдать предлагаемую нумерацию строк, то можете не сомневаться, что программа будет собрана в надлежащем порядке. НАЧАЛО ЗАДАНИЕ МАсснъод ЗАДАНИЕ ПЕРЕМЕН- ПЕРЕЙТИ 1. Задание массивов и чтение данных (строки 100 — 250) Всю информацию, показанную на схеме лабиринта на пре- дыдущей странице, нужно поместить в память компьютера. Чтобы осуществить это, используйте несколько массивов. выбрать ПЕЩЕРУ СЛУЧАЯМИ* ОЪРАЪОМ ОПИСЛГЬ ПЕЩЕРУ И содержи- Массивы N, Е, S и W Прежде всего вам потребуются четыре мас- сива N, Е, S и W. Числа в этих массивах указы- вают компьютеру, какая пещера расположена в направлении N (север), Е (восток), S (юг) и W (запад) от каждой пещеры лабиринта. Задайте размеры этих массивов в первой строке (100). Каждый указанный массив имеет семь эле- ментов. Ввод И ГРО Подпрограммы Move GRAB» R U N help LOCATE ает, что н- ном направлении нет пещеры. Например, пещера 1 не имеет со- седней пещеры в на- правлении W (запад), а у пещеры 2 нет со- седней пещеры в на( пра ении N (север). Для подготовки данных к игре составьте таб- лицу, аналогичную этой. Числа в левом столбце таблицы являются индексами массивов и соот- ветствуют номерам пещер. Пользуясь схемой расположения пещер, заполните каждую строку этой таблицы, записывая в нее номер пещеры, расположенной в направлении N, Е, S и W от каждой из пещер, перечисленных в левом столб це таблицы. НЕТ НЕТ СЧЕТ ЧИСЛА < ДВИЖЕНИИ ИГРОКА ИСПОЛЬ- НАПОМНИТЬ ИГРОКУ ЕГО МЕСТЬ ПОЛО- ЖЕНИЕ ПРОЫГР COKTOBMU1A В ОА-НОУГ пецее- ИЭМЕНМА ЛИ игрок ПОЭМ им К? СДЪР. ИГРОК ВЫИГР STOP, игрок Чтение данных 110 FOR К = 1 ТО 7 120 READ N(K), Е(К), S(K), W(K) 130 NEXT К 2000 DATA 2, 7, 6, 0 Добавьте оператор очистки экрана Далее вам потребуется цикл, подобный представленному выше для чтения в массивы. Данные для семи строк DATA нужно взять из нашей таблицы. Первая из этих строк показана выше. 114
GUNPOWDER Массив D$ 2100 DATA НИЗКАЯ И ХОЛОДНАЯ, ТЕМНАЯ И ЗАКОПЧЕНАЯ ите эт Дан- цикл. ные в массив, ис- пользуя, как и пре- Затем вам потребуется массив с именем D$ для хранения описанийТпещерк адайте его размер в самом начале программы и, используя описания пещер на схеме, напишите строки DATA, как показано выше. Массивы Т$ и Т Теперь вам потребуется еще два массива. Массив Т$ нужен для хранения названий сокро- вищ, а массив Т говорит вам, где находится каждое из этих сокровищ. Число, хранящееся в каждой ячейке массива Т, является номером той пещеры, где хранится сокровище, название кото- рого записано в аналогичной ячейке массива Т$. Например, в начале игры Т (2) равен 2, т. е. но- меру пещеры, где хранится сокровище Т$ (2) (жевательная резинка). Во время игры номера в массиве Т изменяются, так как ящики с сокрови- щами перемещаются. Задайте размеры этих массивов, на- пишите строки DATA, как показано справа, и считайте эти данные в об 2200 DATA ЗОЛОТО, 1, ЖЕВАТЕЛЬНАЯ РЕЗИНКА, 2 2210 DATA СЕНДВИЧИ, 3, МУСОР, 4 массива. Переменные м WXT Чисто передвижений, выполненных игроком. Показывает, переносит ли игрок что-нибудь. Переменная-флажок. Вы узнаете позже, как работает эта перемен- ная. Переменные для хране- ния временных данных. В блоках выше указаны имена тех переменных, которые потребуются позднее. Начиная со строки 300, присвойте каждой из этих переменных нулевое начальное значение. 2. Подпрограмма HELP (строки F СЕМЬ ПЕЩЕР ОБРАЗУЮТ ЛАБИРИНТ В КАЖДОЙ ’ I ПЕЩЕРЕ НАХОДИТСЯ ЯЩИК С СОКРОВИЩАМИ. I ВЫ ДОЛЖНЫ СОБРАТЬ ВСЕ СОКРОВИЩА В ОДНУ L ПЕЩЕРУ. , 1000 — 1120) В дальнейшем вам потребуется подпрограмма HELP (помощь), чтобы объяснить игроку правила игры. Поместите в строке 300 оператор GOSUB, а подпрограмму начните со строки 1000. Выведите показанные на экране слева инструкции и команды, которые понятны компьютеру (с. 113). 3. Случайный выбор пещеры (строка 350) Номер пещеры, в которых попадает игрок, хранится в переменной R. Чтобы в начале игры вы- брать пещеру, заставьте компьютер выдать случайное число в интервале 1—7 и поместите его в R. 4. Описание пещеры и ее содержимого (строки 400—470) ВЫ в ПЕЩЕРЕ 4 ЭТО ГРЯЗНАЯ И МРАЧНАЯ ПЕЩЕРА В НЕЙ НАХОДИТСЯ: НИЧЕГО Прежде всего сообщите игроку, в какой пещере он находится. Затем опишите эту пещеру, используя R в качестве индекса массива D$. На экранах выше показано, как мог бы выглядеть экран вашего компьютера. 115
GUNPOWDER В КОТО- лить, какие элементы Определение содержимого пещеры Можете ли вы опреде- этого массива равны R? 1430 FOR К = 1 ТО 7 1440 IF Т(К) =R THEN PRINT Т$(К): LET F = 1 1450 NEXT К 1460 IF F = 0THEN PRINT "НИЧЕГО" Чтобы определить содержимое пещеры R, нужно просмотреть массив Т с номерами пещер, рых размещены ящики с сокровищами. Чтобы осуществить это, можно использовать цикл, как показа- но выше. Строка с оператором IF ... THEN определяет, совпадает ли какой-либо из номеров в массиве Т с номером пещеры R. Если эти номера совпадают, компьютер выводит на экран название сокровища и присваивает переменной F значение 1. Переменная F служит для компьютера признаком, указывающим, имеется ли в пеще- ре какое-либо сокровище после выхода ком- пьютера из цикла. Переменная F действует как флажок. Когда условие в операторе IF ... THEN истинно, этот флажок поднят (т. е. F = 1), однако, если условие ложно, тог- да F остается равным 0. Не забудьте устано- вить F обратно в состояние 0 в строке 470, когда будете использовать его снова. 5. Ввод команды игрока Далее спросите игрока, что он намерен делать, а затем запишите оператор INPUT, который дает возможность игроку ввести в переменную А$ ко- манду (например, GRAB, PUT и т. д.). Проверьте ввод игрока с помощью пяти строк IF ... THEN GOSUB, которые будут передавать управление раз- ными подпрограммам в соответствии с каждой ко- мандой. Впишите в операторы GOSUB номера строк после того, как вы установите, где именно в программе записаны эти подпрограммы. 6. Подпрограмма MOVE (строки 1200 — 1260) Постарайтесь написать подпро- грамму MOVE (перейти), испо- льзуя эту блок-схему. 1. Чтобы перейти в другую пе- щеру, игрок вводит букву N, Е, S или W, поэтому проверьте, какая именно буква была введена, испо- льзуя четыре строки IF ... THEN. 2. Чтобы определить номер но- вой пещеры, используйте R в каче- стве индекса соответствующего массива и запишите этот номер во временную переменную X. 3. Затем нужно проверить X, чтобы убедиться, что игрок может двигаться в этом направлении. Ес- ли X = 0, это означает, что в дан- ном направлении нет пещеры, поэ- тому нужно вывести на экран со- общение и отослать компьютер в конец подпрограммы к оператору RETURN. 4. Если X # 0, тогда нужно по- местить в R номер новой пещеры, присваивая R значение X. 5. Поместите оператор RETURN в конец подпрограммы. ДА X = W(R) ДА е>ы вести ₽ СООБЩЕНИЕ. •’ Нельзя идти £> ЭТУ СТОРОНУ 116
GUNPOWDER 7. Подпрограмма GRAB цикл ИЗМЕНИТЬ ЗНАЧЕНИЕ T(Y) НА 999 ЭТА ПИВЕРА ПУСТА . Игрок может переносить одновременно толь- ко один ящик с сокровищами, поэтому сразу про- верьте, несет ли игрок вообще что-либо. Чтобы осуществить это, проверьте значение переменной С, которое должно быть равно 1, когда игрок взял со- кровище. Если С = 1, выведите на экран сообщение и отошлите компьютер к оператору RETURN. 2. Чтобы проверить» имеется ли в пещере какое- либо сокровище, напишите цикл поиска в массиве Т с использованием оператора IF ... THEN. Если какой-то из номеров в массиве Т равен номеру пе- щеры (R), тогда соответствующий индекс массива Т (обозначенный буквой К) нужно записать во вре- менную переменную Y. За время выполнения цикла компьютер может обнаружить несколько номеров, равных R. В этом случае к моменту окончания ци- кла переменная Y будет хранить индекс последнего из этих номеров, хранящихся в массиве Т. НАЧАЛО НЕЛЬЗЯ ПЕРЕНОСИТЬ БОЛЬШЕ ОДНОГО ЯЩЙ КА Установить вить ЬОЗЬРАТ 3. Если Y — 0, это значит, что в данной пещере нет сокровищаТТюэтому вы должны отослать ком- пьютер к оператору RETURN. В противном случае значение индекса, записанное в Y, указывает ком- пьютеру, какой именно ящик с сокровищами выбрать. Замените значение T(Y) на 999. Данное число служит признаком, что именно это сокровище переносится. Присвойте С значение 1, a Y установите снова в состояние 0 и поместите в конце подпрограммы оператор RETURN. 8. Подпрограмма PUT присвоить ЦИКЛ ЗНАЧЕНИЕ КОРРЕКТИРОВАТЬ ЪНАЧЕНИЕС ПЕРЕНОСИТ ими перено- игроком, для чего найти число 999 в нужно опреде- лить путем про- значения верки уже ничего не несет драгоценностями сится нужно масс 1. Прежде всего , переносит л игрок что-нибудь. 2. Выясните, ящик с к НАЧАЛО ЛИ ИГРОкС что- КЛАСТЬ НЕЧЕГО 3. Если Т(К) = 999, за- мените это значе- ние на номер пеще- ры R и снова при- свойте С значение О, чтобы показать, что теперь игрок НИБУДЬ ? FOR Т(к)=999 ВОЗВРАТ 4. Добавьте в эту под- программу строки PRINT, где они необ- ходимы по-вашему мнению, и помести- те в конец оператор RETURN 117
GUNPOWDER 9. Подпрограмма LOCATE (строки 1500 —1590) Эта подпрограмма выдает игроку информацию о текущем местоположении каждого ящика с сокро- вищем. Подумайте, можете ли вы написать такую подпрограмму, используя вывод, показанный ниже на двух экранах. Сначала составьте ее план в виде блок-схемы. ВЫ НЕСЕТЕ: ЯЩИК С ЗОЛОТОМ В ПЕЩЕРАХ НАХОДЯТСЯ 2: ЯЩИК ЖЕВАТЕЛЬНОЙ РЕЗИНКИ 3: ЯЩИКСЕНДВИЧЕЙ 4: ЯЩИК МУСОРА 5: ЯЩИКС МЕДОМ 6: ЯЩИК С ДРАГОЦЕННЫМИ КАМНЯМИ 7: ЯЩИК С МОНЕТАМИ Прежде всего проверьте значение С, чтобы узнать, несет ли что-либо игрок. Если от что-то несет, отошлите компьютер к циклу для нахождения элемента массива Т = 999, затем выведите на экран название переносимого ящика с сокровищем, выбрав элемент массива Т$ с тем же самым индексом. Чтобы вывести на экран содержимое других пещер, вам потребуется другой цикл, который будет вы- водить текущее местоположение каждого ящика с сокровищем за исключением переносимого (если та- ковой имеется). 10. Подсчет движений игрока (строка 600) Чтобы подсчитать число движений игрока, прибавляйте каждый раз 1 к переменной М в строке 660. 11. Все ли сокровища собраны в одной пещере (строки 610—690) Т(5) # W, поэ- тому флажок поднят и F=1 Т(1)=7, поэтому W=7 Игрок выигрывает партию, если он перенес все сокровища в одну пещеру. В этом можно убедиться, проверяя номера, хранящиеся в мас- сиве Т, потому что все они должны быть одинаковыми, когда все со- кровища собраны в одной пещере. Чтобы осуществить это, возьмите один элемент массива Т, например, Т(1) и поместите его в временную переменную W. Затем сравните его поочередно в цикле со всеми други- ми номерами, хранящимися в Т. Используйте переменную-флажок в качестве признака того, все ли номера одинаковы или нет. 12. Использовал ли игрок все свои движения игрока? (строки 700 — 750) 13. Изменилось ли местоположение (строки 800 — 850) лать игроку. Если значение М больше допусти- мого числа ходов, тогда игрок считается прои- гравшим. Если произойдет именно такой случай, выведите на экран сообщение и остановите про- грамму. ВЫ ЕЩЕ В ПЕЩЕРЕ 7 ЧТО ВЫ НАМЕРЕНЫ ДЕЛАТЬ? ? Если игрок ввел N, Е, S или W в переменную А$ в строке INPUT, передайте управление в строку 400 для определения новой пещеры и ее содержимого. В противном случае напомните игроку его местонахождение и отошлите ком- пьютер обратно к строке INPUT (строка 500). 118
GUNPOWDER Ответы на вопросы и задачи На следующих нескольких страницах вы найдете все ответы на вопросы и задачи по про- граммированию. Программы написаны на «стандартном» БЕЙСИКе, поэтому возможно вам придется преобразовать некоторые операторы и функции, например, CLS и RND, чтобы учесть особенности своего компьютера. Если какая-либо из приведенных здесь программ не работает на вашем компьютере, прежде всего проверьте, используются ли в вашем компьюте- ре все слова БЕЙСИКа из этой программы. Чтобы помочь вам, на с. 132 приведена таблица соответствия операторов и функций БЕЙСИКа. Возможно, вы обнаружите, что программы, составленные вами для некоторых задач, от- личаются от программ, представленных в этих ответах. Это не имеет значения, если ваши программы правильно исполняются. Тем не менее, изучите ответ и убедитесь, что ваша про- грамма достаточно коротка и понятна. Первые шаги в программировании Простые задачи по программированию 1 40 PRINT "ПРИВЕТ"; 50 PRINT А$ Точка с запятой заставляет компьютер остаться на той же самой строке при выводе А$. 2 40 PRINT "ПРИВЕТ"; 50 УДАЛИТЕ ЭТУ СТРОКУ Запятая заставляет компьютер оставить несколько пробе- лов перед выводом А$. 3 40 PRINT ТАВ(6); "ПРИВЕТ"; А$ 50 УДАЛИТЕ ЭТУ СТРОКУ Некоторым компьютерам не нужна точка с запятой по- сле TAB. 4 40 PRINT" ДО СВИДАНИЯ" 50 PRINT " А$ Задачи о переменных (с. 91,92) Выбор имен переменных Имена LETTERS и RUNS содержат ключевые слова БЕЙСИКа (LET и RUN), и поэтому их нельзя использо- вать в качестве имен переменных. Использование оператора PRINT 10 LET А =66 20 LET В = 77 А 30 LET RR$ = "РЖАВЫХ РОБОТОВ" 40 PRINT А, " RR$; " СъЕЛИ" 50 PRINT В; "ЖАРЕНЫХ СОСИСОК" Пробел внутри кавычек выводится компьютером так же, как и любой другой символ. Взгляд на программу изнутри 45 PRINT" С = " ;С 55 PRINT " D = ": D Переход из шкалы Цельсия в шкалу Фаренгейта 40 LET С = 9/В 50LETD=C В 60 LET R = D + F Измените в программе строки 40 — 60, как показано выше. Задачи по программированию •| 10LETU$= "АГ" 20 PRINT "ВВЕДИТЕ ВАШЕ СЛОВО" 30 INPUT W$ 40 PRINT "СЛОВО НА ЯЗЫКЕ АГЛИ: "; 50 PRINT U i 50 PRINT U$;W$ Строка 50 заставляет компьютер вывести АГ и затем сразу слово, записанное в WS. 2 10 PRINT "СКОЛЬКО ПРОЙДЕНО КИЛОМЕТРОВ"; 20 INPUT D 30 PRINT "СКОЛЬКО ЗАТРАЧЕНО ЧАСОВ"; 40 INPUTТ 50 LET S = D/T 60 PRINT "ВАША СКОРОСТЬ СОСТАВЛЯЛА"; S/ 70 PRINT "КИЛОМЕТРОВ В ЧАС" В строке 50 компьютер вычисляет скорость и записывает ее в переменную S 3 10 LET А = 30 20 LET В = 20 30 LET S = 35 40 LETT=S/B 50 LET С = А Т 60 LETD=C+S 70 PRINT "ОНИ ДОЛЖНЫ КУПИТЬ"; 80 PRINT D; "СОСИСОК" 90 PRINT "ОНИ ЗАТРАТЯТ НА ЕДУ"; 100 PRINT Т; "ЧАСОВ." А и В — это количество сосисок, которые могут съесть роботы за час. S — количество сосисок, кото- рые намерен съесть робот 2, а Т — время, которое за- тратит робот 2, чтобы съесть свои S сосисок. Строка 50 вычисляет число сосисок, которые съест робот 1 за это же время Т. D — общее число сосисок. Повторение действий (с.93,94) Простые задачи о циклах -| 10 FOR J = 1 ТО 100 20 PRINT "ПРИВЕТ"; 30 NEXTJ Точка с запятой в строке 20 заставляет компьютер оставаться на той же строке при выводе следующего слова. 2 10 FOR J = 1 то 25 20 PRINT ТАВ(15); "ПРИВЕТ"; 30NEXT J Этот цикл заставляет компьютер выводить столбец из 25 слов ПРИВЕТ с отступом в 15 пробелов от левого края экрана. 119
GUNPOWDER g Строка 20 неправильна, потому что она сбивает счетчик цикла I. В начале цикла строка 20 изме- няет значение I с 1 на 0. Задачи о шагах | 10 FOR I =25 ТО 1 STEP -1 20 PRINT TAB(I); "ПРИВЕТ" 30 NEXT I Переменная цикла I используется как аргумент в функции TAB. Убедитесь, что значение I не больше ши- рины вашего экрана. При каждом повторении цикла пе- ременная I уменьшается на 1. 2 ю FOR L = 5TOO STEP -1 20 PRINT ТАВ(5); L; ТАВ(10); L L 30 NEXT L Шаг STEP-1 заставляет переменную цикла L изме- няться в сторону убывания от 5 до 0. При каждом по- вторении цикла строка 20 выводит значение L и затем квадрат этого значения. 3 Ю PRINT "НАЧАЛЬНОЕ ЗНАЧЕНИЕ"; 20 INPUT А 30 PRINT "КОНЕЧНОЕ ЗНАЧЕНИЕ"; 40 INPUT В 50 PRINT "ШАГ"; 60 INPUT С 70 FOR J = А ТО В STEP С 80 PRINT Jh" "; 90 NEXT J В цикле в строках 70 — 90 начальное значение пере- менной цикла задается переменной А, конечное значе- ние — переменной В, шаг STEP — переменной С. Секретное сообщение j 10 PRINT "СЕКРЕТНОЕ СООБЩЕНИЕ" 20 PRINT "ЗАПОМНИТЕ ЗА 5 СЕКУНД" 30 PRINT "ЗАТЕМ ОНО ИСЧЕЗНЕТ" 40 PRINT 50 PRINT "ВСТРЕЧАЙТЕ АГЕНТА X. 2.00 АЭРОПОРТ" 60 for I = 1 то 1000J-Цикл задержки 70 NEXT и 80CLS ---------Очищает экран Задачи построения узоров 2 50 PRINT ТАВ(А-К); " 60 PRINT ТАВ(А+К);" 70 NEXT К А — вершина угла. Чтобы вывести левую сторону угла, нужно вычесть К из А, чтобы вывести правую сто- рону угла, — прибавить К к А. 3 30 Удалите эту строку 30 FOR К = 9 ТО 1 STEP -1 80 PRINT ТАВ(А); " " Чтобы вывести перевернутое изображение угла, нуж- но использовать указанные изменения строк. Чтобы по- строить другие узоры, показанные на с. 9, используйте ту же самую программу с различными позициями TAB. Задачи о циклах (с. 95, 96) Цикл, позволяющий замедлить исполнение программы Вы можете вставить в строку 45 или строку 55 этот цикл задержки. 45 FOR К = 1 ТО 1000 120 48 NEXT К Ошибки в циклах Строки 50 и 70 неправильны. Следует записать так: 50 NEXT К 70 NEXT I Двоичный счетчик Чтобы программа считала в двоичной системе счисле- ния и выдавала результаты счеты в виде двоичных чи- сел, содержащих восемь двоичных цифр, нужно ввести в эту программу еще четыре цикла (Е, F, G, Н). Вам при- дется перенумеровать программу и изменить строки с операторами PRINT, записав их в виде PRINTH+G 2 + F 4 + Е 8+D 16+С 32 +В 64 + А 128 PRINT А; В; С; D; Е; F; G; Н Мигающее сообщение 10 FOR J = 1 ТО 10 20 CLS 30 FOR К = 1 ТО 1000: NEXT К 40 PRINT ТАВ(10); "ОПАСНОСТЬ" 50 PRINT ТАВ(7); "НАПАДЕНИЕ ИЗ КОСМОСА" 60 FOR К = 1 ТО 1000: NEXT К 70 NEXTJ Вот программа, которая выводит мигающее сообще- ние. Чтобы учесть особенности своего экрана, вам, воз- можно, придется изменить число повторений в цикле за- держки и позиции в функции TAB. Если в вашем компью- тере не допускаются многооператорные строки, поместите в отдельную строку оператор NEXT К. Компьютерные часы 10 FOR J=o ТО 59 20 FOR К = 0 ТО 59 30 PRINT J; " : "; К 40 FOR L = 1 ТО 500: 50CLS 60 NEXT К Цикл минут — Цикл секунд 70 N ЕXT J _____________________ Установите цикл по L так, чтобы получить задержку в одну секунду. Старт космического корабля 10CLS ▲ 20 FOR 1=ТО20 30 PRINT 40 NEXT I 50 PRINT " 60 PRINT" 70 PRINT" 80 PRINT" " 90 PRINT" 100 FOR J = 1 TO 25 ▲ 110 PRINT 120 FOR J 120 for к = 1 to wool—Цикл задержки 130 NEXT К J 140 NEXT J Цикл в строках 20 — 40 выводит пустые строки так, чтобы изображение ракеты выводилось сначала в ниж- ней части экрана. Строки 50 — 90 выводят изображение ракеты. Цикл в строках 100 — 140 нужно повторить столько раз, сколько строк умещается на вашем экране. При каждом повторении этого цикла компьютер выво- дит на экран еще одну пустую строку и изображение ра- кеты перемещается вверх на одну строку.
GUNPOWDER Программа «Подпрыгивающий человечек» 10 FOR J=TO 25 STEP 2 20 CLS 30 PRINT 40 PRINT TAB(J); " О 50 PRINT TAB(J); 60 PRINT TAB(J);" /\ “ 70 FOR K = 1 TO 1000 80 NEXT К 90 CLS 100 PRINT TAB(J + 1); "<O> " 110 PRINT TAB (J + 1) " □ " 120 PRINT TAB (J+ 1); " /\ " 130 FOR K = 1 TO 1000 140 NEXT К 150 NEXT J Цикл в строках 10 — 150 должен использоваться столько раз, сколько символов умещается по горизонта- ли экрана. Строки 40 — 60 выводят изображение чело- вечка в первой позиции, строки 100 — 200 — во второй (строки 70 — 80 и 130 — 140 являются циклами за- держки). Упражнения с оператором IF ... THEN (с. 97,98) Проверка знания таблиц умножения 55 IF В <> J A THEN PRINT "НЕВЕРНО. "} J; "X"; А;" = "; J А Добавьте эту строку, чтобы компьютер мог сообщать вам, когда ваш ответ неправилен. Пароль 50 IF Р$ <>S$ THEN PRINT "НЕВЕРНО. ГЛУПАЯ ГОЛОВА." ГОЛОВА". 60 it- P$ = S$ THEN PRINT "OK. ПРОДОЛЖАЙТЕ" Дополните программу строками 10 LET S$ = "СОСИСКИ" 20 LET N = 007 30 PRINT "ПОЖАЛУЙСТА ПАРОЛЬ"; 40 INPUT Р$ 50 PRINT "СЕКРЕТНЫЙ НОМЕР"; 60 ШТЗГЕ ЭТ 60 INPUT SN 70 IF P$OS$ OR SN <>N THEN PRINT неверно. ГЛУПАЯ ГОЛОВА. 80 IF P$ =S$ AND SN = N THEN PRINT "ВСЕ В ПОРЯДКЕ. ПРОДОЛЖАЙТЕ" Чтобы компьютер запрашивал не только пароль, но и секретный номер, измененная программа должна иметь следующий вид: Компьютер в качестве калькулятора 10 PRINT "ЗАДУМАЙТЕ ЧИСЛО"; 20 INPUT X 30 PRINT "И ЕЩЕ ОДНО"; 40 INPUT Y 50 PRINT "ВАМ ХОТЕЛОСЬ БЫ:" 60 PRINT "СЛОЖИТЬ, ВЫЧЕСТЬ, РАЗДЕЛИТЬ" 70 PRINT "ИЛИ УМНОЖИТЬ?" 80 INPUT А$ 90 IF А$ = "СЛОЖИТЬ" TH EN LET А = X + Y 100 IF А$ = "ВЫЧЕСТЬ" THEN LET А = X-Y 110 IF А$="РАЗДЕЛИТЬ" then A =X/Y 120 IF А$="УМНОЖИТЬ" THEN А= X.Y 130 PRINT "ОТВЕТ РАВЕН"; А Компьютер выполняет различные операции в зависи- мости от вашего ответа, который вводится в А$ Игра в угадывание чисел 45 IF Y^X THEN PRINT "СЛИШКОМ МАЛО" 46 IF Y<X THEN PRINT "СЛИШКОМ МНОГО" Добавьте эти строки, чтобы компьютер мог сооб- щать, что предлагаемое вами число больше или меньше угадываемого. 5 LET N =0 55 LET N = N + 1 56 IF N> 5 THEN STOP Эти строки обеспечивают подсчет числа попыток и останавливают программу после пяти попыток. Игра в угадывание слов 10 PRINT "ПОЖАЛУЙСТА, ВВЕДИТЕ ЗАГАДАННОЕ СЛОВО"; 20 INPUT W$ 30 PRINT "ПОЖАЛУЙСТА, КЛЮЧ К НЕМУ"; 40 INPUT С$ 50CLS 60 PRINT "КЛЮЧ:"; 70 PRINT С$ 80 PRINT "/ГАДАЙТЕ СЛОВО 90 INPUT G$ 100 IF G$=W$ THEN GOTO 130 110 PRINT "HET" 120 GOTO 90 130 PRINT "ДА" Строки 10 — 40 заставляют компьютер запрашивать загадываемое слово и ключ к нему. Строки 50 — 60 очи щают экран и выводят ключ. Строка 120 отсылает ком- пьютер обратно в строке 90 для обработки следующей попытки. Конные скачки Вот полные строки с операторами IF ... THEN для игры «Конные скачки». 80 IF G1=H1 AND G2=H2 THEN GOTO 160 90 IF G1=H2 OR G2=H1 THEN GOTO 150 100 IF (G1=H1 AND G2 H2) OR (G2=H2 AND G1 H1) THEN GOTO 140 120 IF N = 4THEN GOTO 170 Строка 80: Если обе попытки правильны, управление следует передать строке 160. Строка 90: Если лошадь угадана правильно, а место не- правильно, управление передается строке 150. Строка 100: Если правильна только одна попытка, то следует перейти к строке 140. Строка 120: После четырех попыток управление переда- ется строке 170. Как улучшить эту игру 15 LET S=0 140PRINT "ОДНА ЛОШАДЬ УГАДАНА ПРАВИЛЬНО": LETS = 2 : GOTO 120 160 PRINT "ПРАВИЛЬНО" : LETS =4 180 PRINT "ВЫ ХОТЕЛИ БЫ ПРОДОЛЖИТЬ ИГРУ?" Вот предложение по системе подсчета очков. Игрок получает четыре очка за угадывание обеих лошадей и два очка за угадывание одной лошади. Число набранных очков хранится в переменной S. 200 INPUT Z$ 210 IF г$="Д" THEN GOTO 10 220 IF Z$="H" THEN STOP Чтобы дать игроку возможность самому сделать вы- бор — продолжать или закончить игру, добавьте в про- грамму эти строки. 121
GUNPOWDER Случайные числа (с. 99,100) Случайное число между 10 и 20 INT (RND(1 )*11+10) Чтобы получить такое число, нужно умножить RND(l) на количество чисел в заданном интервале (11), а затем прибавить первое число этого интервала (10). За- пишите RND в допустимой для вашего компьютера форме. Задача по программированию 20 LET X = INT(RND(1).2Qt1) Замените строку 20 игры в угадывание чисел так, что- бы заставить компьютер выбирать случайное число в ин- тервале 1 — 20. Числовая последовательность Добавьте эти строки в программу для игры в угады- вание последовательности чисел 5 PRINT "УКАЖИТЕ СЛЕДУЮЩЕЕ УТРО" 7 PRINT "В ПОСЛЕДОВАТЕЛЬНОСТИ." 10 LET X = INT(RND(1 )*10+1) 20 LET Y = INT(RND(1 )*10+1) 60 LET A = X +4*Y 70 INPUT N 80 IF N=A THEN PRINT "ПРАВИЛЬНО" 90 IF N A THEN PRINT "НЕВЕРНО. ОНО РАВНО"; A 100 GOTO 5 Строка 60 вычисляет следующее число данной последо- вательности. Случайная последовательность 24 LET R=INT(RND(1)* 30 25 IF R =1 THEN GOTO 30 26 IF R =2 THEN GOTO 40 27 IF R = 3 THEN GOTO 50 Чтобы получать последовательность чисел случай- ным образом, заставьте компьютер выбрать случайное число в интервале 1 — 3 и запомнить его в R. В зависи- мости от значения R отсылайте компьютер к различным последовательностям. 30 FOR I = 1 ТО 3 33 PRINT X+I*l 35 NEXT I 37 LET А=Х+4*4 39 GOTO 70 40 FOR 1=1 ТО 3 43 PRINT 1*1—Y 45 NEXT I 47 LET A=4*4-Y 49 GOTO 70 50 FOR 1=1 TO 3 53 PRINT X+Y—1*1 45 NEXT I 57 LET A=X+Y—4*4 Чтобы включить в программу три различные число- вые последовательности, удалите строки 30 — 60 и до- бавьте для каждой последовательности отдельный цикл. В конце блоков операторов, формирующих первые две последовательности, запишите оператор GOTO 70. Старт с планеты Зоргос 10 LET С=10 J--------- ------------------------- 20PEINT "У ВАС ": С; "ЧИПОВ" 30 PRINT "УКАЖИТЕ ВАШЕ СТАВКУ" 40 INPUT В 50 IF В С THEN PRINT "В ВАС НЕТ ТАКОГО □-------- КОЛИЧЕСТВА ЧИПОВ": GOTO 20 60 LET С=С-В □---------------------------------- 70 LET X=INT(RND(1 )*6+1 “1_____________________ 80 LET Y=INT(RND(1 )*6+1 I 90 PRINT "ЧТОБЫ БРОСИТЬ ИГРАЛЬНЫЕ КУБИКИ, НАЖМИТЕ КЛАВИШУ Р:"; 100 INPUT Р$$ 110 IF Р$ "Р" THEN GOTO 90 J-------------------- 120 PRINT TAB(5);X;TAB(10);Y J------------------ 130 IF X=Y THEN GOTO 250 140 IF X+Y=10 OR X+Y=11 THEN GOTO 210 ---------- 150 IF X+Y=6 OR X+Y=7 THEN GOTO 190 _ 160 PRINT "К СОЖАЛЕНИЮ ВЫ ПРОИГРАЛИ СВОЮ СТАВКУ" 170 IF С=0 THEN GOTO 290 180 GOTO 20 J----------------------------------- 190 PRINT "БЕЗ ИЗМЕНЕНИЙ. ВЫ СОХРАНИЛИ СВОЮ СТАВКУ" 200 LET С=С+В: GOTO 203------------------------- 210 PRINT "ОТЛИЧНО. ВЫ УТРОИЛИ СВОЮ СТАВКУ" 220 LET С=С+(В*3) 230 IF С =50 THEN GOTO 320 J------------------— 240 GOTO 200 250 PRINT "ВЫ УДВОИЛИ СВОЮ СТАВКУ" 260 LETC = C + (В*2) 270 IF С = 50 THEN GOTO 320 280 GOTO 20 290 PRINT "К СОЖАЛЕНИЮ У ВАС НЕТ БОЛЬШЕ ЧИПОВ" 300 PRINT "ВЫ НЕ ПОКИНЕТЕ ЗОРГОС." 310 STOP 320 PRINT "ПРЕКРАСНО. ТЕПЕРЬ ВЫ МОЖЕТЕ ПОКИНУТЬ ЗОРГОС С"; С; "ЧИПАМИ" — Переменная С хранит число чипов. — Проверяет, не превышает ли ставка игрока числа имеющихся у него чи- пов. л— Вычисляет, сколько чипов осталось, j— Формируются два случайных числа между 1 и 6. — Проверяет ввод игрока. — Выводит на экран случайные числа. ।— Сравнивает сумму двух случайных J чисел с заданными контрольными значениями и в зависимости от ре- зультата сравнения отсылает ком- пьютер к различным строкам для L подсчета выигрыша или проигрыша. Отсылает компьютер обратно к на- чалу игры. 1— Корректирует значение С. Если С равно или больше 50, переда- ет управление в конец программы. 122
GUNPOWDER Бумага, камень и ножницы (поиск ошибок в программе) Чтобы заставить программу правильно работать, ис- правьте в ней, как показано ниже, следующие строки: 50 LET R=INT(RND(1 )*3+1) 80 IF R33THEN LET С$="НОЖНИЦЫ" 150 IF С$=44НОЖНИЦЫ" AND A$=" КАМЕНЬ" THEN LET F=1 190 PRINT "ИТАК" 210 IF F=1 THEN PRINT "ВЫ ВЫИГРАЛИ" 230 IF F=0 THEN LET C=C+1 240 IF F=1 THEN LET A=A+1 280 IF C 0ANDA 10 THEN GOTO 40 Манипуляции с символами (c. 101,102) Задачи о символьных строках | д 40 PRINT ТАВ(К); MID$(N$,K.1) Этот оператор заставляет компьютер выводить каж- дый раз одну букву из слова в позицию К, начиная с бук- вы с номером К. 2 Ю LET К$= "КЕНГУРУ" 20 LET L=LEN(K$) 30 FOR J=L ТО 1 STEP-1 Д 40 PRINT MID$(K$,J,1); 50 NEXT J Использование цикла в шагом — 1 заставляет ком- пьютер выводить слово в обратном порядке. 3 Д 50 PRINT RIGHT$(S$,L-J)+LEFT$(S$,J, При каждом повторении цикла функция RICHT$ (S$, L — J) заставляет компьютер выводить L (длина слова) минус J букв с правой стороны слова КВАДРАТЫ, а за- тем добавлять J букв с левой стороны этого слова. По- пробуйте исполнить эту программу, используя другие слова. Редактор текста Вот заполненные строки программы «Редактор текста». 40 LET S$=" "+s$" 70LETW$=" "+W$+" " Чтобы быть уверенными, что в строке 140 компью- тер ищет только целые слова, с каждой стороны SS и W$ нужно добавить пробелы. Без этих пробелов ком- пьютер может выбрать в предложении всякую последо- вательность символов, которая совпадает с W$. Попро- буйте запустить программу без этих пробелов и посмот- рите, что при этом произойдет. 100 LET LS=LEN(W$) 110 LET LW=LEN(W$) Эти строки делают переменную LS равной длине SS, а переменную LW равной длине W$. Строка 100 повторя- ется снова 160, чтобы присвоить переменной LS длину нового предложения. д 140 IF MID$(S$,K,LW)=W$ THEN LET A$=S$ При каждом повторении цикла функция MID$ (S$, К, L, W) заставляет компьютер проверять LW (длина W$) символов в SS, начиная с символа с номером SS. Когда компьютер находит последовательность символов, кото- рая совпадает с W$, он записывает все это предложение в новую переменную А$. Д 150 IF A$=S$ THEN LET S$=LEFT$(A$,K)+ N$+RIGHT$(A$,LS—(K+LW—2)) Функция LEFTS (AS, К) определяет количество симво- лов, расположенных слева от удаляемого слова. Чтобы понять, как работает эта строка, лучше всего сначала выполнить все предписываемые ею действия над предло- жением на листке бумаги. Самое длинное слово 180 IF К =LS—LW+1 THEN GOTO 140 50 IF LEN (W$) LEN(A$) THEN LET A$=i$ При каждом повторении цикла компьютер сравнива- ет длину слова А$. Если слово W$ длиннее слова А$, компьютер заменяет А$ на W$ и затем сравнивает сле- дующее слово. В конце цикла переменная А$ содержит самое длинное из введенных слов. Этот оператор передает управление строке 140, чтобы компьютер проверил оставшуюся часть предложения на случай повторного появления заменяемого слова. Самое короткое слово 10 LET А$="ХХХ' ’ ’&&АВС» « »123' ' '' ХХХХХХХХХХ" 50 IF LEN (W$) LEN(A$)THEN LET A$=W$ 70 PRINT "САМОЕ КОРОТКОЕ СЛОВО:" Эта программа аналогична программе нахождения са- мого длинного слова за исключением строк 10 и 50. Строка 10 содержит достаточно длинную символьную строку, с которой компьютер сравнивает все вводимые слова. Неважно, какие символы помещены в переменную А$. 123
GUNPOWDER Еще о действиях над символами (с.103) Задачи с буквами Декодирование циклового кода 1 А 10 FOR К=56 ТО 90 Эти значения являются ASCII-кодами для букв латин- ского алфавита. 2 10 FOR К=97 ТО 122 20 PRINT CHR$(K); 30 NEXT К В строке 10 указаны значения для вывода строчных букв латинского алфавита. (В некоторых компьютерах, не использующих строчные буквы, эти числа использу- ются для разных наборов заглавных букв). 3 А 10 LET R=INT(RND(1 )*26+65) 20 PRINT CHR$(R); 30 NEXT 10 Вот простейший способ вывода случайной последова- тельности букв. Для компьютеров ZX81 (Timex 1000) нужно заменить число 65 (номер ASCII-кода для первой буквы латинского алфавита) на число 38. Программы кодирования сообщение (С.104) Программа «Шифровальщик» Вот законченная программа, в которую включены все пропущенные числа и символы. Эту программу можно использовать на микрокомпьютере Spectrum (Timex 2000), заменив функцию ASC на CODE. 10 PRINT "ВВЕДИТЕ ВАШЕ СООБЩЕНИЕ" 20 INPUTМ i 30 FOR J=1 ТО LEM(M$) д 40 LET X=ASC(MID$(M$,J,1) 50IFX 65ORX 90 THEN LET N=X:GOTO 100 60 IF INT(J/2)=J/2 THEN LET N=X+1 70 IF INT(J/2) J/2 THEN LET N=X-1 80 IF N 65 THEN LET N=N+26 90IFN 90 THEN LET N=N—26 100 PRINT CHR$(N); 110 NEXT J Чтобы получить программу декодирования циклового кода, нужно изменить строку 60: 60 LET N=X—J Сравнение букв 10 INPUT Х$, Y$ 20 IF Х$ Y$THEN PRINT Х$;"ПРЕДШЕСТВУЕТ"; Y$ 30 IF Y$ X$ THEN PRINT Y$, "ПРЕДШЕСТВУЕТ";Х$ 40 GOTO 10 Если ваш компьютер допускает только одну перемен- ную после слова INPUT, используйте для операторов INPUT две отдельные строки. Преобразование строчных букв в прописные и наоборот 50 IF Х$ =''а" AND Х$ ="z"THEN PRINT CHR$(ASC(X$>—32) 60 IF X$ 0"A" AND X$ ="Z" THEN PTINT CHR$(ASC(X$)+32) В строках 50 и 60 было пропущено число 32. Именно на это число отличаются номера кодов заглавных и строчных букв латинского алфавита. Взгляните на табли- цу ASCII-кодов в своем руководстве пользователя. В строке 60 — 70 приводится проверка, является ли переменная цикла J четным или нечетным числом. Для этого J делится на 2, а результат деления с помощью функции INT приводится к целому числу. Затем компьютер проверяет, равно ли это целое число J/2. Если эта проверка подтверждается, тогда J является четным числом. Код с ключевым числом Эту программу можно получить, взяв за основу про- грамму «Шифровальщик» и вставив в нее строки ввода секретного ключевого числа. Затем нужно изменить строку 60 так, чтобы к ASCII-коду каждого символа при- бавлялось ключевое число К. Строку 70 нужно удалить. 25 PRINT "ВВЕДИТЕ КЛЮЧЕВОЕ ЧИСЛО" 27 INPUT К 60 LET N=X+K 70 Удалить эту строку Цикловый код Эта программа также аналогична программе «Ши- фровальщик», но в строке 60 к ASCII-коду каждого сим- вола теперь нужно прибавлять переменную цикла (J). 60 LET N=X+J 70 Удалить эту строку Перестановочный код 10 INPUT "СООБЩЕНИЕ"; М$ 20 FOR J=1 ТО LEN (М$) STEP 2 А 30 PRINT MID$(M$, J+1, 1); A 40 PRINT MID$(M$, J, 1); 50 NEXT J STEP 2 заставляет компьютер изменять пе- ременную цикла J с шагом 2. При каждом по- вторении цикла компьютер выводит на экран сначала второй символ (J + 1) из текущей пары символов, а за ним первый символ (J) из этой же пары. 124
Упражнения с функцией INKEY$ (с. Вывод на экран слова ПРИВЕТ 105 106) 10 LET A$=INKEY$ 20 IF А$=" " THEN PRINT " "; 30 IF A$ " " THEN PRINT "ПРИВЕТ" 40 GOTO 10 Если не нажата ни одна клавиша, переменная А$ пу- ста, и компьютер выводит пробелы (строка 20). Если на- жата какая-либо клавиша, она запоминается в А$, а ком- пьютер выводит слово ПРИВЕТ (строка 30). Используйте функцию INKEY$ в форме, приемле- мой для вашего компьютера. Как заставить компьютер ждать 10 LET A$=INKEY$ 20 IF А$=" " THEN GOTO 10 30 Остальная программа Строка 20 заставляет компьютер повторять строку 10 до тех пор, пока не нажата какая-либо клавиша. Ошибки при быстром сложении Чтобы программа использовалась надлежащим обра- зом, исправьте следующие строки, как показано ниже: 20 PRINT "НАЖМИТЕ ЛЮБУЮ КЛАВИШУ, ]---------Г КОГДА ВЫ" J--------------------------------1 ’ 80 PRINT X; "+";Y;" = " ]------------------1 110 LET A$=INKEY$ J-----------------------1 140 IF N 50 TH EN GOTO 90 □----------------1 160 FOR K=1 TO 1000:NEXT K]-----------------'----- 170 GOTO 40 J------------------------------------- 190 PRINT "ПРАВЕЛЬНО. ОТВЕТ РАВЕН X+Y J---------- Добавьте пропущенные кавычки. Умножить на 25 и прибавить 1. Удалите кавычки перед X Имя переменной должно идти перед INKEY$ Чтобы получить все возможные ответы для суммы X+Y, N должна пробегать значения 1—50. После NEXT стояла неправильная переменная. Измените номер строки так, чтобы перемен- ной N снова присваивалось нулевое значение. Поместите имена переменных за кавычками. Игра «Авария автомобиля» Вот программа для игры «Авария автомобиля». 10CLS 20 LET С=5 30 LET L=1 40 LET W=1O 50 LET R=L+W 60 IF L =1 THEN LET N=1 “I__________________________ 70 IF L =25 THEN LET N=0 J 80 IF N=1 THEN LET L=L+1 “1_________________________ 90 IF N=0 THEN LET L=L-1 I 100 LET A$=INKEY$ 110 LK A$ " " THEN LET C=C+1 “I_____________________ 120 IF A$=" " THEN LET C=C-1 J 130 PRINT TAB(L);"1",TAB (C);"*";TAB (R);.J- 140 IF C =L OR C =R THEN PRINT "***АВАРИЯ***" J----- 150 GOTO 50 □--------------------------------------- Когда L достигает любого края экрана, значение N изме- няется. Когда N=l, значение L увеличивается на 1. Когда N=0, значение L уменьшается на 1. Эти строки позволяют вам управлять автомобилем. Выводит изображение дороги и автомобиля. Определяет момент аварии автомобиля. Передает управление строке 50, чтобы скорректировать зна- чение R с учетом изменения L. Если программа исполняется слишком быстро, до- бавьте в нее этот цикл задержки: 142 FOR К=1 ТО 400: NEXT К Система подсчета очков Случайные зигзаги дороги 140 С =L OR С =R THEN GOTO 160 145 IF A$ " " THEN LETS=S+1 160 PRINT"* * * АВАРИЯ ♦ U 170 LET CR=CR+1 180 IF CR =5 THEN GOTO 20 190 PRINT "КОНЕЦ ИГРЫ" 200 PRINT "ВАШ C4ET:”;S 210 STOP Строка 145 прибавляет одно очко каждый раз, когда вы управляли автомобилем без аварии. Строка 180 оста- навливает программу после пяти аварий. В самом начале программы нужно присвоить нулевые значения перемен- ной CR (число аварий) и переменной S (число очков). 75 IF L=5 OR L=10 THEN LET N=INT(RND(1 )*2) 76 IF L=15 OR L=20 THEN LET N=INT(FND(1)*2) Чтобы сделать зигзаги дороги случайными, можно заставить компьютер случайно выбирать направление дороги при определенных значениях L. Этого можно до- биться, изменяя случайным образом значения N, когда L равно, скажем, 5, 10, 15 и 20. 125
GUNPOWDER Задачи о данных (с.107,108) Проверка имени 50 IF Х$="ДЖИМ" THEN PRINT "В СПИСКЕ ВАШЕГО ИМЕНИ": STOP 80 DATA ЧАРЛИ, ДЖЕММА, ДЭДДИ, ДИК 90 DATA СЭМ, ДЕЛИ, ДЖОН Поместите в строки DATA свой собственный список имен, аналогичный показанному. Не забудьте поставить запятые между каждым именем. Последнее имя из спис- ка поместите в строку 50. Если в вашем компьютере не допускаются многооператорные строки, повторите на новой строке оператор IF ... THEN с оператором STOP. Восстановление данных 10 FOR J=65 ТО 90)-ASCII коды 20 for l= 1 ТО 19]-Количество элементов данных д 40 IF LEFT$(N$, 1)=CHR$(J) THEN PRINT N$ Поиск ошибок в программах 1. Элементы данных содержат такие символы как « — » и «/», поэтому в строке 20 следует заменить чис- ловую переменную на строковую, т. е. N$. 2. Оператор GOTO заставляет компьютер продолжать попытки считывать данные из строк DATA и после того, как считан весь список данных. Поэтому будет выдано сообщение о синтаксической ошибке «Не хватает дан- ных». Эту ошибку можно избежать, используя для чте- ния данных цикл с числом повторений, равным числу элементов данных, либо поместив последний элемент данных в строку с оператором IF ... THEN, как это сде- лано в программе «Проверка имени». Кафе Джо 10 PRINT "ДОБРО ПОЖАЛОВАТЬ В КАФЕ ДЖО" 20 PRINT "СКОЛЬКО ВЫ МОЖЕТЕ ИСТРАТИТЬ" 30 INPUT X 40 PRINT "ВЫ МОЖЕТЕ ЗАКАЗАТЬ:" 50 PRINT 60 READ Y, Y$ 70IFY =X THEN PRINT Y$ 80 IF У$="МОЛОЧНЫЙ КОКТЕЙЛЬ" THEN STOP 90 GOTO 60 100 DATA 1.99, ТУШЕНЫЕ УЛИТКИ ПО-ФРАНЦУЗСКИ Занесите в строки DATA все остальные цены и блюда, указанные в меню, поставив последним МОЛОЧНЫЙ КОКТЕЙЛЬ. Телефонный справочник 10 PRINT "ЧЕЙ НОМЕР ТЕЛЕФОНА" 20 PRINT "ВАМ НУЖЕН" 30 PRINT 40 INPUT N$ 50 read х$, Y$ ]--- Читает имена в Х$ и номера в YS 60 IF N$=X$ THEN GOTO 90 □----------------- 70 IF X$=" " THEN PRINT "В СПИСКЕ НЕТ ТАКОГО ___ ИМЕНИ": GOTO 100]-------------------------- 80 GOTO 50 90 PRINT X$;":";Y$ 100 PRINT "НУЖЕН ВАМ ДРУГОЙ НОМЕР" ----- 110 INPUT A$ 120 IF A$=$L F $ TH EN GOTO 150 130 IF A$="HET" THEN STOP 140 PRINT "Я HE ПОНИМАЮ": GOTO 110]------------- 150 R E STOR E:GOTO 10 J------------------- 160 DATA ЧИПМУНК, 67-5054 ----- 170 DATA РЖАВЫЙ РОБОТ, 60-14-444]----------1 Использование массивов (с.Ю9>110) Числовые массивы 10 DIM N(6> 50 DATA 1066, 1216, 1485, 1603, 1665, 1959 Вывод данных на экран Чтобы вывести данные на экран вам нужен цикл, по- добный этому (не забудьте изменить номер у строки DATA): 50 FOR К=1 ТО 6 60 PRINT "N(";K;") ";N(J> 70 NEXT К Этом цикл выводит на экран элементы массива в случай- ном порядке: 50 FOR К=1 ТО 10 60 LET R=INT(RND(1 )*6+1) 70 PRINT N(R), 80 NEXT К Строковые массивы А 10 DIM N$(5) 20 FOR 1=1 ТО 5 ▲ 30 READ N$(l) 40 NEXT I 50 FOR 1=1 TO 5 60 RRINT "N$(";l;"> ";N$(I) 70 NEXT I 80 DATA ТОНИ, КОРА, ДЖУДИ, КРИС, ГАБИ Переходит к строке 90 при обнаружении за- данного имени. Поместите последнее имя из ва- шего списка в кавычки в этой строке. Эта строка нужна в том случае, когда в строке ПО вводится ответ, отличающийся от «ДА» или «НЕТ» Отсылает компьютер обратно к началу списка DATA Впишите в строки DATA свой список имен и номеров телефо- нов, аналогичный этому. Вычислитель календаря Вставьте пропущенные строки и переменные, как по- казано ниже: А 10 DIM M$(12), D(12) А 30 READ M$(N),"СОДЕРЖИТ"; 80 PRINT D(N); "ДНЕЙ" Добавьте остальные строки с данными аналогично этой строке: А 90 DATA ЯНВАРЬ, 31 Чтобы изменить программу, вставьте эти строки: 50 PRINT "КАКОЙ МЕСЯЦ?" 60 INPUT А$ 62 FOR 1=1 ТО 12 Д 63 IF М$ (l)=A$ THEN LET F=l 64 NEXT I 70 PRINT A$; "СОДЕРЖИТ"; 80 PRINT D(F); "ДНЕЙ" 126
ER Генератор идей Д 10 DIM |$(10) 20 FOR 1=1 ТО 10 ▲ 30 READ l$(K) 40 NEXT I 50 PRINT "ВЫБЕРИТЕ ЧИСЛО ОТ 1 ДО 10" 60 INPUT N 70 PRINT "ПОЧЕМУ БЫ ВАМ НЕ"; 80 PRINT l$(N) 90 PRINT "ХОРОШАЯ ИДЕЯ"; 100 INPUT А$ 110 IF А$="ДА"ТН EN STOP 120 PRINT:GOTO 50 130 DATA НАРИСОВАТЬ КАРТИНКУ, ПРОЧИТАТЬ КНИГУ Добавьте к строке 130 свои данные. Гистограмма случайных чисел 100 FOR К=1 ТО 10 110 PRINT К, ТАВ(4) 120 FOR L=1 ТО А(К) 130 PRINT 140 NEXT L 150 PRINT 160 NEXT К Составление подпрограмм (с.111) Добавки к мороженому Д10 DIM l$(5), N(5) 20 FOR К=1 ТО 5 ДЗО READ l$(K), N(K) 40 GOSUB 70 50 NEXT К 60 STOP 70 PRINT l$(K);TAB(11);" "; 80 FOR L=1 TO N(K) 90 PRINT "*"; 100 NEXT L 110 PRINT 120 RETURN 130 DATA ДЫНЯ, 16, БАНАН, 11 140 DATA ИМБИРЬ, 8, КОРНИШОН, 1 150 DATA АНАНАС,18 Чтобы обеспечить вывод компьютером звездочки в каждой строке с одной и той же позиции, в строку 70 включена функция TAB. Потопи подводную лодку Двадцать вопросов ДЮ DIM Q$(20), А(20) 20 FOR К=1 ТО 20 Д 30 READ &$(К), А(К) 40 NEXT К 50 FOR L=1 ТО 20 60 PRINT Q$(L) 70 INPUT X Если ваши ответы со- держат символы или буквы, поместите их в строковый массив. 80 IF X=A(L) THEN PRINT "ПРАВИЛЬНО" 90 IF X A(L) THEN PRINT "НЕТ, ГЛУПЕЦ. ПРАВИЛЬНЫЙ ОТВЕТ:"; A(L) 100 PRINT 100 NEXT L 120 DATA СКОЛЬКО НОГ У СОРОКОНОЖКИ? 100 130 DATA СКОЛЬКО ИГРОКОВ В ФУТБОЛЬНОЙ КОМАНДЕ?, 11 Ч Хи Поместите свои вопро- сы и ответы в строки DATA аналогично этим строкам. Игровая программа «Фрукты» Д 10 DIM F$(6) 20 FOR К=1 ТО 6 А 30 READ F$(K) 40 NEXT К 50 CLS 60 LET T=10 70 PRINT "У ВАС"; Т; "ЖЕТОНОВ" 80 LET l$=INKEY$ 90 IF |$= Э " "THEN GOTO 80 100 LET T=T-1 110CLS 120 LET R=INT(RND(1 )*6+1) 130 LET A$=F$(R) 140 LET R=INT(RND(1 )*6+1) 150 LET B$=F$(R) 160 LET R=INT(RND(1 )#6+1) 170 LET C$=F$(R) 180 PRINT 190 PRINT A$;" ";B$," ";C$ 3 200 PRINT J Выбирает из F$ три фрукта Выводит названия фруктов 210 IF А$=В$ AND В$=С$ AND С$= "ВИШНЯ" THEN GOSUB 270 220 IF А$=В$ AND В$=С$ AND С$ "ВИШНЯ" THEN GOSUB 310 230 IF (A$=B$ AND B$ C$) OR (A$=C$ ANDC$ B$) -Строки 210-230 OR (B$=C$ AND C$ A$) THEN GOSUB II ) опРеДеляют ВИД 240 IF T 0 THEN GOTO 70 выигрыша 250 PRINT "ВСЕ ЖЕТОНЫ КОНЧИЛИСЬ" 200 PRINT "ПРОМАХ" 210 PRINT "СМЕСТИТЕСЬ НА"; 220 IF B=Y THEN GOTO 250 230 I F В Y THEN PRINT "СЕВЕР" 240 IF В Y THEN PRINT "ЮГ" 250 IF A=X THEN GOTO 280 260 IF A X THEN PRINT "ВОСТОК" 270 IF A X THEN PRINT "ЗАПАД" 280 RETURN 260 STOP 1-я 270 PRINT "3 ВИШНИ" подпрограмма 280 PRINT "ВЫ ПОЛУЧАЕТЕ ГЛАВНЫЙ ВЫИГРЫШ"I 290 LET Т=Т+20 300 RETURN 310 PRINT "3 ОДИНАКОВЫХ ФРУКТА" 3 2'я 320 PRINT "ВЫ ВЫИГРАЛИ ПЯТЬ ЖЕТОНОВ" "подпрограмма 330 LET Т=Т+5 340 RETURN -J 350 PRINT" ОДИНАКОВЫХ ФРУКТА" “Г3“я Эта подпрограмма предназначена для сравнения дей- ствительных и угадываемых координат подводной лодки и вывода на экран соответствующего сообщения- подсказки. 360 PRINT "ВЫ ВЫИГРАЛИ ДВА ЖЕТОНА" подпрограмма 380 RETURN 390 DATA ЛИМОН, ВИШНЯ, ДЫНЯ 400 DATA КОЛОКОЛЬЧИК, ВИНОГРАД, СЛИВА 127
GUNPOWDER Программа «Поиски сокровищ» (с.113—118) Вот полная программа для игры «Поиски сокровищ» в виде последовательности разделов, соответствующей логике ее работы. 1. Задание массивов и чтение данных А 100 DIM N(7), Е(7), S(7), W(7), D$(7), Т$(7), Т(7) 110FORK=1TO 7 а 120 READ N(K), Е(К), S(K), W(K) 130 NEXT К 140 FOR K=1 TO 7 Л150 READ D$(K) 160 NEXT К 170 FOR K=1 TO 7 A 180 READ T$(K),T(K) 190 NEXT К 200 LET M=0 210 LET C=0 220 LET F=0 230 LET W=0 240 LET X=0 250 LET Y=0 260 CLS Данные начинаются co строки 2000. 2. Подпрограмма HELP 300 GOSUB 1000 Подпрограмма начинается co строки 1000. 3. Случайный выбор пещеры 350 LET R=INT(RND(1)»7+1) 4. Описание пещеры 400 PRINT "ВЫ В ПЕЩЕРЕ"; R 410 PRINT "ЭТО "; D$(R); "ПЕЩЕРА" 420 PRINT "В НЕЙ НАХОДИТСЯ:"; Описание содержимого пещеры 430 FOR К=1 ТО/7 А 440 IF T(K)=R THEN PRINT TAB(15);T$(K):LET F=1 450 NEXT К 460 IF F=0THEN PRINT TAB(15) "НИЧЕГО" 470 LET F=0 A480 PRINT:PRINT F — это переменная-флажок. В строке 440 этот фла- жок «поднимается» (F = 1), если один из номеров в мас- сиве равен номеру пещеры (R). 5. Ввод команды игрока 500 PRINT "ЧТО ВЫ НАМЕРЕНЫ ДЕЛАТЬ" 510 INPUT А$ 520 IF A$="HELP" THEN GOSUB 1000 530 IF A$="N" OR A$=”E" OR A$="S" OR A$="W" THEN GOSUB 1200 540 IF A$="GRAB" THEN GOSUB 1300 550 IF A$="PUT" THEN GOSUB 1400 560 IF A$="LOCATE” THEN GOSUB 1500 Строки c 520 no 560 отсылают компьютер к разным под- программам в зависимости от вводимой команды 10. Подсчет числа движений игрока 600 LET М=М+1 11. Все ли сокровища в одцой пещере? 610 LET W=T(1) 620 FOR К=2 ТО 7 630 IF W Т(К) THEN LET F=1 640 NEXT К 650 IF F=1 THEN GOTO 690 660 PRINT " ОТЛИЧНАЯ РАБОТА. ВЫ ПЕРЕНЕСЛИ ВСЕ СОКРОВИЩА" 670 PRINT "В ПЕЩЕРУ "; R ; " ЗА "; М; " ДВИЖЕНИЙ" 680 STOP 690 LET F=0 В строке 610 номер, хранящийся в Т (1), помещается в переменную W. Внутри цикла (строка 630) компьютер сравнивает W со всеми другими номерами, хранящимися в массиве Т. Если какой-либо номер из массива Т отлича- ется от W, компьютер присваивает 1 переменной-флажку (F). Если все номера в массиве Т совпадают с W, пере- менная F остается равной 0, а это означает, что все со- кровища собраны в одной пещере. 12. Использовал ли игрок все свои движения? 700 IF М =28 THEN GOTO 30 710 PRINT "К СОЖАЛЕНИЮ ВЫ ПРЕВЫСИЛИ ДОПУСТИМЫЙ ЛИМИТ ДВИЖЕНИЙ" 720 STOP 730 PRINT Если М равно или больше 29, игрок превысил задан- ное число движений, и поэтому программа останавлива- ется. Вы можете изменить допустимое число движений. 13. Изменилось ли местоположение игрока? 800 IF A$="N" OR А$=”Е" OR A$="S" OR A$="W" THEN GOTO 400 810 PRINT "ВЫ ЕЩЕ В ПЕЩЕРЕ"; R 850 GOTO 500 2. Подпрограмма HELP 1000 PRINT "СЕМЬ ПЕЩЕР ОБРАЗУЮТ ЛАБИРИНТ" 1010 PRINT "В КАЖДОЙ ПЕЩЕРЕ НАХОДИТСЯ ЯЩИК" 1020 PRINT "С СОКРОВИЩАМИ. ВЫ ДОЛЖНЫ СОБРАТЬ" 1030 PRINT "ВСЕ СОКРОВИЩА В ОДНУ ПЕЩЕРУ" 1040 PRINT 1050 PRINT "ЭТИ КОМАНДЫ ПОНЯТНЫ КОМПЬЮТЕРУ:" 1060 PRINT "HELP: ИНФОРМАЦИЯ О ПРАВИЛАХ ИГРЫ" 1070 PRINT "N, Е, S, W : ДВИГАТЬСЯ В НАПРАВЛЕНИИ N (СЕВЕР), Е (ВОСТОК) S (ЮГ), W (ЗАПАД)" 1080 PRINT "GRAB : ПОДНЯТЬ СОКРОВИЩЕ" 1090 PRINT "PUT : ПОЛОЖИТЬ СОКРОВИЩЕ" 1100 PRINT "LOCATE : ВЫВЕСТИ ТЕКУЩЕЕ МЕСТОПОЛОЖЕНИЕ СОКРОВИЩ" ▲ 1110 PRINT : PRINT 1120 RETURN Компьютер сообщает игроку правила игры и коман- ды, воспринимаемые им. Когда игрок вводит слово HELP, компьютер переходит к этой подпрограмме. 6. Подпрограмма MOVE 1200 IF A$="N" THEN LET X=N(R) 1210 IF A$="E" THEN LET X=E(R) 1220 IF A$="S" THEN LET X=S(R) 1230 IF A$="W" THEN LET X=W(R) ▲ 1240 IF X=0 THEN PRINT "НЕЛЬЗЯ ИДТИ В ЭТУ СТОРОНУ": GOTO 1260 1250 LET R=X 1260 RETURN В строке 1200 — 1230 компьютер определяет, какое именно направление движения ввел игрок (N, Е, S или W). Затем он находит номер пещеры, расположенной в заданном направлении, используя R как индекс соответ- ствующего массива, и запоминает его в переменной X. Если X = 0 (строка 1240), это значит, что в данном на- правлении нет пещеры. 128
GUNPOWDER 7. Подпрограмма GRAB 9. Подпрограмма LOCATE ▲ 1300 IF C=1 THEN PRINT "НЕЛЬЗЯ ПЕРЕНОСИТЬ БОЛЬШЕ ОДНОГО ЯЩИКА": GOTO 1370 1310 FOR К =1 ТО 7 1320 Fl T(K)=R THEN LET Y=K 1330 NEXT К 1340 IF Y=0 THEN PRINT '/ЭТА ПЕЩЕРА ПУСТА" 1350 LETT(Y)=999 1360 PRINT "ХОРОШО. ВЫ ПЕРЕНЕСЕТЕ"; T$(Y) ▲ 1370 LET С=1 :LRY Y=0 1380 RETURN В строке 1320 компьютер сравнивает с R каждый но- мер, хранящийся в массиве Т. Если они равны, компью- тер берет значение индекса этого элемента Т и записыва- ет его в переменную У. После окончания цикла компью- тер использует Y, чтобы выбрать соответствующий элемент из массива Т и заменить его значение на 999 (строка 1350). Если У = 0 (строка 1340), это значит, что пещера пуста. 8. Подпрограмма PUT А 1400 IF С=0 THEN PRINT "ВЫ НИЧЕГО НЕ НЕСЕТЕ": GOTO 1450 1410 FOR К=1 ТО 7 1420 IF Т(К)=999 THEN PRINT Т$(К); "ПОСТАВЛЕН В ПЕЩЕРЕ"; R 1430 IF Т(К)=999 THEN LET T(K)=R 1440 NEXT К 1450 LET C=0 1460 RETURN Компьютер находит элемент массива Т, который ра- вен 999 (строка 140). Затем он заменяет значение этого элемента на R (строка 1430). 1500 PRINT "ВЫ НЕСЕТЕ:" ▲ 1510 IF С=0 THEN PRINT ТАВ(10); "НИЧЕГО": GOTO 1500 1520 FOR К=1 ТО 7 1530 IFT(K)=999 THEN PRINT ТАВ(10);Т$(К) 1540 NEXT К 1550 PRINT "В ПЕЩЕРЕ НАХОДЯТСЯ:" 1560 FOR К=1 ТО 7 1570 IFT(K) 999 THEN PRINT Т(К);" : ";Т$(К) 1580 NEXT К 1590 RETURN 1. Данные А 2000 DATA 2, 7, 6, 0 2010 FATA 0,3, 7, 1 2020 DATA 0, 0, 4, 2 2030 DATA 3, 0, 5, 7 2040 DATA 7,4,0, 6 2050 DATA 1,5, 0, 0 2060 DATA 2, 4, 5, 1 Это — данные для массивов N, S, Е и W. 2100 DATA ХОЛОДНАЯ И МОКРАЯ, ТЕМНАЯ И ЗАКОПТЕЛАЯ 2110 DATA ТУМАННАЯ И ПРИЗРАЧНАЯ, ГРЯЗНАЯ И МРАЧНАЯ 2120 DATA ПУСТАЯ И СТРАШНАЯ, НАПОЛНЕННАЯ УЖАСНЫМИ ПРИЗРАКАМИ, НАПОЛНЕННАЯ ЖУТКИМИ ПРИВИДЕНИЯМИ Это — данные для массива D$. 2200 DATA ЯЩИК С ЗОЛОТОМ, 1, ЯЩИК ЖЕВАТЕЛЬНОЙ РЕЗИНКИ, 2 2210 DATA ЯЩИКСАНДВИЧЕЙ, 3, ЯЩИК МУСОРА, 4 2220 DATA ЯЩИК С МЕДОМ, 5, ЯЩИК С ДРАГОЦЕННЫМИ КАМНЯМИ,6, ЯЩИК С МОНЕТАМИ, 7 Это — данные для массивов Т$ и Т.
GUNPOWDER Краткое описание основных операторов, функций и команд БЕЙСИКА Ниже приводится в алфавитном порядке список основных операторов, функций и команд БЕЙСИКа, рассмотренных в этой книге, с краткими пояснениями по их использованию. Написание некоторых ключевых слов БЕЙСИКа, отмеченных звез- дочкой, может отличаться в разных компьютерах. АВС Предлагает компьютеру игнорировать знаки плюс или минус перед числами и выдает их абсо- лютные значения. Например, значение функции АВС (-5) равно 5. AND. Эта логическая операция используется в опе- раторе IF ... THEN для одновременной проверки нескольких условий. Оператор после слова THEN исполняется только в том случае, если одновремен- но истинны обе проверки, объединенные операцией AND (И). IFX YANDY 100 THEN PRINT "ИСТИНА" *ASC Преобразует символ в его числовой код PRINT ASC("J") 74 ASCII-код буквы J CHR$. Определяет символ, соответствующий за- данному числовому коду. PRINT CHR$(74) J *CLS. Этот оператор очищает экран. DATA. Этот оператор задает список значений, ко- торые присваиваются переменным с помощью опе- ратора READ (см. READ/DATA). DEF FN имя. Это — сокращение от «define func- tion» (определить функцию). Оператор DEF служит для определения числовой или строковой функции и присваивания ей имени. Каждый раз, когда нуж- но выполнить вычисление, заданное в операторе DEF функцией FN имя, осуществляется вызов на- званной функции. В примере оператор DEF указы- вает компьютеру, как преобразовать в километры расстояние М в милях. DEF FNKILO=M*1.6093 INPUT D PRINT FNKILOHD) DIM. Этот оператор распределяет память для мас- сивов. Например, оператор DIM D$ (30) задает од- номерный массив для 30 элементов строковых дан- ных. Оператор DIM М (4,7) задает двумерный мас- сив для 28 элементов числовых данных, распо- ложеных в 4 строках и 7 столбцах. END. Этот оператор указывает конец программы. ELSE. Это служебное слово указывает компьютеру, что нужно делать, если проверка условия в опера- торе IF ... THEN ложна. IF X*Y THEN PRINT X ELSE LET X=X*2 Если в вашем компьютере не предусмотрена конструкция ELSE, нужно поместить альтернатив- ный оператор из этой конструкции на следующей программной строке в другом операторе IF ... THEN. IF X*YTHEN PRINT X IF X*=Y THEN LET X=X*2 FOR ...NEXT. Эти операторы заставляют компью- тер выполнить заданное число раз набор операто- ров, расположенных между строками FOR и NEXT. Такая конструкция называется циклом. В примере оператор PRINT J повторяется в цикле пять раз. FOR J=1 TO 5 PRINT J NEXT J GOSUB. Этот оператор передает управление из основной программы к подпрограмме. За словом GOSUB должен быть указан номер первой строки подпрограммы. В конце подпрограммы оператор RETURN заставляет компьютер вернуться обратно в основную программу к оператору, следующему непосредственно после оператора GOSUB. 100 GOSUB 200 110 PRINT "ПОЖАЛУЙСТА, СЛЕДУЮЩАЯ ИНСТРУКЦИЯ" 200 PRINT "ЭТО КОРОТКАЯ" 210 PRINT "ПОДПРОГРАММА" 220 RETURN GOTO. Этот оператор передает управление про- граммной строке, номер которой указан после сло- ва GOTO. IF ... THEN. Этот оператор заставляет компьютер сравнить некоторые данные и в зависимости от ре- зультата этой проверки выполнить определенные действия. Проверяемое условие записывается после слова IF. Если это условие истинно, тогда компью- тер выполняет оператор, записанный после слова IF. Если это условие ложно, компьютер игнорирует оператор после слова THEN. Для сравнения дан- ных используются следующие символы: = (равно); < > (не равно); > (больше чем); < (меньше чем); > = (больше или равно); < = (меньше или равно). IF X*Y YHEN PRINT "X БОЛЬШЕ Y" 130
*INKEY$. Контролирует клавиатуру и выдает ин- формацию о том, какая клавиша нажата в текущий момент. В отличие от оператора INPUT, функция INKEYS не ждет, пока вы нажмете клавишу, и не требует от вас использования затем клавиши ВК или ВВОД. Из-за быстрой работы компьютеров функцию INKEYS обычно включают в цикл. В не- которых компьютерах для получения задержки нужно поместить после INKEYS число в скобках, которое указывает длительность этой задержки. В примере ниже символ, соответствующий нажатой клавише, запоминается в переменной А$: LET A$=INDEY$ INPUT. Этот оператор заставляет компьютер ждать, пока пользователь во время исполнения программы не введет с клавиатуры некоторые дан- ные. Эти данные присваиваются переменным, име- на которых следуют за словом INPUT INPUT Т$, R$ INT. Преобразует действительное число в целое, отбрасывая все цифры от десятичной точки. PRINT INT(5.6093) 5 *LEFT$. Выделяет из символьной строки заданное число символов слева. Например, оператор PRINT LEFTS (А, $, 3) выведет 3 символа с левой стороны символьной строки А$. LET A$="ABCDEF" PRINT DEFT$(A$,3) ABC LEN. Возвращает длину символьной строки, т. е. число символов в символьной строке, включая про- белы и знаки препинания. LET A$="ABCDEF" PRINT LEN(A$) 6 LET. Этот оператор именует область памяти, при- сваивая ей имя переменной, и заносит в нее данные. LET В$="СОЛОВЕЙ" LET R=5 LIST. Эта команда приказывает компьютеру выве- сти на экран текст программы. *MID$. Предлагает компьютеру выделить из сим- вольной строки определенное число символов, на- чиная с заданной позиции. Например, функция MID$ (А$, 3, 2) выделяет из символьной строки А$ два символа, начиная с третьего символа. LET A$="ABCDEF" PRINT MID$(A$,3,2) CD NEXT. Этот оператор предлагает компьютеру вер- нуться к началу цикла. (См. FOR ... NEXT.) NEW. Эта команда приказывает компьютеру уда- лить программу из памяти, подготавливая ее для ввода новой программы. *ON GOSUB. Этот оператор отсылает компьютер к конкретной подпрограмме в зависимости от зна- чения переменной. В примере ниже, если С = 3, компьютер переходит к третьей подпрограмме из перечисленных после слова GOSUB, т. е. к подпро- грамме, начинающейся со строки 250: OR. Эта логическая операция используется в опера- торах IF ... THEN для проверки нескольких усло- вий. Когда условия связаны операцией OR (ИЛИ), операторы после слова THEN выполняются в том случае, если истинно хотя бы одно из условий. IF X>Y OR Y>100 THEN PRINT "ИСТИНА" *PEEK. Заставляет компьютер определить содер- жимое конкретной ячейки памяти. Функция РЕЕК используется совместно с оператором PRINT. Опе- ратор PRINT РЕЕК (адрес) выводит на экран со- держимое ячейки памяти с этим адресом в виде со- ответствующего символа. *РОКЕ. Этот оператор записывает число в ячейку памяти с заданным адресом. Например, оператор РОКЕ 4057, 64 помещает число 64 в ячейку памяти с адресом 4057. *PLOTE. Этот оператор высвечивает пиксел на экране дисплея. Например, оператор PLOT (X,Y) высвечивает пиксел с координатами X и Y. PRINT. Этот оператор предлагает компьютеру вы- вести на экран дисплея данные или результаты вы- числений. Пустой оператор PRINT вызывает про- пуск строки. PRINT "ОТВЕТ" PRINT LEN(B$) PRINT 256 *READ/DATA. Оператор READ считывает элемен- ты данных из списка оператора DATA и помещает их в переменные или массив. Обычно для много- кратного исполнения оператор READ помещают в цикл. FOR J=1 ТО 5 READ B(J) NEXT 7 DATA 43, 67,123, 34, 46 *READY. Сообщение, которое выводят на экран не- которые компьютеры, когда они готовы к приему команд. REM. Это — сокращение от слова «remark» (ком- ментарий). Операторы REM используются, чтобы напомнить пользователю, что должна делать та или иная часть программы. Компьютер не обраба- тывает строки, начинающиеся со слова REM, он только выводит их на экран. RESTORE. Этот оператор используется совместно с операторами READ и DATA. Каждый раз, когда вы используете оператор READ, компьютер читает из списка DATA очередной элемент данных. Опера- тор RESTORE заставляет компьютер начать чтение данных снова с самого начала. В некоторых ком- пьютерах существует оператор RESTORE «номер строки», который заставляет компьютер читать данные, начиная с заданной строки. RETURN. Этот оператор помещают в конце под- программы, чтобы возвратить управление обратно в основную программу к строке, следующей непо- средственно за строкой с оператором GOSUB. ON С GOSUB 100, 170, 250, 400, 700 131
GUNPOWDER *RIGHT$. Предлагает компьютеру выделить из символьной строки определенное число символов справа. Например, функция RIGHTS (AS, 4) предла- гает компьютеру выделить из символьной строки А$ последние четыре символа справа. LET A$="ABCDEF" PRINT RIGHT$(A$, 4) CDEF *RND. Предлагает компьютеру выбрать случайное число. RUN. Эта команда приказывает компьютеру испо- лнить программу. *SPC Предлагает компьютеру пропустить задан- ное число позиций в выводимой на печать строке. Эта функция имеется не во всех компьютерах. SQP. Возвращает квадратный корень числа. STEP. Это служебное слово используется в цикле FOR ... NEXT для задания шага изменения пере- менной цикла. В примере компьютер считает от 1 до 6 с шагом 2 и поэтому цикл повторяется 3 раза: FOR J=1 ТО 6 STEP 3 PRINT J NEXT J STOP. Этот оператор прекращает выполнение про- граммы. *ТАВ. Перемещает курсор по экрану на определен- ное число позиций (столбцов). Эта функция обычно используется с оператором PRINT для вывода ка- ких-либо символов в заданное место экрана. В не- которых компьютерах можно также использовать функцию TAB для перемещения курсора на опреде- ленное число строк вниз по экрану. В большинстве компьютеров требуется ставить точку с запятой после функции TAB. THEN. Это служебное слово используется в опера- торе IF, чтобы указать компьютеру, что он должен делать, если заданное условие истинно (см IF ... THEN). VAL. Предлагает компьютеру рассматривать сим- вольную строку как число. Эта функция особенно полезна, если вы хранили в строковой переменной числа. LET А$=”1066'' LET A=VAL(A$) Таблица соответствия некоторых операторов и функций БЕЙСИКа «Стандартный» БЕЙСИК C64/UIC-20 Apple TRS-80 BBC/Electron Spectrum CLS PRINT CHRS (147) HOME CLS CLS CLS INT (RND(1)»N+ 1) LET IS = INKEYS PRINT ASC («J») INT(RND(1) »N +1) INT(RND(1) ♦ N +1) INT (RND(l) ♦ N + 1) RND (N) GET 1$ GET IS LET 1$ = INKEYS LET IS = INKEYS PRINT ASC («J») PRINT ASC («J») PRINT ASC («J») PRINT ASC («J») INT (RND(1)»N+ 1) INKEYS PRINT CODE («J») PRINT LEFTS Стандартная (AS, 3, 2) форма PRINT MIDS (AS, 3, 2) записи PRINT RIGHTS (AS, 3, 2) Стандартная форма записи Стандартная форма записи Стандартная форма записи PRINT AS (1 TO 3) PRINT AS (3 TO 5) PRINT AS (3 TO 6) AS содержит 6 сим- волов PRINT TAB (X,Y); MS См. руководство пользователя НТАВ X: UTAB Y: PRINT @32*Y+X, PRINT TAB PRINT MS MS (X, Y); MS PRINT AT X, Y; MS
GUNPOWDER Предметный указатель Цифры, набранные курсивом, соответствуют кн. 1 Адрес 59, 71, 72 Байт 30, 32 База данных 20, 22 ----журнальных статей 27 ----преобразование 27 ----природоведческая 27 ----продуктов питания и витаминов 27 Бит 70, 71 Быстродействие компьютера 78 Вывод текста на печать 70, 71 Выполнение вычислений 7 Вычислитель скорости 92, 119 Графика компьютерная 28 — мгновенная 28 Данные 8, 21, 84, 92, 94, 119 — восстановление 107 — задача 107 — упаковка 71 — чтение 107 — элемент 54 Двоеточие 12 Диски магнитные 14, 15 Запись 66, 82 — длина 66 Запятая 7, 13, 25, 34, 45 Запятые и точки с запятой 7 Игры 104, 105 Имена мнемонические 58 Клавиатура 8, 12, 20, 32, 50, 54, 84 Клавиша Ввод 6 — ВК (возврат курсора) 59, 6, 69, 73, 89, 90 — командная 50 — функциональная 59, 78 — BREAK (прервать) 9 — ESCAPE (выход) 9 Код машинный 10, 25, 30 — 33, 38, 86, 87 — перестановочный 104 — с ключевым числом 104 — собственный 116 — управляющий 72 — цикловый 104, 184 ----декодирование 124 — ASCII 32, 69 — 71, 73, 103 Коды для ввода даты 72 Команда непосредственная 89, 90 — прямая 6 — CLS (очистить) 6 — END 25 — LIST 6, 72 — NEW (новый) 67 — PRINT (распечатать) 55 — RUN (пуск) 6, 90 Компьютер 51, 52, 84, 86, 119 — бытовой 8, 50, 78 — центральный 58 Координаты 28, 38 «Копия твердая» 21, 43 Курсор 13, 60, 6 — клавиши управления 60 Линии перекрещивающиеся 28 Магнитофон кассетный 14, 15, 18, 20, 42 Массив 11, 27, 28, 54, 66 — двумерный И, 25, 29, 65 — использование 109 — набор ячеек 21 — одномерный 11 — приемы работы 66 — с перекрестными ссылками 65 — строковый 109 — числовой 109 — хранение данных 64 Меню 58, 74, 20, 22, 24, 26, 53 — составление 76 — с перемещением курсора 77 Микрокомпьютер 78, 84 — портативный 41 Накопитель на гибких магнитных дисках (НГМД) 20, 21 Обеспечение аппаратное 10, 50 — программное 10, 32, 50 Окно для ввода текста 58 — команд 59 — меню 58 Оператор задания цвета 38 — ASC 130 — CHRS 130 — DATA (данные) 9, 11, 13, 107, 112, 130 ---- строка 67, 72, 107 — DIM (размер) 11, 27, 130 — FOR (для) 10 — GET 132 — GOSUB (подойти к подпрограмме) 9, 22, 53, 54, 56, 60, 61, 80, 111, 130 — GOTO (идти к) 9, 60, 61, 80, 97, 98, 105, 106, 130 — IF ... THEN (если ... тогда) 9, 12, 13, 25, 26, 60, 61, 80, 97, 98, 121 — INPUT (ввести) 8, 12, 73, 76, 105 — INT 10 — LET (пусть) 8 — LIST 90, 131 — MID$ 131 — NEW 131 — NEXT (следующий) 10 — PRINT (вывести) 7, 71, 89, 90, 99, 131 — READ (читать) 9, 11, 64, 107, 112, 131 — REM (комментарий) 9, 51, 74 — RESTORE (восстановить) 68, 131 — RETURN (возврат) 9, 17, 50, 53, 111 — RND 10 — RUN 131 — SPC 131 — TAB 131 — VAL 24 — Операторы 60 — графические 10, 13, 28 Операция AND (И) 60, 97 — OR (ИЛИ) 60, 97 Память 15, 17, 18, 23, 78, 86, 87, 92 — 95, 102, 119, 56 — компьютера 8, 11, 80 — микрокомпьютера 21, 85 133
GUNPOWDER — постоянная (ПЗУ) 72, 80 — с произвольной выборкой (ОЗУ) 72, 80 — экономия места 64, 79 — ячейка 72 Пароль 58, 67, 97, 121 Переменная строковая 69 Переменная-флаг 58, 116 Переменная целая 59 — цикла 62, 63, 66 — числовая 8, 24 Переменные 14, 17, 29, 55, 64, 73 — или данные 7, 8 — имя 8, 12 -----выбор 58, 91 стандартное 58 — инициализация 12 — и слова 91 — использование 54 — локальные 56, 57 Пиксел 22, 23, 102, 103, 105, 109, 117, 10 Планшет графический 42 Подпрограмма 50, 54, 61 — быстрое исполнение 56 — другой вид 56 — инициализация 54, 55, 67 — порядок расположения 55 — построения рамок 75 — сервисная 55 — составление 111 — универсальная 55 вывода сообщений 55 графическая 55 П орт управляющий 38 Последовательность случайная 122 — числовая 99 Построение гистограммы 38 — графиков 38 линейных 39 — осей 38 — перекрещивающихся линий 28 Представление трехмерных поверхностей 28 Приемы программ 50 Принтер 20, 21, 42, 43 Программа 8, 20, 78, 84, 86, 87 — блок-схема 89, 114 — изменение 87 операторов 89 — картотека 52, 53, 81 переменные 82 распечатка 83 — ошибки 89 — скелетная 53 — составление 88 Прокручивание 75 Процессор текстовый 41, 46, 50, 51, 60, 78 Редактор текста 102, 123 Режим графический 54 -----с высоким разрешением 23, 43, 102, 109, 117 Робот 10 Сетки линии 30 -----построение 31 — стороны 29 Система операционная 72, 78 Скобки 7 Слово 73 — ввод 77 — самое длинное 102, 103 ---- короткое 102, 103 — AND 26 — E1SE (иначе) 25 Создание библиотеки 51 Сообщение мигающее 95, 120 — секретное 94, 120 — центрирование 74 Сортировка данных 32 программы 32 — использование методов 37 — методом пузырька 32, 34, 38 ----Шелла 32, 35, 38 — результаты испытаний 37 — слов 34 — сравнение методов 37 Строка без кавычек 70 — максимальная длина 80 — многооператорная 61 — номер 6, 14, 61 — символьная 123 — состояний 58 — формата 58 Термопринтер 43, 53, 70 Файл 52, 71, 67 — данных 67 защита 67 применение 67 создание 67 — дисплейный 72 — имя 52 Форматирование текста 64 Функция ASC 103 — CHR$ 103 — INT 74 — LEN 11 — MID$ 11, 16 — TAB 58, 96 — VAL 73 Циклы 106—109, 117, 121, 18, 26, 29, 62 — вложенные 10, 62, 95 — задачи 93, 95, 120 — задержки 94 — переменная 62 — приемы выхода 63 Числа двоичные 30 — действительные 59 — случайные 13, 18, 99, 122 ----генерирование 37 ----гистограмма ПО, 127 Экран 46, 50, 77, 78 Язык компьютерный 10 — программирования 16, 84, 86, 6, 61, 63 ---- знаки препинания 89 ----ключевые слова 80 ----основные операторы 7 ----правила записи операторов- 89 ----символы математических операций 89 ----синтаксис 6 ----сокращенная запись ключевых слов 80 ----стандартный 12, 15, 119 ----уровня высокого 32, 87 ------- низкого 32, 33 134
GUNPOWDER Содержание ЧАСТЬ 4 5 ВВЕДЕНИЕ В БЕЙСИК 6 ОСНОВНЫЕ ОПЕРАТОРЫ БЕЙСИК 7 БЕЙСИК В ДАННОЙ ЧАСТИ 12 УЧИМСЯ БЕЙСИКУ, ИЗУЧАЯ ПРОГРАММЫ 14 ИСПОЛЬЗОВАНИЕ СИМВОЛЬНЫХ СТРОК 16 ЦИКЛЫ И СЛУЧАЙНЫЕ ЧИСЛА 18 СОЗДАНИЕ БАЗЫ ДАННЫХ О ЧЕМПИОНА- ТАХ МИРА ПО ФУТБОЛУ 20 МГНОВЕННАЯ ГРАФИКА 28 ПРОГРАММЫ СОРТИРОВКИ ДАННЫХ 32 ПОСТРОЕНИЕ ГРАФИКОВ 38 ЕЩЕ О ДЕЙСТВИЯХ НАД СТРОКАМИ СИМВОЛОВ 40 ЧАСТЬ 5 49 ЧТО ТАКОЕ ПРИЕМЫ ПРОГРАММИ- РОВАНИЯ? 50 ИСКУССТВО ПЛАНИРОВАНИЯ ПРОГРАММЫ 52 ЧТО ДЕЛАТЬ В ПЕРВУЮ ОЧЕРЕДЬ 54 УНИВЕРСАЛЬНЫЕ ПОДПРОГРАММЫ 55 ОПРЕДЕЛЕНИЕ СОБСТВЕННЫХ ФУНКЦИЙ 57 ПРИЕМЫ РАБОТЫ С ПЕРЕМЕННЫМИ 58 ТОНКОСТИ ПРИМЕНЕНИЯ ОПЕРАТОРА IF ... THEN 60 ПОВТОРЕНИЕ ДЕЙСТВИЙ: ЦИКЛЫ 62 ХРАНЕНИЕ ДАННЫХ В МАССИВАХ 64 ПРИЕМЫ ХРАНЕНИЯ ДАННЫХ 66 ПРОВЕРКА ВВОДА_____ 73 ПРЕДСТАВЛЕНИЕ ИНФОРМАЦИИ НА ЭКРАНЕ 74 СОСТАВЛЕНИЕ МЕНЮ 76 УВЕЛИЧЕНИЕ СКОРОСТИ ВЫПОЛНЕНИЯ ПРОГРАММ 78 ПРИЕМЫ ЭКОНОМИИ МЕСТА В ПАМЯТИ 79 ПРОГРАММА КАРТОТЕКА 81 ЧАСТЬ 6 88 ПЕРВЫЕ ШАГИ В ПРОГРАММИРОВАНИИ 89 ЗАДАЧИ О ПЕРЕМЕННЫХ 91 ПОВТОРЕНИЕ ДЕЙСТВИЙ 93 ЗАДАЧИ О ЦИКЛАХ 95 УПРАЖНЕНИЯ С ОПЕРАТОРОМ IF ... THEN 97 СЛУЧАЙНЫЕ ЧИСЛА 99 ДЕЙСТВИЯ НАД СИМВОЛАМИ 101 ПРОГРАММЫ КОДИРОВАНИЯ СООБЩЕНИЙ 104 УПРАЖНЕНИЯ С ФУНКЦИЕЙ INKEY$ 105 ПРОГРАММА «АВАРИЯ НА ДОРОГЕ» 106 ЗАДАЧИ О ДАННЫХ 107 ИСПОЛЬЗОВАНИЕ МАССИВОВ 109 СОСТАВЛЕНИЕ ПОДПРОГРАММ 111 ИГРОВАЯ ПРОГРАММА «ФРУКТЫ» 112 КАК НАПИСАТЬ ИГРОВУЮ ПРОГРАММУ «ПОИСКИ СОКРОВИЩ» 113 ОТВЕТЫ НА ВОПРОСЫ И ЗАДАЧИ 119 КРАТКОЕ ОПИСАНИЕ ОСНОВНЫХ ОПЕРАТО- РОВ, ФУНКЦИЙ И КОМАНД БЕЙСИКА 130 ТАБЛИЦА СООТВЕТСТВИЯ НЕКОТОРЫХ ОПЕРАТОРОВ И ФУНКЦИЙ БЕЙСИКА 132 ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ 133
GUNPOWDER Учебное издание Брайан Реффин Смит, Лайза Уоттс, Лес Науорт и др. ОСВАИВАЕМ МИКРОКОМПЬЮТЕР кн. 2 Заведующий редакцией д-р техн, наук А.Л. Шёрс Зам. заведующего редакцией Э.Н. Бадиков Старший научный редактор В.С. Соболев Младший редактор Ю.Л. Евдокимова Художник Н. М. Иванов Художественный редактор О.Н. Адаскина Технический редактор Л.П. Бирюкова Графики: Ю.А. Бушуев, С.А. Бычков, О.С. Василько- ва, А.Я. Коршунов, А.С. Соколов, Ю.Н. Соустин, А.В. Тетерин, Б.И. Щербаков Макет изготовили: В.Н. Ефросимова, О.В. Писковая, Л.В. Чижова Корректор Е.А. Валуева ИБ № 7269 Сдано в набор 22.06.89 г. Подписано к печати 15.12.89 г. Формат 60 x 90 1/8. Бумага офсетная № 1. Печать офсетная. Объем 8,50 бум. л. Усл. печ. л. 17,00. Усл. кр.-отт. 63,24. Уч. изд. л. 22,62. Изд. № 6/6854. Тираж 125 000 экз. Зак. 2866. Цена 2 р. 70 к. ИЗДАТЕЛЬ* ВО «МИР» В/О «Совэкспорткнига» Государствен- ного комитета СССР по печати, 129820, ГСП, Москва, И-110, 1-й Рижский пер., 2. Предприятие малообъемной книги дважды ордена Трудового Красного Знамени Ленинградского производственного объединения «Типография им. Ив. Федорова». Государственного комитетаСССР по печати. 192007, Ленинград, ул. Боровая, 51.
GUNPOWDER

... 009 4----00V
ЖЕЕВ НАУКА И ТЕХНИКА к КАРТИНКАХ ч»гйНяоХ^ Г" 4$Ь^ О