Basic вводный курс

Алфавит языка

Алфавит языка

В любом учебнике иностранного языка вначале дается его алфавит, т. е. набор символов для записи слов, предложений и всевозможных понятий этого языка. У языка Бейсик тоже есть алфавит, который содержит в себе следующие символы:
  • Заглавные (или прописные) буквы латинского алфавита: А, В, С, D, E, F, G, H, I, J, К, L, M, N, О, Р, Q, R, S, T, U, V, W, X, Y, Z. При наборе программы, впрочем, нет нужды следить за тем, чтобы буквы были заглавными. Интерпретатор сам изменит строчные буквы на заглавные.
  • Арабские цифры: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.
  • Разделители: , (запятая), ; (точка с запятой), . (точка), : (двоеточие), ' (апостроф), " (кавычки), ( (открывающая скобка), ) (закрывающая скобка), символ <Пробел>.
  • Знаки арифметических операций: + (сложение), — (вычитание), * (умножение), / (деление), л (возведение в степень).
  • Знаки операций отношений: > (больше), < (меньше), = (равно), <> (не равно), >= (больше либо равно), <= (меньше либо равно).


  • Арифметика в Бейсике

    Арифметика в Бейсике

    Прежде чем двигаться дальше ("Как трудно двигаться дальше" — из песни Бориса Гребенщикова), необходимо напомнить, что в те далекие времена, когда только зарождались алгоритмические языки, а словосочетание "персональный компьютер" вызывало у тех, кто его слышал сомнения в здравомыслии его произносившего, так вот, в те самые времена считалось, что компьютер (от англ. compute — вычислять), т. е. "вычислитель" только и предназначен для того, чтобы считать в тысячи, нет — в миллионы раз быстрее человека. По сути, это действительно так, и если вы немного представляете себе физику происходящего в компьютере, то все, что вы ни делаете за компьютером — сочиняете стихи или музыку, рисуете картинки, играете, общаетесь в Сети — все внутри этого "вычислителя" сводится к цифровой двоичной форме и к действиям, элементарным арифметическим действиям над этими самыми числами.
    Отсюда вывод — если хочешь быть программистом, надо дружить с математикой. Начнем?
    Итак, компьютер умеет вычислять элементарные арифметические выражения. Но для того, чтобы он смог это сделать, мы должны представить это самое выражение в понятном ему виде, а именно:
  • в отличие от арифметики, выражение должно быть записано в одну строку безо всяких числителей и знаменателей;
  • для записи арифметических действий допустимо использовать только перечисленные ниже знаки:
  • + (сложение, слева от клавиши или на малой цифровой клавиатуре "серый плюс");
  • - (вычитание, то же, что дефис, или на малой цифровой клавиатуре "серый минус");
  • * (умножение, там же, где цифра 8 на основной клавиатуре при нажатой клавише или на малой цифровой клавиатуре "серая звездочка");
  • / (деление, на разных клавиатурах бывает в разных местах или на малой цифровой клавиатуре "серый слэш");
  • ^ (возведение в степень, при выбранном латинском шрифте там же, где цифра 6 на основной клавиатуре при нажатой клавише );
  • () (скобки, там же, где цифры 9 и 0 на основной клавиатуре при нажатой клавише ).
  • недопустим пропуск знака умножения между коэффициентом и переменной, как это возможно в алгебре (например, нельзя писать 2х, а надо 2*Х, или нельзя 5d, а надо 5*D);
  • дробная часть отделяется от целой точкой, а не запятой (нельзя писать 3,14, а надо 3.14);
  • допустимо опускать в записи десятичной дроби ноль, стоящий перед точкой (вместо 0.123 можно .123).
  • Чтобы компьютер вычислил выражение правильно, необходимо помнить о приоритете выполнения действий. Тут все как в элементарной математике:
  • сначала выполняются действия в скобках (в Бейсике скобки используются только круглые, в сложных выражениях они могут быть и двойные и тройные и т. д.);
  • далее вычисляются функции, если они есть;
  • затем выполняется возведение в степень,
  • потом умножение и деление; ;
  • в последнюю очередь — сложение и вычитание.
  • Действия одинаковой очередности выполняются слева направо.
    Приведем ряд примеров перевода арифметических выражений в пригодный для Бейсика вид.
  • В арифметикеАрифметика в Бейсике — в Бейсике 1/х
  • В арифметике Арифметика в Бейсикев Бейсике 2*х^2
  • В арифметике Арифметика в Бейсике в Бейсике (3+4)/(8-6)
  • Замечание
    В последнем случае хочу обратить внимание на обязательность скобок как в числителе, так и в знаменателе. Потому что при записи 3+4/8-6 компьютер сначала произведет деление 4 на 8, затем прибавит 3 и вычтет 6. В ответе получится -2,5 вместо правильных 3,5. Будьте внимательны!
    Чтобы потренироваться, вот вам ряд заданий на запись арифметических выражений в виде, пригодном для вычислений на Бейсике.
    1. Арифметика в Бейсике
    2. Арифметика в Бейсике
    3. Арифметика в Бейсике
    4. Арифметика в Бейсике
    5. Арифметика в Бейсике
    Подсказка: корень квадратный (впрочем, как и любой другой) всегда можно представить в виде степени. А вот как, узнайте на уроках математики! Да про скобки не забудьте!
    Теперь наоборот. Следующие выражения Бейсика запишите в обычной арифметической форме:
    6. Арифметика в Бейсике
    7. (5^3*3-4) ^.5
    8. 44/4*5+10-2^З/.3
    9. 5+2/6-7+З^2
    10. 5+2/6-7+З^2
    11. (4*(5-4^2)^2
    12. 3+8/4-7*З^2
    Ну и чтобы закончить с арифметикой, расскажу еще о двух действиях, которые вы навряд ли использовали в школе, а в программировании они могут оказаться весьма полезными. Эти действия применимы только к целым числам!
    Первое из них — деление нацело. Для этого действия используется знак \ (так называемый обратный слэш). Компьютер в этом случае делит числа как обычно, но в качестве результата деления представляет только целую часть, отбрасывая дробную. Например:
  • 41\4=10
  • 25\9=2 И Т. Д.
  • И второе — нахождение целого остатка от деления. Для этого действия нет специального знака и оно выполняется при помощи оператора mod. Оператор mod действует как и предыдущий, но в качестве результата представляет целочисленный остаток от деления. Например:
  • 41 MOD 4= 1
  • 25 MOD 9 = 7
  • Действия деления нацело и нахождения целочисленного остатка выполняются до обычных умножения и деления.
    Если это вам понятно, давайте вычислим несколько выражений.
    13. 20\6
    14. 20 mod 6
    15. 34\4
    16. 34 MOD 4
    17. 2\5
    18. 2 MOD 5
    19. 4*7\3 MOD 6/3
    20. 24 MOD 5\3


    Где взять русский Бейсик

    Где взять русский Бейсик

    Собственно, проблем, я думаю, с этим возникнуть не должно — надо поспрашивать у учителей информатики, у друзей на компакт-дисках может быть, в конце концов обращайтесь к автору книги — не откажу. Рабочая версия занимает около 400 Кбайт.


    Язык Бейсик

    Глава 1. Язык Бейсик

  • Оболочка Russian Quick Basic
  • Где взять русский Бейсик
  • Запуск русского Бейсика и начало работы
  • Как вводить текст программы в окне редактора
  • Запуск программы на выполнение
  • Сохранение и открытие файлов в Бейсике
  • Алфавит языка
  • Переменная и что в ней меняется
  • Арифметика в Бейсике
  • Оператор присваивания
  • Синтаксис оператора присваивания
  • Выводим результаты
  • Стандартные функции Бейсика
  • Выводим данные в заданном месте экрана
  • Вводим данные
  • Оператор INPUT
  • Операторы DATA и READ
  • Содержание


    Как Бейсик сообщает об ошибках

    Как Бейсик сообщает об ошибках

    Если в программе была допущена ошибка, то после запуска программы на экране появится окно с сообщением об ошибке. У вас есть два варианта действий — выбрать кнопку Справка, чтобы получить информацию о допущенной ошибке, либо нажать клавишу или . Тогда вы вернетесь в окно редактирования, где курсор будет находиться в том месте, где компьютер нашел ошибку.


    Как вводить текст программы в окне редактора

    Как вводить текст программы в окне редактора

    В окне редактора мигает курсор — горизонтальная светящаяся черточка, указывающая, где будет вводиться текст программы при наборе его с клавиатуры.
    Если вы заметили, что что-то набрали неправильно, есть несколько путей исправить допущенные ошибки.
  • Удаление лишних символов. Слева от курсора — клавиша . Символ, под которым мигает курсор и справа от курсора — клавиша .
  • Вставка недостающих символов. Курсор установить под тот символ, слева от которого необходимо произвести вставку и набрать нужные символы. Текст при этом раздвинется автоматически.
  • Переход из режима вставки в режим замены. Режим вставки включается автоматически. В режим замены и обратно мы переходим нажатием клавиши . Курсор при этом принимает вид светящегося прямоугольника. Теперь, при вводе какого-либо символа, будет стираться тот символ, который находился прежде на этом месте. Автоматическое раз-движение строки в этом случае не происходит.
  • Переход на следующую строку осуществляется нажатием клавиши . Если вы случайно нажали клавишу в середине строки, то вторая половина ее перейдет вниз. Пугаться этого не надо. Нажимайте клавишу .
  • Копирование и перемещение фрагментов текста программы. Сначала фрагмент нужно выделить. Выделение производится либо мышью при удерживаемой левой кнопке, либо клавишами управления курсором <<-> и <->> при нажатой клавише . После выделения возможны варианты:
  • удаление фрагмента — клавиша ;
  • копирование фрагмента в буфер — сочетание клавиш +;
  • вырезка фрагмента в буфер — сочетание клавиш + +;
  • вставка фрагмента из буфера в новое место (сколько угодно раз) — сначала курсор нужно поместить в новое место, а затем — сочетание клавиш +.
  • Впрочем, все то же самое можно сделать через меню Редактирование.

    Оболочка Russian Quick Basic

    Оболочка Russian Quick Basic

    Прежде чем непосредственно приступить к программированию, надо научиться пользоваться средой предлагаемого к изучению языка. А поскольку она на русском языке, то это не составит большого труда.
    Итак, нам предстоит узнать:
  • где взять русский Бейсик;
  • как его запустить и начать работу;
  • как вводить текст программы в окне редактора;
  • как запускать программы на выполнение;
  • как сохранить программу на диске в виде файла и открыть уже существующую для просмотра и редактирования.


  • Окно редактора

    Рисунок 1.2. Окно редактора

    Окно редактора
    Переход из одного окна в другое осуществляется клавишей или щелчком в соответствующем окне левой кнопкой мыши.
    В окне немедленного выполнения вы можете сразу видеть результаты работы набранных команд после нажатия клавиши .


    Оператор INPUT

    Оператор INPUT

    Оператор input обеспечивает запрос данных, необходимых для выполнения программы, непосредственно у пользователя, которые тот вводит прямо с клавиатуры. Это дает возможность вести диалог с пользователем и решать задачу, исходя из его конкретных запросов.
    Работает оператор input следующим образом. В том месте программы, где вы хотите запросить у пользователя какие-то данные, вы должны написать input, а после него через пробел — переменную или несколько переменных, в которые будут занесены вводимые данные. Например:
    CLS:?"Каков Ваш рост в см?"
    INPUT R
    ?"Ваш рост превышает 1 м на ";R-100;"см"
    Эта элементарная программа работает так: оператор cls очищает экран, оператор print выводит на экран надпись "Каков Ваш рост в см?". Далее вступает в действие оператор input. Когда программа встречает этот оператор, она приостанавливает свое действие, выводит на экран знак вопроса, после которого мигает курсор. Таким образом, программа показывает, что она ожидает от пользователя ввода данных с клавиатуры. Неискушенный пользователь в этот момент обычно пугается, что программа зависла и начинает звать на помощь. Тот же, кто внимательно прочитает эту книгу, будет знать, что делать, а именно ответить на заданный вопрос, в данном случае — набрать на клавиатуре свой рост и нажать клавишу . После таких абсолютно правильных действий пользователя программа заносит введенное число в память в переменную с именем R, где оно и будет храниться, после чего переходит к исполнению следующей за input команды. В рассматриваемой программе она определяет вывод на экран результатов — надписи "Ваш рост превышает I м на ", затем компьютер вычислит разность между значением переменной R и 100 см, выведет ее на экран и добавит единицу измерения "см".
    Очень запоминается следующий пример диалоговой программы, которая запрашивает у пользователя имя, а затем здоровается с ним:
    CLS:?"KaK вас зовут?" ';
    INPUT NAME$ Rem Знак $ указывает на то, что ожидается вьод Rem не числовой, а символьной информации
    ? "Здравствуйте"; NAME$
    Эта программа очищает экран (оператор cls), затем выводит сообщение "Как вас зовут?", следом вступает в дело оператор input. При этом программа приостанавливает свое действие и ждет от человека ввода его имени, например Ваня, которое запоминается компьютером в переменной name$. После этого на экране появится сообщение "Здравствуйте, Ваня!". Ваня обычно радуется, как маленький, даже если это уже взрослый человек.
    Для тех, кто в дальнейшем планирует изучать язык Паскаль, пожалуй, стоит запомнить именно такую конструкцию оператора input: сначала вывод сообщения оператором print, а затем запрос данных. Но Бейсик в этом смысле облегчает работу и позволяет объединить два действия в одном. Тогда обе вышеприведенные программы обретут иной вид.
    Про средний рост:
    CLS:INPUT "Каков Ваш рост в cm";R
    ?"Ваш рост превышает 1 м Ha";R-100; "см"
    Про "Здравствуйте, Ваня!"
    CLS: INPUT "Как вас 3OByT";NAME$
    ? "Здравствуйте"; NAME$
    То есть в операторе input сначала можно разместить подсказку (но только одну), а затем после точки с запятой указать имя запрашиваемой переменной, или, если их несколько, перечислить через запятую.
    Кроме того, обратите внимание, что в модифицированных вариантах программ в вопросах опущены знаки вопросов, т. к. оператор input при работе сам выставляет знак вопроса.
    Рассмотрим примеры.
    Далее приведена программа, запрашивающая длины катетов, а затем вычисляющая длину гипотенузы прямоугольного треугольника.
    CLS:INPUT "Введите длины двух катетов";А,В
    C=SQR(A"2+B"2)
    ?"Длина гипотенузы =";С
    Когда оператор input требует не одно, а несколько значений, то после запуска программы их надо вводить в том порядке, в котором они запрашиваются, а по окончании нажать клавишу .
    Если вы случайно ввели меньше или больше данных, чем было необходимо, и нажали клавишу , то появится сообщение "Ввод сначала". Это означает, что вы спокойно, без паники должны осуществить ввод данных заново.
    Перед упражнениями приведем еще один пример программы с оператором input:
    CLS: INPUT "Как вас зовут";NAME$
    ? "Здравствуйте,"; NAME$
    INPUT "Введите год вашего рождения, а затем текущий год ";YEARl,YEAR2 ! <.
    R=YEAR2-YEAR1
    ?"Вам около";R; "лет"
    Запустим программу и проследим ее работу (выделенные полужирным символы должны набираться пользователем в процессе работы программы).
    Rem Нажмите +
    Как вас зовут? Ваня Rem После ввода нажмите клавишу
    Здравствуйте, Ваня
    Введите год вашего рождения, а затем текущий год? 1986, 2000
    Rein После ввода нажмите клавишу
    Вам около 14 лет .
    Несколько маленьких упражнений. < '¦¦'¦'"' ''¦'".
    70. Напишите программу, запрашивающую ваш год рождений, год рождения вашей мамы и печатающую/; Во сколько лет мама вас родила. '
    71. Напишите дружественную по отношению к пользователю программу. Пусть она обращается к вам по имени, а затем предложит последовательно ввести прилагательное, существительное, наречие и глагол, чтобы в результате вывести на экран несложную фразу с использованием введенных слов.
    72. Напишите программу, запрашивающую три стороны треугольника А, В, С и вычисляющую его площадь по формуле Герона:
    Оператор INPUT
    73. Напишите программу, запрашивающую высоту дома h (в метрах), ускорение свободного падения g, и вычисляющую время падения кирпича t (в секундах) с крыши этого дома по формуле:
    Оператор INPUT
    Замечание
    Помните, что в самой программе вы не указываете ни конкретных имен, ни конкретных слов, а лишь имена переменных, в которых они будут храниться после ввода с клавиатуры.


    Оператор присваивания

    Оператор присваивания

    Представьте, что вы разработали алгоритм, продумали, какие в нем будут участвовать переменные, придумали им имена и что же дальше? Как же сообщить компьютеру их значения? Как менять эти значения? Итак, мы знакомимся с первым оператором языка Бейсик — оператором присваивания. Знайте, что имя переменной после присваивания будет служить для компьютера своего рода ссылкой на адрес в памяти, где значение этой самой переменной разместилось.
    В старых версиях Бейсика оператор присваивания всегда начинался со слова let. Сейчас этого нет, и оператор присваивания выглядит просто как обычное математическое равенство. Но это вовсе не так!

    Операторы DATA и READ

    Операторы DATA и READ

    Существует другой способ ввода данных. Он применяется в том случае, если эти данные заранее известны. Тогда мы организуем в программе некое подобие склада (с помощью оператора data), а потом при помощи оператора read последовательно считываем эти данные в запрашиваемые переменные, в которых они хранятся и обрабатываются. Удобство этого способа в том, что не приходится каждый раз при запуске программы вводить исходные данные (особенно, когда их много), а также в простоте изменения исходных данных.
    Приведем пример программы.
    DATA 13, 17, 19
    READ A
    ? А
    READ A
    ? а
    READ А
    ? А
    На "складе" data хранятся три числа — 13, 17 и 19. Первый оператор read читает со "склада" число 13 и записывает его в переменную а, а затем оператор print выводит ее значение на экран. Потом считывается второе число — 17, вместо старого значения 13 в переменную а записывается новое — 17, которое тоже выводится на экран. Аналогичные действия происходят и в третий раз с последним числом со "склада"

    Переменная и что в ней меняется

    Переменная и что в ней меняется

    Компьютер, как и вы, уважаемые читатели, обладает памятью. Она бывает разная. В процессе отладки вашей программы ком пьютер напрягает эту самую память, размещая в ней исходные данные, обрабатывая их, используя ваш алгоритм, получая результаты и доводя их до вашего сведения — чаще на экран монитора. Я думаю, для вас не секрет, что память эта называется ОЗУ (Оперативное Запоминающее Устройство), или по-английски RAM (Random Access Memory). Это, собственно, одно из основных устройств компьютера, имеющее, правда, ограниченный объем, измеряющийся в Мегабайтах.
    Если вы пишете достаточно сложную и уже нелинейную программу, то наверняка потребуются переменные, т. е. такие области этой самой оперативной памяти, которые имеют имя, данное нами, и значения, которые могут меняться. Имя переменной в ходе выполнения программы постоянно, а значение может меняться многократно. Этот процесс можно сравнить со сдаваемой на лето дачей. Дача — это участок (область памяти компьютера), имеющий уникальный и неповторимый адрес, по которому его можно найти (имя переменной) и который не меняется, и каждое лето на дачу приезжают новые жильцы (значения переменной).
    Каковы правила на этот счет в Бейсик? Так как Russian Quick-Basic — это язык, рассчитанный на использование из-под DOS (Disk Operation System, дисковая операционная система), то существуют ограничения на имена переменных:
  • имя переменной должно состоять не более чем из сорока символов;
  • в качестве символов можно использовать только латинские буквы, цифры;
  • имя переменной не может начинаться с цифры;
  • категорически запрещены в именах файлов символы точки, запятой, звездочки, вопросительного знака, пробела.
  • Примеры правильных имен переменных:
  • X, Y, Z, IVAN;
  • IVAN3, SI, T234, LOVE7, R6N8F43;
  • NM, MAX, GAVGAV.
  • Примеры неправильных имен переменных:
  • (использована русская буква);
  • ИВАН (использована кириллица);
  • YOU+ME (использован недопустимый символ "+");
  • 23DROVA (имя переменной начинается с цифры).
  • Переменные различаются по типу хранимой в них информации. Два наиболее крупных типа — числовой (для хранения различных чисел) и строковый (для хранения символов и строк). Во втором случае к имени переменной добавляется обязательный символ $ (на клавиатуре — там же, где цифра 4, при нажатой-клавише ), например, Х$ или QUIKE3$.


    Первое окно после запуска русского Бейсика

    Рисунок .1. Первое окно после запуска русского Бейсика

    Первое окно после запуска русского Бейсика
    Далее следуйте инструкции, появившейся на экране. При нажатии клавиши вы попадаете в Руководство для начинающих, а, нажав клавишу — в окно редактора (Рисунок 1.2).
    Компьютер теперь готов к вводу и редактированию ваших программ.
    Вам для работы предоставляется два окна:
  • верхнее — окно редактирования;
  • нижнее — окно немедленного выполнения.


  • использования оператора присваивания

    Рисунок .3. Пример использования оператора присваивания

    использования оператора присваивания
    Рассмотрим работу приведенного выше оператора присваивания на примере фрагмента маленькой программы:
    Х=15
    Y=2
    Z=(X-3*Y^2)+7
    Вопрос. Чему будет равен Z после выполнения всех операторов присваивания?
    Решение. Интерпретатор делает следующее:
  • присваивает переменной X значение 15;
  • присваивает переменной Y значение 2;
  • вычисляет значение правой части третьего оператора присваивания (15-3*2^2)+7. Получается 10;
  • присваивает переменной Z значение 10.
  • Ответ. После выполнения всех операторов присваивания значение Z будет равно 10.
    Вопрос. А если бы первые два оператора присваивания отсутствовали, то чему было бы равно значение Z?
    Ответ. В этом случае интерпретатор принял бы значения X и Y по умолчанию равными 0, вычислил бы с этими нулями значение правой части и оказалось бы, что Z в этом случае равно 7.
    Пока все было похоже на традиционную математику. Но есть один небольшой нюанс. Давайте рассмотрим такой фрагмент программы:
    Х=2
    х=х+1
    Если читать эту запись как математическую, то первый оператор совершенно обычен, "Икс равен двум". Но второй сразу заставляет бунтовать испорченную холодной логикой голову. Так ведь не может быть! Как это "Икс равен Икс плюс один"? Но что противоречит здравому смыслу в математике, легко поддается пониманию в программировании. Ведь это не математическое равенство, а рассматриваемый нами оператор присваивания. Разберем его работу.
    Итак, вопрос. Чему будет равно значение X после выполнения двух операторов присваивания?
    Решение. Сначала переменной X присваивается значение 2. Затем интерпретатор обращается к правой части второго оператора присваивания, находит в памяти значение X. Оно равно 2. Прибавляет к нему 1. Получается 3. Пересылает получившийся результат в правую часть, в ту же самую переменную X. Старое значение ее, равное 2, стирается, записывается новое — 3.
    Ответ. После выполнения двух операторов присваивания значение переменной X будет равно 3.
    Теперь упражнения. Если следующие операторы Бейсика написаны правильно, то напишите слово "верно". Если нет, то укажите на ошибку. Все операторы рассматривайте по отдельности, т. к. они не являются частью общей программы.
    21. 3+6=z
    22. w=5+8
    23. 5+8
    24. s+r=76
    25. v=(x+y+z)/3
    26. F+F-5
    27. H=H*2
    28. x=x*s
    29. d=e=i \
    30. A+B=C-D
    31. Записать операторы, которые переменной S присваивают среднее арифметическое чисел А, В и С.
    32. Записать операторы, которые переменной S присваивают расстояние между точками с координатами XI, Y1 и Х2, Y2.
    33. Записать операторы, которые переменной S присваивают длину гипотенузы С по катетам А и В.
    34. Записать операторы, которые переменной S присваивают площадь треугольника со сторонами X, Y, Z.
    35. Записать оператор присваивания, который меняет знак у значения переменной R.
    36. Чему будут равны значения переменных X и Y после выполнения операторов?
    х=3
    У=6
    x=y
    У=Х
    37. Поменять местами значения переменных X и Y.
    38. Присвоить переменной W сумму цифр трехзначного числа К.
    39. Присвоить переменной S значение длины светового года в километрах. Световой год — расстояние, которое свет проходит за астрономический год, т. е. 365 суток. Скорость света принять равной 300 000 км/сек.
    40. Присвоить переменной V значение объема кирпича с размерами А — длина, В — ширина, С — высота.
    41. Записать в форме оператора присваивания формулу перевода долларов США в рубли (курс по состоянию на июль 2000 г. — 28 руб. за $1).


    Синтаксис оператора присваивания

    Синтаксис оператора присваивания

    Произносится оператор присваивания следующим образом: "Присвоить Зет значение Икс минус три Игрек квадрат в скобках плюс семь" (Рисунок 1.3). Ни в коем случае нельзя говорить: "Зет равно" и далее по тексту.

    Сохранение и открытие файлов в Бейсике

    Сохранение и открытие файлов в Бейсике

    Написав программу и желая ее сохранить на диске, выберите в меню Файл команду Сохранить или Сохранить как. Откроется диалоговое окно, в котором вы должны выбрать диск и каталог для сохранения, дать имя файлу и нажать кнопку ОК. После этого в заголовке окна редактирования появится имя, назначенное файлу.

    Стандартные функции Бейсика

    Стандартные функции Бейсика

    Пока мы не забыли элементарную арифметику в Бейсике и вывод результатов (надеюсь, у вас это получается, причем в законченной, красивой форме с подсказками), необходимо ознакомиться со стандартными функциями языка Бейсик, чтобы в полной мере ощутить его вычислительные способности.
    Бейсик позволяет работать со стандартными алгебраическими функциями, перечисленными в табл. 1.1.

    Стандартные алгебраические функции

    Таблица 1.1. Стандартные алгебраические функции

    Функция Описание Пример Результат
    ABS Возвращает абсолютную величину (модуль) аргумента ? ABS(-2.56) 2,56
    SQR Возвращает квадратный корень из аргумента ? SQR (9) 3
    SIN Возвращает значение синуса аргумента (аргумент указывается в радианах) ? SIN(3) 0,14112
    COS . Возвращает значение косинуса аргумента (аргумент указывается в радианах) ? COS(3) 0,98992599
    TAN Возвращает значение тангенса аргумента (аргумент указывается в радианах) ? TAN(3) -0,1425465
    EXP Находит значение показательной функции ех;, где х — аргумент, а е — основание '.' натурального логарифма, равное 2,718... ? EXP(l) 2,718282
    LOG Возвращает логарифм по основанию е ? LOGO) 1,09861229
    INT Возвращает целую часть аргумента (от англ. INTeger — целый) ? INT(30,l) 30
    SGN "Возвращает 1, если аргумент больше нуля; 0, если аргумент равен нулю;-1,если аргумент меньше нуля (от англ. SiGN — знак)
    ? SGN (3)
    ? SGN(O)
    ? SGN(-3)
    1
    0
    -1


    Вводим данные

    Вводим данные

    Чем хорош Бейсик? Тем, что позволяет писать программы, весьма дружественно настроенные к пользователю, запрашивающие у него свойственные только ему параметры и решающие поставленную задачу для вполне конкретных данных вполне конкретного человека или любого другого объекта.
    По негласным законам программирования хорошая программа не должна зависеть от исходной информации и обязана решать поставленную задачу для произвольных данных. Например, если это задача о расчете среднего роста учеников вашего класса, то программа должна быть написана таким образом, чтобы при введении данных о росте всех учеников результатом был бы средний рост вашего класса, а при введении данных о росте только мальчиков — средний рост мальчиков.
    Это позволяет делать оператор input.


    Выводим данные в заданном месте экрана

    Выводим данные в заданном месте экрана

    Экран компьютера в текстовом режиме представляет собой условную сетку из столбцов и строк. В стандартном режиме таких столбцов 80 (т. е. в строке может разместиться не более 80 символов), а строк 25.
    В Бейсике есть оператор, который позволяет управлять выводом данных на экран, что существенно повышает восприятие программ пользователем. Текст или результаты вычислений всегда выводятся на экран начиная с той позиции, в которой на момент вывода находится курсор. Изменить эту позицию поможет оператор locate.
    Правильно записывается он так:

    LOCATE Y,X
    где х — номер столбца экрана, a y — номер строки (0<х<80 и 0<у<25).
    В операторе locate используются две величины, которые мы будем называть операндами. В этом операторе они должны быть целыми.
    Например, команды

    CLS:LOCATE 13,40:?"S" .

    позволяют последовательно:
  • очистить экран и перевести курсор в позицию Х=0, Y=0;
  • перевести курсор в позицию Х=40, Y=13;
  • напечатать в центре чистого экрана букву S.
  • Выполним ряд упражнений с использованием оператора locate.
    64. Наберите и запустите программу, которая выведет в центре чистого экрана ваши имя и фамилию. Обеспечьте симметричное расположение надписи относительно сторон экрана.
    65. Укажите последовательные положения курсора. Предскажите, как будет расположен текст на экране после исполнения следующих маленьких программ:
  • LOCATE 20,7:CLS:?"HE ТУДА"
  • LOCATE 12,10:?"А ГДЕ ЖЕ ТЕКСТ?".-CLS
  • CLS:?"ЕЩЕ РАЗ НЕ ТУДА": LOCATE 0,0
  • 66. С помощью нескольких команд напечатайте слова "Раз!" и "Два!" в разных местах экрана.
    67. Напишите программу, которая вычислит и напечатает в центре чистого экрана значение выражения: 23+33+43+5J.
    Над ним в качестве заголовка напечатайте надпись "Сумма кубов".
    68. В центре чистого экрана выведите слово "СЕРЕДИНА", окруженное рамкой из звездочек, как показано ниже:

    Выводим результаты

    Выводим результаты

    Пока мы вводили в компьютер исходные данные, используя оператор присваивания. Другие способы ввода будут рассмотрены в одной из следующих глав.
    Сейчас же хочется рассмотреть более важную на первых порах составляющую Бейсика — вывод полученных результатов на экран монитора, а также вывод всякого рода текстовых сообщений. То есть мы знакомимся с могущественным оператором print.
    Этот оператор столь многообразен в своих применениях, что мы позволим себе посвятить ему несколько страниц, чтобы читатель увидел и понял все его возможности и особенности.
    Первая возможность оператора print заключается в том, что он предписывает компьютеру вычислить арифметическое или алгебраическое выражение и вывести результат на экран. Таким образом, наши первые программы на Бейсике будут состоять всего из одного-двух операторов. Например:
    PRINT 2*2
    После запуска такой мощной программы компьютер напряжется, подумает и высветит на экране ответ — 4. После оператора print вы можете писать с целью получения результатов все те (или другие) выражения, с которыми мы будем упражняться в следующих разделах книги.
    Например:
    PRINT(3+4)/(8-6)
    В данном случае ответом будет 3,5.
    Замечание
    Возможны ошибки при использовании оператора print для вычисления арифметических или алгебраических выражений. Если при наборе допущена неточность в написании операторов языка Бейсик, появится сообщение "Синтаксическая ошибка".
    Примеры распространенных ошибок:
  • 23-11+7 не дана команда print.
  • print 2+2 неверно написано слово print.
  • print (4+7)/3+2) не хватает открывающей скобки в знаменателе.
  • print 23*6/2= в выражении использован лишний символ
  • Курсор обычно указывает то место в программе, где допущена ошибка, поэтому ничего не бойтесь, внимательно изучите свое выражение, внесите необходимые исправления и запустите программу снова.
    Замечание
    Сообщение об ошибке "Деление на ноль" последует если при,вычислении выражения с использованием операции деления ружилось деление на ноль.
    Например, в знаменателе получается ноль:
    PRINT(4+8) /(3*2-6).
    Замечание
    Еще одно сообщение вы можете увидеть при работе с вычислениями. Переполнение последует, если в результате вычислений получается число, не размещающееся в памяти компьютера (довольно часто это бывает при работе с возведением в степень).
    Например:
    PRINT 10^100
    Теперь, прежде, чем мы перейдем к упражнениям с оператором print, хотелось бы облегчить ваш труд по набору. Дело в том, что вместо пяти символов слова print, вы можете ставить просто знак ?. Интерпретатор Бейсика чудесным образом после запуска программы сам заменит все знаки вопроса на оператор print, т. е. вместо
    PRINT 2*2
    можно смело писать
    ? 2*2
    И второе, если ваше выражение настолько длинно, что не помещается в экранной строке, то позвольте компьютеру самому перенести часть выражения на следующую строку. Ни в коем случае не делайте этого при помощи клавиши .
    Вспомнив, что корень квадратный (как, впрочем, и любой другой степени) из числа можно представить в виде возведения в степень, вычислите и с помощью оператора print выведите на экран результаты следующих выражений.
    42. Предскажите, какой результат будет получен при вычислении значения выражения 4л1/2. Проверьте свое предположение на компьютере.
    43. Выводим результаты
    44. Выводим результаты
    45. Выводим результаты
    46. Выводим результаты
    47. Выводим результаты
    48. Выводим результаты
    Потренировались в вычислении арифметических выражений? Поехали дальше.
    Оператор print позволяет, как мы уже говорили, не только вычислять арифметические выражения, но и выводить на экран надписи, что предоставляет программисту оформлять тот самый дружественный интерфейс. Ведь если после запуска программы я вижу на экране число, то я не всегда могу понять, к чему оно относится, результат ли это вычислений, или количество лет, оставшихся мне в жизни. Поэтому, чтобы получить законченный программный продукт, мы будем использовать вторую уникальную возможность оператора print.
    Итак, если мы хотим вывести на экран сообщение, то необходимо прежде всего дать компьютеру команду print (или знак вопроса, что то же самое), после которой указать сообщение, взятое в кавычки.

    Запуск программы на выполнение

    Запуск программы на выполнение

    Как же запустить программу? Когда вы написали программу и хотите посмотреть, а что, собственно, из этого получилось, то надо нажать клавишу . Программа будет исполнена в случае отсутствия синтаксических ошибок, и тогда вы увидите результаты ее работы и сообщение внизу экрана "Чтобы продолжить, нажмите любую клавишу". Эта надпись вызывает иногда смятение в душах неопытных программистов, и они начинают судорожно искать на клавиатуре надпись "Любая клавиша". Надеюсь, у вас до этого не дойдет. Если же в программе есть ошибки, то вы их исправляете, и у вас вновь два варианта:
  • запустить программу с места, где она прервалась — клавиша ;
  • запустить программу сначала — сочетание клавиш +
  • Если вы хотите видеть окно, в котором видны результаты выполнения программы, то нажмите клавишу .
    Основы есть? Если возникают вопросы, то, во-первых, при выборе тех или иных пунктов меню внизу появляется краткая информация о нем на русском языке, а по нажатии клавиши вы получите более подробные сведения. Во-вторых, в самом меню есть справка и по командам языка Бейсик, и по содержанию. Учитесь пользоваться справочным материалом!

    Запуск русского Бейсика и начало работы

    Запуск русского Бейсика и начало работы

    Существует три основных варианта.
  • Если у вас на компьютере ничего, кроме MS DOS, нет, то придется открыть каталог с Бейсиком, а затем в командной строке набрать имя запускающего файла qbasic и нажать клавишу .
  • Если у вас есть операционная оболочка Norton (или Volkov) Commander, то задача упрощается — переходите на панель, где содержится каталог с Бейсиком, открываете ее клавишей или двойным щелчком левой кнопкой мыши, затем при помощи стрелок управления курсором находите файл qbasic.exe, и запускаете его нажатием клавиши или двойным щелчком левой кнопкой мыши.
  • Самый модный вариант, если у вас MS Windows: найдите на Рабочем столе ярлык QuickBasic и дважды щелкните по нему левой кнопкой мыши.
  • Во всех трех случаях экран очищается и появляется среда русского Бейсика (Рисунок 1.1).

    Basic вводный курс

    "600 Секунд"

    Рисунок 1.43. "600 секунд"


    177. Видоизмените (весьма, надо сказать незначительно, легким движением руки) предыдущую программу, чтобы она заполняла экран сотней цветных прямоугольников случайных размеров (Рисунок 1.44). Постарайтесь, чтобы на черном фоне не получались черные прямоугольники.
    178. Теперь настал черед заполнить экран полусотней окружностей. Закраска пусть будет разноцветная, а контур окружностей только белый (Рисунок 1.45).
    179. Давайте устроим в центре экрана маленький взрыв. Он будет изображен сотней отрезков разноцветных прямых, сходящихся в точке Х=320, Y=175. Длина их пусть лежит случайным образом в пределах от 50 до 100 экранных точек (Рисунок 1.46).

    Алгоритмы

    Алгоритмы

    Все, что бы мы ни делали, будь то на компьютере, или в жизни, чаще всего преследует какую-либо цель. И не всегда эта цель достигается. Но если мы как следует сформулируем для себя же лаемый результат, потом продумаем четкий план его достижения, то, по крайней мере, на компьютере цель будет достигнута (в жизни, к сожалению, не все так однозначно).
    Так вот, четкая, ясная и однозначная последовательность действий, приводящая к достижению результата, называется алгоритмом.
    Примеры алгоритмов из жизни — это и правила перехода улицы, рецепт пирога, инструкция по изготовлению ядерной бомбы в домашних условиях и т. д.
    Сразу попробуйте подумать и ответить, что из перечисленного ниже является алгоритмом, а что нет
  • правила перехода улицы;
  • политическая карта мира;
  • телефонный справочник;
  • рецепт пирога;
  • инструкция по пользованию видеомагнитофоном.


  • Безусловный переход

    Безусловный переход

    Безусловный переход оператором goto предписывает программе свернуть с линейного пути и, беспрекословно повинуясь, перейти к метке, расположенной в любом месте программы.
    8 качестве метки используются натуральные числа с двоеточием после них. Метка указывается только в начале строки (т. е. если в строке программы несколько операторов, то нельзя ставить метку, например, перед вторым). Приведем пример программы, рисующей на экране три символа звездочки по диагонали:
    CLS
    ?"?*" ?"??*"
    Символ ? в данном случае означает пробел.
    Добавим теперь метку 1 рядом со второй строкой и оператор goto в конце программы. Получаем:
    CLS
    1: ?"*"
    ?"?*"
    9 "77* "
    GOTO 1
    Казалось бы, изменения незначительные, но запустите программу и посмотрите что происходит! Вы в панике? Вы пытаетесь прекратить действие программы, но ничего не получается? Программа зациклилась! Что делать? Спокойно нажмите клавишу и, не отпуская ее, клавишу . Это называется прервать выполнение программы. Переведите дух и давайте шаг за шагом разберемся, что же произошло.
    Программа очищает экран, затем рисует первую звездочку, под ней с отступом в один пробел — вторую, потом ниже третью, а вот затем получает команду goto 1. Это приказ, которого невозможно ослушаться. Программа ищет метку, находит ее у команды рисования первой звездочки и начинает снова последовательно выполнять команды рисования — первую, вторую, третью и — снова приказ перехода, и так — до бесконечности (вернее, до прерывания программы). А поскольку оператор print, не снабженный точкой с запятой, после выполнения всегда переводит курсор на следующую строку, то и получается эффект движения.
    А теперь поупражняйтесь.
    110. Попробуйте спрогнозировать, что произойдет, если метку 1 в программе рисования звездочек указать в первой строке перед оператором cls? А что, если в четвертой строке? Или (кощунственная мысль!) перед самим оператором goto? Проверьте свои предположения на практике.
    111. Напишите программу, которая заставит бежать по экрану следующий узор:
    112. Если вы обратили внимание на текст предыдущей программы, то должны были заметить, что узор легко прослеживается. Воспользовавшись этим, напишите программу, которая заставит бежать по экрану слово "РОК", а потом, если не лень, то и свое имя. Буквы этих слов надо изобразить символами клавиатуры (какими вам больше нравится).
    113. Посмотрите на текст следующей программы:
    х=о
    1: Х=Х+1 ? X
    GOTO 1
    Как вы думаете, при каком значении х программа закончит свою работу? Если у вас достаточно быстродействующий компьютер, можете рискнуть проверить свое предположение на практике. Да, впрочем, рискните и на медленном, ведь всегда можно прервать программу. Правда, в этом случае вы так и не узнаете тайны, какое самое большое целое число компьютер может вывести на экран.
    Строго говоря, серьезное программирование не любит оператор goto. Считается, что он засоряет и путает программу. Вызывает зацикливание и зависание компьютера. Рекомендуют обходиться без него. А мне он все равно нравится. Но это мое личное даже не мнение, а просто чувство. При написании серьезных программ я тоже стараюсь обходиться без goto.


    Буква F, католический костел, яхта, знаки "Не курить" и "Любовь", мороженое

    Рисунок 1.28. Буква F, католический костел, яхта, знаки "Не курить" и "Любовь", мороженое

    Буква F, католический костел, яхта, знаки
    106. Так как программированием чаще занимаются представители сильного пола, а среди них, как известно, бывает довольно много любителей футбола, то предлагаю изобразить эмблему своей любимой команды. У меня это, конечно же, "Зенит"! Вот, кстати, как выглядит их эмблема (Рисунок 1.29). . Сложно? Конечно, да! Но ведь ради любимой команды можно и постараться!
    107. В качестве самостоятельного задания придумайте себе сами эмблему и нарисуй ее.

    Буратино

    Рисунок 1.42. Буратино

    Буратино
    154. Когда мы изучали операторы data и read, to мы говорили, что используем их при изучении оператора цикла. Этот час пробил. Задав в операторе data координаты всех точек концов отрезков, из которых состоит Рисунок 1.42, напишите программу, рисующую Буратино при помощи оператора цикла.
    Совет
    При рисовании непрерывной ломаной линии применяется сокращенная форма оператора line, а именно: line -(х, Y), с. То есть линия будет рисоваться от последней графической точки на экране до точки с координатами X, у. Поэтому при выполнении предыдущего задания рекомендуется поставить первую точку оператором pset, а затем в цикле считывать поочередно координаты следующих точек и рисовать отрезки при помощи сокращенной формы оператора line.


    CD-MAN, глядящий на запад

    Рисунок 1.22. CD-MAN, глядящий на запад


    CD-MAN, глядящий на запад



    Цепочка соприкасающихся окружностей

    Рисунок 1.63. Цепочка соприкасающихся окружностей

    Цепочка соприкасающихся окружностей
    217. Создайте программу вычисления среднего роста десяти человек, данные о которых занесены в оператор data.
    218. Напишите программу вычисления среднего балла при поступлении в институт по результатам четырех экзаменов, которые вводятся с клавиатуры.
    219. С помощью Бейсика вычислите среднее геометрическое трех произвольных чисел. Среднее геометрическое есть корень степени N из произведения N чисел.


    Циклический алгоритм

    Циклический алгоритм

    В тех случаях, когда нам необходимо выполнить одинаковые действия, в которых изменяется только какая-либо величина (так называемый параметр), то мы применяем операторы цикла. Это дает мощный толчок программированию, позволяя выполнять очень сложные алгоритмы.


    Циклы с несколькими зависимыми параметрами

    Циклы с несколькими зависимыми параметрами

    Бывает, что при попытке выполнить задание с помощью оператора цикла выясняется, что изменяется не одна, а две или три величины. В том случае, если вы можете установить между ними зависимости, следует использовать следующие правила:
  • определить, какие же величины изменяются, и обозначить их буквами;
  • назначить одну из этих величин независимым аргументом;
  • определить закономерности, связующие изменяющиеся величины, и выразить эти величины через независимый аргумент;
  • написать программу с оператором цикла, основным параметром которого будет независимый аргумент, а в командах тела цикла, на месте других изменяющихся величин, необходимо подставить их выражения через этот независимый аргумент.
  • Приведем пример. Предположим, мы хотим построить семейство окружностей, как на Рисунок 1.49. Не правда ли, напоминает рупор?

    Два пересекающихся эллипса

    Рисунок 1.13. Два пересекающихся эллипса Два пересекающихся эллипса

    Два пересекающихся эллипса

    Елочка

    Рисунок 1.31. Елочка

    Елочка
    109. Если вам удалось предыдущее задание, то попробуйте вырастить на экране еловый бор из трех одинаковых елочек,
    пририсовать к ним траву, солнце, небо, облака — в общем, все, что подскажет вам фантазия.


    Фантастический глаз

    Рисунок 1.38. Фантастический глаз


    Фантастический глаз



    Функции ASC и CHRS

    Функции ASC и CHRS

    Функция asc определит нам код ASCII для первого символа этой строковой переменной и имеет следующую форму записи:
    ASC(строковая_переменная)
    Например:
    N=ASC("F")
    ? " Код заглавной буквы F —"; N
    В результате получим:
    Код заглавной буквы F — 70
    Еще пример.
    Х$="YAHOO"
    N=ASC(X$)
    ?N
    В результате получим код первого символа, входящего в слово "YAHOO", т. е. "Y", который равен 89.
    Замечание
    Следует помнить, что коды заглавных и строчных букв — разные.
    Кроме того, если мы напрямую указываем в функции asc символ или текст, то он берется в кавычки (первый пример), а если это строковая переменная, то без кавычек (второй пример).
    Функция chr$ определит нам символ, код которого указан в скобках. Форма записи функции:
    CHRS(код)
    Например:
    CLS
    1: INPUT "Введите любой код от 33 до 128"; N
    IF N < 33 OR N >=128 THEN ? "Обратите внимание на числовые
    границы для кода": GOTO 1
    ? "Символ с кодом "; N; "- это"; CHR$(N)
    Обратите внимание на оформление программы. Сначала выполняется очистка экрана. Затем — запрос кода. Если он введен не в требуемых пределах, то программа возвращает человека к запросу — простейший, но очень полезный способ помочь пользователю.
    221. Опробуйте представленную выше программу и узнайте, что за символы скрываются под кодами 33, 66, 99, 100, 128.
    222. Примените функции asc и chr$ к примеру простейшей шифровки информации, когда символы вводятся побуквенно, а программа определяет их код, добавляет к ним 1 и выводит на экран вместо введенного символа символ с новым получившимся кодом. Слово для тестовой проверки такой программы — "CAT", после его побуквенного введения должно получиться "DBU".
    223. Напишите программу-дешифратор для предыдущего задания. Тестовая проверка: из слова "DBU" должно получиться слово "CAT".
    Эти программы грамотно работают для первых стандартизированных 128 кодов. Чтобы правильно работать, например, с русским текстом, надо знать коды строчных и прописных букв кириллицы, которые скрываются в интервале от 129 до 255. Поэтому еще одно задание.
    224. Напишите программу, выводящую на экран символы, скрывающиеся за кодами 129—255. Распечатайте или выпишите коды строчных и прописных букв кириллицы.
    Но, всякий раз вводить текст побуквенно — большая морока. Нельзя ли как-нибудь в Бейсике обрабатывать слова и строки? Конечно, можно. Для этого существуют специальные функции.


    Функции LEFTS, RIGHTS и MID$

    Функции LEFTS, RIGHTS и MID$

    Для получения фрагмента строки (или значения строковой переменной) применяются специальные функции.
    Функция left$ выделяет из введенной строковой переменной n символов слева:
    LEFT$(строковая_переменная, N)
    Рассмотрим пример.
    CLS
    F$="ГАЗОНОКОСИЛЬВДК"
    L$=LEFT$(F$, 5)
    ? L$
    На экране появится слово "ГАЗОН", т. е. первые пять символов слева исходной строковой переменной.
    Функция right$ вырезает из введенной строковой переменной N символов справа:
    RIGHTS(строковая_переменная, N)
    Например:
    CLS
    F$='TA30H0K0CIOTbII]HK" R$=RIGHT$(F$, 9)
    ? R$
    На экране появится слово "КОСИЛЫЦИК", т. е. первые девять символов справа исходной строковой переменной.
    Наконец, функция mid$ извлекает N2 символов, начиная с ni исходной строковой переменной:
    MID$(строковая_переменная, N1, N2)
    Например,
    CLS
    F$="ГА30Н0К0СИЛЫЦИК" M$=MID$(F$, 7, 4) ? М$
    На экране появится слово "КОСИ", т. е. четыре символа, начиная с седьмого исходной строковой переменной.
    Используя эти функции для начала можно с их помощью поиграть в игру "Наборщик", когда из букв, составляющих какое-либо слово, нужно составить другие слова. Для этого предназначена функция конкатенации или, по-простому, слияния, которая записывается просто знаком +. Например:
    CLS
    F$="ГАЗОНОКОСИЛЬЩИК"
    W1$=MID$(F$, 4, 2)+RIGHT$(F$, 7)
    W2$=MID$(F$, 4, 2)+LEFT$(F$, 2)
    W3$=MID$(F$, 9, 1)+MID$(F$, 7, 2)+MID$(F$, 11, 2) +MID$ (F$, 7,2)
    ? Wl$
    ? W2$
    ? W3$
    Выполните упражнения.
    226. Определите, какие слова получатся в результате выполнения приведенной выше программы?
    227. Напишите программу, которая выдаст на экран пять слов максимальной длины из слова "ЭЛЕКТРИЧЕСТВО". Побеждает тот, у кого сумма букв во всех словах наибольшая.
    В качестве очередного примера приведем задачу подсчета слов во введенном тексте. Как известно, для компьютера словом является последовательность символов, заключенная в пробелы с двух сторон. Подчеркиваю, это не обязательно слово, в привычном для нас понимании, а любой набор символов, например, 45ро9) или ВАР56+УР47. Поэтому, в простейшем случае, подсчет количества слов во введенном тексте сводится к подсчету количества пробелов и добавлении к полученному значению единицы. (Почему так? Очень просто: слов два, а пробел между ними один; слов три — а пробелов два и т. д.) Получаем программу.
    CLS
    INPUT "Введите текст телеграммы"; W$
    N=LEN(W$) : K=0
    FOR 1=1 ТО N
    P$=MID$(W$, I, 1)
    IF P$=" " THEN K=K+1 NEXT I ? "В вашей телеграмме — "; K+l; "слов"
    Программа работает очень просто. Она определяет длину текста в символах и заносит это число в переменную N. Затем устанавливает счетчику пробелов к нулевое значение. После чего, в цикле вырезает из текста последовательно по одному символу и проверяет, а не является ли он пробелом. Если это так, то увеличивает счетчик пробелов к на .единицу, а если нет — берет следующий символ. По завершении цикла в переменной к хранится количество пробелов в тексте, и мы выводим ответ о количестве слов на экран, добавляя к к еще единичку.
    228. Используя пример с подсчетом слов в телеграмме, напишите программу, имитирующую отделение связи с очень хорошим обслуживанием. Программа должна выяснять имя клиента и в дальнейшем обращаться к нему только по имени. Запрашивается также регион, куда посылается телеграмма. Их три — Россия (коэффициент 1), страны СНГ (стоимость одного слова умножается на 2) и дальнее зарубежье (стоимость одного слова умножается на 5). По России стоимость одного слова составляет 1 руб. 50 коп. (причем неважно, какой длины слово). Затем у клиента запрашивается текст телеграммы и денежная сумма, определяется количество слов, стоимость телеграммы. Если денег ровно столько, сколько надо, его благодарят и прощаются. Если больше, чем надо, то ему предлагают сдачу и прощаются. Если — меньше, то просят добавить необходимую сумму, а затем, после расчета, с клиентом прощаются. А для пущей красо-
    ты я обычно прошу нарисовать окошко телеграфа, в прорезях которого и происходит диалог компьютера с пользователем (Рисунок 1.65).

    Функция INKEY$

    Функция INKEY$

    Вернемся еще раз к организации пауз и задержек в вашей программе. Мы уже делали это с помощью пустого оператора цикла, с помощью оператора sleep. Есть еще одна полезная функция inkey$, которая ожидает нажатия определенной клавиши, анализирует поступающую информацию об уже нажатых клавишах, и, в зависимости от результатов анализа, программа следует по тому или иному пути. Например:
    CLS
    ? "Нажмите любую клавишу для продолжения..."
    WHILE INKEY$=""
    WEND
    ? "Продолжение..."
    Можно задать и определенную клавишу для продолжения выполнения программы:
    CLS
    ? "Нажмите клавишу ESC для продолжения..."
    WHILE INKEY$OCHR$ (27)
    WEND
    Замечание
    Функция inkey$ работает только вместе с условным оператором.


    Функция INPUTS

    Функция INPUTS

    Эта функция ожидает ввода N символов, которые и будут обрабатываться программой сразу после их набора на клавиатуре, не дожидаясь нажатия клавиши . В этом заключается принципиальное отличие функции от оператора input.
    Например:
    CLS
    N$=INPUT$ (2)
    IF Ы$="да" THEN ?N$ ELSE ?"нет"
    В данном случае программа после ввода с клавиатуры последовательности символов, анализирует ее, выделяя только два первых символа, и действует в зависимости от проверяемого условия.


    Функция LEN

    Функция LEN

    Следующая функция — len. Она определяет длину введенной или существующей в переменной строковой переменной в символах. Синтаксис:
    LEN(строковая_переменная)
    Например,
    CLS
    INPUT "Введите Вашу фамилию"; F$
    N=LEN(F$)
    ? "В вашей фамилии "; N; "букв"
    Представленная программа выясняет количество букв во введенной пользователем фамилии. Причем, обратите внимание, что функция len учитывает не только буквы, но и символы, т. е.
    она распознает и пробелы, и знаки препинания, и цифры, содержащиеся во введенном тексте. Например:
    CLS
    INPUT "Введите Ваш адрес"; F$
    N=LEN(F$)
    ? "В вашем адресе "; N; "символов"
    225. Определите с помощью предыдущего примера, сколько символов будет в следующем адресе:
    197110, Россия, Санкт-Петербург, Чкаловский пр., 78-33


    Функция определения вхождения подстроки

    Функция определения вхождения подстроки

    Допустим, мы хотим найти в тексте какое-либо слово. Нам на помощь приходит функция instr, имеющая следующий синтаксис:
    INSTR(N, F$, R$)
    где n — позиция, с которой вы хотите начинать поиск (необязательный параметр), f$ — строковая переменная, в которой будет производиться поиск, r$ — подстрока, поиск которой осуществляется. В случае отсутствия этой позиции поиск начнется с первого символа строковой переменной. Функция instr укажет нам номер позиции, с которой начинается вхождение искомой подстроки, или 0 в следующих случаях:
    П подстрока не найдена;
    ? значение N больше длины исходной строковой переменной;
    ? длина строковой переменной нулевая.
    Если подстрока пустая, то результатом будет n, а при его отсутствии — 1. Поиск прекращается с первым нахождением подстроки. Например:
    CLS
    Р$="Свиноводство, овцеводство, пчеловодство"
    Р$="чело"
    N=INSTR (F$, R$)
    IF N о О THEN ? "Слово 'чело' в исходной строке есть и начинается с"; N; "позиции"
    Результатом выполнения программы будет фраза:
    Слово 'чело' в исходной строке есть и начинается с 29 позиции
    235. Заменить в исходном тексте "photo, graph, philophon, cophe" все сочетания "ph" на символ "Г.


    Алгоритмы, графика, символы и строки

    Глава 2. Алгоритмы, графика, символы и строки

  • Алгоритмы
  • Виды алгоритмов
  • Линейный алгоритм
  • Графика в Бейсике
  • Графические примитивы
  • Правила построения сложных изображений
  • Макроязык GML
  • Вывод текстовой информации в графике
  • Разветвляющийся алгоритм
  • Безусловный переход
  • Условный переход
  • Циклический алгоритм
  • Оператор с заранее известным числом повторений
  • Оператор цикла WHILE... WEND
  • Случайные числа
  • Построение графиков функций
  • Циклы с несколькими зависимыми параметрами
  • Вложенные циклы
  • Наращивание переменной
  • Оператор DO...LOOP
  • Символы и строки
  • Функции ASC и CHRS
  • Функция INPUTS
  • Функция LEN
  • Функции LEFTS, RIGHTS и MID$
  • Сравнение строковых переменных
  • Преобразование строчных и прописных букв
  • Функция определения вхождения подстроки
  • Функция INKEYS
  • Содержание


    Горизонтальная линия из точек

    Рисунок 1.35. Горизонтальная линия из точек

    Горизонтальная линия из точек
    138. Заполните экран горизонтальными линиями (через 10), а затем, с помощью еще одного оператора цикла, вертикаль ными линиями другого цвета (тоже через 10). Должна получиться решетка, как на Рисунок 1.36.

    Графические примитивы

    Графические примитивы

    Ну что ж, начнем с графических примитивов, т. е. элементарных объектов, на которые можно разбить любое сложное изображение.

    График функции синуса

    Рисунок 1.47. График функции синуса

    График функции синуса
    Значение X изменяется от 0 до 640, давая возможность строить график на всю ширину экрана. Достаточно сложно выражение для Y. Это связано с переносом начала координат в центр экрана (отсюда числа 175 и 320). А вот число 30 в данном случае несколько произвольно — это коэффициент растяжения. Попробуйте его поменять сначала на 10, а потом на 50 (только менять всегда надо в двух местах) и посмотрите на возникающие отличия. На мой взгляд, коэффициент 30 наиболее оптимален.
    Построение иного графика сводится к замене определения функции на другую.
    Давайте поупражняемся. Напишите программы построения графиков перечисленных ниже функций.
    180. Y=COS (X) .
    181. Y=ABS (X) .
    182. Y=INT(X) .
    183. у=1/(1+х^2).
    184. Y=X^2.
    185. Y=2*SIN(X/2)+0.5*COS(2*X).
    186. Y=TAN(X).
    Графики представляют из себя семейства точек, между которыми могут быть значительные разрывы (как, например, при построении графика тангенса). Чтобы избежать этого, уплотнкть график, можно в заголовке цикла установить шаг изменения по X меньше 1. Попробуйте.
    Теперь попытаемся построить график функции y=i/x (кажется, это называется гиперболой). Если вы будете рисовать его как т
    описано выше, ничем не дополняя, то, возникнет ошибка, о которой мы уже говорили — "Деление на ноль". Придется в очередной раз вспомнить математику и область допустимых значений. В данном случае, X не может быть равен 0, но поскольку начало координат у нас искусственно перенесено в центр экрана, то для графика X будет обращаться в 0 при координате экрана, равной 320. Поэтому программа будет выглядеть так:
    SCREEN 9
    LINE {0, 175)-(640, 175), 15
    LINE (320, 0)-(320, 350), 15
    DEF FNY(X)=1/X
    FOR X=0 TO 640
    IF X=320 THEN X=X+1 Y=175-30*FNY((X - 320)/30) PSET(X, Y), 15
    NEXT X
    А график должен выглядеть так (Рисунок 1.48).

    График гиперболы

    Рисунок 1.48. График гиперболы

    График гиперболы
    Постройте теперь графики следующих функций.
    187. y=1i/(x+d.
    188. Y=SQR(X).
    189. Y=X/(X^2-1).
    Сейчас задания посложнее, но и интереснее. Изобразите на экране поверхность, образованную вращением вокруг оси X графиков представленных ниже функций.
    190. у=1/(1+х^2).
    191. Y=1/X.
    192. Нарисуйте поверхность, образованную вращением вокруг оси Y, графика функции у = х2 .
    Совет
    Попробуйте строить график не точками, а эллипсами, радиус которых... Вот именно!


    Графика в Бейсике

    Графика в Бейсике

    Иногда при изучении этой темы приходится сталкиваться с непониманием учащихся. "А зачем так сложно, если в любом графическом редакторе можно сделать то же самое?" Взгляд автора здесь таков. Да, в графическом редакторе можно нарисовать практически что угодно. Но, зная приемы программирования, создаются быстро такие элементы, на которые в графическом редакторе уйдет очень много времени и не будет возможности многократного повторения и внесения быстрых изменений в рисунок.
    Прежде всего, необходимо сказать несколько слов о включении графических режимов. При входе в оболочку Бейсика по умолчанию включается текстовый режим, в котором можно производить вычисления и выводить результаты на экран. Но если мы хотим пользоваться графическими возможностями языка, то должны объяснить это компьютеру посредством включения графического режима командой screen 9. Таких режимов несколько, но автор рекомендует пользоваться девятым режимом, потому что он обладает наибольшей разрешающей способностью и позволяет получать качественные графические объекты. После включения графического режима мы можем давать компьютеру команды рисования графических примитивов.
    Замечание
    Графический режим включается только один раз.
    В режиме screen 9 экран представляет собой координатную сетку с началом в левом верхнем углу, вправо от которого увеличивается координата X, а вниз — координата Y. Максимальное значение X на экране 640, a Y — 350 (Рисунок 1.4).

    Храм

    Рисунок 1.27. Храм


    Храм



    Эллипс, вытянутый по горизонтали

    Рисунок 1.11. Эллипс, вытянутый по горизонтали


    Эллипс, вытянутый по горизонтали



    Эллипс, вытянутый по вертикали

    Рисунок 1.12. Эллипс, вытянутый по вертикали

    Эллипс, вытянутый по вертикали
    Очевидно, что если коэффициент сжатия равен 1, то это будет уже никакой не эллипс, а просто окружность.
    Оператор рисования эллипса записывается почти так же, как и для окружности:
    CIRCLE (X, Y) , R, С, , , К
    где х, y — координаты центра эллипса, r — радиус той окружности, из которой этот эллипс получился, с — цвет, к — значение коэффициента сжатия.
    Например, после выполнения оператора
    CIRCLE (320, 175), 50, 2,,,.5
    в центре экрана появится эллипс зеленого цвета, сжатый сверху и снизу, у которого Ry в два раза меньше, чем Rx.
    Если же добавить еще один оператор
    CIRCLE (320, 175), 50, 2,,,2
    то сверху дорисуется дополнительный один эллипс, который будет сжат уже по горизонтали, и у него уже Ry будет в два раза больше, чем Rx. Вместе они должны составить следующую картинку (Рисунок 1.13)
    Ну, а теперь продолжим наши упражнения.
    93. Напишите программу, которая изобразит квадрат и вписанную в него окружность.
    Замечание
    К сожалению, иногда размеры точек по осям абсцисс и ординат не совпадают, вследствие чего может наблюдаться асимметрия в изображениях (при полной правильности всех ваших расчетов). В таких случаях приходится подгонять детали рисунка вручную.
    94. Создайте программу, с помощью которой можно нарисовать мишень — пять концентрических (т. е. с одним центром) окружностей, вложенных друг в друга, и перекрестие двух отрезков прямых. Можно усложнить изображение, добавив попавшую в мишень стрелу (Рисунок 1.14).
    95. Напишите программу, которая отобразит снеговика, состоящего из пяти окружностей разного радиуса и ведерка на голове из эллипса и двух отрезков (Рисунок 1.15).
    96. Напишите программу построения цилиндра, состоящего из эллипсов и двух вертикальных линий (Рисунок 1.16).
    97. При помощи Бейсика нарисуйте летающую тарелку (Рисунок 1.17).

    Эллипс

    Эллипс

    Очередной примитив — эллипс. Эллипс — это, по сути, окружность, которой слегка дали по "голове" или по "бокам", в результате чего она стала вытянутой по вертикали или горизонтали. И вместо одного радиуса, как у окружности, у эллипса стало два — по осям X и Y.
    Частное от деления Ry на Rx дает нам так называемый коэффициент сжатия:

    Корабль в ночи

    Рисунок 1.26. Корабль в ночи


    Корабль в ночи






    Куб и пирамида

    Рисунок 1.10. Куб и пирамида


    Куб и пирамида



    Квадрат с окружностями

    Рисунок 1.23. Квадрат с окружностями

    Квадрат с окружностями
    99. Создайте программу, отображающую месяц в обратную сторону, чем в примере, рассмотренном выше. Закрасьте его красным цветом.
    100. С помощью Бейсика нарисуйте закрашенный квадрат (одним оператором) с вписанными в него двумя разноцветными окружностями (Рисунок 1.23).
    101. Напишите программу, выводящую на экран петлю гистерезиса, которая состоит из двух отрезков прямых линий и четырех дуг, являющихся четвертями окружности (Рисунок 1.24). Попробуйте сначала нарисовать изображение в масштабе на бумаге, рассчитать все исходные данные. Закрасьте получившееся изображение. (Будьте внимательны при состыковке дуг, зачастую там образуются разрывы.)

    Лестница 1

    Рисунок 1.53. Лестница 1

    . Лестница 1

    Нарисуйте две пирамиды индейцев майя

    Рисунок 1.54. Лестница 2

    Нарисуйте две пирамиды индейцев майя
    197. Нарисуйте две пирамиды индейцев майя — вид спереди и вид сверху (Рисунок 1.55 и 1.56).
    198. Вернитесь к примеру с "рупором" из увеличивающихся окружностей и попробуйте сделать картинку, на которой подобные рупоры выходят из всех четырех углов экрана и встречаются в центре.

    Летающая тарелка

    Рисунок 1.17. Летающая тарелка

    Летающая тарелка
    Ну что ж, если все получается, то пора постепенно переходить к более сложным вещам, а именно, к рисованию дуг окружностей и эллипсов. Но прежде следует вспомнить, что в Бейсике используется радианная мера углов (см. "Стандартные функции Бейсика"). Любая дуга имеет угол, от которого она начинается, и угол, где она заканчивается. Чтобы разобраться с этим, сначала я приведу оператор рисования дуг окружностей:
    CIRCLE (X, Y) , R, С, а, Ь
    где появившиеся две новые величины а и ь и обозначают эти углы. Правило рисования дуг на Бейсике звучит так: "дуга строится от угла а к углу b против часовой стрелки".
    Для того чтобы показать это наглядно, лучше всего обратиться к тригонометрической окружности (Рисунок 1.18).

    Линейный алгоритм

    Линейный алгоритм

    Для написания программ с линейным алгоритмом мы уже готовы. Нам известно, как очистить экран и поприветствовать пользователя по имени, запросить у него необходимые данные и решить вычислительные задачи. Попробуем поупражняться. Следите все же за интерфейсом своих программ!
    В следующих заданиях вам предлагается написать программы, производящие требуемые вычисления и выдающие на экран результаты.
    76. Расстояние до ближайшей к Земле звезды Альфа Центавра 4,3 световых года. Скорость света принять 300 000 км/с. Скорость земного звездолета 100 км/с. За сколько лет звездолет долетит до звезды?
    77. Вычислить количество прожитых составителем программы дней. Учесть, что в високосном году 366 дней.
    78. Известна теория биоритмов. С момента рождения жизнь человека подчиняется трем синусоидальным биоритмам. Физический цикл — 23 дня, эмоциональный — 28 дней и интеллектуальный — 33 дня. Первая половина каждого цикла — положительная, вторая — отрицательная. При переходе от положительной к отрицательной фазе в каждом цикле есть так называемый критический день. В физическом цикле — 12-й день, в эмоциональном — 15-й день, в интеллектуальном — 17-й день. Когда два и более цикла находятся в отрицательной фазе, или в критических днях, то в такие дни повышена вероятность физических недомоганий и травм, эмоциональных срывов и ссор, замедленности интеллектуальных процессов и реакции. В Японии, например, в крупных фирмах для каждого работника составлен график и в "плохие" дни их не допускают до работы, дают отдыхать, потому что оплата больничного или брак в работе обойдутся фирме дороже. Теперь к делу. Опираясь на результат предыдущего задания и используя операцию нахождения целочисленного остатка, рассчитайте, каков для вас сегодняшний день по всем трем циклам.
    79. Запросите у пользователя валютный курс на сегодняшний день, затем имеющуюся у него рублевую сумму и рассчитайте, сколько долларов он может купить.
    80. Дискета 3,5" вмешает 1,44 Мбайт. Рукопись содержит 450 страниц текста. На каждой странице 60 строк по 80 символов в каждой. Поместится ли рукопись на дискету? Если нет, то сколько таких дискет потребуется?
    81. Документ содержит текст из 32 строк по 60 символов в каждой и точечную черно-белую фотографию 10x15 см. Каждый квадратный сантиметр содержит 300 точек, любая точка описывается 4-мя битами. Каков общий информационный объем документа в Кбайтах?
    82. Запросите у пользователя длину ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.
    83. Есть притча о шахматах, где выигравший запросил у могущественного правителя, чтобы ему был выплачен выигрыш зерном пшеницы по следующим правилам: на первую клетку шахматной доски положить одно зерно, на вторую — два зерна, на третью — четыре, на четвертую — восемь и т. д., иными словами, на каждую последующую в два раза больше зерен, чем на предыдущую. Сколько же зерен должен был бы получить выигравший? (Замечание: на каком-то этапе выполнения этого задания возможно переполнение памяти. Подумайте, как обойти это препятствие.)
    84. Кстати, для оценки предыдущего результата еще одно задание. В России ежегодно собирают около 90 млн тонн зерновых. Масса одного зерна около 5 грамм. Сколько зерен в таком урожае, и сколько лет пришлось бы расплачиваться России по условиям предыдущего задания?
    85. Продав квартиру, вы получили $ 22 000 и положили их в банк. Банк начисляет 1% в первый месяц, а каждый следующий — тоже 1%, но уже с получившейся суммы. Сколько денег будет в банке на вашем счету через год? (Нестабильностью нашей экономической системы пренебрегаем.)
    86. Допустим, вы получили наследство $ 1 000 000 и хотите красиво пожить. После долгих раздумий вы решаете, что будете жить на $ 800 в месяц. На сколько лет вам хватит наследства?
    87. Пушка стреляет под углом 30° к линии горизонта. Масса снаряда 30 кг, начальная скорость 500 м/с. Какова будет
    дальность полета снаряда? (Формулу вспомните из курса физики.)
    Нагляднее всего работа с линейными алгоритмами осуществляется в графике, когда мы сразу видим результат своей деятельности. Но для этого нам надо изучить несколько новых операторов.


    Макроязык GML

    Макроязык GML

    Для расширения возможностей машинной графики Бейсика был дополнительно разработан специальный макроязык GML (Graphics Macro Language). Он позволяет строить довольно сложные изображения и быстро выводить их на экран. Каждая команда языка представляет собой латинскую букву, после которой следует один или два числовых параметра (как правило, целых числа). Команды этого языка перечислены в табл. 1.3.

    Моделирование бросания игрального кубика

    Моделирование бросания игрального кубика

    Казалось бы надо пойти по уже проторенному пути первого примера и, раз нам надо получить цифры от 1 до 6, просто умножить rnd(N) на 6. Но, если разобраться, то обнаружится, что при этом мы будем получать числа в диапазоне от 0,0000006 до 5,9999994. Взятая целая часть даст нам числа от 0 до 5. На 6 никак не выходим. Хорошо, умножим на rnd(N) 7. Тогда получим числа от 0,0000007 до 6,9999993. Теперь получается 6, но нам ведь совсем не нужен 0. Что же делать? Очень просто — умножаем на 6 и прибавляем 1!
    CLS
    RANDOMIZE TIMER
    X=INT(RND(1)*6)+1
    ? X
    Так как в дальнейшем нам придется часто сталкиваться с заданиями, требующими использование случайных чисел, то необходимо потренироваться.
    Напишите операторы для получения случайных целых чисел в интервалах.
    171. От 1 до 10.
    172. От -5 до +5.
    173. От 10 до 20.
    174. От 50 до 100.
    175. От -35 до 65.
    Применим теперь оператор случайных чисел на практике и, как всегда, для наглядности начнем с графики.

    Моделирование бросания монеты

    Моделирование бросания монеты

    Нам необходимо при каждом запуске программы случайным образом получать либо число 0 ("решка"), либо 1 ("орел"). Если мы будем просто брать целую часть от полученного при помощи rnd(N) случайного числа, то всегда будем получать 0.
    Попробуем умножить rnd(N) на 2. В результате имеем числа от 0,0000002 до 1,9999998. Если мы теперь будем брать целую часть, то как раз и получим 0 или 1. Программа выглядит следующим образом:
    CLS
    RANDOMIZE TIMER
    X=INT(RND(1)*2)
    IF X=0 THEN ? "У вас выпала решка" ELSE ? "У вас выпал орел"

    Наращивание переменной

    Наращивание переменной

    О том, что такое переменная и об операторе присваивания мы уже говорили. И обращали внимание на такое абсурдное с точки зрения математики выражение
    Х=Х+1
    Применяется оно обычно в Бейсике для работы всевозможных счетчиков, а также для подсчета сумм или произведений рядов чисел. Например, необходимо вычислить сумму всех четных чисел от 1 до 100 включительно. Программа будет выглядеть так:
    CLS S=0
    'Обнуление переменной, где будет накапливаться сумма

    FOR 1=2 TO 100 STEP 2
    S=S+I NEXT I ? "Сумма четных чисел от 1 до 100 равна"; S Программа работает эффективно и просто. Параметром цикла являются сами четные числа, которые нам остается накапливать в переменной S. Разберем алгоритм по шагам:
  • s=0;
  • 1=2;
  • s=0+2=2;
  • 1=4;
  • s=2+4=6;
  • 1=6;
  • s=6+6 и т. д. до 100.
  • На экране в результате увидим надпись:
    Сумма четных чисел от 1 до 100 равна 2550.
    Объяснять здесь вроде больше нечего Иногда лучше решать, чем говорить. Итак, вам необходимо написать программы для нахождения сумм.
    209. Всех чисел, делящихся на 13 в интервале [1; 1000].
    210.

    Окружность

    Окружность

    Следующий этап построения — окружность. Все, что нужно знать об окружности для Бейсика — это координаты ее центра и радиус. Оператор выглядит так:
    CIRCLE (X, Y) , R, С
    где х, y — координаты центра, r — радиус (в экранных точках),
    с — цвет.
    Например, оператор
    CIRCLE (320, 175), 50, 2
    изобразит нам зеленую окружность радиусом 50 точек в центре экрана.

    Оператор цикла WHILE... WEND

    Оператор цикла WHILE... WEND

    Этот оператор позволяет сочетать свойства условного оператора и оператора цикла. С их помощью можно выполнять повторяющиеся действия с заранее неизвестным количеством повторений.
    Работает он следующим образом. Сначала идет оператор while с условием, при котором цикл выполняется. Ключевое слово wend аналогично по своему назначению слову next, т. е. является последней строкой цикла. Всякий раз, доходя до wend, компьютер проверяет, выполняется ли условие, указанное оператором while. Если оно не выполняется, то программа переходит к исполнению операторов, следующих за wend. Если же выполняется, то цикл повторяется снова. Следующая программа, прежде чем допустить пользователя до продолжения работы, запрашивает у него пароль.
    WHILE WORD$О"TERMINATOR"
    INPUT "ВВЕДИТЕ ПАРОЛЬ"; WORD$ 'WEND ? "ПРАВИЛЬНО! ВЫ ДОПУЩЕНЫ К ПРОДОЛЖЕНИЮ РАБОТЫ"
    Вот как эта программа будет работать после запуска:
    ВВЕДИТЕ ПАРОЛЬ? MOON
    ВВЕДИТЕ ПАРОЛЬ? ARNOLD
    ВВЕДИТЕ ПАРОЛЬ? TERMINATOR
    ПРАВИЛЬНО! ВЫ ДОПУЩЕНЫ К ПРОДОЛЖЕНИЮ РАБОТЫ
    155. При помощи оператора while...wend вычислите с— наибольший общий делитель введенных с клавиатуры натуральных чисел х и y.
    156. Определите, какие из представленных ниже операторов Бейсика написаны правильно, а какие нет. В случаях неправильной записи объясните допущенные ошибки. Все операторы рассматривайте по отдельности, потому что они не являются частями одной программы.
  • FOR D=R TO S STEP H
  • IF W=13 THEN ? "ЧЕРТОВА ДЮЖИНА"
  • IF W=13 THEN X=X+1
  • FOR S=2-6 4
  • FOR S=4 TO 12 STEP 2
  • FOR S=12 TO 4 STEP 2
  • WEND S=45
  • Что будет выведено на экран в результате выполнения следующих программ при указанных исходных данных.
    157. Программа:
    INPUT W FOR R=l TO W ? "WAR"
    NEXT R
    IF R=W THEN GOTO 1
    ? "SUNDAY"
    1: "PEACE"
    при w=3.
    158. Программа:
    W=27.6
    1: IF INT(W)=W THEN GOTO 2
    ? "ЧЕРТ ПОБЕРИ!!!"
    W=W * 2 - 5.2
    GOTO 1
    2: ? "МИХАИЛ СВЕТЛОВ"
    A=W -1
    IF A <> 50 THEN 3
    GOTO 1
    3: END
    159. Программа:
    FOR H=5 TO 21 STEP 4
    ? H - 3
    ? H+3 NEXT H
    160. Программа:
    1: ? "НА СТАРТ! ВНИМАНИЕ!" FOR V=5 TO 1 STEP -1 ? V; "СЕКУНД"
    GOTO I
    ? "МАРШ!"
    161. Программа:
    DATA 10, 100, 1000
    READ А, В
    ? В - А
    READ С
    RESTORE
    READ X, Y, Z
    IF C=Y THEN 1
    IF B=Y THEN 2
    GOTO 3
    1: ? "плюс"
    GOTO 3
    2: ? "МИНУС"
    3: END
    162. Программа:
    X=13
    Y=17
    Z=2
    2: IF Z >=5 THEN 1
    ? X, Y, Z
    X=X - 1
    Y=X+Y
    Z=Z+1
    GOTO 2
    1: END
    163. Программа:
    FOR R=l TO 4 9 STEP 6
    W=W+R*2 NEXT R ? R

    164. Программа:
    FOR K=7 TO 28 STEP 7
    ? "УРА!!!" NEXT К ? "ВПЕРЕД!!!"
    165. Программа:
    x=i
    1: ? X
    Х=Х+2
    IF X <= 13 THEN 1
    END
    166. Программа:
    FOR B=l TO 4
    D=B*2
    ? D, В NEXT В
    167. Программа:
    FOR C=2 TO 11 STEP 2
    ? C, C"2 NEXT С ? "ВЗРЫВ!"
    168. Программа:
    X=13 Y=52 Z=99 FOR U=100 TO 1 STEP -2
    IF U=X THEN ? U
    IF U=Y THEN ? U
    IF U=Z THEN ? О NEXT U
    169. Программа:
    WHILE S < 10
    ? S WEND
    170. Программа:
    WHILE D$ О "ИНФОРМАТИКА"
    READ D$, В
    ? "ПРЕДМЕТ"; D$
    ? В WEND DATA МАТЕМАТИКА, 4, ФИЗИКА, З, ИНФОРМАТИКА, 5, ХИМИЯ, 3


    Оператор DO...LOOP

    Оператор DO...LOOP

    Оператор do. . .loop чем-то похож на оператор while. . .wend, но возможности его применения несколько шире — проверяемое условие может быть использовано не только в начале оператора, но и в конце.
    Поэтому возможны четыре различные формы написания оператора:
  • первая форма
    DO UNTIL условие
    тело_цикла LOOP
  • вторая форма
    DO WHILE условие
    тело_цикла LOOP
  • третья форма
    DO
    тело_цикла LOOP UNTIL условие
  • четвертая форма
    DO
    тело цикла
    LOOP WHILE условие
  • Если используется ключевое слово until, цикл будет выполняться, только когда условие имеет значение "ложь".
    При указании ключевого слова while цикл будет выполняться до тех пор, пока условие будет иметь значение "истина".
    Размещение условий в начале или конце цикла приводит к разным результатам: при проверке условия в конце оператора цикла, конструкции, составляющие его тело, будут исполняться хотя бы один раз, в то время как при проверке условия в начале возможен вариант, что цикл исполняться вообще не будет. Например:
    к=о
    ? "Значение К в начале цикла равно"; К DO WHILE К < 10
    К=К+1 LOOP ? "Значение К в конце цикла равно"; К
    Кстати, чему же будет равно значение к в конце цикла?
    220. Напишите программы — одну с оператором do ... loop while, а другую с do ... loop until, — которые бы выводили на экран расположенные по диагонали экрана круги, закрашенные цветами с 1 по 6 (Рисунок 1.64). Параметр цикла — номер цвета.

    Оператор с заранее известным числом повторений

    Оператор с заранее известным числом повторений

    Когда мы работали с графикой, то в одном из заданий вам предлагалось построить мишень — пять концентрических окружностей. Мы это легко сделали, пять раз написав оператор построения окружности circle, изменяя в нем каждый раз радиус.
    Ну а если бы таких окружностей надо было бы 100? Неужели 100 раз писать практически одно и то же? Очень нелегко, даже если пользоваться копированием строк. Неужели нельзя как-нибудь полегче? Конечно можно! Нам на помощь приходит оператор ЦИКЛа FOR. . .NEXT.
    Итак, правила пользования оператором цикла for. . .next:
  • Рассмотреть повторяющиеся действия и выделить в них равномерно изменяющуюся величину (параметр).
  • Дать параметру имя.
  • Определить для параметра начальное значение, конечное значение и шаг изменения, т. е. насколько за один раз увеличивается (или уменьшается) параметр.
  • Написать оператор цикла, состоящий из трех частей:
  • заголовок цикла
  • FOR параметр=нач значение ТО кон_значение STEP шаг
  • тело цикла
  • В теле цикла указываются один или несколько операторов, предназначенных для повторяющихся действий, причем, вместо конкретных значений изменяющейся величины указывают имя параметра.
  • NEXT параметр
  • Рассмотрим пример построения мишени. Действуем по правилам. При рисовании мишени изменяется радиус, это и будет параметр. Обозначим его буквой R. Пусть начальное значение r=20, конечное значение r=60, шаг изменения ?r=io.
    Записываем оператор цикла (предварительно, конечно, включив графический режим):
    FOR R=20 TO 60 STEP 10
    CIRCLE (320, 175), R, 14 NEXT R
    Если мы также четко будем и в дальнейшем следовать этим правилам, то нам не составит труда работать с оператором цикла.
    Необходимо отметить, что можно записывать оператор цикла в одну строку, это не ошибка:
    FOR R=20 TO 60 STEP 10: CIRCLE (320, 175), R, 14: NEXT R
    Но если в теле цикла много операторов, то такая запись будет плохо читаемой.
    Как же работает оператор цикла на примере приведенной выше программы? Встретив заголовок цикла for, программа присваивает параметру начальное значение и переходит в тело цикла. Там находит команду circle, и исполняет ее, подставляя вместо параметра его начальное значение. Встретив команду next программа добавляет к предыдущему значению параметра величину шага, затем проверяет условие, не стало ли значение параметра больше конечного его значения, и, если нет, продолжает выполнение цикла. Если да, переходит к выполнению следующей за оператором цикла команды или заканчивает выполнение программы, если таковой отсутствует.
    Таким образом, последнее значение параметра в нашем примере будет 70, после чего цикл закончится. (Попробуйте к программе добавить строку ? "R=",- r и посмотрите, что появилось на экране.)
    Теперь следует сказать несколько слов о составной части оператора цикла — шаге изменения параметра step. Довольно часто преподаватели провокационно спрашивают, а какие значения может принимать step? Может ли он быть отрицательным? Дробным? Вот ответы на эти вопросы. Шаг может быть любым вещественным числом, за исключением нуля, иными словами, и целым, и дробным, и отрицательным. Но отрицательным он может быть только в случае, если начальное значение параметра больше конечного, т. е. когда мы идем от большего к меньшему. Например, тот же оператор цикла из примера про мишень с тем же результатом можно было бы записать и так:
    FOR R=60 TO 20 STEP -10: CIRCLE (320, 175), R, 14: NEXT R
    Кроме того, если шаг изменения параметра равен единице, то при написании оператора цикла его можно опускать, например:
    FOR №-12 ТО 24 STEP 1
    можно было бы записать просто
    FOR W=12 TO 24
    Но это не касается минус единицы!
    Использование оператора цикла очень наглядно в графике (хотя это, как раз, не главное применение данного очень полезного инструмента). Поэтому, давайте освоим правила управления оператором цикла, выполнив несколько упражнений.
    137. Напишите программу, рисующую на экране горизонтальную линию, состоящую из точек, расстояние между которыми 8 (Рисунок 1.35).

    Орнамент

    Рисунок 1.40. Орнамент

    Орнамент
    Правила построения орнаментов:
  • выявить в орнаменте повторяющийся фрагмент;
  • выделить опорную изменяющуюся величину (параметр), ее начальное, конечное и шаг;
  • дать параметру имя;
  • определить смещение других изменяющихся величин относительно опорной;
  • написать оператор цикла.
  • 152. Напишите программу для рисования орнамента (Рисунок 1.40).
    153. Закрепите успех, написав программу для построения греческого орнамента (Рисунок 1.41).

    Отрезок и прямоугольник

    Отрезок и прямоугольник

    Следующий примитив — отрезок прямой линии. Оператор записывается таким образом:
    LINE (X1, Y1)-(X2, Y2), С
    где XI, yi — координаты начала отрезка; х2, Y2 — координаты конца отрезка; с — как всегда цвет.
    Например, мы хотим изобразить отрезок синего цвета на желтом экране с координатами (Рисунок 1.5).

    Пешеходный переход "зебра"

    Рисунок 1.37. Пешеходный переход "зебра"

    Пешеходный переход
    139. Нарисуйте пятиконечную звезду, вписанную в окружность, как на Рисунок 1.25. Используйте для рисования и закраски операторы цикла.
    140. Постройте пешеходный переход — "зебру", как на Рисунок 1.37.
    141. Нарисуйте фантастический глаз, как на Рисунок 1.38.

    Петля гистерезиса

    Рисунок 1.24. Петля гистерезиса


    Петля гистерезиса



    Построение графиков функций

    Построение графиков функций

    Строить графики в Бейсике мы будем точками, а задавать компьютеру функцию для построения оператором def fn.
    Кроме того, координатная сетка экрана компьютера, как мы должны помнить, является перевернутой по отношению к привычной геометрической. Отсюда и последуют преобразования по приведению координатной сетки к нормальному виду. Я не хочу утомлять читателя длинными математическими выкладками, а призываю поверить на слово. Если же в ком-то проснется любознательность, то разобраться во всем можно самому.
    Итак, оператор def fn определяет для компьютера ту функцию, график которой мы хотим построить. Работает он следующим образом:
    DEF FN имя_функции{параметр_функции)=функция
    Например, определим функцию у = sin x .
    DEF FNY(X)=SIN(X)
    Здесь y — имя функции, х — ее параметр, a sin (X) — непосредственно сама функция.
    Определим функцию

    Правила построения сложных изображений

    Правила построения сложных изображений

    При рисовании придерживайтесь определенных правил, которые перечислены далее.
  • Обязательно начертите свое изображение на бумаге в масштабе.
  • Разбейте изображение на те самые графические примитивы, каждый из которых вы могли бы нарисовать каким-либо уже изученным оператором.
  • Найдите и выделите на рисунке опорные точки — концы отрезков, начала и концы дуг, центры окружностей, эллипсов, отдельные точки (если они есть). Наметьте точки для оператора закраски paint. Если в изображении есть прямоугольники со сторонами, параллельными экрану, то необходимо выделить координаты их базовых диагоналей, по которым они будут строиться.
  • Определите максимальный размер изображения в экранных точках, исходя из размеров экрана.
  • Определите координаты всех опорных точек, значения радиусов окружностей и эллипсов, коэффициенты сжатия эллипсов, углы всех дуг.
  • Определите последовательность построения и закраски замкнутых контуров.
  • Напишите программу, введите ее, снабжая как можно большим количеством необходимых комментариев (можно сначала на бумаге), и отладьте ее.


  • Преобразование строчных и прописных букв

    Преобразование строчных и прописных букв

    Если ваш текст напечатан строчными буквами, вы хотите заменить его прописными или наоборот, не надо заново его набирать. Для этого есть две функции:
    ? ucase$ (строковая_переменная) — преобразует все буквы строки в прописные.
    ? lcase$ (строковая_переменная) — преобразует все буквы стро-ки в строчные.
    К сожалению, эти функции применимы только к латинскому алфавиту.
    Пример:
    CLS
    N$="1 have 5"
    R$=" рублей"
    ? N$;R$
    N1$=UCASE$(N$)
    R1$=UCASE$(R$)
    ? N1$, Rl$
    Результатом работы программы будет следующее:
    I have 5 рублей I HAVE 5 рублей
    Функции эти очень полезны, когда мы просим пользователя ввести один из возможных ответов, например "YES" или "NO", или просто "Y" или "N", а пользователь, естественно, может ввести ответ как строчными, так и прописными буквами. В таком случае, с помощью функций ucase$ или lcase$ сначала надо привести ответ к требуемому виду, а потом проверять условие. Например:
    INPUT "Будете еще играть? (Y/N); N$ IF UCASE$(N$)="N" THEN ?"До свидания"


    Программа "Звездное небо"

    Программа "Звездное небо"

    Изобразим звездное небо пятьюстами белыми точками на черном фоне. Координаты каждой из точек должны быть в пределах по X от 0 до 640 и по Y от 0 до 350.
    SCREEN 9 RANDOMIZE TIMER FOR N =1 TO 500
    X=INT(RND(1)*641)
    Y=INT(RND(1)*351)
    PSET(X, Y) , 15 NEXT N
    Здесь число 500 в заголовке цикла указывает на количество "звезд". Можете поэкспериментировать, изменяя этозначение.
    А теперь мы хотим нарисовать разноцветные "звезды".
    Добавим для этого перед pset оператор случайных чисел для цвета
    C=INT(RND(1)*16)
    а в самом операторе pset вместо цвета 15 укажем цвет с, и можем наслаждаться разноцветными "звездами".
    Но давайте уж доведем дело до конца. Ведь при использовании оператора c=INT(RND(1) *16) у нас будет получаться и 0 — черный цвет, т. е. на черном фоне своеобразные "черные дыры". Давайте избежим и этого, заставив компьютер при получении 0 не брать его в расчет, пока не получится другой цвет:
    SCREEN 9
    RANDOMIZE TIMEP
    FOR N =1 TO 500 X=INT(RND(1)*641) Y=INT(RND(1)*351) 1: C=INT(RND(1)*16) IF C=0 THEN 1 PSET(X, Y) , С
    NEXT N
    Co звездным небом разобрались. Теперь задания.
    176. Когда-то на петербургском 5-м канале была скандально известная информационная программа "600 секунд" с телеведущим Александром Невзоровым. Начиналась она с заставки, где экран телевизора покрывался сеткой разноцветных отрезков прямых линий со случайными координатами концов (рис 1.43). Попробуйте воспроизвести эту заставку и покажите ее своим старшим родственникам или друзьям. Это навеет на них воспоминания.

    Рамка с конвертом

    Рисунок 1.9. Рамка с конвертом

    Рамка с конвертом
    Рамка рисуется двумя операторами line с bf, конверт — подумайте сами. Координаты тоже выберите сами. Только не рисуйте слишком мелкие объекты.

    Разноцветные круги

    Рисунок 1.64. Разноцветные круги


    Разноцветные круги






    Разноцветные окружности

    Рисунок 1.45. Разноцветные окружности


    Разноцветные окружности



    Разноцветные прямоугольники

    Рисунок 1.44. Разноцветные прямоугольники


    Разноцветные прямоугольники



    Разветвляющийся алгоритм

    Разветвляющийся алгоритм

    Ну что ж, надеюсь, что с линейными программами особых трудностей у вас не возникло. Пиши команды подряд, хотя, конечно, все сначала надо было продумать, и изображения у нас получались просто великолепные!
    Однако надо двигаться вперед. А дальше у нас — разветвляющийся алгоритм. Что это такое, мы уже говорили. Например, витязь на перепутье: "Если налево пойдешь, коня потеряешь, если прямо пойдешь — смерть найдешь", ну и т. д.
    А вот как он реализуется на практике в Бейсике, мы поговорим сейчас.
    Ветвление в алгоритме и программе осуществляется двумя способами:
  • на основе безусловного перехода;
  • на основе условного перехода. Начнем с первого.


  • Решетка

    Рисунок 1.36. Решетка


    Решетка



    Мишень Рисунок 15. Снеговик

    Рисунок 14. Мишень



    Снеговик Рисунок 16. Цилиндр

    Рисунок 16. Цилиндр


    Снеговик Рисунок 16. Цилиндр



    CD-MAN

    Рисунок 20. CD-MAN

    CD-MAN
    Построим изображение CD-MAN (Рисунок 1.20). Радиус "глаза" и координаты его центра определим исходя из здравого смысла.
    Хотя на первый взгляд кажется, что данное построение очень сложно, но на самом деле мы знаем уже достаточно инструментов, чтобы сделать это двумя изящными легкими движениями. Для начала, действительно давайте определим радиус "глаза". Диаметр его составляет примерно пятую часть радиуса "туловища", стало быть радиус — одну десятую, т. е. 5. Координаты центра примерно Х=215, Y=85. Теперь займемся углами дуги "туловища". Угол а определяется довольно легко — он равен 45°, а вот для определения угла ь надо пройти почти всю тригонометрическую окружность — первая четверть, вторая четверть — еще +90°, третья четверть — еще +90°, и, наконец, еще +45°. Итого Ь=315°. Ну что ж, все данные для построения есть. Приступим.
    Rem "туловище"
    CIRCLE (200, 120), 50, 1, -45*3.14/180, -315*3.14/180
    CIRCLE (215, 85), 5, 1 Rem "глаз" >
    Еще раз напоминаю, что в программировании главное — это предварительная подготовка всех исходных данных!
    Теперь рассмотрим рисование дуг эллипсов.
    Когда мы говорили о построении самих эллипсов, то в операторе было несколько странно видеть три указанных подряд запятых. Сейчас все стало понятно — это место для углов а и ь. Остальное — аналогично дугам окружности. Итак, оператор построения дуг эллипса таков:
    CIRCLE (X, Y) , R, С, a, b, К

    Месяц

    Рисунок 21. Месяц

    Месяц
    В качестве примера нарисуем "светит месяц, светит ясный" (Рисунок 1.21).
    Внешняя граница месяца — это дуга окружности, а внутренняя — дуга эллипса. Центр у них общий (Х=500, Y=70). Коэффициент сжатия эллипса равен 2. Начало и конец дуг тоже одинаковы (а=4,71, Ь=1,57). Радиус окружности возьмем 50, а вот с радиусом эллипса придется помучиться, поскольку, как мы уже говорили, экранные точки имеют разные ширину и высоту, определяющиеся примерным соотношением 3:4. Поэтому в качестве радиуса эллипса возьмем значение 50x3/4. Тогда месяц построится следующим образом:
    CIRCLE (500, 70), 50, 14, 4.71, 1.57 CIRCLE (215, 85), 50*3/4, 4.71, 1.57, 2
    Rem дуга окружности Rem дуга эллипса
    Закраска
    Уже очень хочется попробовать свои силы? Еще немножко нужно подождать. Ведь мы хотим все делать красиво. И нам нужно изучить еще один шаг — закраску замкнутых контуров.
    После того, как мы научимся закрашивать, у нас в руках будут практически все необходимые инструменты для рисования сложных объектов, разработки больших линейных алгоритмов.
    Итак, оператор закраски имеет следующий синтаксис:
    PAINT (X, Y) , Cl, C2
    где х, y — координаты любой точки внутри закрашиваемого' контура, ci — цвет, которым закрашивается контур, С2 — цвет самого контура. Если эти цвета совпадают, то достаточно указать С1.
    Правила закраски:
  • Контур должен быть замкнут. Если в нем будет прокол хотя бы в одну экранную точку, то вся "краска" вытечет и зальет экран.
  • Контур должен быть одноцветен. Если составляющие даже замкнутого контура разных цветов, то для компьютера эта ситуация аналогична разрыву. Будет закрашен весь экран.
  • Координаты точки закраски должны лежать внутри контура.
  • Рекомендуется закрашивать контур непосредственно после того, как он нарисован. Часто рисуют все изображение, потом начинают закрашивать разные области, а линии разного цвета пересекаясь дают разрывы, и вот уже экран затекает самыми разными красками.
    Если точка закраски попала вне контура, то закрасится весь экран, за исключением самого контура (иногда это бывает нужно, но подобные случаи редки).
    Если точка закраски попала на контур, то ничего не закрасится.
    Есть общая рекомендация из личного опыта автора, немного удлиняющая процесс отладки программы, но дающая 100%-ный правильный результат закраски. Перед закраской вместо оператора paint лучше написать оператор pset с теми же координатами, но какого-нибудь контрастного цвета, чтобы ее было хорошо видно. Запустить программу и убедиться, что все вышеназванные правила соблюдены и точка находится внутри закрашиваемого контура. После этого возвращаемся в программу, изменяем оператор pset на paint.
    Рассмотрим пример закраски месяца из предыдущей программы белым цветом. После того как мы его нарисовали, у нас добавится всего одна команда:
    PAINT(530, 70), 15, 14
    Откуда взялось число 530 в качестве координаты X, я думаю, понятно, если посмотреть на рисунок, вспомнить координаты центра и радиус.
    Ну что ж, а теперь упражнения на дуги и закраску. В них изображения уже более сложные, требующие достаточно основательной предварительной подготовки. Не забывайте о ней!
    98. Напишите программу, выводящую на экран образ, аналогичный примеру CD-MAN, изменив лишь углы и координаты центра "глаза" (Рисунок 1.22).
    Закрасьте "туловище" одним цветом, а "глаз" — другим.

    Эмблема футбольной команды "Зенит"

    Рисунок 29. Эмблема футбольной команды "Зенит"


    Эмблема футбольной команды






    Основные команды перемещения языка GML

    Рисунок 30. Основные команды перемещения языка GML

    Основные команды перемещения языка GML
    Для приведения в действие последовательности команд языка GML необходимо использование оператора draw.

    Например, команда
    I DRAW "R50 D50 L50 U50"
    изобразит нам квадрат, начиная от последней графической точки.
    Если такой точки не было, и вы сразу начинаете строить изображение с помощью оператора draw, to по умолчанию исходной точкой считается центр экрана.
    Если вы подготовите сначала какое-либо изображение в строковой переменной, то потом его можно будет многократно вызывать на экран. Для этого используется функция "х". Ее работу рассмотрим на примере.
    N$="R50 D50 L50 U50"
    DRAW "C14 X"+VARPTR$ (N$)
    DRAW "BM500, 50 C2 X"+VARPTR$(N$)
    С помощью первого оператора запоминаем последовательность команд построения квадрата в строковой переменной n$. Вторым оператором задаем цвет 14 и сообщаем компьютеру командой х, что необходимо выполнить последовательность команд n$. Это делает функция varptr$. Последним оператором перемещаемся без рисования в точку с координатами 500, 50, меняем цвет на 2 и снова выполняем последовательность команд n$.
    В результате на экране в центре и в правом верхнем углу должны появиться одинаковые разноцветные квадраты со стороной 50.
    Совместное использование фафических примитивов и оператора draw позволит вам рисовать очень качественные изображения на вашем экране.
    108. Для того чтобы опробовать эти возможности, нарисуйте елочку (Рисунок 1.31).

    Движение точки по экрану под углом 45°

    Рисунок 32. Движение точки по экрану под углом 45°

    Движение точки по экрану под углом 45°
    SCREEN 9
    Х=300: Y=175 ' начальные координаты точки
    DX=1: DY=1 ' приращение координат X и Y.
    ' Так как мы их сделали положительными, ' координаты X и Y будут увеличиваться, ' а, следовательно, точка сначала будет двигаться 1 вправо-вниз под углом 45 градусов 1: PSET (X, Y), 14 ' вывод точки на экран PSET (X, Y), 0 ' стирание точки цветом фона IF X=0 OR X=64 0 THEN DX=-DX ' в случае достижения точкой
    1 вертикальных сторон экрана, приращение по X меняется ' на противоположное, а значит точка начнет двигаться ' в обратную по X сторону IF Y=0 OR Y=350 THEN DY=-DY ' в случае достижения точкой
    ' горизонтальных сторон экрана, приращение по Y ' меняется на противоположное, а значит точка ' начнет двигаться в обратную по Y сторону X=X+DX: Y=Y+DY ' изменение координаты точки GOTO 1 ' переход на метку 1, где происходит
    ' рисование точки
    Не забывайте про паузу!
    130. Замените в предыдущей программе точку на закрашенную окружность. Получится подобие бильярдного стола. А еще можно сопровождать удар шарика о границу экрана звуковым сигналом веер, который нужно добавить после изменения приращения на противоположное.
    131. Усложним задачу. На экране появляется прямоугольник, от которого точка тоже должна отражаться (рис 1.33).

    Движение точки по экрану с препятствием

    Рисунок 33. Движение точки по экрану с препятствием

    Движение точки по экрану с препятствием
    Допустим, координаты углов прямоугольника следующие:
  • левый верхний 100, 180;
  • правый верхний 300, 180;
  • левый нижний 100, 230;
  • правый нижний 300, 230.
  • Тогда, по сравнению с предыдущим примером, к условиям отражения от сторон экрана добавятся еще четыре условия отражения от сторон прямоугольника. Мы приведем два — для верхней и левой сторон, а вы напишите еще два — для нижней и правой.
    Для верхней:
    IF Y=180 AND 100<Х<300 THEN DY=-DY
    To есть если точка достигла горизонтали 180, а по X попала в интервал ] 100; 300[, то изменяем направление движения по Y на противоположное.
    Для левой:
    IF X=100 AND 180 Рассуждения аналогичны.
    132. Теперь вы готовы к более объемному и сложному заданию. Называться оно будет "Муха в графине". Сначала на экране вы рисуете прямоугольный графин с горлышком (Рисунок 1.34).
    Затем располагаете там точку и заставляете ее двигаться внутри графина, отражаясь от его стенок (будет интересней, если вы не станете ее стирать, тогда мы сможем видеть траекторию ее полета). Меняя начальное расположение точки, можно добиться, что через какое-то время она вылетит из
    графина. Пусть в этот момент на экране появится надпись "Ура! Я на свободе!", а муха продолжит полет, отражаясь от сторон экрана. Графин можно сделать закрашенным.

    Муха в графине

    Рисунок 34. Муха в графине

    Муха в графине
    133. Если вы обратили внимание, "муха" при полете слегка пробивает стенки графина. Что нужно изменить в условиях, чтобы этого избежать? Сделайте из "мухи" шарик, и снова добейтесь того, чтобы он не портил стенки графина.
    Давайте сделаем простейший графический редактор. У некоторых в детстве была, наверное, и-грушка "Волшебный экран", где можно было крутить колесики и рисовать отрезками прямых линий. Почему бы то же самое не сделать на компьютере? Для этого нам понадобится использование оператора inkey$, который ожидает нажатия любой символьной клавиши и запоминает ее значение. Например:
    CLS
    1:K$=INKEY$ ? К$ GOTO 1
    На экране будет воспроизводиться символ той клавиши, которую вы нажмете (попробуйте поставить после print k$ точку с запятой и посмотрите, что изменилось).
    Теперь, совместно используя inkey$ и условный оператор, мы можем сделать полезную прикладную программу-развлечение для младших друзей. Приведем ее фрагмент.

    SCREEN 9
    Х=300: Y=200: С =15
    начальные координаты и цвет точки рисования.
    1 Вы можете задать им свои, ' произвольные значения
    1: PSET(X,Y), С
    K$=INKEY$
    IF K$="w' THEN Y=Y -1 ' эта строка заставляет программу
    ' после нажатия клавиши "w" ' уменьшить координату Y на 1, ' т. е. осуществить передвижение точки ' на одну экранную единичку вверх
    Rem Здесь вы программируете другие клавиши для движения
    Rem в другие стороны, а также и изменение цвета,
    Rem и возможно, стирание. Все в ваших руках!
    GOTO 1 ' зацикливание программы на постоянный опрос ' клавиатуры
    Теперь, когда программа готова, нарисуйте сами с ее помощью какую-нибудь осмысленную картинку — домик в деревне, или звездные войны, или что хотите.

    Замечание
    Хорошо бы предусмотреть рисование цветом фона для перемещения точки без следа. А чтобы потом определить, где находится точка, достаточно изменить ее цвет.
    Оператор выбора
    Для организации меню, т. е. выбора из нескольких возможностей, применяется оператор выбора, который позволяет, в зависимости от значения переменной, делать те или иные действия.
    Конструкция оператора несколько тяжеловесна, но ничего страшного в ней нет.
    Она выполняет один из нескольких блоков операторов в зависимости от значения выражения.
    SELECT CASE тест_выражение CASE список_выражений1
    [блок_ операторов_1]
    [CASE список_выражений2
    [блок операторов_2]}
    [CASE ELSE
    [блок_операторов_n]} END SELECT

    Здесь тест_выражение — любое числовое или строковое выражение; список_выражений1, список_выражений2 — ОДНО ИЛИ несколь ко выражений для сравнения с параметром тест_выражение. В выражении ключевое слово is должно стоять перед любым знаком отношения. блок_операторов_1, блок_операторов_2, блок_ операторов_n — один или несколько операторов в одной или нескольких строках.
    Аргументы списка выражений могут принимать любую из следующих форм или их комбинацию и должны разделяться запятыми:
  • выражение [, выражение] . . .
  • выражение ТО выражение
  • IS оператор_отношения выражение
  • Здесь выражение — любое числовое или строковое выражение, совместимое С параметром тёст_выражение\ знак_отношения — один из знаков отношения <, <=, >, >=, <> или =.
    Рассмотрим пример:
    CLS
    INPUT "Введите уровень риска (1-5): "; RISK SELECT CASE RISK CASE IS >= 5
    PRINT "Максимальный риск, шансов на возвращение
    практически нет." PRINT "Пишите завещание." CASE 2 ТО 4
    PRINT "Высокий риск, шансов на возвращение немного." PRINT "Проверьте снаряжение, оружие и припасы." CASE 1
    PRINT "

    Рисунок 4. Размеры

    Рисунок 4. Размеры и координаты экрана в режиме screen 9

    Рисунок 4. Размеры


    Греческий орнамент

    Рисунок 41. Греческий орнамент


    Греческий орнамент



    Отрезок прямой линии

    Рисунок 5. Отрезок прямой линии

    Отрезок прямой линии
    Программа будет выглядеть так:
    screen 9
    COLOR 1, 14
    LINE (100, 300)-(600, 50), 1
    Не секрет, что по диагонали прямоугольника можно всегда его достроить. Известно это и Бейсику. Поэтому можно одним оператором построить прямоугольник со сторонами, параллельными экрану. В этом случае оператор line имеет следующий вид:
    LINE (XI, Y1)-(X2, Y2), С, В
    То есть к обычному оператору отрезка добавляется буква (это именно буква, а не число!) в — от английского слова box (ящик, коробка). А координаты — это начало и конец любой из диагоналей прямоугольника. Возьмем предыдущий пример и добавим в операторе line букву в:
    LINE (100, 300)-(600, 50), 1, В
    В результате выполнения у нас получится уже не отрезок, а прямоугольник, причем сама диагональ видна не будет (Рисунок 1.6).

    Орбиты"

    Рисунок .50. "Орбиты"

    Орбиты
    194. Создайте программу, выводящую на экран "труба" — окружности одного радиуса, выходящие из левого верхнего угла экрана и идущие под углом 45° вправо вниз (Рисунок 1.51). Окружности нарисованы одним цветом, а закрашены другим.

    Труба" по диагонали

    Рисунок 52. "Труба" по диагонали

    Труба
    195. Напишите программу, аналогичную предыдущей, только окружности разместите из левого верхнего угла в правый нижний по диагонали экрана (Рисунок 1.52). Надо использовать соотношения сторон экрана.
    196. С помощью Бейсика постройте две лестницы (Рисунок 1.53 и 1.54).

    Пирамида: вид спереди

    Рисунок 55. Пирамида: вид спереди
    Пирамида: вид спереди

    Пирамида: вид спереди

    Пирамида: вид сверху

    Рисунок 56. Пирамида: вид сверху

    199. Напишите программу построения "эллипсирующих окружностей" (Рисунок 1.57).

    Эллипсирующие окружности"

    Рисунок 57. "Эллипсирующие окружности"


    Эллипсирующие окружности






    Лоскутный ковер

    Рисунок 58. Лоскутный ковер

    Лоскутный ковер
    201. Заполните экран светофорными кругами (Рисунок 1.59). Самые большие круги красные, средние — желтые, маленькие — зеленые.

    Светофорные круги

    Рисунок 59. Светофорные круги

    Светофорные круги
    202. Воспользовавшись предыдущим заданием, замените окружности на квадраты — получатся "светофорные" квадраты.
    203. Изобразите шахматную доску.
    Мы всё работаем с графикой. Это наглядно. Но не будем забывать о том слове, от которого произошел термин "компьютер" — вычислять.
    204. Напишите программу, выводящую на экран таблицу умножения от 2 до 10 в следующем виде (Рисунок 1.60).

    Прямоугольник со сторонами, параллельными экрану

    Рисунок .6. Прямоугольник со сторонами, параллельными экрану


    Прямоугольник со сторонами, параллельными экрану



    Таблица умножения

    Рисунок 60.



    Электронный будильник

    Рисунок 61. Электронный будильник

    Электронный будильник
    А теперь два интегрированных задания, где надо применить знания, приобретенные вами ранее.
    207. Напишите программу "Уничтожение астероида". Экран заполняется пятьюстами звездами. Астероид изображается красным кругом белым контуром, центром в точке 470, 160
    и радиусом 10. По траектории функции y = 0,5sin2x + 2cos-x/2
    от правой стороны экрана движется боевой звездолет, изображаемый зеленым кругом с желтым контуром и радиусом 3. Каждый момент продвижения сопровождается проверкой
    условия, не находится ли звездолет в опасной близости от астероида (опасным считается расстояние менее 50 экранных точек). Если это расстояние в некоторый момент времени стало меньше критического, то звездолет уничтожает астероид, т. е. он взрывается (см. задание 179). На экране появляется торжествующая надпись. Все радуются (в том числе и учитель).
    Совет
    Расстояние между двумя точками на плоскости вычисляется по формуле: корень квадратный из суммы квадратов разностей координат Х1, Х2 и Y1, Y2. Я специально не пишу эту формулу. Проверяем понимание сложных инструкций.
    208. Это задание носит прикладной характер и позволяет опытным путем вычислить число п. Да, безусловно, практически все из вас знают это число с точностью по крайней мере до двух знаков. Но предлагаемый метод очень хорош. Называется он методом Монте-Карло. Монте-Карло — европейская столица игорного бизнеса, а значит там владычествует Его Величество Случай. Вот "мы и попробуем поставить его себе на службу.
    Сначала забудьте, чему равно п и послушайте теорию вопроса. Представьте себе окружность радиусом R = \ , вписанную в квадрат. Из этого следует, что сторона квадрата будет 2R , а его площадь SK = (2R)2 =4R2. Площадь круга SO = kR2 . Далее берем и равномерно посыпаем квадрат песком. Затем нанимаем бригаду рабочих, которые считают, сколько песчинок всего (N1) и сколько из них попало в круг (N2). Потом составляется простая пропорция — площадь квадрата так относится к площади круга, как общее количество песчинок к количеству песчинок попавших в круг.
    Отсюда сенсационный вывод — радиус окружности не имеет никакого значения, она должна быть лишь вписана в квадрат (Рисунок 1.62).
    Но где ж мы найдем песок, а главное тех, кто все это будет считать? Поэтому поставим компьютерный эксперимент. Нарисуем квадрат и впишем в него окружность. Координаты опорных точек (если сами рисовали) знаем. Уравнение окружности X2 +Y2 = R2 тоже знаем. Задаем цикл до 1000, в котором случайным образом определяем координаты "песчинок" так, чтобы они лежали внутри квадрата. Тут же проверяем условие, а не попала ли "песчинка" в круг (используя уравнение окружности), и если попала, подсчитываем их количество. Кроме того, рисуем их на экране разными цветами (попавшие и не попавшие). По окончании цикла подсчитываем и выводим на экран число п. Понятно, что чем больше количество "песчинок", тем более точным будет результат. Для того чтобы знать, когда закончится эксперимент, рекомендуется выводить на экран счетчик "песчинок" (как мы делали с хронометром). Но, все-таки, экспериментировать с миллионом "песчинок" не надо — замучаетесь ждать сами, да и компьютер, хотя и железный, но все же живой.

    Вычисление числа я методом Монте-Карло

    Рисунок 62. Вычисление числа я методом Монте-Карло


    Вычисление числа я методом Монте-Карло






    Так надо делать!

    Рисунок 7. Так надо делать!

    Так надо делать!
    К сожалению, опыт автора показывает, что многим из вас лень этим заниматься — отсюда пустая трата сил и времени и очень неказистые результаты.
    Перейдем к упражнениям.
    88. Напишите программу, изображающую на экране четыре точки разного цвета в центре желтого экрана. Точки расположите квадратом на расстоянии друг от друга 5 точек.
    89. Напишите программу, выводящую ромб с диагоналями (Рисунок 1.8).

    ок должен быть крупным

    Рисунок ок должен быть крупным и наглядным. Это любят преподаватели!
    92. Создайте программу, выводящую на одном экране куб и пирамиду (Рисунок 1.10).


    Рисунок сутствует, возврат гарантирован."

    Рисунок сутствует, возврат гарантирован." PRINT "В Вас отсутствует дух авантюризма,
    это слишком скучно." END SELECT
    Еще пример. По заданному номеру дня недели требуется напечатать его название:
    CLS
    INPUT "Введите номер дня недели"; N SELECT CASE N CASE 1
    ? "Понедельник" CASE 2
    ? "Вторник" END SELECT


    Ну что ж, теория без практики суха. Задания.
    134. Напишите программу, которая выводит на экран меню, содержащее список трех поэтов под номерами, затем запрашивает у пользователя номер поэта и выводит на экран какое-нибудь его четверостишие, после чего возвращается в меню. Последним пунктом меню предусмотреть выход из программы.
    135. В восточных календарях принят 60-летний цикл, состоящий, в свою очередь, из пяти 12-летних подциклов. Под-циклы обозначались цветом: зеленый, красный, желтый, белый и черный. Внутри каждого подцикла годы носили названия животных: крысы, быка, тигра, кролика (зайца или кота), дракона, змеи, лошади, овцы (барана или козы), обезьяны, петуха, собаки и свиньи. Создайте программу с использованием операторов выбора, запрашивающую номер года нашей эры и печатающую его название по восточному календарю. Для проверки: 1966 г. — год красной лошади, 1984 г. — зеленой крысы.
    136. Усложненный вариант предыдущего задания. Теперь требуется определить не только название введенного с клавиатуры года, но и год наступления "светлого будущего", до которого вы, безусловно, доживете! Делаем это поэтапно. Вот примерный словесный алгоритм. После введения исходного четырехзначного года с клавиатуры вам необходимо выделить составляющие его цифры и записать их в переменные А1, А2, аз и А4. (Если в номере года есть нули, то в соответствующие переменные записать 4.) Затем необходимо взять от них синусы по модулю. Из полученных значений выделить по две цифры после запятой и сложить их. Если сумма больше либо равна 10, то сложить еще раз. Должно полу-
    читься 4 цифры, из которых надо составить четырехзначное число. Это и будет номер года наступления светлого будущего. Осталось определить его название по восточному календарю и вывести результаты на экран. Для проверки: при исходном годе 1986 годом светлого будущего будет 3589.


    Ромб с диагоналями

    Рисунок 1.8. Ромб с диагоналями

    Ромб с диагоналями
    Пропущенные координаты определите сами, зная свойства ромба.
    90. Создайте программу, рисующую Российский флаг'. Флаг состоит из трех полос, поэтому рисовать их надо, используя
    Есть, кстати, мнемоническое правило для запоминания цветов нашего флага — это магическое слово БеСиК — БЕлый, СИний, Красный — и на Бейсик похоже, и не забудешь никогда.
    команду line с параметром bf. Здесь главное четко рассчитать координаты диагоналей всех трех прямоугольников.
    91. Напишите программу, выводящую рамку с конвертом (Рисунок 1.9).

    "Рупор"

    Рисунок 1.49. "Рупор"


    Действуем по правилам. Все окружности лежат на одной горизонтали, т. е. у их центров меняются не координаты Y, а координаты X. Кроме этого, они имеют разный радиус. Причем он
    изменяется не спонтанно, плавно увеличиваясь. Итак, обозначим изменяющиеся величины: X — координата центров окружностей по оси абсцисс, R — радиус окружностей.
    Назначим независимым аргументом координату X. Попробуем установить закономерность изменения радиуса R от аргумента X. X изменяется от 0 до 640. Допустим, шаг изменения 10. Обычно устанавливают такое взаимоотношение X и R:
    R=X
    Но в этом случае получится, что радиус последней окружности будет равен 640, диаметр, соответственно, 1280. А ведь экран высотой всего 350! Значит, если мы хотим видеть на экране все наши окружности, то последний радиус не должен превышать 175, а лучше был бы меньше. Попробуем избрать такое соотношение:
    R=X/4
    Максимальное значение радиуса в таком случае равно 160. Напишем программу:
    SCREEN 9
    FOR Х=0 ТО 640 STEP 10
    CIRCLE (X, 175), Х/4, 15 NEXT X
    Посмотрите, что получается на экране. Похоже? Не совсем, скажете вы и будете правы, потому что последние окружности выходят за пределы экрана справа. Но с этой проблемой я предлагаю разобраться вам самостоятельно.
    Потренируемся.
    193. Напишите программу, изображающую "орбиты", соприкасающиеся все в крайней правой точке и имеющие разные радиусы (Рисунок 1.50).

    Символы и строки

    Символы и строки

    Когда мы говорили о дружественном интерфейсе, то упоминали о так называемых строковых переменных, имена которых отли чаются от обычных добавлением знака $. В таких переменных могут содержаться как отдельные символы, так и их последовательности длиной до 255 символов. К ним в Бейсике применимы специальные операции, о которых мы здесь и расскажем.
    Для начала надо немного отвлечься, чтобы сообщить о том, что каждый символ, представленный на клавиатуре для компьютера переводится в числовой код. Эти коды объединены в стандартную международную таблицу кодов ASCII (см. Приложение). Коды с 0 по 32 не имеют изображения на экране и служат для функций управления (пробел, клавиши управления курсором и т. д.). Далее следуют знаки препинания, цифры, строчные и прописные буквы латинского алфавита и другие символы, которые вы можете найти на клавиатуре. Всего их 128. А еще 128 кодов (от 129 до 255) служат для расширения возможностей клавиатуры, например для генерации национальных символов — в нашем случае для кириллицы. Учить их наизусть ни в коем случае не надо — они есть в таблице. Но если ее не окажется под рукой, то вы должны определить код любого символа, используя специальные функции asc и chr$.


    Случайные числа

    Случайные числа

    В процессе изучения циклических алгоритмов уместно рассказать о генерации случайных чисел программным путем. При кажущейся простоте получить случайные числа не так легко. Попробуйте продиктовать своему другу 100 цифр. В идеале каждая из них должна бы повториться по теории вероятности около 10 раз, но у каждого человека встречаются какие-то пристрастия к тем или иным цифрам и в ряду из сотни цифр не будет абсолютной случайности. Получить на компьютере случайные числа тоже было нелегко, но в конце концов это удалось. В качестве основы для создания какой-либо последовательности случайных чисел служат показания встроенного в компьютер таймера. А поскольку они в каждый момент времени различны, то мы и получаем великое множество практически неповторяющихся случайных чисел в заданном диапазоне.
    Случайные числа нужны прежде всего в компьютерных играх, чтобы обеспечить непредсказуемость игры для человека. Кроме того, они используются в учебных задачах и моделировании различных математических, физических и других процессов на компьютере.
    Итак, новый оператор rnd.
    Чтобы получать случайные числа, вы прежде всего должны инициировать процесс генерации последовательности случайных чисел компьютером при помощи оператора randomize timer. Он указывается в программе только один раз и сообщает компьютеру, что надо создавать случайные числа, беря за основу показания таймера.
    Затем, чтобы получить из этой последовательности какое-либо значение, мы должны использовать оператор rnd(n), который выдает случайное число в диапазоне от 0 до 1. Минимальное полученное число будет 0,0000001, а максимальное 0,9999999. В качестве N может служить любое целое или действительное число. Этот параметр также влияет на выбор компьютером случайных чисел. Например, программа
    RANDOMIZE TIMER X=RND(1) ? X
    может вывести на экран число 0,367423, а может 0.0034289, а может 0,8912314. Каждый раз при запуске программы мы будем видеть новое значение.
    Но часто встает проблема получения случайных чисел в заданном диапазоне. Как это сделать, мы рассмотрим на примерах.

    Сравнение строковых переменных

    Сравнение строковых переменных

    Над строковыми переменными тоже можно производить операции сравнения. Больше будет та переменная, которая начинается с символов, более близких к концу алфавита, т. е. имеющих больший код, а если символы совпадают, то более длинное слово. Строковые переменные считаются идентичными, если они полностью тождественны. Если они отличаются пробелами в начале или конце, то они уже не идентичны!
    Например,
    "DOG" > "CAT", но "ELEFANT" < "MOUSE" "TIGER2" > "TIGER1" "Ml 6 " > "Ml6"
    229. Напишите программу, проверяющую, является ли введенное слово или фраза палиндромом, т. е. читающемся слева направо и справа налево одинаково (например, шалаш, казак, А роза упала на лапу Азора). Программа сообщает "Да, это палиндром", или "Нет, это не палиндром" и выводит на экран введенный текст в варианте слева направо и справа налево. Здесь необходим цикл посимвольного чтения от N (длины текста) до 1.
    230. Напишите программу, подсчитывающую количество слогов во введенном слове.
    231. В операторе data перечислены 10 слов. Напишите программу, которая:
  • напечатает все слова из списка, отличные от слова "SUN";
  • напечатает слово, ближайшее к началу алфавита в списке (считаем, что все слова различны; выполнять аналогично поиску минимального из ряда чисел);
  • слово, составленное из последних символов всех слов списка;
  • все слова из списка, содержащие три буквы.
  • 232. В тексте, содержащем между словами от 1 до 3 пробелов, оставить только по одному.
    233. Подсчитать, сколько раз входит каждый символ в данную строку.
    234. Написать программу шифратор и дешифратор, ставящую в соответствие русским символам соответствующие латинские и наоборот (аналог так называемого конвертора).


    Команды языка GML

    Таблица 1.3. Команды языка GML

    Команда Действие
    Un Переместиться вверх на n точек
    Dn Переместиться вниз на n точек
    Ln Переместиться влево на n точек
    Rn Переместиться вправо на n точек
    En Переместиться по диагонали вверх и вправо на n точек
    Fn Переместиться по диагонали вниз и вправо на n точек
    Gn Переместиться по диагонали вниз и влево на n точек
    Hn Переместиться по диагонали вверх и влево на n точек
    M x, у Переместиться в точку с координатами х, у
    M ±n, im Переместиться по отношению к текущей позиции на ±n точек по оси X и на +гл точек по оси Y. Знаки плюс и минус проставлять обязательно
    At Поворот изображения против часовой стрелки вокруг точки, с которой начиналось рисование на 90°xt (te0, 1,2,3). Действует во всех дальнейших командах до нового назначения
    Cn Задание нового цвета. Действует во всех дальнейших командах до нового назначения
    Sn Расстояние, указанное в командах перемещения, умножается на п/4 (0
    В Переместиться в новую позицию при помощи следующих за в команд, но рисование не производить. Отменяется установкой цвета С
    N Выполнить следующую команду перемещения и вернуться в исходную позицию. Может предшествовать любой команде перемещения
    Pcl,c2 Команда заполнения контура цветом, cl — цвет заполнения, с2 — цвет контура. Должны соблюдаться все вышеизложенные правила закраски, и курсор должен находиться внутри закрашиваемого контура
    Основные команды перемещения легко запомнить с помощью Рисунок 1.30.

    Таблица умножения Прежде чем выдать

    ? "Поспите 10 сек."
    SLEEP 10
    ? "Подъем! Учитель пришел!"
    Если значение секунд указано 0 или не указано вовсе, то программа будет ожидать нажатия любой клавиши, например:
    ? "Прочитайте внимательно нижеследующее слово и нажмите
    любую клавишу, когда надоест..." ? "Вы — просто гений!" SLEEP ? "Но от скромности вы не умрете..."
    205. Итак, используя полученные знания про вложенные циклы и оператор sleep, напишите программу, которая в центре чистого экрана будет выводить показания хронометра — часы, минуты и секунды, разделенные двоеточием, начиная с 0 час. 0 мин. 0 с. Отрегулируйте свой хронометр, чтобы он шел правильно.
    206. Усложним предыдущее задание. Нарисуем будильник, сделаем в нем два поля. В одно выведем текущую дату, а во второе — наш уже получившийся хронометр. Если очень захочется, то можно сделать из него будильник, добавив в нужный момент оператор веер, который производит отрывистый не совсем приятный звук (Рисунок 1.61).

    Телеграф

    Рисунок 1.65. Телеграф


    Телеграф






    Точка

    Точка

    Первый из графических примитивов — точка. Для изображения точки используется оператор pset со следующим синтаксисом:
    PSET(X, Y) , С
    где х и y — координаты точки на экране, а с — ее цвет. Если цвет не указан, то точка будет изображена последним установленным цветом (это касается и всех прочих графических примитивов).
    Рассмотрим пример.
    SCREEN 9
    PSET(320, 175),4
    На черном экране в этом случае появится красная точка в центре.
    Сразу же хочется заметить, что из эстетических соображений лучше менять цвет фона, потому что черный экран выглядит мрачно. Например:

    SCREEN 9
    color, 1
    PSET (320,175) ,4
    Теперь та же точка будет в центре синего экрана, уже лучше!

    Тригонометрическая окружность

    Рисунок 1.18. Тригонометрическая окружность

    Тригонометрическая окружность
    Взглянув на тригонометрическую окружность, мы всегда довольно легко сможем определить начало и конец нужных нам
    дуг. Более того, Бейсик позволяет использовать в качестве операндов в своих командах арифметические выражения. Поэтому, например, если вы знаете угол начала дуги — 30°, но затрудняетесь определить его на тригонометрической окружности, то можете в соответствующем месте оператора дуги написать
    3.14*30/180
    и пусть компьютер сам считает.
    Приведем несколько простых примеров.
    Построим верхнюю половину окружности синего цвета с радиусом 30 (Рисунок 1.19), у которой центр находится в точке 150, 100.

    "Труба" под углом 45°

    Рисунок 1.51. "Труба" под углом 45°






    Условный переход

    Условный переход

    Мало того, что условный переход подразумевает выполнение тех или иных команд в зависимости от проверяемого условия, так Бейсик предоставляет нам еще и несколько вариантов действий.
    Начнем с классической конструкции:
    IF ... THEN ... ELSE
    Или по-русски:
    ЕСЛИ ... ТОГДА ... ИНАЧЕ
    В записи условия можно использовать следующие символы:
  • = (равно);
  • > (больше);
  • < (меньше);
  • о или >< (не равно);
  • <= или =< (меньше или равно);
  • >= или => (больше или равно).
  • Мне кажется, что уже что-то должно быть понятно из самой конструкции условного оператора. Но раскроем его смысл на примере следующей программы. Допустим, в некоторой стране живут люди, говорящие только правду. Но при этом и у них есть вредные привычки, и некоторые из них курят. Для продажи сигарет сделаны автоматы, которые запрашивают возраст покупателя и реагируют на это двумя различными способами в зависимости от названной правдиво величины.
    CLS
    INPUT "Как Вас зовут"; N$
    INPUT "Сколько Вам полных лет"; S
    IF S<18 THEN ?"Вам еще рановато курить, ";N$ ELSE ?"Минздрав
    России предупреждает — курение опасно для вашего здоровья!"
    Программа запрашивает имя, потом возраст (все это уже не вызывает у нас никаких затруднений), а вот потом вступает в дей ствие условный оператор. Если возраст s меньше 18, то выводится надпись, что курить еще рановато (а чтобы не было очень обидно, обращается по имени). Иначе (т. е. если возраст больше либо равен 18) автомат продает сигареты, но предупреждает об опасности курения.
    Еще один маленький пример. Вычислим корень квадратный из х.

    CLS
    INPUT "Введите любое число"; X
    ? "Корень квадратный из Х="; SQR(X)
    Запускаем программу. Вводим число 4. Ответ 2. Вводим 121. Ответ 11. Вводим -9. Аварийное прерывание программы и сообщение об ошибке "Неверный вызов функции". Что такое? А все потому, что корень квадратный вычисляется только из положительного числа. Вот программа и "ругается". Но мы же умные, добавим в программу условный оператор, и будет она работать для любых чисел.
    CLS
    1:INPUT "Введите любое число";Х'
    IF X>=0 THEN ? "Корень квадратный из X ="; SQR (X) ELSE ?"Корень квадратный из отрицательного числа вычислять отказываюсь. Дайте положительное число!"
    :GOTO 1
    Теперь программа анализирует введенное значение и, в случае его положительности, вычисляет корень, а в случае отрицательности в легкой форме раздражается и просит у пользователя другое число.
    И еще пример с графикой. Предположим, мы настолько дружественны к пользователю, что не говорим ему: "Вот, посмотри, какая картинка!", а предлагаем некий выбор. Для первого раза из двух возможностей.
    SCREEN 9
    INPUT "Введите 1, если хотите увидеть солнце и любую другую цифру, если ничего не хотите"; X
    IF X=l THEN CIRCLE (320, 175), 50, 2: PAINT(320, 175), 14, 2 ELSE ?"Спасибо за внимание!"
    Программа запрашивает у пользователя цифру (причем в случае ввода буквы просит осуществить ввод заново). Если это цифра 1,
    то рисуется желтый круг, в любом другом случае появляется надпись "Спасибо за внимание!".
    Поупражняемся.
    114. Напишите программы, которые в зависимости от введенного числа либо вычисляют функцию, либо выдают сообщение, что функция не определена:

    Верхняя половина окружности

    Рисунок 1.19. Верхняя половина окружности

    Верхняя половина окружности
    Первым делом, глядя на дугу, определяем направление против часовой стрелки. Это дает нам возможность выяснить, где находится начало и конец дуги. Далее обращаемся к тригонометрической окружности. В этом простом примере сразу видно, что угол начала а=0, а угол конца дуги b=3,14. Таким образом, оператор построения этой дуги выглядит так:
    CIRCLE (150, 100), 30, 1, 0, 3.14
    Построим правую половину той же самой окружности (мы уже не будем сопровождать это построение рисунком, т. к. процесс аналогичен). По тригонометрической окружности определяем, что а=4,71, b=1,57. Записываем оператор построения дуги:
    CIRCLE (150, 100), 30, 1, 4.71, 1.57

    Виды алгоритмов

    Виды алгоритмов

    Алгоритмы бывают трех основных видов, которые являются базовыми при написании программ.
    Первый тип — линейный алгоритм. В нем все действия выполняются в строгом порядке, последовательно, одно за другим. Типичный жизненный пример такого алгоритма — рецепт пирога.
    Второй тип — разветвляющийся алгоритм. Здесь те или иные действия выполняются в зависимости от выполнения или невыполнения некоего условия. Пример из жизни — правило перехода улицы по светофору. Если горит красный — стоим, если горит зеленый — идем.
    Наконец, третий тип — циклический алгоритм. Он содержит повторяющиеся действия с какой-либо изменяющейся величиной, так называемым параметром. По циклическому алгоритму можно колоть дрова. Берем полено, ставим на попа, колем топором, берем второе полено и т. д., пока поленья не закончатся, и эта работа нам не надоест.


    Вложенные циклы

    Вложенные циклы

    В предыдущем разделе мы рассмотрели случаи, когда в цикле изменяются несколько величин, но их можно выразить друг через друга. Сейчас нам надо рассмотреть ситуации, когда изменяются несколько независимых величин.
    Приведем пример. Напишем программу заполнения экрана точками с расстоянием между ними по горизонтали и вертикали 10.
    SCREEN 9
    FOR X=0 TO 64 0 STEP 10
    FOR Y=0 TO 350 STEP 10 PSET(X, Y), 4
    NEXT Y NEXT X
    Работает программа таким образом. В первом заголовке цикла переменной X присваивается значение 0. Потом программа переходит к выполнению следующего оператора, т. е. в нашем случае, второго цикла, который и исполняется, пока Y не пре высит значение 350. После этого берется следующее значение X, и действия с Y повторяются. И так до тех пор, пока X не станет больше 640. То есть программа строит вертикальные цепочки точек, пока не заполнится весь экран.
    Все это не так сложно, если понять и запомнить следующее. Циклы должны быть вложены друг в друга, как матрешки. Параметры, упоминаемые в заголовках циклов, в их окончаниях должны быть перечислены в обратном порядке.
    Правильное использование циклов:
    FOR X=0 ТО 64 0 STEP 10
    FOR Y=0 TO 350 STEP 10 Rem Тело цикла
    NEXT Y NEXT X
    Неправильное применение циклов:
    FOR X=0 TO 640 STEP 10
    FOR Y=0 TO 350 STEP 10 Rem Тело цикла
    NEXT X NEXT Y
    Кроме того, в окончании вложенных циклов можно указывать только один оператор next с перечислением параметров, например:
    NEXT Y, X
    Приступим к упражнениям.
    200. Напишите программу, заполняющую экран лоскутным ковром. Лоскутки должны быть плотно прилегающими друг к другу разноцветными квадратиками со стороной 10 (Рисунок 1.58).

    Вывод текстовой информации в графике

    Вывод текстовой информации в графике

    Часто хочется сопроводить свои рисунки подписями. Не сдерживайте свои желания. Делайте это просто — с помощью операторов locate и print, как мы это уже многократно делали.

    Взрыв сверхновой

    Рисунок 1.39. Взрыв сверхновой

    Взрыв сверхновой
    142. Изобразите взрыв сверхновой звезды (если это задание делать по-простому, то понадобится четыре оператора цикла, можно сложнее — но и короче). Сделайте лучи во всех четырех случаях разного цвета. Это придаст живости (Рисунок 1.39).
    143. Заставьте окружность надуваться как воздушный шарик.
    144. Мы уже перемещали по экрану геометрические фигуры с использованием условного оператора и оператора безусловного перехода. Теперь наши фигуры будут двигаться равномерно по вертикали или горизонтали. Сместите:
  • закрашенный прямоугольник;
  • закрашенную окружность.
  • Все это замечательно. Но давайте вспомним, что Бейсик — все-таки язык в большой степени не графический, а вычислительный, и попробуем применить оператор цикла к вычислениям.
    Например, напечатать значения y = sinx в интервале [-30°; 30°]
    с шагом 5°. Действуя по правилам, несложно понять, что параметр — это х, так мы его и обозначим. Начальное, конечное значения параметра и шаг указаны непосредственно в самом задании. Пишем оператор цикла:
    OR X=-30 ТО 30 STEP 5
    Y=SIN (X*3.14/180)
    ? "SIN С; X; ")="; Y NEXT X
    На что, кроме оператора цикла, здесь хочется обратить ваше внимание, так это на оператор print. Разберитесь, пожалуйста, как он работает, и что дает такая, казалось бы, запутанная запись.
    Еще пример. Необходимо вывести на экран четные числа от 2 до 20. Здесь меняется само число, обозначаем его N, начальное значение 2, конечное 20, шаг 2. Пишем:
    FOR N=2 ТО 20 STEP 2: ? N: NEXT N
    А если от 20 до 2, то будет, соответственно:
    FOR N=20 ТО 2 STEP -2: ? N: NEXT N
    Проверим ваше понимание, как всегда, при помощи ряда заданий.
    145. Выведите на экран в строку все числа первой сотни, оканчивающиеся на пять.
    146. Определите значение переменной f после выполнения следующих операторов:
    F=l: N=l
    FOR 1=2 ТО N: F=F+1/I: NEXT I
    147. Напишите программу, запрашивающую возраст пользователя, а затем печатающую текст "Да ты крут!" по числу прожитых лет. Обратите внимание, что здесь в теле цикла не будет использоваться параметр. Такое тоже возможно.
    148. С клавиатуры запрашивается любая цифра от 2 до 9, а затем компьютер печатает таблицу умножения на эту цифру.
    149. Напишите программу., выводящую на экран степени числа 2 от 2 до 10 включительно.
    150. Распечатайте в табличном виде (с аргументами) значение функции квадратного корня на интервале [2; 4] с шагом 0,1.
    151. Напишите программу, которая в центре чистого экрана на одном и том же месте выведет последовательно цифры от 1 до 3600 (аналог электронного секундомера).
    Когда мы двигали геометрические объекты, го нам приходилось иногда искусственно замедлять движение, чтобы оно было более плавным. Тогда без объяснений был введен пустой цикл для организации пауз. Пустым будем называть такой цикл, в котором нет тела. Например:
    FOR 1=1 ТО 100: NEXT I
    Просто компьютер считает в уме до 100. А мы его ждем (ну, правда, если до 100 — это быстро, а вот до 10 000 уже придется |и потерпеть).
    Следующая группа упражнений поможет вам закрепить работу с оператором цикла в графике на примере орнаментов. Сначала рассмотрим пример.
    Орнамент — это повторяющийся геометрический узор, например, как на Рисунок 1.40.

    Взрыв

    Рисунок 1.46. Взрыв


    Взрыв






    Звезда

    Рисунок 1.25. Звезда

    Звезда
    102. Выведите на экран пятиконечную звезду, вписанную в окружность и закрашенную как на Рисунок 1.25.
    103. Нарисуйте корабль в ночном море под российским флагом (Рисунок 1.26).
    Это задание уже представляет собой достаточно сложное изображение. Попробуйте выполнить его так, как вы считаете нужным, а мы хотим изучить, как это нужно делать.

    Basic вводный курс

    Андреевский флаг (суммы элементов диагоналей равны)

    Рисунок 1.72. Андреевский флаг (суммы элементов диагоналей равны)


    Андреевский флаг (суммы элементов диагоналей равны)



    Чтение из файла

    Чтение из файла

    Чтение из файла производится аналогично записи, но — вместо режима output используется режим input. Будьте внимательны! Прочитаем занесенные нами данные из файла avto.dat.
    ' Программа чтения файла данных об автомобилях
    CLS
    INPUT " Введите имя файла"; F$
    1 Открытие файла
    OPEN F$ FOR INPUT AS #1
    PRINT "База данных автомобилей на 17 декабря 2000 года"
    1=1
    DO
    PRINT "Вывести данные об"; I; "автомобиле?"
    INPUT "Для окончания введите QWE, для продолжения — "; M$
    IF UCASE$(M$)="QWE" OR UCASE$(M$)="ЙЦУ" THEN 1
    INPUT #1, M$, N$, C$, G$, S$
    PRINT M$, N$, C$, G$, S$
    1=1+1 LOOP UNTIL EOF(l) 1 Закрытие файла 1 : CLOSE #1 PRINT "Файл закрыт"
    Обратите внимание на оператор loop until eof(D. Он означает, что считывание ведется до тех пор, пока не будет обнаружен символ конца файла (end of file), а в скобках указан номер открытого файла.
    Выведите с помощью этой программы данные о первых трех автомобилях.

    Добавление данных в файл

    Добавление данных в файл

    Указание for append в операторе open подготавливает файл для вывода данных и смещает указатель на конец файла. Последующие операторы приписывают новую информацию к уже имеющейся. В предложенной далее программе в файл данных об автомобилях добавляются сведения о двух новых поступлениях.
    ' Программа создания файла данных об автомобилях
    CLS
    INPUT " Введите имя файла"; F$
    ' Открытие файла
    OPEN F$ FOR APPEND AS #1
    DO
    INPUT "Марка автомобиля? (Для окончания работы введите QWE.); М$
    IF UCASE$(M$)="QWE" OR UCASE$(M$)="ЙЦУ" THEN 1
    INPUT "Номер автомобиля?"; N$
    INPUT "Цвет автомобиля?"; С$
    INPUT "Год производства автомобиля?"; G$
    INPUT "Продажная цена автомобиля?"; S$
    WRITE #1, М$, N$, C$, G$, S$ LOOP
    ' Закрытие файла 1 : CLOSE #1 PRINT "Файл дополнен"
    Выполните упражнения.
    293. Школе необходим последовательный файл для учета выпускников.
  • Создайте последовательный файл для канцелярии по учету выпускников. Храните в нем фамилию, имя, год выпуска, любимый вид спорта и нынешний род занятий выпускника. Для образца составьте файл на десять человек.
  • Воспользуйтесь этим файлом и напечатайте приглашения на очередной домашний матч "Зенита" тем выпускникам, которые назвали футбол своим любимым видом спорта.
  • 294. Компьютерная фирма ведет файл со сведениями о двадцати своих сотрудниках.
  • Создайте последовательный файл, содержащий имя и адрес каждого сотрудника (с указанием улицы, дома, квартиры и почтового индекса).
  • По содержимому файла напечатайте почтовые адреса для рассылки чеков еженедельной заработной платы.
  • 295. Гидрометцентр ведет статистику выпадения снега по регионам, для каждого из которых заведен последовательный файл. Во всех файлах присутствуют три элемента данных: имя метеоролога, название региона, количество выпавшего за зиму снега в мм.
  • Напишите программу ввода данных; заполните файлы для трех регионов.
  • Просмотрите все три файла и подсчитайте средний уровень снежных осадков по трем областям. Результат выведите на экран.
  • 296. Налоговая инспекция поощряет налогоплательщиков, вносящих подоходный налог до истечения апрельского контрольного срока, делая им скидку.
  • Создайте файл, в котором содержались бы имена, сведения о сроках уплаты и размере налога для каждого налогоплательщика (ограничьтесь группой из шести человек).
  • Пусть ваша программа читает файл и делает скидку в 10% для тех, кто уплатил налог досрочно, а также выводит на экран их имена и размер скидки в рублях.
  • 297. Фабрика игрушек ведет учет фирм розничной торговли, сбывающих ее продукцию. Файл контрагентов содержит названия этих фирм, сведения об их местоположении и индекс кредитоспособности: низкая или высокая.
  • Напишите программу, которая создала бы последовательный файл контрагентов.
  • Напишите программу, которая создала бы два последовательных файла с именами good.dat и bad.dat соответственно для фирм с высокой и низкой кредитоспособностью.
  • Пусть ваша программа спрашивает у бухгалтера, какой из двух списков ему представить, а затем выдает названия фирм и их местоположение из соответствующего файла.
  • 298. Предположим, адвокат Михаил Бурщевский с помощью компьютера ведет учет своих клиентов и их дел (табл. 1.4).
  • Напишите программу, которая позволяла бы ему вводить в последовательный файл следующие сведения: имя клиента, обвинение, исход дела.
  • Мицкевич "из огня попадает в полымя". Напишите программу, которая заменяла бы неопределенное решение суда на "Проиграно".
  • Напечатайте обновленный файл.


  • Двумерные массивы

    Двумерные массивы

    Что такое двумерный массив? Это такой набор однотипных данных, местоположение каждого элемента которого определяется не одним индексом, а двумя. Например, для тех, кто с детства играл в "морской бой", не будет открытием, что каждая клеточка игрового поля обозначается двумя символами — буквой и цифрой, например, А5 — "мимо", И10— "попал", Ж7 — "убит". Только в Бейсике принято в качестве индексов использовать все же целые числа. Жизненный пример применения двумерных массивов — билеты в кино или театр, имеющие для каждого зрителя две координаты — ряд и место'.
    Описываются подобные массивы в Бейсике тем же оператором dim, после которого в скобках указываются две размерности массива — количество строк и количество столбцов. Например, массив 5x3 объявим так:
    DIM X(5, 3)
    X (If 1) X [1, 2) X (1, 3) X (1. 4) X (1, 5)
    X (2, 1) X (2, 2) X (2, 3) X (2, 4) X (2, 5)
    X (3, 1) X (3, 2) X (3, 3) X (3, 4) X (1, 5)
    ' Кстати, маленькое лирическое отступление. Откуда пошла традиция указывать на билетах ряд и место? Оказывается из Франции. Когда тамошние дворяне при шпагах и гордом характере приходили в театр, имея просто билет без указания места, то нередко возникали смертоубийственные стычки из-за этих самых мест. Королю это надоело, и он обратился за помощью к ученому Декарту, который и предложил систему — "ряд—место". Эта система в дальнейшем трансформировалась в привычную нам декартову систему координат — ось X, ось Y.

    Файловая система

    Файловая система

    Информация, вводимая с клавиатуры или обрабатываемая с помощью программных средств Бейсика размещается в оперативной памяти компьютера, которая является энергозависимой, и, как только мы выключим питание, вся наша информация погибнет. Чтобы избежать это и донести наши гениальные программы по крайней мере до преподавателя (чтобы он их достойно оценил), а лучше до далеких потомков, необходимо сохранять наши работы на диске в виде файлов.
    Файл — это поименованная область на магнитном или лазерном диске. Поименованная — значит, имеющая имя. В файлах могут содержаться тексты, графические и видеоизображения, звуки и музыка, таблицы и базы данных и многое другое, но нас интересуют прежде всего программы, написанные на Бейсике и данные для этих программ.
    Мы уже объясняли в самом начале, как сохранить программу в виде файла и открыть уже существующий файл. Имя файлу мы даем сами, но к нему есть некоторые требования:
  • имя не должно быть больше чем 8 символов;
  • имя может состоять из букв латинского алфавита, цифр и символов, например, _, -, (,), $ и некоторых других. Впрочем, злоупотреблять специальными символами не стоит — букв и цифр вполне хватает;
  • в имени файла запрещены символы <Пробел>, *, точка, запятая, кавычки, двоеточие.
  • У файла также есть расширение имени. Оно имеет длину не более трех символов, указывается через точку после имени и характеризует тип файла. Изучаемая нами версия Бейсика (как, впрочем, и практически все другие) автоматически при сохранении добавляет к имени файла расширение bas, что упрощает поиск написанных нами программ и работу с ними.
    Для того чтобы хранить свои файлы и результаты работы с ними на диске, лучше завести свой личный каталог (или папку — это одно и то же). Надеюсь, вы знаете как это делается.
    В файлах вы можете хранить как исходные данные для обработки, так и результаты работы вашей программы.
    Для работы в Бейсике нам чаще нужны файлы, хранящие однородные по типу или структуре сведения о каких-либо объектах. Набор данных о каком-либо одном объекте называется записью.
    За самой последней записью находится невидимый символ конца файла, который устанавливается автоматически. Файл может быть пустым, т. е. содержать 0 байт информации, но имя файла и символ конца файла будут присутствовать всегда. Таков закон.
    Записи могут содержать данные разных типов, но должны быть обязательно одинаковы по структуре, например:
    "Запорожец", "4067 ЛДЕ", "1972", "100$"
    "ГАЗ-34", "6666 ЛАА", 1989, "3500$"
    В соответствии со способом доступа к файлам они делятся на два вида.


    Флаг Японии (суммы элементов диагоналей не равны)

    Рисунок 1.73. Флаг Японии (суммы элементов диагоналей не равны)

    Флаг Японии (суммы элементов диагоналей не равны)
    285. Одномерный массив из N элементов свернуть по спирали в квадратную матрицу размерностью корень квадратный из N по следующему образцу.
    286. Исходный массив Sl(16) состоит из следующих элементов: 3, 5, 9, 7, 12, 34, 21, 13. 6, 89, 54, 66, 2, 10, 99, 55.
    Создайте массив S2(4, 4), вид которого представлен на Рисунок 1.74.

    Массивы, подпрограммы

    Глава 3. Массивы, подпрограммы

  • Массивы
  • Описание массива
  • Заполнение одномерных массивов и вывод их на экран.
  • Простейшие сортировки
  • Двумерные массивы
  • Подпрограммы
  • Работа с файлами
  • Файловая система
  • Способы доступа к файлам
  • Операции над файлами
  • Открытие файла
  • Содержание


    Изменения данных в файле

    Изменения данных в файле

    Для изменения какой-либо записи, удаления старых или добавления новых данных в последовательном файле необходимо открыть два файла: подлежащий изменению и новый, в котором создается обновленная версия исходного файла. Старый файл в дальнейшем можно удалить. Приведенная ниже программа в файле avto.dat изменяет "МОСКВИЧ" на "МЕРСЕДЕС". В первых строках открываются исходный файл avto.dat и новый файл avto2.dat, сначала пустой. Очередная запись считывается из файла avto.dat и, при условии, что это не "МОСКВИЧ", переписывается без изменения в новый файл. Если же встречается значение "МОСКВИЧ", то оно заменяется на "МЕРСЕДЕС" путем присваивания нового значения переменной м$. В следующей строке данное значение попадает в выходной файл. После того как весь входной файл просмотрен, оба файла закрываются.
    OPEN "avto.dat" FOR INPUT AS #1 OPEN "avto2.dat" FOR OUTPUT AS #2 FOR 1=1 TO 5
    INPUT #1, M$, N$, C$, G$, S$
    IF UCASE$(M$)="MOCKBM4" THEN М$="МЕРСЕДЕС"
    PRINT #2, M$, N$, C$, G$, S$ NEXT I CLOSE 1, 2 KILL "avto.dat"
    NAME "avto2.dat" AS "avto.dat" END
    Заключительный этап — удаление исходного и переименование нового файла, которому придается прежнее имя, что обеспечивает и в дальнейшем наличие на дискете файла avto.dat.

    Круговая интерпретация одномерного массива

    Рисунок 1.68. Круговая интерпретация одномерного массива

    Круговая интерпретация одномерного массива
    238. Напишите программу вычисления среднего арифметического содержащихся в операторе data следующих десяти чисел: 31, 19, 52, 65, 6, 8, 13, 16, 97, 33.
    239. Напишите программу вычисления выражения:

    Массив

    Рисунок 1.66. Массив

    Массив
    FAM$ из четырех элементов
    Из этого следует, что:
  • массива есть имя, которое дает ему программист;
  • у массива есть тип, который определяется именем — числовой (имя без $) и текстовый (или символьный, или строковый — имя с символом $);
  • у массива есть размер, т. е. количество составляющих его элементов;
  • у массива есть сквозная последовательная индексация составляющих его элементов;
  • у каждого элемента массива есть значение (в нашем случае это фамилия).


  • Массивы

    Массивы

    Мы подобрались к одной из самых сложных, на мой взгляд, тем в программировании для начинающих. Именно из-за массивов я остался на второй год в институте (потому что тогда в школах еще этим не занимались). Теперь, когда я объясняю эту тему своим ученикам, то стараюсь сделать это как можно более доходчиво, пусть не совсем научными терминами, но понятно, поскольку без представления, что такое массив, дорога в программирование будет закрыта.
    Но и без умных определений не обойтись.
    Итак, массив — это набор однородных данных (чисел, символов, слов), имеющий имя и последовательную нумерацию его элементов. Например, список фамилий учеников вашего класса — массив, численные данные о среднесуточной температуре за месяц — массив, буквы русского алфавита — массив.
    Как физически массив представляется в компьютере, я рассказывать не буду, а как формально — это надо себе представлять.


    Метод обмена или "пузырька"

    Метод обмена или "пузырька"

    Название данного метода часто вызывает нездоровый смех у молодежи, хотя никакого тайного смысла у этого метода нет. Просто он выполняется таким образом, что максимальное число после каждого шага сортировки как бы всплывает в конец массива, на свое заслуженное место. Заключается метод в следующем. Программа, начиная с первых элементов массивов, сравнивает эти элементы попарно, и, в случае, если они расположены не по возрастанию, меняет их местами. В результате (N -I)2 перестановок (в случае самого плохого расположения элементов массива — все элементы по убыванию) массив окажется упорядочен по возрастанию. Например, есть массив из четырех элементов:
    4 3 2 1
    Рассмотрим по шагам метод "пузырька" для этого массива.
    Метод обмена или
    269. Напишите программу, реализующую метод "пузырька". Для уменьшения количества ненужных сравнений может служить счетчик, подсчитывающий количество обменов за один полный пробег вдоль всего массива. Как только его значение станет равно нулю (т. е. ни одного нового обмена не будет произведено), это будет означать, что массив упорядочен. Для наглядности оформите исходный и получившийся массив в виде столбиковых интерпретаций друг под другом.
    270. Дан массив букв, составляющих английский алфавит, но размешенных не по порядку. Напишите программу, преобразующую этот массив в алфавит английского языка.
    271. Дан массив из 13 четырехбуквенных русских слов (существительных и нарицательных), в единственном числе, в именительном падеже. Упорядочить их по алфавиту.


    Операции над файлами

    Операции над файлами

    Независимо от того, какие действия мы проделываем с информацией, хранящейся в файле, мы должны будем производить следующие обязательные операции:
  • открытие файла;
  • чтение и запись обрабатываемых данных;
  • закрытие файла.


  • Описание массива

    Описание массива

    Если мы знаем, что в программе предстоит работать с большим объемом каких-то данных, то мы должны этот массив в программе объявить с помощью специального оператора dim (от англ. "dimension"), после которого указывается имя массива, а потом в скобках следует так называемый размер массива, т. е. количество его элементов. Например, пусть в группе четыре человека. Массив — это фамилии учеников. Мы тогда должны записать так:
    DIM FAM$ (4)
    Знак $ добавляется, т. к. в массиве будут храниться строковые переменные. В этом случае компьютер в памяти отводит некую область из четырех ячеек, которую всю и называет fam$. Кроме того, эти ячейки нумеруются натуральными числами, начиная с 1. Я всегда подобную процедуру, да и сам массив, сравниваю с улицей одноэтажных домов в деревне или маленьком городке. Построили на улице четыре дома, назвали улицу fam$ (имя массива дается по тем же правилам, что и имя переменной), пронумеровали дома и заселили туда жильцов (Рисунок 1.66).

    Открытие файла

    Открытие файла

    Для открытия файла предназначен оператор open, имеющий следующий формат:
    OPEN имя_файла FOR режим AS # номер файла
    С именем файла должно быть уже все понятно. Режим определяет доступ к данным файла. Возможны следующие режимы:
  • input. Это режим чтения информации из файла. В случае, если указывается несуществующее имя файла, возникнет сообщение об ошибке "Файл не найден".
  • output. Режим записи информации в файл. Обычно при этом создается новый файл. Если же открывается для записи уже существующий файл, то ранее хранимая в нем информация будет безвозвратно утеряна.
  • append. Режим добавления информации в файл. Новая информация будет размешена в конце файла, за последней записью.
  • Номер файла предваряется необязательным знаком #, после которого следует целое число от 1 до 255.

    Подпрограммы

    Подпрограммы

    Иногда в определенных местах программы приходится выполнять практически одни и те же последовательности действий с разными исходными данными. Такие последовательности действий можно оформить в виде так называемых подпрограмм (от англ. "subroutine"). Подпрограммы сокращают текст программы, существенно уменьшают время их исполнения, облегчают жизнь программистам, которые могут создавать программы модульно, т. е. собирая сложную программу из законченных кусочков более простых составляющих. Это позволяет создавать большие программы группой программистов, разрабатывать и реализовать группе школьников какие-либо глобальные проекты.
    Для примера использования процедуры приведем программу вычисления следующего выражения:
    Z=N!/M!*(N-M)!
    Переменные N и М, а также выражение (N—М) снабжены восклицательным знаком, который в математике означает не что иное, как факториал (например, N-факториал). Факториал — это произведение натуральных чисел от 1 до N включительно. Например, 3!=1х2хЗ=6, а, например, 6! — это уже 1x2x3x4x5x6=720.
    В выражении нам три раза придется вычислять факториал, производя при этом одни и те же действия с разными числами. Нам облегчит работу подпрофамма, которую мы разместим в конце основной профаммы и назовем, например, fact. В подпрофам-ме мы опишем, как вычислить факториал вообще, а затем из основной программы обратимся к подпрофамме три раза с различными параметрами. Вот как будет выглядеть проuhамма:
    CLS
    1 : INPUT "Введите значения N и М"; N, М
    K=N
    GOSUB FACT
    Х1=Р
    К=М
    GOSUB FACT
    Х2=Р
    K=(N-M)
    GOSUB FACT
    Z=X1/(X2*P)
    PRINT "Искомое выражение равно"; Z
    PRINT "Еще одно выражение?(Y/N): INPUT а$
    IF UCASE$(a$)="Y" THEN 1 ELSE PRINT "До новых встреч
    у монитора..." END
    ' Описание подпрограммы FACT для вычисления факториала
    FACT:
    Р=1
    FOR i=l TO К
    P=P*i NEXT i RETURN
    Рассмотрим работу программы. Начало стандартное: очистка экрана, запрос с клавиатуры исходных данных. Самое интересное начинается потом. Подпрограмма fact описана после слова end основной профаммы, что обусловлено простым желанием, чтобы профамма все же не зациклилась, а когда-нибудь все-
    таки завершилась. Параметром подпрограммы является переменная к, для которой и вычисляется факториал.
    В основной программе мы присваиваем переменной к значение переменной n, для которой мы хотим вычислить первый факториал из трех. После чего необходимо обратиться к подпрограмме. Для этого существует специальное слово gosub, после которого указывается имя подпрограммы (в нашем случае fact). Управление переходит на первый оператор, содержащийся в подпрограмме, затем выполняются все операторы подпрограммы, вплоть до ключевого слова return. Это означает, что подпрограмма закончилась, и управление передается в основную программу.

    "Пожиратель звезд"

    Рисунок 1.69. "Пожиратель звезд"


    266. Напишите программу "Сторож", которая бы заставила змейку (Рисунок 1.70) оббегать стороны экрана по часовой стрелке (это можно написать и без массива). Усложните программу, взяв на службу еще одну "змейку". Теперь они ползают друг за другом (Рисунок 1.71). Еще сложнее — программа для движения змейки, управляемой стрелками или буквенными клавишами и совершающей повороты под прямым углом. А если и это все по плечу, то заставьте змейку поворачивать еще и под углом 45°.


    Рисунок 1.71. "Пожиратель звезд"





    Преобразованный в спираль одномерный массив

    Рисунок 1.74. Преобразованный в спираль одномерный массив


    Преобразованный в спираль одномерный массив






    Простейшие сортировки

    Простейшие сортировки

    Одной из основных операций, производимых над массивами, являются операции сортировки или упорядочивания элементов массива по какому-либо признаку: чаще по возрастанию или убыванию — для чисел, и по алфавиту — для символов и строк.
    Сортировок придумано множество, и, говорят, тому, кто придумает новый эффективный метод сортировки, сразу будет вручена Нобелевская премия.
    С древних времен, однако, до нас дошли два самых простых (но, конечно, не самых эффективных) способа сортировки, которые мы здесь и рассмотрим.

    Работа с файлами

    Работа с файлами

    Сейчас, когда в ваших головах и руках уже есть практически все необходимые инструменты для написания сложных программ, осталось немножко поднапрячься и узнать, что хранить исходные данные для больших программ очень удобно в виде отдельных файлов. Но, чтобы это понять, надо иметь минимальное представление о файловой организации информации на дисках.


    Сортировка выбором

    Сортировка выбором

    Допустим, дан числовой массив из N элементов. Надо отсортировать его по возрастанию.
    Суть способа в следующем. Находим наибольший элемент в массиве и меняем его местами с последним. Уменьшаем количество рассматриваемых элементов на 1 (т. к. последний элемент уже на своем месте). Повторяем о'перацию для уменьшенного на единицу массива. И так — N—1 раз.
    Пусть дан массив из пяти элементов:
    8 4 9 6 7
    Рассмотрим процесс упорядочивания по шагам.
    Сортировка выбором
    На этом шаге третий элемент поменялся сам с собой.
    Сортировка выбором
    267. Напишите программу для упорядочивания массива по возрастанию методом выбора. Измените программу так, чтобы она упорядочивала массив по убыванию.
    268. Дан массив из 13 чисел. Расположите числа по возрастанию. Введите с клавиатуры число М так, чтобы оно вошло в массив и получившийся массив также был бы упорядочен по возрастанию.

    Способы доступа к файлам

    Способы доступа к файлам

    В изучаемом нами Бейсике существуют два метода доступа к информации, хранящейся в файлах:
  • последовательный доступ;
  • прямой доступ.
  • Файлы последовательного доступа наиболее просты как в организации, так и в работе с ними. Записи обрабатываются последовательно одна за другой. Информация в таких файлах хранится в виде текста в кодах ASCII. Подобные файлы легко просмотреть на экране, используя любой простейший редактор, или в самом Бейсике. Но, как всегда, у каждой медали две стороны. Простота — хорошо, а последовательность в данном случае — плохо. Если информация об интересующих меня объектах упорядочена в файле по алфавиту, то мне всякий раз придется перебирать практически весь файл, чтобы добраться до нужной записи. Отсюда, при большом информационном объеме файла обработка его резко замедляется.
    Файлы прямого доступа хранят информацию в специальном формате, в котором каждая запись занимает строго фиксированную одинаковую с остальными длину. То, что такие файлы могут занимать на диске больше места, чем файлы последовательного доступа, с лихвой компенсируется скоростью работы с ними.

    Столбиковая интерпретация одномерного массива

    Рисунок 1.67. Столбиковая интерпретация одномерного массива


    Столбиковая интерпретация одномерного массива



    "Сторож-змейка"

    Рисунок 1.70. "Сторож-змейка"






    Исходные данные задачи

    Таблица 1.4. Исходные данные задачи

    Имя клиента Обвинение Исход дела
    Сердюков Клевета Выиграно
    Прохоров Оскорбление Проиграно
    Мицкевич Поджог ?????
    Максимова Взлом Выиграно
    Лерман Взятка Проиграно
    299. Хоккейные команды "Черные ястребы" и "Красные крылья" хранят в последовательных файлах имена всех своих двенадцати нападающих, число заброшенных ими шайб, сделанных голевых передач и заработанное штрафное время.
  • Создайте файлы black.dat и red.dat, содержащие информацию о каждой из двух команд.
  • Ваша программа по данным, извлеченным из этих файлов, должна создавать новый файл allstars.dat, в котором содержались бы имя, команда и сумма очков (голы и передачи) для шести лучших игроков обеих команд. Пусть имена и показатели результативности хоккеистов выводятся на экран.
  • 300. Имена и адреса всех, кто обращается за информацией в фирму, попадают в список рекламной рассылки.
  • Создайте основной файл master.dat из десяти записей в качестве списка рассылки и меньший файл family.dat из пяти записей для вновь обратившихся с запросами в фирму. Добавьте данные из второго файла в конец первого.
  • Напишите программу, которая случайным образом выбирала бы из основного файла одну запись и посылала бы адресату письмо с уведомлением о выигрыше приза.
  • 301. Инспектор колледжа ведет файл академических занятий студентов.
  • Создайте последовательный файл и заполните его фамилиями, названиями академических курсов и оценочным коэффициентом студентов. Воспользуйтесь данными, перечисленными в табл. 1.5.


  • Исходные данные

    Таблица 1.5. Исходные данные

    Фамилия студента Курс Оценочный коэффициент
    Югов Программирование 78
    Северов Японский язык 91
    Западов Психология 56
    Востоков Психология 45
    Зюйдов Корейский язык 89
    Вестов Программирование 66
    Полюсов Психология 90
    Выберите "умных" студентов, т. е. тех, кто имеет оценку выше 88, и запишите сведения о них в файл best.dat. Пусть программа помогает инспектору формировать на основе этого файла группы углубленного обучения. По названию курса она должна выдавать список "умных" студентов, зачисленных в такую группу.


    Запись в файл

    Запись в файл

    Рассмотрим пример записи в файл.
    OPEN "capitals.dat" FOR OUTPUT AS #1 FOR X=l TO 5
    INPUT "ВВЕДИТЕ НАЗВАНИЕ СТОЛИЦЫ"; F$
    PRINT #1, F$ NEXT X CLOSE #1 END
    В результате работы программы мы получим (полужирным шрифтом выделены данные, вводимые пользователем с клавиатуры):
    ВВЕДИТЕ НАЗВАНИЕ СТОЛИЦЫ? МОСКВА ВВЕДИТЕ НАЗВАНИЕ СТОЛИЦЫ? САНКТ-ПЕТЕРБУРГ ВВЕДИТЕ НАЗВАНИЕ СТОЛИЦЫ? ТАЛЛИН ВВЕДИТЕ НАЗВАНИЕ СТОЛИЦЫ? РИГА ВВЕДИТЕ НАЗВАНИЕ СТОЛИЦЫ? ВИЛЬНЮС
    При этом на диске в текущем каталоге образуется файл, содержащий пять строковых значений. Имя файла будет capitals.dat.
    Удобнее всего при работе с файлами сделать текущим каталог, где эти файлы содержатся или будут содержаться, а при обращении к ним указывать только их имена.
    В качестве параметра имя_файла можно использовать переменную текстового типа. Это позволяет вводить имя файла с клавиатуры и является универсальным способом работы с файлами. Например:
    INPUT " Введите имя файла "; FileName$ OPEN FileName$ FOR OUTPUT AS #1
    После ключевого слова as указывается номер файла. Больше открыть файл с таким номером в данной программе нельзя. Для каждого последующего файла должен быть указан свой собственный неповторимый номер в пределах от 1 до 255. Сколько всего может быть открыто файлов, зависит от файла конфигурации вашего компьютера config.sys, в котором число одновременно открытых файлов определяется командой files.

    Заполнение двумерных массивов и вывод их на экран

    Заполнение двумерных массивов и вывод их на экран

    В обработке двумерных массивов есть своя специфика — использование вложенных циклов.
    Заполним двумерный массив Х(3, 5) целыми случайными числами, лежащими в интервале от 1 до 20 и выведем массив на экран в виде таблицы.
    CLS : RANDOMIZE TIMER DIM X(3, 5) FOR I =1 ТО 3 FOR J=l TO 5
    X(I, J)=INT(RND(l)*20)+l ? X(I, J); NEXT J
    NEXT I
    На что надо обратить внимание. Для начала, при выводе массива во внутреннем цикле после оператора print стоит точка с запятой. Это дает возможность отображать массив построчно. А оператор print без параметров, указанный после внутреннего цикла, позволяет после вывода каждой строки элементов массива, переводить курсор на новую строчку.
    272. Найдите в массиве из приведенного выше примера максимальный и минимальный элемент, и, при выводе массива на экран, выделите их красным цветом.
    273. Дан двумерный массив 5x5. Определите сумму элементов каждой строки и ту строку, в которой сумма элементов максимальна.
    274. Дан массив А(2, 10). В первом столбце содержатся координаты X точек плоскости экрана, а во втором столбце — координаты Y тех же точек. Определите количество точек, попадающих в нижнюю правую четверть экрана, выведите их на экран, а искомые точки выделите другим цветом.
    275. Определите наименьший элемент в массиве Х(10, 10). Выделите его другим цветом.
    276. Дан массив W$(5, 4), в котором каждая строка состоит из четырех символов, составляющих английское слово. Отсор-
    тируйте массив таким образом, чтобы слова были расположены по алфавиту.
    277. В массиве R (5x5) поменяйте местами первую и последнюю строки.
    278. В массиве R (5x5) замените элементы, стоящие ниже главной диагонали, нулями.
    279. В массиве R (5x5) замените элементы главной диагонали нулями.
    280. В массиве R (5x5) вычислите сумму элементов главной диагонали.
    281. В массиве R (5x5) упорядочьте строки по возрастанию элементов главной диагонали.
    282. Определите, является ли заданный массив 3x3 магическим квадратом, т. е. таким, суммы элементов которого в строках, столбцах и главных диагоналях равны между собой.
    283. Выведите на экран номера строк массива 5x5, сумма элементов которых четна.
    284. Выведите на экран изображение Андреевского флага, если у данного массива 5x5 суммы элементов диагоналей равны, и флаг Японии — в обратном случае (Рисунок 1.72, 1.73).

    Заполнение массива при помощи стандартных функций

    Заполнение массива при помощи стандартных функций

    Так как чаше мы решаем учебные задачи, то конкретные числовые или строковые значения элементов массива нас мало интересуют. Важно, чтобы программа работала правильно. Поэтому часто массив заполняется случайными значениями.
    CLS
    RANOMIZE TIMER
    INPUT "Введите количество элементов массива"; N
    DIM MASS(N)
    FOR 1=1 ТО N
    MASS(I)=INT(RND(l)*100)
    ? MASS(I); NEXT I
    Мы вычисляем какую-либо функцию, например синус, и значения этой функции заносим в массив. Пусть дана функция y-sinx , где х меняется от 1 до 10 с шагом 0,5. Здесь мы должны сначала решить для себя, а сколько будет значений вычислено. Мы это уже делали, но, повторение — мать учения.
    N=(Хнач. — Хкон.)/шаг+1
    В нашем случае:
    N=(10-1)/0.5 +1=19
    Тогда программа будет выглядеть так:
    CLS
    INPUT "Введите начальное, конечное значения аргумента
    и шаг приращения"; XN, XK, DX
    N=INT((XK - XN)/DX)+1
    DIM MASS(N)
    1=1
    FOR X=XN TO XK STEP DX
    MASS(I)=SIN(X)
    ? MASS(I);
    1=1+1 NEXT X
    Здесь нам уже приходится вручную наращивать индекс г, т. к. параметром цикла в данном случае является х.
    После заполнения массива настает пора его обрабатывать. Чаще всего приходится обрабатывать все элементы массива, поэтому действия выполняются в цикле.
    Изменение значений элементов массива ведется с помощью оператора присваивания, например:
    MASS(1!=13
    MASS(3)=12
    MASS(3)=SQR(MASS(1)+MASS(3))
    ? MASS(3)
    Вопрос. Какое значение будет выведено на экран? Чему равны значения mass ( i ) и mass (3) ?
    Задания. Прежде всего попрактикуемся в заполнении массивов и выводе на экран не только численных значений элементов массива, но и графической их интерпретации.
    236. Заполните массив десятью случайными целыми числами, каждое их которых лежит в пределах от 50 до 200, и выведите на экран их численные значения, а также графическое представление в виде вертикальных закрашенных прямоугольников шириной 30, и высотой, соответствующей их значению. Нижние стороны прямоугольников лежат на линии с координатой Y=300, левой стороне первого прямоугольника соответствует координата Х=100 (Рисунок 1.67).
    237. Заполните массив десятью случайными целыми числами, каждое их которых лежит в пределах от 5 до 30, и выведите на экран их численные значения, а также графическое представление в виде закрашенных соприкасающихся кругов, радиусы которых равны значениям элементов массива (Рисунок 1.68).

    Заполнение одномерного массива с клавиатуры

    Заполнение одномерного массива с клавиатуры

    Рассмотрим следующий пример:
    CLS
    INPUT "Введите количество элементов массива"; N
    DIM MASS(N)
    FOR 1=1 ТО N
    ? "Введите"; N; "элемент массива"
    INPUT MASS(I) NEXT I
    7
    FOR 1=1 TO N ? MASS(I); NEXT I
    Программа требует некоторых пояснений. Первая команда тра-диционна — очистка экрана. Далее идет запрос с клавиатуры количества элементов массива. Потом цикл, в котором от 1 до N программа последовательно запрашивает у пользователя ввод очередного элемента массива и записывает его значение по указанному адресу mass(i) . После первого цикла выполняется оператор print без параметров. Он отображает пустую строку между вводом значений и их выводом. Последний оператор цикла выводит значения массива на экран в строчку, что обеспечивается
    добавлением к оператору print точки с запятой. Результаты работы программы для трех элементов будут выглядеть так:
    Введите 1 элемент массива
    ? 23
    Введите 2 элемент массива
    ? 13
    Введите 3 элемент массива
    ? 98
    23 13 98

    Заполнение одномерного массива заранее известными значениями из оператора DATA

    Заполнение одномерного массива заранее известными значениями из оператора DATA

    Часто встречаются задачи, когда данные для обработки уже известны и содержатся в операторе data. (Однако, если их много, тяжелый труд — их туда заносить. Обычно — работа для молодых программистов.)
    DATA 23, 13, 98, 77, 45, 56, 32,' 10, 90, 55
    CLS
    INPUT "Введите количество элементов массива"; N
    DIM MASS(N)
    FOR 1=1 ТО N
    READ MASS(I)
    ? MASS(I); NEXT I
    Программа стала несколько короче, т. к. в этом случае можно совместить чтение данных из data и одновременный вывод их на экран — ведь пользователь освобожден от необходимости вводить данные с клавиатуры. Мы сразу увидим массив на экране.
    Этот способ экономичней первого, и, кроме того, при отладке программы нет нужды всякий раз заново вводить данные.

    Заполнение одномерных массивов и вывод их на экран

    Заполнение одномерных массивов и вывод их на экран

    Первая задача, встающая перед программистом прежде чем, обработать массив, — заполнить его "жильцами". Для этого в Бейсике существует несколько способов, которые мы и рассмотрим. Кроме того, для контроля правильности заполнения, лучше бы сразу выводить массив на экран, чтобы потом можно было проверить правильность решения поставленной задачи.
    Для всех случаев мы рассмотрим один и тот же пример — заполнить массив N целыми числами, каждое из которых не более 100. Мы не берем конкретное значение N, чтобы вы понимали: программа не должна зависеть от исходных данных. Сейчас мы хотим создать массив из 10 чисел, а в следующий раз — из 1000. Программа останется той же.

    Basic вводный курс

    Анаграммы (русский язык и программирование)

    Анаграммы (русский язык и программирование)

    Игра со словами. Анаграмма — это слово, в котором перепутаны буквы, например, "ШАДОЛЬ" — это "ЛОШАДЬ", а "ТИВОНКР" — это "ВТОРНИК". Программа рассчитана на двух игроков, соревнующихся друг с другом. В качестве слов используются только имена существительные, нарицательные, в единственном числе, в именительном падеже. Первый игрок вводит с клавиатуры слово длиной не менее пяти, но не более восьми букв (постарайтесь сделать так, чтобы во время ввода на экране вместо букв отображались символы *). Затем компьютер определяет длину введенного слова, разбирает его на отдельные символы, заносит их в массив, откуда случайным образом выводит на экран. Соперник в течение 2-х минут (время определяет компьютер) должен определить это слово. В случае правильного ответа (который он вводит с клавиатуры) он получает 1 очко, и сам загадывает слово первому игроку. Игра идет до 5 очков. За неправильный ответ очки не начисляются. Безусловно, приветствуется дружественный интерфейс: запрос и обращение к игрокам по именам, вывод на экран правил игры, графическое и звуковое оформление.


    Царь-пушка (математика, физика, экономика, история, русский язык и программирование)

    Царь-пушка (математика, физика, экономика, история, русский язык и программирование)

    Выполните расчет рентабельности изготовления ядер для "Царь-пушки".
    Царь выделил 10 млн рублей на изготовление наиболее рентабельных ядер для Царь-пушки. Необходимо написать программу, рассчитывающую рентабельность изготовления ядер для 17 различных материалов, сэкономив таким образом для государственной казны значительные средства, которые могли бы быть затрачены на проверку рентабельности в полевых условиях с использованием натуральных материалов.
    Исходные данные таковы. Отпущено денег 10 млн руб. Калибр Царь-пушки, фамилию мастера и год изготовления выясните дома. Взяв из табл. 1.6 исходные данные, создайте файл pushka.dat.


    Глава 4. Задания повышенной трудности, интегрированные, азартные
  • Задания повышенной трудности
  • Угадайка (математика и программирование)
  • Анаграммы (русский язык и программирование)
  • Стрельба из пушки (физика, математика и программирование)
  • Царь-пушка (математика, физика, экономика, история, русский язык и программирование)
  • Кинотеатр "Кристалл-Палас" (математика, экономика и программирование)
  • Тараканьи бега (математика, дизайн и программирование)
  • Тесты (психология, русский язык и программирование)


  • Кинотеатр "Кристалл-Палас" (математика, экономика и программирование)

    Кинотеатр "Кристалл-Палас" (математика, экономика и программирование)

    И еще одно очень объемное задание. Представьте себе, что вас приглашают в кинотеатр "Кристалл-Палас", расположенный на Невском проспекте, на должность директора. Когда вы пытаетесь узнать, сколько же вам будут платить, то говорят, что сейчас заодно и проверят ваши деловые способности, и предлагают написать программу, используя следующие исходные данные. В кинотеатре "Кристалл-Палас" три зала: "Красный", "Зеленый" и "Синий". Залы одинаковы и представляют собой квадраты 11x11 кресел. В результате маркетинговых исследований были установлены показатели по заполнению зала в среднем (Рисунок 1.77).

    Игровое поле для "тараканьих бегов"

    Рисунок 77. Игровое поле для "тараканьих бегов"


    Игровое поле для






    Рассадка зала

    Рисунок 77. Рассадка зала

    Рассадка зала
    Первым делом, чтобы облегчить себе жизнь, создадим файл исходных данных, в котором будет содержаться массив 11x11, элементами которого будут цифры из таблицы. Здесь цифры 1 и 2 будут обозначать мужчин, 3 и 4 — женщин, 5 и 6 — детей, 7 и 8 — тех, кто имеет право на льготные билеты, 0 — пустые места и 9 — знакомые и родственники служащих кинотеатра, которые ходят в кино бесплатно. К исходным данным также относится курс доллара на сегодняшний день. Цены на билеты в зависимости от времени сеанса и принадлежности к той или иной категории зрителей приведены в табл. 1.7, а затраты от общей прибыли — в табл. 1.8.

    Стрельба из пушки (физика, математика и программирование)

    Стрельба из пушки (физика, математика и программирование)

    Вариант 1
    В замке в заточении томится прекрасная принцесса. В стене замка имеется небольшое окошко-бойница. У нас есть пушка. Необходимо передать принцессе план побега, выстрелив им из пушки (и, естественно, попав). Дается всего три попытки. Исходными данными являются угол наклона ствола пушки по отношению к горизонту и начальная скорость полета ядра. Они запрашиваются с клавиатуры. Предусмотреть примитивное изображение пушки (Рисунок 1.75), поворот ствола в зависимости от введенного угла, вычерчивание траектории полета ядра, реакцию замка на попадание в стену ядра, вывод на экран текста плана побега в случае правильного попадания.

    Дуэль на пушках через каменную

    Рисунок 1.75. Стрельба из пушки: вариант 1

    Дуэль на пушках через каменную
    Вариант 2

    Дуэль на пушках через каменную стену — кто кого. Пушки теперь есть у двух игроков. Они небольшого размера. Стреляют по очереди, также задавая угол и скорость полета ядра в пределах: угол от 10° до 90°, начальная скорость от 30 до 100 м/с. Попадание засчитывается, если расстояние от центра ядра до центра колеса пушки не более 20 экранных точек. В таком случае противник проигрывает. Высота стены каждый раз выбирается случайным образом в пределах от 50 до 200 экранных точек (Рисунок 1.76). Игра идет до трех побед.

    Дуэль на пушках через каменную

    Рисунок 76. Стрельба из пушки: вариант 2



    Исходные данные для задания "Царь-пушка"

    Таблица 1.6. Исходные данные для задания "Царь-пушка"

    Материал Плотность г/см3 Себестоимость руб./кг Коэффициент убойной силы
    1 Платина 21,5 3636,36 1000,0
    2 Золото 19,3 3090,91 950,0
    3 Свинец 11,3 178,18 900,0
    4 Серебро 10,5 454,55 800,0
    5 Медь 9 81,82 300.0
    6 Никель 8,9 92,73 340,0
    7 Железо 7,9 29,09 500,0
    8 Олово 7,3 67,27 550,0
    9 Титан 4,5 203,64 450,0
    10 Алюминий 2,7 21,82 450,0
    11 Глина 2,2 3,64 0,1
    12 Каучук 0,9 25,45 130,0
    13 Цинк 7,1 60,00 610,0
    14 Графит 2,5 9,09 2,5
    15 Латунь 8,24 73,09 230,0
    16 Мельхиор 5,42 84,00 200.0
    17 Чугун 7,63 28,09 . 440,0
    Здесь необходимо перевести плотности в систему СИ. Далее вычислить (все вычисления производить в системе СИ):
  • объем ядра (ядро идеально круглое);
  • массу ядра (М);
  • начальную скорость (по формулеИсходные данные для задания );
  • цену одного ядра (С);
  • количество ядер (N);
  • дальность полета (S), если выстрел производится под углом 45°;

  • убойную силу Исходные данные для задания ;-, где К— коэффициент убойной силы.
  • рентабельность Исходные данные для задания .
  • Напишите программу, которая поможет:
  • найти пять наиболее рентабельных материалов, их рентабельности занести в массив и упорядочить по возрастанию;
  • из самой большой рентабельности взять вторую цифру;
  • из следующей по убыванию — число, составленное из первых двух цифр, поделить на два;
  • в очередной по убыванию — сложить цифры целой части и прибавить число, которое получится, если число, составленное из двух первых цифр пятой рентабельности, поделить пополам;
  • из четвертой рентабельности взять разность второй и третьей цифр.
  • Полученные четыре значения соответствуют порядковым номерам букв русского алфавита, в котором отсутствует буква "е". Необходимо определить эти буквы и составить из них четырехбуквенное слово, которое является первым результатом выполнения задания. Второе слово получаем следующим образом: из фамилии мастера берем три последние буквы, добавляем букву, чей порядковый номер — вторая цифра года создания Царь-пушки и букву, чей порядковый номер получается делением на 2 числа, образуемого второй и четвертой цифрами года создания Царь-пушки. Составляем пятибуквенное слово.


    Цены билетов в кинотеатре "Кристалл-Палас"

    Таблица 1.7. Цены билетов в кинотеатре "Кристалл-Палас"

    Категория зрителей Цена билетов (руб.)
    Утро (1 сеанс) День (3 сеанса) Вечер (2 сеанса)
    Мужчины 70 100 200
    Женщины 50 70 150
    Дети 30 50 100
    Льготники 10 20 50
    Необходимо вычислить прибыль кинотеатра за день, за месяц (считая, что в месяце 30 дней), расходы по статьям в рублях и долларах. Вывести эти данные на экран, выделив зарплату директора цветом.


    Затраты из общей прибыли за месяц

    Таблица 1.8. Затраты из общей прибыли за месяц

    Затраты % Затраты %
    Амортизация 12 Охранные структуры 25
    Налоги 22 Новые фильмы 22
    Зарплата сотрудникам 16 Директор 3
  • Часть 5. После каждого забега выводится информационное сообщение о финансовом положении участников и статистике побед тараканов.
  • Рекомендуется оформить забег музыкально.

    Тараканьи бега (математика, дизайн и программирование)

    Тараканьи бега (математика, дизайн и программирование)

    Конечно, сейчас уже далеко не все из вас смотрели фильм "Бег", поставленный по роману М. Булгакова. В частности, в нем есть сюжет о том, как наши эмигранты первой волны зарабатывали себе в Париже на жизнь. Одним из источников их доходов были тараканьи бега. Попробуем реализовать их компьютерную версию.
  • Часть 1. Красочная заставка.
  • Часть 2. Представление кличек участвующих тараканов, запрос количества делающих ставки и их фамилий, выдача всем кредита в 200 единиц, прием ставок (не более 100, но не менее 30).
  • Часть 3. Оформление игрового поля примерно, как на Рисунок 1.78.
  • Часть 4. Непосредственно забег. Скорость каждого таракана за один такт — случайное целое число от 1 до 5.
  • Забег заканчивается, как только какой-либо таракан коснулся "головой" финишной черты. Если никто из сделавших ставки не выиграл, то деньги переходят в доход казино. В случае выигрыша игрока, ему начисляется двойная ставка. Игра идет до тех пор, пока кто-либо не разорится, или кто-либо не наберет сумму в размере двойного кредита.

    Тесты (психология, русский язык и программирование)

    Тесты (психология, русский язык и программирование)

    Для этого задания вы можете взять любой тест из многочисленных выпускаемых сейчас журналов. Создайте файл исходных данных — вопросов и вариантов ответов. Напишите программу, знакомящуюся с пользователем, сообщающую ему цель теста и инструкцию по работе с программой, проводящую тест, анализирующую результаты и выводящую итоги, взятые из другого файла данных.
    Такая программа может использоваться как для психологических тестов, так и для проверки знаний в какой-либо области.
    Если с одним тестом у вас получилось, то можно написать целую гибкую систему тестирования, где пользователю предлагается выбор из нескольких тестов, а также непосредственное создание тестов самому.
    Итак, вы уже имеете некий багаж знаний, который никогда не бывает лишним, вы уже пользуетесь уважением у друзей и преподавателей, вы получаете только пятерки по программированию, но впереди — моря и океаны новых знаний. Ничего не бойтесь, и все у вас получится!
    Удачи!


    Угадайка (математика и программирование)

    Угадайка (математика и программирование)

    Компьютер случайным образом загадывает число от 1 до 100.

    Задача пользователя — за минимальное







    Задания повышенной трудности

    Задания повышенной трудности

    Если вы добрались до сих слов, дорогой читатель, то дальше, полагаю, вы сможете идти один, гордо неся знамя российского программирования над миром (ведь только в США 80% разработчиков программного обеспечения и математиков — наши соотечественники).
    Напоследок я хочу предложить вам ряд разнообразных задач, поломав голову над которыми, вы приобретете неоценимую закалку и опыт. Они будут без решений. Кроме того, подобные задания всегда хочется видеть не просто работающими, но и оформленными, и снабженные такими "FOOL PROOF" (защитой от дурака, т. е. выдерживающими случайные нажатия не тех клавиш неопытными пользователями), чтобы с ними было приятно работать.


    Basic вводный курс

    Арифметика в Бейсике

    Арифметика в Бейсике


    Циклический алгоритм

    Циклический алгоритм


    Решения

    Глава 5. Решения

  • Арифметика в Бейсике
  • Оператор присваивания
  • Выводим результаты
  • Стандартные функции Бейсика
  • Вывод данных в заданном месте экрана
  • Вводим данные
  • Операторы DATA и READ
  • Линейный алгоритм
  • Графика в Бейсике
  • Разветвляющийся алгоритм
  • Условный переход
  • Циклический алгоритм
  • Символы и строки
  • Содержание


    Графика в Бейсике

    Графика в Бейсике


    Линейный алгоритм

    Линейный алгоритм


    Оператор присваивания

    Оператор присваивания


    Операторы DATA и READ

    Операторы DATA и READ


    Разветвляющийся алгоритм

    Разветвляющийся алгоритм


    Рисунок ание квадрата со стороной

    Рисунок ание квадрата со стороной 200
    LINE (100, 100)-(300, 300), 14, В
    ' Рисунок ание вписанной в квадрат окружности радиусом
    100CIRCLE (200, 200), 100, 0, , , 1.01
    ' Задание общего количества песчинок N
    ' и обнуление счетчика попавших в круг KN=5000: K=0
    FOR 1=1 ТО N
    X=INT(RND(1)*200)+100
    Y=INT(RND(1)*200)+100 ' Вычисление расстояния от выпавшей точки до центра
    S =SQR((X-200)Л2+(У-200)"2) ' Проверка условия, попала ли точка в круг 1 и изображение ее красным или белым цветами IF S<=100 THEN K=K+1: PSET (X, Y) , 4 ELSE PSET (X, Y) , 15 ' Вывод на экран счетчиков песчинок LOCATE 5, 20: PRINT "Выпала песчинка №"; I
    LOCATE 6, 20: PRINT "В круг уже попало"; К; "песчинок" NEXT I
    1 Вычисление и вывод на экран значения числа Пи LOCATE 23, 15: PRINT "Число ПИ для"; N; "точек ="; 4*K/N END


    Рисунок ание закрашенного квадратика

    Рисунок ание закрашенного квадратика
    LINE (X, Y)-(X + 10, Y + 10), С, BF
    ' Обводка квадратика белым контуром
    LINE (X, Y)-(X + 10, Y + 10), 15, В NEXT Y NEXT X END


    Символы и строки

    Символы и строки


    Стандартные функции Бейсика

    Стандартные функции Бейсика


    Таблица умножения 1:INPUT "Введите

    Таблица умножения
    1:INPUT "Введите целое число от 2 до 9"; N
    IF N<2 OR N>9 THEN ?"От 2 ДО 9!": GOTO 1
    ? "Таблица умножения на "; N
    FOR I = 2 ТО N
    ? I; "*"; N; "="; I*N NEXT I END


    Условный переход

    Условный переход




    Вводим данные


    Вывод данных в заданном месте экрана

    Вывод данных в заданном месте экрана


    Выводим результаты

    Выводим результаты


    Basic вводный курс

    Цвет символов и цвет фона: оператор COLOR

    Цвет символов и цвет фона: оператор COLOR

    Оператор color имеет следующий синтаксис:
    COLOR N1, N2
    Предназначен он для изменения цвета символов на N1, а цвета фона (т. е. экрана) — на N2. Если в записи оператора опустить параметр ni, to он будет записываться так:
    COLOR , N2
    и станет изменять только цвет фона. Например:
    CLS
    SCREEN 9
    FOR N2 = 0 ТО 15
    COLOR , N2
    SLEEP I NEXT N2
    Запустив данную программу, вы увидите с паузой в 1 секунду все возможные цвета из табл. 3.3, в которые будет окрашен фон.
    Если опустить параметр N2, то оператор color будет менять только цвет символов. Например:
    SCREEN 9
    FOR I = О ТО 15
    COLOR I
    PRINT I NEXT I

    Цвет точки экрана: функция POINT

    Цвет точки экрана: функция POINT

    Вы можете определить, какой цвет имеет в данный момент любая точка экрана, задав ее координаты в виде аргумента функции point (x,y). Например:
    SCREEN 9
    LINE (0, 0)-(100, 100), 4
    LOCATE 10, 1 FOR у = 1 ТО 10
    FOR X = 1 ТО 10
    PRINT POINT(x, у);
    NEXT x
    PRINT NEXT у
    Данная программа рисует линию зеленого цвета по диагонали, начиная с верхнего левого угла, а затем во вложенных циклах поточечно сканирует область от точки с координатами (1, 1) до точки с координатами (10, 10) и выдает на экран массив составляющих ее цветов. Он будет выглядеть следующим образом:
    2000000000
    0200000000
    0020000000
    0002000000
    0000200000
    0000020000
    0000002000
    0000000200
    0000000020
    0000000002


    Дополнительные возможности

    Дополнительные возможности

    Здесь хотелось бы рассказать о возможностях Бейсика, позволяющих писать более красивые программы, работать с которыми пользователю было бы приятно, и в душе он поминал бы вас хорошими словами.


    Движущиеся изображения: операторы GET и PUT

    Движущиеся изображения: операторы GET и PUT

    Простой способ "оживить" экран состоит в исполнении операторов get и put. Они позволяют "снять" изображение с части экрана и повторить его в другом месте. Это происходит очень быстро, поскольку исходная фигура не перерисовывается теми графическими операторами, которыми она вначале была создана, а просто дублируются все ее точки.
    Представленная ниже программа рисует блоху, которая "скачет" по экрану, т. к. сначала оператор get сохраняет ее изображение, а затем оператор put копирует это изображение в любое заданное место экрана. Ощущение движения возникает из-за того, что перед каждым "прыжком" блохи ее старое изображение стирается.
    CLS
    SCREEN 9
    COLOR 9, 1
    REM

    Дополнительные возможности

    Глава 6. Дополнительные возможности

  • Дополнительные возможности
  • Экранные режимы: оператор SCREEN
  • Цвет символов и цвет фона: оператор COLOR
  • Движущиеся изображения: операторы GET a PUT
  • Цвет точки экрана: функция POINT
  • Одиночный звуковой сигнал: оператор ВЕЕР
  • Звуковое оформление: оператор SOUND
  • Музыка в Бейсике: оператор PLAY
  • Содержание


    Экранные режимы: оператор SCREEN

    Экранные режимы: оператор SCREEN

    Наиболее распространены сейчас видеосистемы VGA, а более всего SVGA. Поэтому рассматривать мы будем только их. Во многих школах, конечно, все еще можно встретить разношерстные HGA, CGA, EGA, но не будем ориентироваться на прошлое.
    Основными характеристиками видеосистемы являются ее разрешение, т. е. количество экранных точек (что определяет качество выводимого изображения) и количество отображаемых цветов и оттенков. Для видеосистем VGA и SVGA характеристики перечислены в табл. 3.1.

    Музыка в Бейсике: оператор PLAY

    Музыка в Бейсике: оператор PLAY

    Оператор play позволяет составлять музыкальные фрагменты и проигрывать их в различных сочетаниях в ходе выполнения программы. Как и оператор draw, оператор play имеет свой набор команд для определения мелодии. С помощью этих команд вы можете задать темп, октаву, паузы и другие музыкальные характеристики. Команды объединяются в строку и присваиваются строковой переменной. Когда вы захотите услышать мелодию, обратитесь к оператору play с командой
    "X"+VARPTR (строковая переменная)

    В представленной ниже программе оператор play используется для последовательного проигрывания нот в семи октавах.
    Последовательно проигрывает все ноты в 7 октавах scale$ = "CDEFGAB" PLAY "LI6" FOR I = 0 ТО 6
    PLAY "0" + STR$(1%)
    PLAY "X" + VARPTR$(scale$) NEXT I
    А вот еще один пример — всем известная мелодия "Happy birthday to you!".
    CLS
    PLAY "L8 MF MS 03 GG L4 AG 04 С 03 L2 В"
    PLAY "L8 MF MS 03 GG Ы AG 04 D L2 C"
    PLAY "L8 MF MS 03 GG L4 04 GE L8 CC 03 L4 В А"
    PLAY "04 L8 FF L4 ECD LI C"
    END
    Все команды оператора play перечислены в табл. 3.4. Испытав их, вы убедитесь, что они предоставляют широкие возможности для "музицирования". Таково еще одно замечательное применение двоичного кода.

    Одиночный звуковой сигнал: оператор ВЕЕР

    Одиночный звуковой сигнал: оператор ВЕЕР

    Звуковое оформление можно осуществить с помощью оператора веер. Это, вероятно, самый простой, но весьма полезный оператор Бейсика. Он вызывает звуковой сигнал из динамика — гудок продолжительностью четверть секунды — и обеспечивает тот же эффект, что и оператор print chr$(7). Несколько таких гудков подряд дадут длительный сигнал и привлекут, если требуется, ваше внимание к программе. Попробуйте поэкспериментировать со следующими операторами:
    FOR В = 1 ТО 10
    ВЕЕР NEXT В


    C2 L20 U20 R20 D20

    Рисунок ание блохи
    DRAW " C2 L20 U20 R20 D20 F10 D10 R2"
    DRAW "BM300,175 C2 G10 D10 L2"
    DRAW "ВМ300Д55 С2 НЮ ЕЮ L2"
    DRAW "BM320,155 C2 ЕЮ НЮ R2"
    DRAW "ВМ310Д55 С2 U4"
    DRAW "ВМ307,151 С2 RIO H6 G6"
    PAINT (310, 170), 2, 2
    BYTES = INT((55 *2+7)/8)*60
    DIM BUG(BYTES)
    GET (285, 135)-(340, 195), BUG
    CLS
    PUT (250, 80), BUG: SLEEP 1
    PUT (250, 80), BUG: SLEEP 1
    PUT (30, 60), BUG: SLEEP 1
    PUT (30, 60) , BUG: SLEEP 1
    PUT (460, 130) , BUG : SLEEP 1
    PUT (460, 130) , BUG : SLEEP 1
    PUT (180, 70), BUG: SLEEP 1
    PUT (180, 70), BUG: SLEEP 1
    PUT (300, 70), BUG: SLEEP 1
    END

    Оператор GET

    Прежде чем выполнить оператор get, нужно провести важную подготовительную работу: определить местоположение и размер той области экрана, которую вы хотите снять. Большую помощь в этом вам окажет предварительный набросок на миллиметровой бумаге, где каждый квадратик сопоставляется с точкой экрана.
    Оператор get запоминает в массиве изображение заданной области экрана. Поэтому нужно заранее описать массив оператором dim. Существует формула, определяющая требуемую длину массива исходя из размеров запоминаемой области и режима работы экрана. Формула для средней разрешающей способности экрана такова:

    INT ( (число точек по горизонтали * 2 + 7) /8) * число точек по вертикали

    Формула для высокой разрешающей способности экрана:

    INT {(число точек по горизонтали + 7) /8) * число точек по вертикали

    В строке программы, содержащей присваивание переменной bytes, подсчитывается длина массива, необходимая для изображения блохи при средней разрешающей способности.

    Рисунок ок занимает примерно 55

    Рисунок ок занимает примерно 55 позиций по .горизонтали и 60 — по вертикали. Результат вычисления определяет длину массива bog в следующей строке.

    Оператор

    GET (285, 135)-(340, 195), BUG

    переписывает в массив bug содержимое прямоугольной области экрана, левый верхний угол которой совпадает с точкой (285, 135), а правый нижний — с точкой (340, 195).

    Оператор PUT

    Теперь уже совсем просто "посадить" блоху в любое место экрана. Это делается с помощью оператора put. В строках, следующих за оператором get программы, содержимое массива bug размещается на экране с той позиции, которая указана в операторах put. Так, оператор

    PUT (250, 80), BUG

    накладывает содержимое области экрана, снятое с помощью get, на прямоугольник, левый верхний угол которого находится в точке (250, 80). Эффект наложения таков, что если два одинаковых оператора put следуют подряд, то второй нейтрализует действие первого: изображение сначала рисуется, а затем стирается. Таким образом, несколько сдвоенных операторов put создают иллюзию движения изображения.
    Дополнительный параметр оператора put определяет способ наложения рисуемого изображения с тем, что уже есть на экране. Оператор с параметром pset

    PUT (250, 80), BUG, PSET

    игнорирует прежнее изображение в данной области экрана. Оператор

    PUT (250, 80), BUG, PRESET

    действует так же, но рисует негативное изображение, а оператор

    PUT (250. 80), BUG, XOR

    действует так же, как оператор без последнего параметра. Два таких оператора, следующих подряд, рисуют и тут же стирают изображение, оставляя экран неизменным.
    Оператор

    PUT (250, 80), BUG, AND

    оставляет только общую часть нового и старого изображения. Оператор

    PUT (250, 80), BUG, OR

    "добавляет" изображение к тому, что уже есть на экране. Поэкспериментируйте с оператором put и постарайтесь использовать предоставляемые им возможности.



    Характеристики видеосистем

    Таблица 3.1. Характеристики видеосистем

    Адаптер Разрешение Количество цветов
    VGA (Video Graphics Array) 640x480 256
    SVGA (Super Video Graphics Array) до 1024x1024 До 16 миллионов
    При запуске Бейсика автоматически загружается текстовый экранный режим screen о. А далее адаптеры VGA и SVGA поддерживают режимы, представленные в табл. 3.2. Воспользовав шись этой таблицей, вы сможете устанавливать графический режим с помощью оператора screen.

    Экранные режимы для адаптеров VGA и SVGA

    Таблица 3.2. Экранные режимы для адаптеров VGA и SVGA

    Номер режима Разрешение Количество цветов
    0 текстовый режим 16
    1 320x200 4
    2 640x200 2
    7 320x200 16
    8 640x200 16
    9 640x350 16
    10 640x350 2
    11 640x480 2
    12 640x480 16
    13 320x200 256


    Возможные цвета

    Таблица 3.3. Возможные цвета

    Номер Цвет
    0 Черный
    1 Синий
    2 Зеленый
    3 Голубой
    4 Красный
    5 Фиолетовый
    6 Коричневый
    7 Светло-серый
    8 Темно-серый
    9 Светло-синий
    10 Светло-зеленый
    11 Светло-голубой
    12 Светло-красный
    13 Васильковый
    14 Желтый
    15 Ярко-белый


    Команды оператора PLAY

    Таблица 3.4. Команды оператора PLAY

    Команда Действие
    Буква от А до G Исполнение ноты, обозначенной указанной буквой
    Буква от А до G, за которой следует знак #, + или - Исполнение ноты в соответствии с буквой, где знак # или + означают "диез", а знак — соответствует "бемоль"
    Lx Исполнение последующих нот с интервалом 1/х, где х меняется в диапазоне от 1 до 64
    Ox Играть в октаве х. Третья октава начинается со среднего "ми" (нота С). Всего имеется семь октав (с 0 по 6), расположенных между "ми" и "ре" (от С до В)
    Px Пауза длительностью 1/х (х от 0 до 64)
    Tx Задание темпа или четвертных нот, исполняемых в минуту (х может меняться от 32 до 255; по умолчанию равно 120)
    Nx Исполнение ноты х, которая может меняться от 0 до 84. Каждая октава имеет 12 нот, включая диезы и бемоли. 0 означает паузу
    MN Нормаль. Каждая нота звучит 7/8 времени, заданного в команде L
    ML Легато. Каждая нота звучит полный интервал, заданный в команде L
    MF Стаккато. Каждая нота звучит 3/4 времени, заданного в команде L
    MS Установка режима непосредственного исполнения. Каждая нота, заданная в операторах PLAY н sound, исполняется только после завершения предыдущей. Исполнение программы приостанавливается до окончания музыки. Этот режим принимается по умолчанию
    MB Установка режима фонового исполнения. Каждая нота, заданная в операторах PLAY и SOUND, сохраняется в отдельном буфере и исполняется в процессе работы основной программы
    . (точка) Увеличение продолжительности звучания на 50%
    Фоновая музыка — весьма эффективное средство, дополняющее визуальное восприятие работы компьютера. Она успокаивающе действует на нетерпеливого клиента, который вынужден ждать, скажем, окончания выполнения программы службы знакомств.
    В очередной программе фоновая музыка делает поздравление из ранее рассмотренного примера более теплым. В операторах play команда mf заменена командой мв (фоновое исполнение). В результате программа выводит на экран имя именинника, не дожидаясь окончания музыки. Музыка продолжается в процессе исполнения цикла for. . .next, во время которого на экране пишется имя крокодила Гены.
    ' Поздравление с днем рождения!
    CLS
    PLAY "L8 MB MS 03 GG L4 AG 04 С 03 L2 В"
    PLAY "L8 MB MS 03 GG L4 AG 04 D L2 C"
    PLAY "L8 MB MS 03 GG L4 04 GE L8 CC 03 L4 В А"
    PLAY "04 L8 FF L4 ECD LI C"
    FOR I = 1 TO 24
    LOCATE I, I
    PRINT "КРОКОДИЛ ГЕНА, С ДНЕМ РОЖДЕНИЯ!" NEXT I END
    В следующей программе параметр х цикла for...next внутри цикла используется для обозначения длительности звучания ноты G (соль) в третьей октаве.
    FOR X = 1 ТО 64
    PLAY "L" + STR$(X)
    PLAY "03G" NEXT
    Поскольку аргумент команды L является знаменателем дроби, обозначающей длительность ноты, с возрастанием х длительность звучания становится все короче. Запустите программу и вы услышите музыку, напоминающую звук скачущего пластмассового шарика.


    Звуковое оформление: оператор SOUND

    Звуковое оформление: оператор SOUND

    Запустите программу, приведенную ниже, и вы поймете, как работает оператор sound. Вы услышите звук той частоты и длительности, которые указаны как параметры оператора. Первый параметр х определяет частоту в диапазоне от 37 до 32 767 Гц, хотя высокие частоты едва ли будут приятны (если вообще доступны) для вашего слуха.
    FOR S = 37 ТО 3000 STEP 100
    SOUND X, 18 NEXT X
    Второй параметр 18 задает длительность звучания, измеряемую в тактах часового механизма ("тиках"). Поскольку секунде соответствует 18,2 "тика", в нашем примере звук каждой частоты длится примерно одну секунду.
    Обычно оператор sound не исполняется до тех пор, пока не "прозвучит" предыдущий оператор. Однако оператор sound с нулевой длительностью, сам по себе не вызывающий звука, прерывает работу предыдущего оператора sound, даже если тот не отзвучал до конца.
    Пример программы, воспроизводящей звуки занятой телефонной линии:
    Как работает оператор SOUND
    CLS
    FOR S = 1 ТО 10
    SOUND 25000, 3
    LOCATE 20, 11: ?" Занято! "
    SOUND 400, 5 NEXT S
    Первый оператор sound воспроизводит звук очень высокой частоты, не воспринимаемой человеческим ухом, и прерывает звук, создаваемый вторым оператором sound.


    Basic вводный курс

    Язык Qbasic. Краткий справочник

    Язык Qbasic. Краткий справочник

    Здесь мне хочется коротко представить наиболее часто используемые операторы Бейсика, снабдив их краткими комментариями (табл. П1—П10). Полная справка по языку имеется в его оболочке, где вы легко можете найти полные сведения о том или ином операторе с наглядными примерами.

    Коды ASCII

    Коды ASCII

    Стандартные и расширенные ASCII-коды опубликованы уже в сотнях книг, посвяшенных программированию. Более того, вы уже можете написать программу, выводящую их на экран. К тому же эти коды есть в справочной системе нашего Бейсика. Но все равно хочется почему-то иметь их перед глазами.
    Недолго думая, я взял их из вышеупомянутой системы при помощи клавиши , и вот — пользуйтесь, кому интересно (Рисунок П1, П2).



    П1. Стандартные коды (0—127)

    Рисунок П1. Стандартные коды (0—127)


    П1. Стандартные коды (0—127)



    П2. Расширенные коды (128—255)

    Рисунок П2. Расширенные коды (128—255)


    П2. Расширенные коды (128—255)



    Сообщения об ошибках и их коды

    Сообщения об ошибках и их коды

    Коды сообщений об ошибках приведены в табл. ПИ. Для наиболее распространенных ошибок даются комментарии.

    П1. Числовые функции

    Таблица П1. Числовые функции

    Функция Описание
    ABS Возвращает абсолютное значение (модуль) аргумента
    ATN Арктангенс (в радианах)
    CDBL Переводит числовое выражение в значение с двойной точностью
    CINT Округление
    CLNG Округление числового выражения до длинного (4 байта) целого значения
    COS Косинус
    CSNG Переводит числовое выражение в значение с одинарной точностью
    ЕХР Экспонента ех
    FIX Округление выражения с плавающей запятой до его целой части
    INT Возвращает наибольшее целое, меньшее либо равное числовому выражению
    LOG Натуральный логарифм числового выражения
    RND Случайное число одинарной точности между 0 и 1
    SCN Возвращает значения знака числового выражения (1, если выражение положительное; 0, если равно 0 и —1, если отрицательно)
    SIN Синус
    SQR Корень квадратный
    TAN Тангенс


    П10. Строковые функции

    Таблица П10. Строковые функции

    Функция Описание
    CHR$ Возвращает ASCII-код первого символа в строковом выражении
    | DATE? Возвращает текущую системную дату
    INSTR Возвращает позицию первого вхождения подстроки в строку
    LCASES Переводит все символы строковой переменной в строчные буквы
    LEET$ Возвращает указанное число символов слева строки
    LEN Возвращает длину строковой переменной в символах
    MID$ Возвращает указанное число символов из середины строковой переменной, начиная с указанной позиции
    RIGHT$ Возвращает указанное число символов справа строки
    SPACE$ Возвращает строку пробелов
    STRING$ Возвращает строку указанных символов
    UCASE$ Переводит все символы строковой переменной в прописные буквы


    П11. Сообщения об ошибках

    Таблица П11. Сообщения об ошибках

    Код Сообщение об ошибке
    1 NEXT без FOR Для окончания цикла NEXT нет соответствующего заголовка FOR. Количество FOR и NEXT должно совпадать
    2 Синтаксическая ошибка Оператор содержит грамматическую ошибку в написании ключевого слова или ошибку в пунктуации, либо есть непарные скобки или другие нарушения правил синтаксиса языка Бейсик
    3 RETURN без GOSUB Для оператора возврата из подпрограммы RETURN нет соответствующего обращения к подпрограмме GOSUB
    4 Нет данных В операторе DATA нет данных. Посчитайте количество данных в операторе DATA и количество считываний из него оператором READ. Посмотрите внимательно, не поставили ли вы при перечислении данных в каком-нибудь месте точку вместо запятой
    5 Неверный вызов функции Возникает чаще всего при попытке извлечения квадратного корня из отрицательного числа или применения графических операторов без включения графического режима SCREEN. Вообще же подобное сообщение возникает при попытке вызова функции с недопустимым параметром
    6 Переполнение Числовая переменная или строковая константа выходят за пределы допустимого диапазона. Проверьте и измените значение в случае необходимости
    7 Не хватает памяти
    8 Метка не определена Оператор GOTO или GOSUB пытаются осуществить переход на несуществующую метку
    9 Индекс вне режима Сообщение возникает при работе "с массивами, когда индекс какого-либо элемента массива превышает его объявленный в операторе DIM размер, а также в том случае, когда массив занимает в памяти объем более 64 Кбайт
    10 Повторяющееся определение
    11 Деление на ноль Выражение в знаменателе после подстановки соответствующих переменных и вычислений, видимо, обращается в ноль
    12 Ошибка в режиме управления
    13 Ошибка ввода
    14 В строке нет места
    16 Слишком сложная строковая формула
    17 Невозможно продолжить
    18 Функция не определена Возможно, используемая функция не определена оператором DEF FN, или допущена ошибка при определении или вызове функции
    19 Нет RESUME
    20 RESUME без ошибки
    24 Устройство в тайм-ауте
    25 Ошибка устройства
    26 FOR без NEXT Для заголовка цикла FOR нет соответствующего окончания цикла NEXT. Количество FOR и NEXT должно совпадать
    21 Нет бумаги
    29 WHILE без WEND Для ключевого слова WHILE нет соответствующего слова WEND
    30 WEND без WHILE Для ключевого слова WEND нет соответствующего слова WHILE
    33 Повторяющаяся метка При расстановке меток допущен повтор одной и той же метки в разных местах программы
    35 Подпрограмма не определена Сообщение возникает при попытке обращения к несуществующей подпрограмме
    37 Ошибка счетчика аргументов
    38 Массив не определен Попытка работать с элементами массива, который не был объявлен оператором DIM
    40 Необходима переменная
    50 Переполнение FIELD
    51 Внутренняя ошибка Чаще всего неверная работа компьютера, реже — смысловые ошибки программы, не сразу различимые на первый взгляд. Часто требуется ручная прокрутка программы
    52 Плохое имя файла/плохой номер Имя файла не соответствует требованиям DOS
    53 Файл не найден При попытке обращения к файлу указано неправильное его имя или путь к нему
    54 Плохой режим файла
    55 Файл уже открыт Попытка повторного открытия файла или удаления открытого файла
    56 Оператор FIELD активен
    57 Ошибка в/вв устройства
    Ошибка устройства ввода/вывода, с которой не справляется DOS. Попробуйте посмотреть, все ли в порядке с аппаратной частью, т. е. внешними устройствами компьютера
    58 Файл уже существует Попытка сохранить файл под именем уже существующего на диске файла
    59 Неверная длина записи
    61 Диск заполнен Диск, на который производится запись файла, не имеет достаточно места для этого. Надо освободить дисковое пространство, удалив что-нибудь менее важное
    62 Ошибка: введен конец файла
    63 Неверный номер записи
    64 Плохое имя файла Имя файла не соответствует требованиям DOS
    67 Слишком много файлов
    68 Устройство недоступно В дисководе нет диска или он испорчен
    69 Переполнение буфера коммуникации Попытка копирования в буфер слишком большого обьема информации
    70 Нет разрешения
    71 Ошибка формата диска В дисководе нет диска или он испорчен
    72 Ошибка диска В дисководе нет диска или он испорчен
    73 Недоступная возможность
    74 Переименование через диски
    75 Ошибка доступа к пути/файлу
    76 Путь не найден При попытке обращения к файлу указано неправильное его имя или путь к нему


    П2. Функции графики и экрана

    Таблица П2. Функции графики и экрана

    Функция Описание
    CIRCLE Рисунок ание окружностей и эллипсов
    CLS Очистка текстовой и графической областей экрана
    COLOR Установка цветов экрана
    CSRLIN Возвращает текущую позицию строки курсора
    DRAW Рисунок ание объектов при помощи набора специальных команд
    GET Сохранение в памяти графической прямоугольной области экрана
    LINE Рисунок ание отрезка прямой линии, прямоугольников со сторонами, параллельными экрану
    LOCATE Перемещение курсора в указанную позицию
    PAINT Закрашивание замкнутого контура
    PALETTE Изменение установок атрибутов цвета
    PALETTE USING Изменение атрибутов цвета пользователем
    PCOPY Копирование одной страницы видеопамяти в другую
    PRESET Рисунок ание точки цветом фона
    PRINT Вывод данных на экран или в файл
    PRINT USING Осуществляет форматированный вывод данных на экран или в файл
    PSET Рисование точки
    PUT Вывод на экран образа, сохраненного оператором GET
    SCREEN Установка режима и характеристик экрана
    VIEW Определяет размер и положение области просмотра, в которую может быть выведена графическая информация
    VIEW PRINT Устанавливает на экране границы области просмотра текста
    WIDTH Изменение числа строк и столбцов, видимых на экране
    WINDOW Определяет логическое пространство для текущей графической области просмотра
    WRITE Запись данных на экран или в последовательный файл


    П4. Операторы и функции для работы с файлами

    Таблица П4. Операторы и функции для работы с файлами

    Оператор, функция Описание
    CLOSE Закрывает один или несколько файлов или устройств
    FIELD Отводит место под переменные в буфере файлов прямого доступа
    FILEATTR Возвращает информацию об открытом файле
    GET Считывает из файла в буфер прямого доступа или в переменную
    INPUT # Считывает данные из файла
    IOCTL Посылает управляющую строку драйверу устройства
    LINE INPUT # Считывает строку до 255 символов с клавиатуры или из файла
    LOCK Ограничивает или закрывает доступ к файлу при работе в сети
    OPEN Открывает файл или устройство
    PRINT # Записывает данные в файл
    PRINT # USING Записывает отформатированные данные в файл
    PUT Записывает содержимое переменной или буфера прямого доступа в файл
    RESET Закрывает все открытые файлы и устройства
    SEEK Устанавливает позицию файла для последующей записи или считывания
    UNLOCK Снимает ограничения, наложенные последним оператором LOCK
    WRITE # Записывает данные в последовательный файл


    П5 . Переменные

    Таблица П5 . Переменные

    Конструкция Описание
    CLEAR Закрывает все файлы, освобождает буферы файлов, очищает все общие переменные, устанавливает числовые переменные и массивы в ноль, устанавливает строковые переменные в ноль и инициализирует стек. Кроме того, CLEAR может изменять размер стека
    CONST Описывает одну или несколько символьных переменных
    DATA Указывает значения данных для последующего считывания оператором READ
    INPUT Считывает входные данные с клавиатуры или из файла
    LET Присваивает значение выражения переменной
    RANDOMIZE Инициализирует генератор случайных чисел
    READ Считывает данные, указанные в операторе DATA
    RESTORE Восстанавливает считанные значения в операторе DATA
    SWAP Обменивает значения двух переменных


    П6. Массивы

    Таблица П6. Массивы

    Конструкция Описание
    DIM Оператор объявления массива
    ERASE Для статических массивов каждому элементу присваивается ноль. Для строкового — определяются строки нулевой длины. Для динамического — освобождает память, используемую массивом
    OPTION BASE Устанавливает нижнюю границу индекса массива
    REDIM Описывает или изменяет размер динамического массива


    П7. Циклы

    Таблица П7. Циклы

    Оператор Описание
    DO ... LOOP Повторяет блок операторов, пока условие верно, или пока оно не станет верным
    END Заканчивает программу, процедуру или блок
    FOR ... NEXT Цикл с параметром, с заранее известным числом повторений
    WHILE ... WEND Выполняет блок операторов, пока указанное условие верно


    П8. Подпрограммы и функции

    Таблица П8. Подпрограммы и функции

    Оператор Описание
    CALL Передает управление в процедуру типа SUB
    DECLARE Описывает процедуру типа FUNCTION или SUB
    DEF FN Определяет функцию
    FUNCTION Определяет процедуру FUNCTION
    GOSUB Переходит в подпрограмму и возвращается из нее
    ON GOSUB Выполняет переход к одной из нескольких подпрограмм в зависимости от выражения
    RETURN Возвращает из подпрограммы в основную программу
    SUB Определяет процедуру SUB


    П9. Звуки и музыка

    Таблица П9. Звуки и музыка

    Оператор Описание
    BEEP Генерирует звуковой сигнал через встроенный динамик
    ON PLAY GOSUB Обращение к подпрограмме, когда число нот в музыкальном буфере меньше определенного числа
    PLAY Воспроизводит музыкальные ноты
    SOUND Генерирует звук через встроенный динамик


    ПЗ. Операторы выбора и перехода

    Таблица ПЗ. Операторы выбора и перехода

    Оператор Описание
    GOTO Безусловный переход на метку
    IF ... THEN ... ELSE Переход в зависимости от истинности или ложности проверяемого условия
    SELECT CASE Переход в зависимости от значения выражения


    

        Программирование: Языки - Технологии - Разработка