яНДЕПФЮМХЕ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

Учебник по языку Basic в задачах и примерах

Содержание

  • Предисловие
  • Язык Бейсик
  • Алгоритмы
  • Циклический алгоритм
  • Символы и строки
  • Массивы
  • Работа с файлами
  • Задания повышенной трудности, интегрированные, азартные
  • Решения
  • Дополнительные возможности
  • Приложение


оПЕДХЯКНБХЕ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

Предисловие

  • О предлагаемой книге
  • Немного истории
  • О языках: интерпретаторы и компиляторы
  • Дружественный интерфейс
  • Основные этапы решения алгоритмических задач на компьютере

О предлагаемой книге

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

Немного истории

Давайте для начала договоримся об определениях, чтобы в дальнейшем говорить на одном языке, поскольку .язык алгоритмов должен быть понимаемым ясно и однозначно.
Под языком программирования мы будем понимать совокупность средств и правил представления алгоритма в виде, приемлемом для компьютера. Отсюда неискушенный читатель может решить, что компьютер, оказывается, при всей его кажущейся могущественности, не поймет задачи, поставленной ему на простом человеческом языке, будь то русский, английский или даже китайский. Таким образом, существует разделение всех языков программирования на две большие группы — языки высокого и низкого уровней. Человек считает себя венцом творения (с этим можно согласиться, но можно и поспорить, если внимательней присмотреться к некоторым таким "венцам"), поэтому языком самого высокого уровня считается" человеческий язык, и когда компьютер станет его легко понимать, то он вплотную приблизится к человеку. Языком самого низкого уровня считается язык так называемых машинных кодов. Все остальные алгоритмические языки лежат где-то посередине. Например, к языкам низкого уровня принадлежат так называемые языки семейства ассемблеров. Их достоинство в том, что они почти не требуют перевода для компьютера, и он практически сразу выполняет алгоритм. Есть, однако, существенный недостаток — писать программы на таких языках может только очень опытный программист, и получаются они слишком громоздкими. Напротив, языки высокого уровня в достаточно сильной степени приближены к человеческому (чаше к английскому) языку — это и Фортран, и Паскаль, и Си, но выполнение алгоритма компьютером в данном случае несколько тормозится предварительным переводом на язык машинных кодов.
К языкам высокого уровня принадлежит и тот, который рассматривается в данной книге. Он служит своего рода переводчиком между человеком и компьютером, помогая им понять друг друга и совместно добиться решения поставленных задач. Разработан первый Бейсик в 1964 г. сотрудниками Дартмутского колледжа Дж. Кемени и Т. Курцем. Интересно происхождение названия языка. В прошлом веке один английский миссионер выделил из английского языка триста наиболее употребительных слов, назвал их Basic English и стал обучать туземцев. Опыт оказался весьма успешным, и контакты с аборигенами значительно упростились. Создатели языка Бейсик стремились достигнуть того же эффекта — облегчить понимание между "туземцами" — начинающими программистами, и компьютерами. Аббревиатура BASIC так и расшифровывается — "Beginner's All purpose Symbolic Instruction Code", что в переводе значит "многоцелевой язык символических команд для начинающих".
Идея оказалась удачной, и на десятилетия язык Бейсик стал основным в деле вовлечения в программирование новых и новых адептов. У автора этой книги есть большое количество выпускников, давно превзошедших своего учителя в деле программирования, успешно работающих у нас и за рубежом, но начинавших с того же Бейсика — тогда еще для ZX-Spectrum. Даже в те времена на несовершенной, зачастую собранной своими руками, технике они писали очень приличные прикладные программы — и для дела, и для игры. Большое достоинство Бейсика, из-за которого его изучение продолжается в школах и поныне — это возможность создавать диалоговые программы.
Ныне Бейсик вышел за рамки языка для начинающих, и его могучий потомок — Visual Basic позволяет творить на компьютере просто чудеса.
Но вернемся к нашему старому доброму Бейсику. За эти годы было создано несколько его версий — GW-Basic, MSX-Basic, TurboBasic, QuickBasic. Автор за время своей работы в школе программировал на всех этих версиях и практически на всех видах техники, начиная от БК и "Корвета" и заканчивая (на момент написания книги) Pentium-II. И все же, в качестве основного для этой книги выбрал Russian QuickBasic. Но я уверен, что искушенный читатель знает, а неискушенный пусть успокоится, все эти версии очень похожи друг на друга базовым набором операторов и конструкций, и, изучив какую-либо одну версию, очень легко перейти на другую. Это примерно как различия русского языка в Санкт-Петербурге и Москве: мы говорим "карточка", а москвичи "проездной", мы говорим "ларек", а они — "палатка", мы произносим "дожди", а они — "дожжи". Можно бесконечно подтрунивать над этими небольшими различиями, но мы прекрасно друг друга понимаем. Итак, давайте говорить на великом и могучем языке высокого уровня — Бейсике.

О языках: интерпретаторы и компиляторы

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

Дружественный интерфейс

Правда, у подножия сияющих вершин ваших будущих программных достижений я вас немножко приторможу с тем, чтобы вы отчетливо понимали, что плодами вашего творчества будут пользоваться и другие люди, зачастую ничего не сведущие в программировании. А поэтому я коротко изложу свои взгляды на мои представления об оформлении программ, или о так называемом дружественном интерфейсе. Ну, кто хоть немного знает английский, тот уже может догадаться, что "интер" — это "между", а "фэйс" — это то, что бывает об "тэйбл", т. е. "лицо". Соответственно, интерфейс — "между лицами", в данном случае имеет смысл в значении оформления диалога между пользователем и компьютером в процессе исполнения написанной программистом (вами, уважаемый читатель!) программы.
Кстати, короткое лирическое отступление об английском языке в деле программирования. Это не роскошь, а суровая необходимость. Опять же вспоминаю с улыбкой своих выпускников, особенно тех, кто учил в школе немецкий. Мой программистский сленг обогатился такими терминами, как "филе наме" (file name), "гамовер" (game over), "лине" (line), "цирцле" (circle). Но произношение — это как раз не самое страшное, а вот писать и понимать ограниченный набор (Basic English) англоязычных терминов необходимо.
Итак, несколько моих принципов по оформлению программ:

  • "Кашу маслом не испортишь" — как можно больше поясняющих комментариев к вашему алгоритму, и пользователям вашей программы хорошо, и (что немаловажно для учащихся) преподаватель всегда очень радуется. Но самое главное, лично вам будет очень просто редактировать и отлаживать программу. К сожалению, этот принцип зачастую игнорируется начинающими программистами, что снижает как текущие оценки, так и олимпиадные, а кроме того, очень затрудняет понимание сути алгоритма и нахождение возможностей для его улучшения.
  • "Fool Proof — зашита от дурака. Ваша программа должна выдерживать натиск неграмотного пользователя (от хакера-то все равно зашиты не найти!) и сопротивляться его попыткам при исполнении программы ввести цифры, где надо было имя, или нажать клавишу <Пробел>, когда была указана клавиша <Enter>.
  • Доходчивость. При написании программы не стоит рассчитывать, что работать с ней будут умные люди (хотя и такие встречаются среди пользователей), а потому при исполнении вашего алгоритма программа должна максимально подробно объяснять человеку, что она от него хочет, и какую "пим-почку" в данный момент надо нажать.
  • Ну и конечно, "красота спасет, мир". Пусть вы делаете даже просто программу проверки знания таблицы умножения, но сделайте это красиво — примените цветовое и шрифтовое оформление, а можно ведь и звуковые эффекты. Не скупитесь на экранные похвалы в адрес пользователя вашей программы — ласковое слово и кошке приятно!

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

Основные этапы решения алгоритмических задач на компьютере

Подход многих моих учеников к решению поставленных мной задач по программированию достаточно однообразен, и в народе носит название "метода тыка". Получив задание, такие, с позволения сказать, "программисты" садятся к компьютеру и начинают комбинировать операторы языка Бейсик в различных вариантах, пытаясь достичь требуемого результата. Да, иногда получается. Но чаще — нет. Почему? Потому что отсутствует системный подход к задаче, что, во-первых, разбазаривает самый драгоценный человеческий ресурс — время, а во-вторых, не приносит плодов ни в программировании, ни в жизни.
Предлагаю метод, как, на мой взгляд, надо подходить к решению программистских задач. А вы уж решайте сами. "Это вам не мелочь по карманам тырить", — как говорил незабвенный Остап Бендер, — "тут думать надо!".
Итак, этапы решения алгоритмических задач на компьютере.

  1. Постановка задачи. Один из самых главных этапов. Вы должны добиться от того, кто дает вам задачу (это можете быть и вы сами) ясной и четкой ее постановки. Вы однозначно и вполне определенно должны понять, что будет результатом решения задачи. Каковы исходные данные? Существуют ли ограничения для этих данных? Можно сказать, что точность и четкость в постановке задачи — это половина дела. Напротив, в случае недопонимания каких-то моментов вероятность непроизводительной траты времени и отрицательного результата резко возрастает.
  2. Следующий этап — решение вопроса "Как будет реализовы-ваться поставленная задача?". Как достичь требуемых результатов? Каковы способы и методы достижения уясненных на первом этапе целей?
  3. После первых двух этапов наступает пора еще одного очень важного момента — этапа разработки алгоритма решения поставленной задачи, т. е. структуризация, разбиение задачи на последовательность простых модулей, каждый из которых легко может быть реализован на языке программирования.
  4. Очередной этап — непосредственный перевод словесного алгоритма или его блок-схемы на выбранный язык программирования и ввод полученной программы в компьютер.
  5. После ввода программы обычно выясняется, что где-то мы допустили просто синтаксические ошибки, где-то недоработали алгоритм, где-то не хватает исходных данных и т. д. Поэтому теперь начинается отладка программы, иными словами, устранение ошибок и неточностей, допущенных на предыдущих этапах.
  6. После того как программа заработала, необходимо проверить ее на правильность работы, используя набор контрольных данных (в тех случаях, где это возможно). Так, например, если мы написали программу для расчета корней квадратного уравнения по заданным коэффициентам, то можем проверить работу программы, вводя такие коэффициенты, для которых предварительно были рассчитаны значения корней или их отсутствие. Это так называемый тестовый этап.
  7. После тестового этапа (если профамма его выдержала!), можно применять программу по назначению. Ну и последнее. Страна должна знать своих героев, а потому завершающим этапом работы по решению алгоритмической задачи следует считать документирование, т. е. распечатку листинга программы, снабженную необходимыми комментариями автора. С этого момента разработанная программа становится интеллектуальной собственностью программиста, и им начинает гордиться семья и школа.


ъГШЙ аЕИЯХЙ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

Язык Бейсик

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

Оболочка Russian Quick Basic

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

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

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

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

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

Существует три основных варианта.

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

Во всех трех случаях экран очищается и появляется среда русского Бейсика (рис. 1.1).

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

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

  • верхнее — окно редактирования;
  • нижнее — окно немедленного выполнения.

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

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

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

В окне редактора мигает курсор — горизонтальная светящаяся черточка, указывающая, где будет вводиться текст программы при наборе его с клавиатуры.
Если вы заметили, что что-то набрали неправильно, есть несколько путей исправить допущенные ошибки.

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

Впрочем, все то же самое можно сделать через меню Редактирование.

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

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

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

Как же запустить программу? Когда вы написали программу и хотите посмотреть, а что, собственно, из этого получилось, то надо нажать клавишу <F5>. Программа будет исполнена в случае отсутствия синтаксических ошибок, и тогда вы увидите результаты ее работы и сообщение внизу экрана "Чтобы продолжить, нажмите любую клавишу". Эта надпись вызывает иногда смятение в душах неопытных программистов, и они начинают судорожно искать на клавиатуре надпись "Любая клавиша". Надеюсь, у вас до этого не дойдет. Если же в программе есть ошибки, то вы их исправляете, и у вас вновь два варианта:

  • запустить программу с места, где она прервалась — клавиша <F5>;
  • запустить программу сначала — сочетание клавиш <Shift>+

Если вы хотите видеть окно, в котором видны результаты выполнения программы, то нажмите клавишу <F4>.
Основы есть? Если возникают вопросы, то, во-первых, при выборе тех или иных пунктов меню внизу появляется краткая информация о нем на русском языке, а по нажатии клавиши <FI> вы получите более подробные сведения. Во-вторых, в самом меню есть справка и по командам языка Бейсик, и по содержанию. Учитесь пользоваться справочным материалом!

Предупреждение
Если у вас отсутствует мышь, то попадание в меню осуществляется клавишей <Alt>, а работа в нем — клавишами управления курсором < [image] > и < [image] > и клавишей <Enter>.

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

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

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

Чтобы открыть уже существующий файл, в меню Файл выберите команду Открыть. Появится диалоговое окно, в котором надо найти диск и каталог, где записан файл, указать его имя и нажать кнопку ОК.
Чтобы начать работу с новым файлом, в меню Файл выберите команду Новый.
Для выхода из Бейсика в меню Файл существует команда Выход. Если вы забыли сохранить свою программу, то Бейсик напомнит вам об этом до выхода и предложит сохранить ваш труд. И только после этого вы выйдете в ту среду, из которой Бейсик был загружен.

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

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

  • Заглавные (или прописные) буквы латинского алфавита: А, В, С, 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.
  • Разделители: , (запятая), ; (точка с запятой), . (точка), : (двоеточие), ' (апостроф), " (кавычки), ( (открывающая скобка), ) (закрывающая скобка), символ <Пробел>.
  • Знаки арифметических операций: + (сложение), — (вычитание), * (умножение), / (деление), л (возведение в степень).
  • Знаки операций отношений: > (больше), < (меньше), = (равно), <> (не равно), >= (больше либо равно), <= (меньше либо равно).

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

Компьютер, как и вы, уважаемые читатели, обладает памятью. Она бывает разная. В процессе отладки вашей программы ком пьютер напрягает эту самую память, размещая в ней исходные данные, обрабатывая их, используя ваш алгоритм, получая результаты и доводя их до вашего сведения — чаще на экран монитора. Я думаю, для вас не секрет, что память эта называется ОЗУ (Оперативное Запоминающее Устройство), или по-английски 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, при нажатой-клавише <Shift>), например, Х$ или QUIKE3$.

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

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

  • в отличие от арифметики, выражение должно быть записано в одну строку безо всяких числителей и знаменателей;
  • для записи арифметических действий допустимо использовать только перечисленные ниже знаки:
    • + (сложение, слева от клавиши <Backspace> или на малой цифровой клавиатуре "серый плюс");
    • - (вычитание, то же, что дефис, или на малой цифровой клавиатуре "серый минус");
    • * (умножение, там же, где цифра 8 на основной клавиатуре при нажатой клавише <Shift> или на малой цифровой клавиатуре "серая звездочка");
    • / (деление, на разных клавиатурах бывает в разных местах или на малой цифровой клавиатуре "серый слэш");
    • ^ (возведение в степень, при выбранном латинском шрифте там же, где цифра 6 на основной клавиатуре при нажатой клавише <Shift>);
    • () (скобки, там же, где цифры 9 и 0 на основной клавиатуре при нажатой клавише <Shift>).
  • недопустим пропуск знака умножения между коэффициентом и переменной, как это возможно в алгебре (например, нельзя писать 2х, а надо 2*Х, или нельзя 5d, а надо 5*D);
  • дробная часть отделяется от целой точкой, а не запятой (нельзя писать 3,14, а надо 3.14);
  • допустимо опускать в записи десятичной дроби ноль, стоящий перед точкой (вместо 0.123 можно .123).

Чтобы компьютер вычислил выражение правильно, необходимо помнить о приоритете выполнения действий. Тут все как в элементарной математике:

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

Действия одинаковой очередности выполняются слева направо.
Приведем ряд примеров перевода арифметических выражений в пригодный для Бейсика вид.

  • В арифметике [image] — в Бейсике 1/х
  • В арифметике [image] в Бейсике 2*х^2
  • В арифметике [image] в Бейсике (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

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

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

Предупреждение
В левой части оператора присваивания может находиться только имя той переменной, в которую будет заноситься новое значение и больше ничего! В правой части оператора присваивания может находиться: конкретное значение, присваиваемое переменной (в зависимости от типа переменной— число или символ, или строка); арифметическое или алгебраическое выражение, содержащее как конкретные числа, так и имена других переменных, уже имеющих значения; имя другой переменной, уже имеющей значение.

Обе части оператора присваивания соединяются знаком равенства. Тип переменных в левой и правой частях оператора присваивания должен совпадать!
Когда интерпретатор языка Бейсик встречает в программе оператор присваивания, то он обрабатывает его следующим образом: производятся все необходимые вычисления и операции в правой части оператора, находится конкретное значение (числовое или символьное), и это значение заносится в переменную, имя которой указано в левой части.

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

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

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

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

Рассмотрим работу приведенного выше оператора присваивания на примере фрагмента маленькой программы:

Х=15
Y=2
Z=(X-3*Y^2)+7

Вопрос. Чему будет равен Z после выполнения всех операторов присваивания?
Решение. Интерпретатор делает следующее:

  • присваивает переменной X значение 15;
  • присваивает переменной Y значение 2;
  • вычисляет значение правой части третьего оператора присваивания (15-з*2Л2)+7. Получается 10; :i " , "
  • присваивает переменной 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).

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

Пока мы вводили в компьютер исходные данные, используя оператор присваивания. Другие способы ввода будут рассмотрены в одной из следующих глав.
Сейчас же хочется рассмотреть более важную на первых порах составляющую Бейсика — вывод полученных результатов на экран монитора, а также вывод всякого рода текстовых сообщений. То есть мы знакомимся с могущественным оператором 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

И второе, если ваше выражение настолько длинно, что не помещается в экранной строке, то позвольте компьютеру самому перенести часть выражения на следующую строку. Ни в коем случае не делайте этого при помощи клавиши <Enter>.
Вспомнив, что корень квадратный (как, впрочем, и любой другой степени) из числа можно представить в виде возведения в степень, вычислите и с помощью оператора print выведите на экран результаты следующих выражений.
42. Предскажите, какой результат будет получен при вычислении значения выражения 4л1/2. Проверьте свое предположение на компьютере.
43.
44.
45.
46.
47.
48.

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

Предупреждение
Если после оператора print выражение не заключить в кавычки,' компьютер будет пытаться вычислять (если только это не строко вые переменные), а то, что взято в кавычки, выводить на экран без изменений, в том виде, в каком это записано в кавычках.

Например, напишем, казалось бы, два совершенно одинаковых оператора и проследим их действие:

PRINT 2*2
PRINT "2*2"

После запуска программы в первом случае мы получим на экране ответ — цифру 4, а во втором просто выражение 2*2, т. к. при этом оно было взято в кавычки.
Ну что ж, попробуем теперь оформить более красиво программу о вычислении площади квадрата по длине его стороны, равной 5 м.

CLS ' это команда очистки экрана, для тех, кто не помнит
? "Площадь квадрата со стороной, равной 5 м составляет"
? 5^2

На экране мы увидим в левом верхнем углу надпись "Площадь квадрата со стороной, равной 5 м составляет", а под ней число 25. Уже лучше, не так ли? Я уже понимаю, что означает число 25.
Но пока все еще не очень красиво. Хотелось бы, чтобы сообщение и ответ были бы в одной строке, и чтобы единица измерения площади хоть как-то присутствовала. Как это ни удивительно, но оператор print может и это!
Он позволяет выполнять одновременно несколько действий, указанных после него в одной строке. Разделителем действий может служить точка с запятой или запятая.
Рассмотрим пример.

CLS
? "Площадь квадрата со стороной 5 м равна ";5^2;" кв. м"

После запуска программы мы увидим в левом верхнем углу чистого экрана надпись "Площадь квадрата со стороной 5 м равна 25 кв. м".
То есть в операторе print было указано три действия:

  • вывести на экран надпись "Площадь квадрата со стороной 5 м";
  • вычислить 5 в квадрате;
  • вывести на экран надпись "кв. м".

Так как в качестве разделителя использовалась точка с запятой, то все три составные части выведены друг за другом, без пробелов (исключение составляет числовой результат, перед которым компьютер всегда вставляет дополнительный пробел для возможного знака минус в случае получения отрицательного результата).
Вот это уже законченный результат!
Теперь надо бы разобраться в разделителях и постараться их не путать.
Разделитель точка с запятой в последовательности действий оператора print позволяет выводить текстовые сообщения и результаты вычислений в одной экранной строке подряд.
В компьютере экранная строка подразумевается поделенной на зоны размером в 14 символов, и разделитель запятая в последовательности действий оператора print позволяет выводить текстовые сообщения и результаты* вычислений тоже в одной экранной строке, но каждое отдельное действие выводится в следующую зону печати. Этот формат служит главным образом для оформления таблиц с ровными колонками. Например, очередная программа:

? "Фамилия", "Телефон"
?
? "Иванов", "212-85-06"
? "Петров", "712-23-45"
? "Сидоров", "100-09-11"

после запуска выведет на экран следующую таблицу:

Фамилия | Телефон
Иванов | 212-85-06
Петров | 712-23-45
Сидоров | 100-09-11

Обратите внимание на вторую строку программы, в которой стоит оператор print без данных. Такая запись позволяет получить пустую строку. Это удобно, например, для отделения заголовка таблицы от данных. ¦ > ¦
Кроме того, если вы исполните команду

? "Печать"

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

? "Печать"; ' команду завершает точка с запятой

то курсор останется в этой же строке после слова "Печать". Это так называемая печать без перевода строки. >,
49. Выясните на компьютере, как отличаются при выводе на печать следующие строки:

? "X";"Y";"Z"
? "X","Y", "Z"
? "X","Y", "Z"

50. С помощью одного оператора print вычислите пять арифметических выражений: 5+2, 5-2, 5*2, 5:2, 52. В качестве разделителя используйте сначала точку с запятой, а потом запятую.
51. Вычислите и напечатайте с подсказкой на чистом экране:

∙ Сумма=312,66+79,4 4
∙ Корень из двух=v2
∙ Результат равен=2*ЗМ*5*6

52. Напечатайте на чистом экране слова "Печать", "через", "строку" одно под другим через строку.
53. Предскажите действие команды

?, "Эксперимент"

Проверьте свой прогноз.

Замечание
В целях более рационального использования экранного места при написании программы иногда допустимо в одной строке писать несколько операторов языка Бейсик. В таких случаях в качестве разделителя операторов применяется двоеточие

Например:
CLS:?"Экран чист"

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

Пока мы не забыли элементарную арифметику в Бейсике и вывод результатов (надеюсь, у вас это получается, причем в законченной, красивой форме с подсказками), необходимо ознакомиться со стандартными функциями языка Бейсик, чтобы в полной мере ощутить его вычислительные способности.
Бейсик позволяет работать со стандартными алгебраическими функциями, перечисленными в табл. 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

Предупреждение
Функция sqr применима только к положительным аргументам.

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

  • пишут аbc вместо abs для модуля;
  • пишут tg вместо tan для тангенса.

Главное правило при использовании стандартных функций — брать аргумент в скобки:

  • нельзя SIN3, а надо sin(3);
  • нельзя SQR9, а надо sqr(9).

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

Алгебра | Бейсик
sin3 + cos6 + tg4 | SIN(3) +COS(6) +TAN(4)
 | SQR(ABS(SIN(45)-COS(30)^2)

Перед упражнениями расскажем про радианную меру углов, потому что не все, к сожалению, любят тригонометрию. Итак,

1 радиан= 180°/ п, отсюда 1 градус=п/180°, следовательно sin 30° в Бейсике будет представлено как sin (30*3.14/180), п==3,14. А вот теперь можно поупражняться. Запишите на Бейсике следующие выражения:

54.
55.
56.
57.
58.
59.
60.

Представьте в общепринятой математической форме:

61. (-R+SQR(SA2-6*A*B))/(3*А)
62. X/Y*(D-F)+(X+Y)/D/F
63. Xl+TAN(F2-V3)/3*ABS(X2-LOG(4)*Y3)/EXP(-2)

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

Экран компьютера в текстовом режиме представляет собой условную сетку из столбцов и строк. В стандартном режиме таких столбцов 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:?"E111E РАЗ НЕ ТУДА": LOCATE 0,0

66. С помощью нескольких команд напечатайте слова "Раз!" и "Два!" в разных местах экрана.
67. Напишите программу, которая вычислит и напечатает в центре чистого экрана значение выражения: 23+33+43+5J.
Над ним в качестве заголовка напечатайте надпись "Сумма кубов".
68. В центре чистого экрана выведите слово "СЕРЕДИНА", окруженное рамкой из звездочек, как показано ниже:

69. Напечатайте свое имя по диагонали, начиная от верхнего левого угла экрана.
Итак, мы научились вычислять и красиво выводить полученные результаты на экран. А теперь мы научимся вводить эти самые исходные данные.

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

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

Оператор INPUT

Оператор input обеспечивает запрос данных, необходимых для выполнения программы, непосредственно у пользователя, которые тот вводит прямо с клавиатуры. Это дает возможность вести диалог с пользователем и решать задачу, исходя из его конкретных запросов.
Работает оператор input следующим образом. В том месте программы, где вы хотите запросить у пользователя какие-то данные, вы должны написать input, а после него через пробел — переменную или несколько переменных, в которые будут занесены вводимые данные. Например:

CLS:?"Каков Ваш рост в см?"
INPUT R
?"Ваш рост превышает 1 м на ";R-100;"см"

Эта элементарная программа работает так: оператор cls очищает экран, оператор print выводит на экран надпись "Каков Ваш рост в см?". Далее вступает в действие оператор input. Когда программа встречает этот оператор, она приостанавливает свое действие, выводит на экран знак вопроса, после которого мигает курсор. Таким образом, программа показывает, что она ожидает от пользователя ввода данных с клавиатуры. Неискушенный пользователь в этот момент обычно пугается, что программа зависла и начинает звать на помощь. Тот же, кто внимательно прочитает эту книгу, будет знать, что делать, а именно ответить на заданный вопрос, в данном случае — набрать на клавиатуре свой рост и нажать клавишу <Enter>. После таких абсолютно правильных действий пользователя программа заносит введенное число в память в переменную с именем 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 требует не одно, а несколько значений, то после запуска программы их надо вводить в том порядке, в котором они запрашиваются, а по окончании нажать клавишу <Enter>.
Если вы случайно ввели меньше или больше данных, чем было необходимо, и нажали клавишу <Enter>, то появится сообщение "Ввод сначала". Это означает, что вы спокойно, без паники должны осуществить ввод данных заново.
Перед упражнениями приведем еще один пример программы с оператором input:

CLS: INPUT "Как вас зовут";NAME$
? "Здравствуйте,"; NAME$
INPUT "Введите год вашего рождения, а затем текущий год ";YEARl,YEAR2 ! <.
R=YEAR2-YEAR1
?"Вам около";R; "лет"

Запустим программу и проследим ее работу (выделенные полужирным символы должны набираться пользователем в процессе работы программы).

Rem Нажмите <Shift>+<F5>
Как вас зовут? Ваня Rem После ввода нажмите клавишу <Enter>
Здравствуйте, Ваня
Введите год вашего рождения, а затем текущий год? 1986, 2000
Rein После ввода нажмите клавишу <Enter>
Вам около 14 лет .

Несколько маленьких упражнений. < '¦¦'¦'"' ''¦'".
70. Напишите программу, запрашивающую ваш год рождений, год рождения вашей мамы и печатающую/; Во сколько лет мама вас родила. '
71. Напишите дружественную по отношению к пользователю программу. Пусть она обращается к вам по имени, а затем предложит последовательно ввести прилагательное, существительное, наречие и глагол, чтобы в результате вывести на экран несложную фразу с использованием введенных слов.
72. Напишите программу, запрашивающую три стороны треугольника А, В, С и вычисляющую его площадь по формуле Герона:

73. Напишите программу, запрашивающую высоту дома h (в метрах), ускорение свободного падения g, и вычисляющую время падения кирпича t (в секундах) с крыши этого дома по формуле:

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

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

Существует другой способ ввода данных. Он применяется в том случае, если эти данные заранее известны. Тогда мы организуем в программе некое подобие склада (с помощью оператора data), а потом при помощи оператора read последовательно считываем эти данные в запрашиваемые переменные, в которых они хранятся и обрабатываются. Удобство этого способа в том, что не приходится каждый раз при запуске программы вводить исходные данные (особенно, когда их много), а также в простоте изменения исходных данных.
Приведем пример программы.

DATA 13, 17, 19
READ A
? А
READ A
? а
READ А
? А

На "складе" data хранятся три числа — 13, 17 и 19. Первый оператор read читает со "склада" число 13 и записывает его в переменную а, а затем оператор print выводит ее значение на экран. Потом считывается второе число — 17, вместо старого значения 13 в переменную а записывается новое — 17, которое тоже выводится на экран. Аналогичные действия происходят и в третий раз с последним числом со "склада"

Предупреждение
В программе можно использовать несколько операторов data, причем они могут быть расположены в любых местах программы. Все они рассматриваются как единый "склад". А данные считыва-ются все равно последовательно сверху вниз и слева направо.

Еще пример, только теперь считываться будут сразу две переменные, что никак не скажется на исполнении программы.

DATA 1, 2, 4
READ А, В
DATA 8
? А, В
READ А, В
? А, В
READ А, В
? А, В
DATA 16, 32

При выполнении оператора data может возникнуть сообщение об ошибке типа "Нет данных". Подобная ошибка возникает при попытке чтения уже закончившихся данных. Если данных во всех операторах data шесть, то и считать их можно только шесть раз.
Можно восстановить все данные, хранящиеся в data командой
RESTORE.

А теперь маленькие задания.
74. Напишите программу, рисующую три закрашенных прямоугольника с заданными координатами диагоналей и цветами.
75. Задайте в операторах data четыре строки любого стихотворения и напишите программу, выводящую их на экран.
Еще ряд заданий на операторы data и read мы выполним, когда научимся пользоваться оператором цикла.


бХДШ ЮКЦНПХРЛНБ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

Алгоритмы

  • Виды алгоритмов
  • Линейный алгоритм
  • Графика в Бейсике
  • Графические примитивы
  • Правила построения сложных изображений
  • Макроязык GML
  • Вывод текстовой информации в графике
  • Разветвляющийся алгоритм
  • Безусловный переход
  • Условный переход

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

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

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

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

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

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

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 м/с. Какова будет
дальность полета снаряда? (Формулу вспомните из курса физики.)
Нагляднее всего работа с линейными алгоритмами осуществляется в графике, когда мы сразу видим результат своей деятельности. Но для этого нам надо изучить несколько новых операторов.

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

Иногда при изучении этой темы приходится сталкиваться с непониманием учащихся. "А зачем так сложно, если в любом графическом редакторе можно сделать то же самое?" Взгляд автора здесь таков. Да, в графическом редакторе можно нарисовать практически что угодно. Но, зная приемы программирования, создаются быстро такие элементы, на которые в графическом редакторе уйдет очень много времени и не будет возможности многократного повторения и внесения быстрых изменений в рисунок.
Прежде всего, необходимо сказать несколько слов о включении графических режимов. При входе в оболочку Бейсика по умолчанию включается текстовый режим, в котором можно производить вычисления и выводить результаты на экран. Но если мы хотим пользоваться графическими возможностями языка, то должны объяснить это компьютеру посредством включения графического режима командой screen 9. Таких режимов несколько, но автор рекомендует пользоваться девятым режимом, потому что он обладает наибольшей разрешающей способностью и позволяет получать качественные графические объекты. После включения графического режима мы можем давать компьютеру команды рисования графических примитивов.

Замечание
Графический режим включается только один раз.

В режиме screen 9 экран представляет собой координатную сетку с началом в левом верхнем углу, вправо от которого увеличивается координата X, а вниз — координата Y. Максимальное значение X на экране 640, a Y — 350 (рис. 1.4).

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

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

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

Точка

Первый из графических примитивов — точка. Для изображения точки используется оператор pset со следующим синтаксисом:

PSET(X, Y) , С

где х и y — координаты точки на экране, а с — ее цвет. Если цвет не указан, то точка будет изображена последним установленным цветом (это касается и всех прочих графических примитивов).
Рассмотрим пример.

SCREEN 9
PSET(320, 175),4

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

SCREEN 9
color, 1
PSET (320,175) ,4

Теперь та же точка будет в центре синего экрана, уже лучше!

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

Следующий примитив — отрезок прямой линии. Оператор записывается таким образом:

LINE (X1, Y1)-(X2, Y2), С

где XI, yi — координаты начала отрезка; х2, Y2 — координаты конца отрезка; с — как всегда цвет.
Например, мы хотим изобразить отрезок синего цвета на желтом экране с координатами (рис. 1.5).

Рис. 1.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).

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

Предупреждение
Будьте внимательны с координатами. Довольно часто вместо координат диагонали указывают координаты стороны прямоугольника. В таком случае вы получите просто отрезок, параллельный экрану.

И еще один примитив, основанный на операторе line. Он позволяет не только строить прямоугольник по диагонали, но и сразу закрашивать его. Пишется он так:

LINE (XI, Y1)-(X2, Y2), С, BF

Обратите внимание, что добавилась еще буква f (без пробела после в), вместе с буквой в обозначающая "box full" — полная коробка. Это заставляет компьютер залить полученный прямоугольник указанным цветом с.
Попробуйте самостоятельно в предыдущем примере добавить букву f и посмотреть, что получится.

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

Ну, что ж, для начала достаточно. Надо бы поупражняться. Но перед упражнениями хотелось бы дать совет, как облегчить себе жизнь.
Чтобы быстро и четко нарисовать заданный объект, рекомендуется взять листок миллиметровки или бумаги в клеточку, нарисовать экран в масштабе 1 см=50 экранных точек. Получится 13 см в ширину и 7 см в высоту. Затем изобразить там объект,
который вы хотите получить, и тогда все координаты будут у вас, как на ладони (рис. 1.7).

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

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

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

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

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

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

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

Окружность

Следующий этап построения — окружность. Все, что нужно знать об окружности для Бейсика — это координаты ее центра и радиус. Оператор выглядит так:

CIRCLE (X, Y) , R, С

где х, y — координаты центра, r — радиус (в экранных точках),
с — цвет.
Например, оператор

CIRCLE (320, 175), 50, 2

изобразит нам зеленую окружность радиусом 50 точек в центре экрана.

Эллипс

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

Таким образом, для вытянутых по горизонтали эллипсов (рис. 1.11) коэффициент сжатия будет в пределах от 0 до 1.
А для эллипсов, вытянутых по вертикали (рис. 1.12), коэффициент сжатия будет больше 1.

Рис. 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).

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

Рис. 1.14. Мишень

Рис. 1.15. Снеговик

Рис. 1.16. Цилиндр

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

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

CIRCLE (X, Y) , R, С, а, Ь

где появившиеся две новые величины а и ь и обозначают эти углы. Правило рисования дуг на Бейсике звучит так: "дуга строится от угла а к углу b против часовой стрелки".
Для того чтобы показать это наглядно, лучше всего обратиться к тригонометрической окружности (рис. 1.18).

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

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

Приведем несколько простых примеров.
Построим верхнюю половину окружности синего цвета с радиусом 30 (рис. 1.19), у которой центр находится в точке 150, 100.

Рис. 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

Предупреждение
Прежде, чем мы приведем более сложный пример дуги, хочется сделать еще одно полезное замечание. Если в операторе построения дуг поставить знак минус перед значениями углов дуги, то автоматически будут проведены радиусы, соединяющие центр окружности с концами дуг. Нельзя ставить минус перед 0. В этом случае вместо нуля надо использовать -6,28 (т. е. 2я).

Рис. 1.20. 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, К

Рис. 1.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).
Закрасьте "туловище" одним цветом, а "глаз" — другим.

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

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

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

Рис. 1.24. Петля гистерезиса

Рис. 1.25. Звезда

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

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

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

При рисовании придерживайтесь определенных правил, которые перечислены далее.

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

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

104. Попробуйте самостоятельно построить сложное изображение по вышеизложенным правилам на примере рис. 1.27.
105. А вот еще несколько вариантов сложных изображений (рис. 1.28).

Рис. 1.27. Храм

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

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

107. В качестве самостоятельного задания придумайте себе сами эмблему и нарисуй ее.

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

Макроязык GML

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

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

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

Основные команды перемещения легко запомнить с помощью рис. 1.30.

Рис. 1.30. Основные команды перемещения языка 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).

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

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

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

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

Предупреждение
Только надо помнить, что координаты в операторе locate не графические (640x350), а текстовые (80x25).

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

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

  • на основе безусловного перехода;
  • на основе условного перехода. Начнем с первого.

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

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

CLS
?"?*" ?"??*"

Символ ? в данном случае означает пробел.
Добавим теперь метку 1 рядом со второй строкой и оператор goto в конце программы. Получаем:

CLS
1: ?"*"
?"?*"
9 "77* "
GOTO 1

Казалось бы, изменения незначительные, но запустите программу и посмотрите что происходит! Вы в панике? Вы пытаетесь прекратить действие программы, но ничего не получается? Программа зациклилась! Что делать? Спокойно нажмите клавишу <Ctrl> и, не отпуская ее, клавишу <Break>. Это называется прервать выполнение программы. Переведите дух и давайте шаг за шагом разберемся, что же произошло.
Программа очищает экран, затем рисует первую звездочку, под ней с отступом в один пробел — вторую, потом ниже третью, а вот затем получает команду goto 1. Это приказ, которого невозможно ослушаться. Программа ищет метку, находит ее у команды рисования первой звездочки и начинает снова последовательно выполнять команды рисования — первую, вторую, третью и — снова приказ перехода, и так — до бесконечности (вернее, до прерывания программы). А поскольку оператор print, не снабженный точкой с запятой, после выполнения всегда переводит курсор на следующую строку, то и получается эффект движения.
А теперь поупражняйтесь.
110. Попробуйте спрогнозировать, что произойдет, если метку 1 в программе рисования звездочек указать в первой строке перед оператором cls? А что, если в четвертой строке? Или (кощунственная мысль!) перед самим оператором goto? Проверьте свои предположения на практике.
111. Напишите программу, которая заставит бежать по экрану следующий узор:
112. Если вы обратили внимание на текст предыдущей программы, то должны были заметить, что узор легко прослеживается. Воспользовавшись этим, напишите программу, которая заставит бежать по экрану слово "РОК", а потом, если не лень, то и свое имя. Буквы этих слов надо изобразить символами клавиатуры (какими вам больше нравится).
113. Посмотрите на текст следующей программы:

х=о
1: Х=Х+1 ? X
GOTO 1

Как вы думаете, при каком значении х программа закончит свою работу? Если у вас достаточно быстродействующий компьютер, можете рискнуть проверить свое предположение на практике. Да, впрочем, рискните и на медленном, ведь всегда можно прервать программу. Правда, в этом случае вы так и не узнаете тайны, какое самое большое целое число компьютер может вывести на экран.
Строго говоря, серьезное программирование не любит оператор goto. Считается, что он засоряет и путает программу. Вызывает зацикливание и зависание компьютера. Рекомендуют обходиться без него. А мне он все равно нравится. Но это мое личное даже не мнение, а просто чувство. При написании серьезных программ я тоже стараюсь обходиться без goto.

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

Мало того, что условный переход подразумевает выполнение тех или иных команд в зависимости от проверяемого условия, так Бейсик предоставляет нам еще и несколько вариантов действий.
Начнем с классической конструкции:

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. Напишите программы, которые в зависимости от введенного числа либо вычисляют функцию, либо выдают сообщение, что функция не определена:

115. Напишите программу для вычисления функции:

116. Напишите программу, определяющую четность или нечетность введенного с клавиатуры целого числа.
117. Напишите программу, находящую меньшее из двух, введенных с клавиатуры чисел.
118. По четырехзначному номеру года, запрошенному с клавиатуры определите номер столетия (например, для 1492 г. — ответ XV век, для 1812 г. — XIX век). Учесть, что началом века считается первый, а не нулевой, год. (То есть, 2000-й год, из астрономии — последний год XX века).
Выше мы рассмотрели полную форму условного оператора, когда в зависимости от истинности или ложности условия выполняются те или иные действия, после чего программа переходит к выполнению следующей за условным оператором команды.
Существует также неполная форма условного оператора. Она выглядит так

IF условие THEN
команды,_выполняемые_в_случае_истинности_условия

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

CLS
INPUT "Как Вас зовут"; N$
INPUT "А сколько Вам полных лет"; S
IF S<18 THEN ?"Вам еще рановато курить, ";N$ : END
?'Минздрав России предупреждает — курение опасно для вашего
здоровья!"

Здесь появляется новый оператор end, выполнение которого в любом месте программы приводит к ее остановке.
Возможен еще также составной условный оператор, когда после служебных слов then или else вновь следует условный оператор, когда выполнение тех или иных действий зависит не от одного, а от нескольких условий.
Например, допустим, что Преображенский полк гренадеров набирали только из тех новобранцев, рост которых был не менее 180 см, а вес — не менее 80 кг.^ Программа этого процесса выглядела бы следующим образом:

CLS
INPUT "Как Вас зовут?"; N$
INPUT "Каков Ваш рост в см"; R
INPUT "Каков Ваш вес в кг"; М
IF R>=180 THEN IF M>=80 THEN ?"Вы - достойный кандидат
в гренадеры, ";N$ ELSE ? N$; ", к сожалению, вы в гренадеры
не годитесь"

Здесь условный оператор сначала проверяет соответствие кандидата по росту, а затем еще и по весу, и только в случае выполнения обоих условий выдается сообщение о пригодности кандидата.
При использовании составных условных операторов надо быть очень осторожным, чтобы не запутаться самому в then и else. Есть правило, по которому else относится к ближайшему слева от него then. В рассматриваемом случае первый условный оператор, который проверяет рост, относится к сокращенной форме, у него нет else, а второй является полным. Отсюда получается такой казус, что если кандидат сразу не проходит по росту,
то на экране вовсе не появится никакого сообщения, потому что программа должна перейти к следующей за условным оператором команде, а ее нет. Чтобы разобраться в этом, выполните упражнение. Вообще, лучше не злоупотреблять составными условными операторами, а разбивать их на несколько простых или использовать сложные условия, о которых мы поговорим чуть ниже.
119. Какое значение будет иметь переменная х после выполнения очередных операторов:

х=о
IF A>0 THEN IF B>0 THEN X=l ELSE X=2
при значениях переменных а и в:
А=1, В=1 А=1, В=-1 А=-1, В=1

120. Запишите в виде одного условного оператора указанные действия:

  • ∙ известно, что из трех чисел ai, A2 и аз одно отлично от других, равных между собой. Присвоить номер этого числа переменной n;

121. Напишите программу, запрашивающую у пользователя три разных целых положительных числа и находящую сумму двух наименьших из них.
122. Если N=3, то какое значение будет иметь переменная s после выполнения следующего оператора:

S=l: K=2
1: IF K>N THEN GOTO 2
S=S*K
K=K+1
GOTO 1
2: ? "S="; S

Предупреждение
В сокращенной форме условного оператора при переходе к метке можно опускать оператор goto.
Таким образом, вторая строчка предыдущей программы могла бы выглядеть так:
1: IF К > N THEN 2

Сложные условия
Если для выполнения тех или иных действий нужно одновременное выполнение двух и более условий, то они объединяются логической связкой and (И). Например, программу про набор в Преображенский полк можно было бы изменить таким образом:

CLS
INPUT "Как Вас зовут?"; N$
INPUT "Каков Ваш рост в см"; R
INPUT "Каков Ваш вес в кг"; М
IF R>=180 AND M>=80 THEN ?"Вы - достойный кандидат
в гренадеры, "; N$ ELSE ? N$; '1, к сожалению, вы в гренадеры
не годитесь"

Сразу необходимо заметить, что в рассматриваемой версии Бейсика Russian Quick Basic (в отличие от других версий Бейсика) допускается запись неравенства 0<Х<7 именно в такой форме без связки and. Например, программа для вычисления функции

выглядела бы следующим образом:

CLS
INPUT "Введите значение X"; X
IF X > 1 THEN Y=X ^2
IF 0<= X <= 1 THEN Y=X ELSE Y=-2*X+1
? "Y (X)="; Y

Третье условие мы не рассматриваем потому, что если не выполняются первые два, то, очевидно, х находится в третьем ин тервале, поскольку описанные условия охватывают всю числовую ось.
Если есть несколько условий и для организации тех или иных действий достаточно выполнения хотя бы одного из этих условий, то применяется логическая связка or (ИЛИ). Например, программа для вычисления следующей функции:
выглядит так

CLS
INPUT "Введите значение X"; X
IF X<-1 OR X>=1 THEN Y=X л 3 ELSE Y=X л 2
? "Y <X)="; Y

Для различия применения and и or можно привести такой жизненный пример. Каждый человек хоть раз задумывался о спутнике жизни и, естественно, выдвигал какие-либо условия к будущему избраннику. Так вот, более требовательные могли бы выдвинуть два таких условия: пусть он будет красивым И (and) богатым. А менее требовательные, предпочитающие синицу в руках, могли бы сказать так: пусть он будет красивым ИЛИ (or) богатым. Чувствуете разницу? В первом случае избраннику не будет отказано только в одном случае из четырех возможных, а во втором, наоборот, три исхода благосклонны. Он может быть только красив, или только богат, ну а если и красив, и богат, то тем более.
Еще один пример. В стене существует квадратное отверстие NxN см. И имеется кирпич с измерениями А, В и С. Определить, пройдет он в отверстие или нет, если подавать его можно только параллельно стенкам отверстия.
Понятно, что кирпич пройдет в отверстие только в случае, если хотя бы два его измерения меньше N. Отсюда программа будет выглядеть так:

CLS
INPUT "Введите сторону отверстия N"; N
1: INPUT "Введите стороны кирпича А, В и С"; А, В, С
IF A<N AND B<N OR A<N AND C<N OR B<N AND C<N THEN ?"Кирпич проходит в отверстие" ELSE ?"Кирпич не проходит в отверстие" INPUT "Рассмотрим еще один кирпич? 1- да, 0 — нет"; X IF X=l THEN GOTO I ELSE ?"Спасибо за работу!"

По-русски это условие можно объяснить следующим образом. Если А и В меньше N, или А и С меньше N, или В и С меньше N, тогда печатать "Кирпич проходит в отверстие", иначе печатать "Кирпич не проходит в отверстие". Кроме того, в этой программе применен достаточно простой, но эффективный ход, управляющий совместной работой пользователя и программы. Чтобы каждый раз не запускать программу (если пользователь хочет рассмотреть несколько вариантов исходных данных), применен запрос с клавиатуры вариантов продолжения: либо рассматриваем еще один кирпич, либо — конец программы. Там же вы можете видеть применение безусловного перехода в условном операторе. Разберитесь и пользуйтесь этим для грамотного оформления своих программных продуктов.
Напишите программы для решения следующих задач, используя условный оператор и сложные условия.
123. По введенным с клавиатуры коэффициентам квадратного уравнения А, В и С найдите его корни. Рассмотрите шесть возможных вариантов:
∙ а=в=с=о, корней бесчисленное множество (X — любое);
∙ а=в=о, оо, уравнение не имеет корней;
∙ а=о, в*0, ОО, вырожденное квадратное уравнение, имеется один корень (формулу вычисления корня найдите сами);
∙ d<o, где d — дискриминант, который предварительно надо вычислить; уравнение не имеет вещественных корней;
∙ d=o, уравнение имеет два одинаковых корня (вывести их значения);
∙ D>0, уравнение имеет два различных вещественных корня (вычислить и вывести их значения).
Для проверки правильности работы программы предлагается шесть тестовых вариантов исходных данных:
∙ а=в=с=о;
∙ а=в=о, c=i;
∙ а=о, в=з, с=б (должно получиться х=-2);
∙ А=5, В=3, С=2;
∙ a=i, в=2, с=1 (должно получиться xi=x2=-i);
∙ А=2, В=5, С=2 (ДОЛЖНО ПОЛУЧИТЬСЯ Х1=-2, Х2=-8).
124. Осуществите запрос трех целых различных чисел с клавиатуры. Выведите на экран наибольшее и наименьшее.
125. Осуществите запрос с клавиатуры у тренера олимпийской сборной России по марафону результаты в часах, минутах и секундах трех победителей чемпионата России. Если какие-то два результата различаются менее чем на 5 сек, выведите
сообщение "Вот так шла борьба за______________медаль".
В сообщении должно быть указано достоинство медали (золотая, серебряная), за которую шла борьба. В противном случае, вычислить среднюю скорость победителя в км/час, если принять длину марафонской дистанции 42 км 195 м.
126. А сейчас мы попробуем сделать пока не очень красивый, но очень простой вариант телевизионной игры "О, счастливчик!". Придумайте пять любых вопросов, и к каждому из них четыре варианта ответов. Теперь я попробую словесно описать алгоритм, а вы — перевести его на Бейсик. Итак, запрашиваем у игрока имя, и узнаем, желает ли он играть. Если не желает, прощаемся, если желает — приветствуем и предлагаем первый вопрос с вариантами ответов. Запрашиваем у игрока с клавиатуры, какой вариант он выбирает. В случае правильного ответа начисляем ему сто очков и переходим ко второму вопросу. Если ответ неверен, то отправляемся на самое начало — снова регистрация и т. д. Первый вопрос — 100 очков, второй — 200, третий — 300, четвертый — 500, пятый — 1000. Если игрок правильно отвечает на все пять вопросов, то поздравляем его и заканчиваем программу.
127. Каждую пятницу члены Клуба толстяков выстраиваются в определенном порядке и взвешиваются. Напишите программу, которая хранит данные взвешивания 10-ти членов Клуба за прошлую неделю. Затем программа запрашивает новые данные взвешивания и для каждого члена Клуба либо выводит поздравление в случае похудения, либо величину прибавки веса с сожалением.
В рамках изучения условного оператора мы можем проанализировать основные принципы движения геометрических объектов по экрану.

CLS
S=0 Rem S — переменная, в которую
Rem будет заноситься накапливаемая сумма.
Rem Естественно, пока мы еще не ввели
Rem ни одного числа, она должна быть обнулена
1: INPUT "Введите любое число"; N
S=S+N
?"Сумма стала равна"; S
INPUT "Еще число? (1 - да, 0 - нет"; R
IF R=l THEN GOTO 1 ELSE ?"Спасибо за работу!"

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

SCREEN 9
X=300: Y=175 ' начальные координаты точки
DX=1 ' приращение координаты X.
' Так как мы его сделали положительным, ' координата X будет увеличиваться, а, следовательно, ' точка сначала будет двигаться вправо 1: PSET (X, Y), 14 ' вывод точки на экран PSET (X, Y), 0 ' стирание точки цветом фона IF X=0 OR X=640 THEN DX=-DX ' в случае достижения точкой
' вертикальных сторон экрана, приращение по X ' меняется на противоположное, а значит точка 1 начнет двигаться в обратную сторону X=X+DX ' изменение координаты точки GOTO 1 ' переход на метку 1, где происходит рисование точки

Программа, как вы видите, получилась зацикленной, т. е. точка будет двигаться бесконечно, пока мы не нажмем клавиши <Ctrl>+<Break>.

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

Для этого между двумя операторами pset надо вставить два оператора:
FOR 1=1 to 100: NEXT I
Это оператор цикла, о котором мы поговорим позже; пока просто поймите, что в данном месте компьютер посчитает до 100 в своем уме, и на это время в программе возникнет пауза. Подставляя вместо числа 100 другие значения, вы сможете управлять величиной паузы.
129. Напишите программу, которая заставит точку двигаться по вертикали. Потом замените точку на закрашенную окружность, а затем — на закрашенный прямоугольник.
Теперь рассмотрим организацию движения точки, которая меняет свое положение на экране и отражается от всех его четырех сторон под углом 45°, как это показано на рис. 1.32.

Рис. 1.32. Движение точки по экрану под углом 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).

Рис. 1.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<Y<230 THEN DY=-DY
Рассуждения аналогичны.
132. Теперь вы готовы к более объемному и сложному заданию. Называться оно будет "Муха в графине". Сначала на экране вы рисуете прямоугольный графин с горлышком (рис. 1.34).
Затем располагаете там точку и заставляете ее двигаться внутри графина, отражаясь от его стенок (будет интересней, если вы не станете ее стирать, тогда мы сможем видеть траекторию ее полета). Меняя начальное расположение точки, можно добиться, что через какое-то время она вылетит из
графина. Пусть в этот момент на экране появится надпись "Ура! Я на свободе!", а муха продолжит полет, отражаясь от сторон экрана. Графин можно сделать закрашенным.

Рис. 1.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 "Риск отсутствует, возврат гарантирован." 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.


жХЙКХВЕЯЙХИ ЮКЦНПХРЛ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

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

  • Оператор с заранее известным числом повторений
  • Оператор цикла WHILE... WEND
  • Случайные числа
  • Построение графиков функций
  • Циклы с несколькими зависимыми параметрами
  • Вложенные циклы
  • Наращивание переменной
  • Оператор DO...LOOP

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

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

Когда мы работали с графикой, то в одном из заданий вам предлагалось построить мишень — пять концентрических окружностей. Мы это легко сделали, пять раз написав оператор построения окружности 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.35. Горизонтальная линия из точек

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

Рис. 1.36. Решетка

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

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

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

Рис. 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.40. Орнамент

Правила построения орнаментов:

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

152. Напишите программу для рисования орнамента (рис. 1.40).
153. Закрепите успех, написав программу для построения греческого орнамента (рис. 1.41).

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

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

154. Когда мы изучали операторы data и read, to мы говорили, что используем их при изучении оператора цикла. Этот час пробил. Задав в операторе data координаты всех точек концов отрезков, из которых состоит рис. 1.42, напишите программу, рисующую Буратино при помощи оператора цикла.

Совет
При рисовании непрерывной ломаной линии применяется сокращенная форма оператора line, а именно: line -(х, Y), с. То есть линия будет рисоваться от последней графической точки на экране до точки с координатами X, у. Поэтому при выполнении предыдущего задания рекомендуется поставить первую точку оператором pset, а затем в цикле считывать поочередно координаты следующих точек и рисовать отрезки при помощи сокращенной формы оператора line.

Оператор цикла 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

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

В процессе изучения циклических алгоритмов уместно рассказать о генерации случайных чисел программным путем. При кажущейся простоте получить случайные числа не так легко. Попробуйте продиктовать своему другу 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. Каждый раз при запуске программы мы будем видеть новое значение.
Но часто встает проблема получения случайных чисел в заданном диапазоне. Как это сделать, мы рассмотрим на примерах.

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

Нам необходимо при каждом запуске программы случайным образом получать либо число 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 до 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.
Применим теперь оператор случайных чисел на практике и, как всегда, для наглядности начнем с графики.

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

Изобразим звездное небо пятьюстами белыми точками на черном фоне. Координаты каждой из точек должны быть в пределах по 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.43. "600 секунд"

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

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

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

Рис. 1.46. Взрыв

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

Строить графики в Бейсике мы будем точками, а задавать компьютеру функцию для построения оператором def fn.
Кроме того, координатная сетка экрана компьютера, как мы должны помнить, является перевернутой по отношению к привычной геометрической. Отсюда и последуют преобразования по приведению координатной сетки к нормальному виду. Я не хочу утомлять читателя длинными математическими выкладками, а призываю поверить на слово. Если же в ком-то проснется любознательность, то разобраться во всем можно самому.
Итак, оператор def fn определяет для компьютера ту функцию, график которой мы хотим построить. Работает он следующим образом:

DEF FN имя_функции{параметр_функции)=функция

Например, определим функцию у = sin x .

DEF FNY(X)=SIN(X)

Здесь y — имя функции, х — ее параметр, a sin (X) — непосредственно сама функция.
Определим функцию [image].

DEF FNY(X)=COS(2*X)+TAN(X/2)

Предупреждение
В одной и той же программе нельзя использовать для разных функций одно и то же имя. Необходимо давать разные имена, например Y(X), Z (X), R(X) И Т. Д.

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

SCREEN 9
LINE (0, 175)-(640, 175), 15
LINE (320, 0)-(320, 350), 15
Rem ось абсцисс Rem ось ординат
Теперь определим функцию, как мы это уже делали.
DEF FNY(X)=SIN(X)

Далее самое интересное — загадочный цикл непосредственного построения графика.

FOR X=0 ТО 640
Y=175~30*FNY( (X - 320)/30)
PSET(X, Y) , 15 NEXT X

После запуска программы должна получиться следующая картинка (рис. 1.47).

Рис. 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 .

Совет
Попробуйте строить график не точками, а эллипсами, радиус которых... Вот именно!

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

Бывает, что при попытке выполнить задание с помощью оператора цикла выясняется, что изменяется не одна, а две или три величины. В том случае, если вы можете установить между ними зависимости, следует использовать следующие правила:

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

Приведем пример. Предположим, мы хотим построить семейство окружностей, как на рис. 1.49. Не правда ли, напоминает рупор?

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

Действуем по правилам. Все окружности лежат на одной горизонтали, т. е. у их центров меняются не координаты Y, а коор-1наты 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).

Рис.1.50. "Орбиты"

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

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

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

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

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

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

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

Рис. 1.55. Пирамида: вид спереди

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

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

Рис. 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).

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

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

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

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

Рис. 1.60. Таблица умножения

Прежде чем выдать вам следующее задание, мне бы хотелось ознакомить вас с весьма полезным оператором sleep. Он приостанавливает выполнение программы на указанное количество секунд. Например:

? "Поспите 10 сек."
SLEEP 10
? "Подъем! Учитель пришел!"

Если значение секунд указано 0 или не указано вовсе, то программа будет ожидать нажатия любой клавиши, например:

? "Прочитайте внимательно нижеследующее слово и нажмите
любую клавишу, когда надоест..." ? "Вы — просто гений!" SLEEP ? "Но от скромности вы не умрете..."

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

Рис. 1.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, в котором случайным образом определяем координаты "песчинок" так, чтобы они лежали внутри квадрата. Тут же проверяем условие, а не попала ли "песчинка" в круг (используя уравнение окружности), и если попала, подсчитываем их количество. Кроме того, рисуем их на экране разными цветами (попавшие и не попавшие). По окончании цикла подсчитываем и выводим на экран число п. Понятно, что чем больше количество "песчинок", тем более точным будет результат. Для того чтобы знать, когда закончится эксперимент, рекомендуется выводить на экран счетчик "песчинок" (как мы делали с хронометром). Но, все-таки, экспериментировать с миллионом "песчинок" не надо — замучаетесь ждать сами, да и компьютер, хотя и железный, но все же живой.

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

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

О том, что такое переменная и об операторе присваивания мы уже говорили. И обращали внимание на такое абсурдное с точки зрения математики выражение

Х=Х+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.
211.
212. Напишите программу для нахождения суммы пяти произвольных чисел, вводимых с клавиатуры (сумматор).
213. Создайте программу для нахождения суммы пяти заданных чисел, указанных в операторе data.
214. Напишите программу вычисления произведения cos5°xcos]00xcosl5°x...xcos850.
215. Напишите программу вычисления суммы

216. Напишите программу, рисующую цепочку соприкасающихся окружностей с заданными в операторе data радиусами (рис. 1.63).

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

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

Оператор 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). Па- ( раметр цикла — номер цвета.

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


яХЛБНКШ Х ЯРПНЙХ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

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

  • Функции ASC и CHRS
  • Функция INPUTS
  • Функция LEN
  • Функции LEFTS, RIGHTS и MID$
  • Сравнение строковых переменных
  • Преобразование строчных и прописных букв
  • Функция определения вхождения подстроки
  • Функция INKEYS

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

Функции 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. Распечатайте или выпишите коды строчных и прописных букв кириллицы.
Но, всякий раз вводить текст побуквенно — большая морока. Нельзя ли как-нибудь в Бейсике обрабатывать слова и строки? Конечно, можно. Для этого существуют специальные функции.

Функция INPUTS

Эта функция ожидает ввода N символов, которые и будут обрабатываться программой сразу после их набора на клавиатуре, не дожидаясь нажатия клавиши <Enter>. В этом заключается принципиальное отличие функции от оператора input.
Например:

CLS
N$=INPUT$ (2)
IF Ы$="да" THEN ?N$ ELSE ?"нет"

В данном случае программа после ввода с клавиатуры последовательности символов, анализирует ее, выделяя только два первых символа, и действует в зависимости от проверяемого условия.

Функция LEN

Следующая функция — len. Она определяет длину введенной или существующей в переменной строковой переменной в символах. Синтаксис:
LEN(строковая_переменная)
Например,

CLS
INPUT "Введите Вашу фамилию"; F$
N=LEN(F$)
? "В вашей фамилии "; N; "букв"

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

CLS
INPUT "Введите Ваш адрес"; F$
N=LEN(F$)
? "В вашем адресе "; N; "символов"

225. Определите с помощью предыдущего примера, сколько символов будет в следующем адресе:
197110, Россия, Санкт-Петербург, Чкаловский пр., 78-33

Функции 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).

Рис. 1.65. Телеграф

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

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

"DOG" > "CAT", но "ELEFANT" < "MOUSE" "TIGER2" > "TIGER1" "Ml 6 " > "Ml6"

229. Напишите программу, проверяющую, является ли введенное слово или фраза палиндромом, т. е. читающемся слева направо и справа налево одинаково (например, шалаш, казак, А роза упала на лапу Азора). Программа сообщает "Да, это палиндром", или "Нет, это не палиндром" и выводит на экран введенный текст в варианте слева направо и справа налево. Здесь необходим цикл посимвольного чтения от N (длины текста) до 1.
230. Напишите программу, подсчитывающую количество слогов во введенном слове.
231. В операторе data перечислены 10 слов. Напишите программу, которая:
∙ напечатает все слова из списка, отличные от слова "SUN";
∙ напечатает слово, ближайшее к началу алфавита в списке (считаем, что все слова различны; выполнять аналогично поиску минимального из ряда чисел);
∙ слово, составленное из последних символов всех слов списка;
∙ все слова из списка, содержащие три буквы.
232. В тексте, содержащем между словами от 1 до 3 пробелов, оставить только по одному.
233. Подсчитать, сколько раз входит каждый символ в данную строку.
234. Написать программу шифратор и дешифратор, ставящую в соответствие русским символам соответствующие латинские и наоборот (аналог так называемого конвертора).

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

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

? 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 ?"До свидания"

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

Допустим, мы хотим найти в тексте какое-либо слово. Нам на помощь приходит функция 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" на символ "Г.

Функция INKEY$

Вернемся еще раз к организации пауз и задержек в вашей программе. Мы уже делали это с помощью пустого оператора цикла, с помощью оператора sleep. Есть еще одна полезная функция inkey$, которая ожидает нажатия определенной клавиши, анализирует поступающую информацию об уже нажатых клавишах, и, в зависимости от результатов анализа, программа следует по тому или иному пути. Например:

CLS
? "Нажмите любую клавишу для продолжения..."
WHILE INKEY$=""
WEND
? "Продолжение..."
Можно задать и определенную клавишу для продолжения выполнения программы:
CLS
? "Нажмите клавишу ESC для продолжения..."
WHILE INKEY$OCHR$ (27)
WEND

Замечание
Функция inkey$ работает только вместе с условным оператором.


лЮЯЯХБШ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

Массивы

  • Описание массива
  • Заполнение одномерных массивов и вывод их на экран.
  • Простейшие сортировки
  • Двумерные массивы
  • Подпрограммы

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

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

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

DIM FAM$ (4)

Знак $ добавляется, т. к. в массиве будут храниться строковые переменные. В этом случае компьютер в памяти отводит некую область из четырех ячеек, которую всю и называет fam$. Кроме того, эти ячейки нумеруются натуральными числами, начиная с 1. Я всегда подобную процедуру, да и сам массив, сравниваю с улицей одноэтажных домов в деревне или маленьком городке. Построили на улице четыре дома, назвали улицу fam$ (имя массива дается по тем же правилам, что и имя переменной), пронумеровали дома и заселили туда жильцов (рис. 1.66).

Рис. 1.66. Массив

FAM$ из четырех элементов
Из этого следует, что:

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

Предупреждение
Оператор dim для каждого конкретного массива должен задаваться только один раз в программе до первого к нему обращения.

Продолжая аналогию с улицей одноэтажных домов, что надо сделать, чтобы обратиться к како'му-либо конкретному жильцу? Знать его адрес!
Предположим, мы хотим потревожить господина Муна — указываем его адрес — fam$(2), т. е. название улицы и дом. Зачастую начинающие программисты путают индекс элемента массива (его номер) и значение элемента массива, т. е. "кто-кто в тереме живет". Итак, еще раз: индекс или номер элемента массива — величина постоянная, а значение (как и жильцы в доме) с легкостью может меняться.
В начале мы рассмотрим одномерные массивы — такие, в которых адрес элемента массива определяется только одним индексом (номером "дома").

Предупреждение
На самом деле, нумерация ячеек-"домиков" в Бейсике начинается с нуля, но с единицы нам привычнее и удобнее, поэтому нулевой "домик" мы пропускаем. Возможен более законный вариант — обязать Бейсик нумеровать "домики" с единицы оператором OPTION BASE 1.

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

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

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

Рассмотрим следующий пример:

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 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 и одновременный вывод их на экран — ведь пользователь освобожден от необходимости вводить данные с клавиатуры. Мы сразу увидим массив на экране.
Этот способ экономичней первого, и, кроме того, при отладке программы нет нужды всякий раз заново вводить данные.

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

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

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).

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

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

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

где х, — числа из оператора data предыдущего задания;
N— их количество; S — среднее арифметическое элементов массива х.
240. Найти сумму 1-го, 4-го, 9-го, 16-го и 81-го элементов массива, состоящего из 100 целых случайных чисел, каждое из которых лежит в пределах от 2 до 22.
241. Замените в массиве из 10 случайных целых чисел, каждое из которых лежит в пределах от 1 до 10, все четные элементы нулями и выведите полученный массив на экран.
242. Массив состоит из 60 случайных двузначных целых чисел. Выведите их на экран в обратном порядке по 6 чисел в строке.
243. В массиве содержатся 10 букв — С, Ф, О, И, К, Л, О, И, Л, Н. Выведите на экран слово, образованное буквами с четными индексами, и слово, образованное буквами с нечетными индексами.
244. Массив состоит из 20 целых положительных и отрицательных чисел, модуль каждого из которых в пределах от 2 до 12. Выведите на экран сначала отрицательные, а затем положительные числа. Определите, модуль суммы каких чисел больше — положительных или отрицательных.
245. Найдите максимальный и минимальный элементы массива из 10 случайных целых двузначных чисел и разность между ними. Представьте графическую столбиковую интерпретацию этого массива, выделив максимальный элемент красным, а минимальный — зеленым цветом. Остальные прямоугольники должны быть желтого цвета.
Если в программе используется несколько массивов, то они могут быть описаны через запятую, например:
DIM Х(10) , Y(10) , W$ (20)
Теперь задания с несколькими массивами.
246. Даны два массива, заполненные каждый десятью случайными целыми числами, каждое из которых от 1 до 9 включительно. Сложите массивы поэлементно, результаты запишите в третий массив. На экран вывести все три массива.
247. Даны три массива с одинаковым количеством элементов 5, в которых содержатся стороны треугольников Aj, Bj и Q. Определите периметр Pj и площадь S; каждого треугольника по формуле Герона. (Так как для того, чтобы треугольник существовал, необходимо определенное соотношение его сторон, то лучше элементы массивов задать в операторе
DATA.)
248. Найдите скалярное произведение двух массивов А и В, состоящих из 5 элементов каждый, которые содержат случайные числа от 2 до 9 включительно. Воспользуйтесь формулой:

где n — размер массива.
249. Найдите соотношение sx/sy, где sx и sy — средние арифметические значения массивов X и Y. соответственно. (Массивы из 10 элементов содержат случайные двузначные целые числа.)
250. Определите объем каждого из 10 цилиндров, для которых заданы радиусы оснований Rj (случайные целые числа от 5 до 25 см) и высоты Hj (случайные целые числа от 10 до 30 см).
251. Заданы 10 пар координат Xj, Yj одних точек на плоскости и 10 пар координат Aj, Bj других точек на плоскости. Вычислите попарно расстояния между точками по формуле:
Занесите эти расстояния в массив S. Проиллюстрируйте задачу графически (соответствующими отрезками на экране). Выделите разными цветами наибольшую и наименьшую длину.
252. Дан одномерный массив W из 10 случайных целых чисел, каждое из которых лежит в пределах от 1 до 100. Получите новый массив R, где каждый элемент создается из массива W делением соответствующего элемента на его индекс.
253. Вычислите и представьте в виде массива последовательность первых 20 чисел Фибоначчи, если Xi~l, X2=2, а каждый последующий элемент равен сумме двух предыдущих.
254. В операторе data содержатся данные о среднесуточной температуре в течение февраля 2000 г. по Санкт-Петербургу. Вычислите среднюю температуру февраля, наибольшую и наименьшую температуры. Постройте линейный график изменения среднесуточной температуры.
255. Школьники неохотно носят одежду, отличающуюся по цвету от одежды одноклассников. Напишите программу, выбирающую 2 цвета (для мальчиков и для девочек) из 12 возможных цветов, которые сегодня будут носить все. Выбор производится случайным образом и сопровождается выводом на экран прямоугольников соответствующих цветов, внутри одного из которых написано "Сегодня этот цвет для мальчиков", а внутри другого "Сегодня этот цвет для девочек".
256. В фирме "Green Beavis Ltd" работают семь сборщиков компьютеров. Для того чтобы повысить производительность их труда, в конце недели обрабатывают сведения о количестве компьютеров, собранных каждым из них ежедневно. Напишите программу, которая выдаст на экран следующие данные:

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

257. Дан массив X, состоящий из 100 целых случайных чисел, каждое из которых лежит в пределах от 3 до 13. С клавиатуры вводится целое число N, также лежащее в этих пределах. Определите количество элементов массива, равных числу N.
258. Даны два числовых массива X и Y с количеством элементов 10 и-20, соответственно. Получите массив Z из 30 элементов, составленный добавлением массива X в коней массива Y.
259. Дан массив из 20 случайных целых чисел, каждое из которых лежит в пределах от 10 до 50. Найдите максимальное число и его номер, а если таких чисел несколько, то подсчитайте, сколько их.
260. Дан массив из 20 случайных целых чисел, каждое из которых лежит в пределах от 10 до 50. Определите среднее арифметическое элементов массива, а также значение элемента, ближайшего к среднему, и его номер.
261. Дан массив среднемесячных температур за год. Определите, в каком месяце была самая высокая температура, а в каком самая низкая, а также среднесезонные температуры.
262. У автора этой книги была копилка, в которой было 100 советских монеток достоинством в 1, 2, 3, 5, 10, 15, 20 и 50 копеек. Задайте массив М(100) случайным образом из этого набора, а затем подсчитайте, сколько в копилке было пятачков и полтинников, и какова общая сумма накопленного.
263. Дан массив из десяти целых двузначных случайных чисел. Найдите сумму трех максимальных из них.
264. Заполните массив R(25) случайными целыми двузначными числами так, чтобы числа не повторялись.
265. Программа "Пожиратель звезд". Когда мы говорили о циклах и построении графиков функций, то писали программу о движении "звездолета", который, пролетая по траектории заданной тригонометрической функции, уничтожал планету, находящуюся от него в опасной близости. Теперь, со знанием массивов, мы можем написать более красивую и более сложную программу. Сначала заполним экран тысячью разноцветных звезд, изображенных либо точками, либо окружностями радиусом 1. Координаты всех звезд запоминаются в массивах Х( 1000) и Y(1000). Затем по траектории

начинает двигаться кавалькада. Впереди сторожевой звездолет (закрашенный круг радиусом 2), прове-
ряющий, не находится ли какая-нибудь звезда в опасной близости от армады (S<=30), и уничтожающий ее в таком случае (звезда заменяется точно такой же, но цветом фона). Позади движутся три крейсерских звездолета (закрашенные круги радиусом 4). В результате выполнения программы на экране должен быть проложен коридор по траектории функции с шириной 60 экранных точек (рис. 1.69).

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

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

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

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

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

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

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

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

8 4 9 6 7

Рассмотрим процесс упорядочивания по шагам.

На этом шаге третий элемент поменялся сам с собой.

267. Напишите программу для упорядочивания массива по возрастанию методом выбора. Измените программу так, чтобы она упорядочивала массив по убыванию.
268. Дан массив из 13 чисел. Расположите числа по возрастанию. Введите с клавиатуры число М так, чтобы оно вошло в массив и получившийся массив также был бы упорядочен по возрастанию.

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

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

4 3 2 1

Рассмотрим по шагам метод "пузырька" для этого массива.

269. Напишите программу, реализующую метод "пузырька". Для уменьшения количества ненужных сравнений может служить счетчик, подсчитывающий количество обменов за один полный пробег вдоль всего массива. Как только его значение станет равно нулю (т. е. ни одного нового обмена не будет произведено), это будет означать, что массив упорядочен. Для наглядности оформите исходный и получившийся массив в виде столбиковых интерпретаций друг под другом.
270. Дан массив букв, составляющих английский алфавит, но размешенных не по порядку. Напишите программу, преобразующую этот массив в алфавит английского языка.
271. Дан массив из 13 четырехбуквенных русских слов (существительных и нарицательных), в единственном числе, в именительном падеже. Упорядочить их по алфавиту.

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

Что такое двумерный массив? Это такой набор однотипных данных, местоположение каждого элемента которого определяется не одним индексом, а двумя. Например, для тех, кто с детства играл в "морской бой", не будет открытием, что каждая клеточка игрового поля обозначается двумя символами — буквой и цифрой, например, А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.
Заполнение двумерных массивов и вывод их на экран
В обработке двумерных массивов есть своя специфика — использование вложенных циклов.
Заполним двумерный массив Х(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).

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

Рис. 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.

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

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

Иногда в определенных местах программы приходится выполнять практически одни и те же последовательности действий с разными исходными данными. Такие последовательности действий можно оформить в виде так называемых подпрограмм (от англ. "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. Это означает, что подпрограмма закончилась, и управление передается в основную программу.

Предупреждение
Ключевое слово RETURN передает управление в основную программу на оператор, следующий за обращением к подпрограмме GOSUB.

Результатом выполнения подпрограммы в нашем случае является переменная р, в которой сохраняется значение факториала. Запомним первое полученное значение (фактически N-факто-риал) в переменной xi. Это необходимо сделать, т. к. подпрограмма будет выполняться несколько раз, и значение переменной р будет меняться.
Затем мы повторяем действия для переменных м и (n-m) , соответственно. Причем, в последнем случае уже не надо запоминать полученное значение факториала в новой переменной, т. к. больше обращений к подпрограмме не будет. Осталось вывести на экран полученное значение и запросить пользователя, будет ли он работать с программой еще.
Если непонятно, запустите пошаговый режим исполнения этой программы, разберитесь, как она работает (клавиша <F8>).

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

Итак, если все ясно, то надо бы выполнить ряд упражнений с использованием подпрограмм.
287. Для каждого двумерного массива Х(3, 4), Y(5, 3), Z(4. 6) определите номер строки с максимальной суммой положительных элементов.
288. Напишите программу, предлагающую пользователю меню из десяти функций, и строящую по ним графики этих функций в зависимости от выбора пользователя.
289. Напишите программу для младших школьников, проверяющую знание ими таблицы умножения от 2 до 12. Учащемуся задаются 5 примеров перемножения случайных чисел в заданном интервале. Оценкой является количество правильных ответов. Используйте подпрограмму для печати замечаний в ответ на каждый результат, вводимый пользователем. За правильный ответ— замечание должно быть поощрительным, за неправильный — сожалеющим. Чтобы сделать опрос более интересным, необходимо заготовить по десять замечаний для правильных и неправильных ответов и выбирать их случайным образом, обращаясь при этом к пользователю по имени, запрошенному в начале программы. Сделайте красочную заставку, легкое музыкальное сопровождение тоже не будет лишним.
290. Напишите программу, отображающую цветное кольцо. Используя ее в качестве подпрограммы, нарисуйте олимпийский флаг.
291. Напишите программы, находящие минимальное и максимальное значения из трех чисел X, Y и Z, введенных с клавиатуры. Используя их в качестве подпрограмм, напишите программу, вычисляющую значение следующей функции:

292. Даны два одномерных массива из 20 элементов каждый. Элементом является случайное целое двузначное число. Напишите программу с использованием подпрограммы, которая изменяет исходный массив путем деления четных чи сел на их индексы. Используя эту подпрограмму, определите, в каком из массивов было произведено больше замен.
В заключение несколько слов о подпрограммах в Russian Quick Basic. Мы привели самый простой способ написания и использования подпрограмм. Но если вы чувствуете в себе силы, то попробуйте самостоятельно разобраться с такими мощными инструментами Бейсика по написанию подпрограмм, как declare sub и call sub. He пожалеете!


пЮАНРЮ Я ТЮИКЮЛХ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

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

  • Файловая система
  • Способы доступа к файлам
  • Операции над файлами
  • Открытие файла

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

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

Информация, вводимая с клавиатуры или обрабатываемая с помощью программных средств Бейсика размещается в оперативной памяти компьютера, которая является энергозависимой, и, как только мы выключим питание, вся наша информация погибнет. Чтобы избежать это и донести наши гениальные программы по крайней мере до преподавателя (чтобы он их достойно оценил), а лучше до далеких потомков, необходимо сохранять наши работы на диске в виде файлов.
Файл — это поименованная область на магнитном или лазерном диске. Поименованная — значит, имеющая имя. В файлах могут содержаться тексты, графические и видеоизображения, звуки и музыка, таблицы и базы данных и многое другое, но нас интересуют прежде всего программы, написанные на Бейсике и данные для этих программ.
Мы уже объясняли в самом начале, как сохранить программу в виде файла и открыть уже существующий файл. Имя файлу мы даем сами, но к нему есть некоторые требования:

  • имя не должно быть больше чем 8 символов;
  • имя может состоять из букв латинского алфавита, цифр и символов, например, _, -, (,), $ и некоторых других. Впрочем, злоупотреблять специальными символами не стоит — букв и цифр вполне хватает;
  • в имени файла запрещены символы <Пробел>, *, точка, запятая, кавычки, двоеточие.

У файла также есть расширение имени. Оно имеет длину не более трех символов, указывается через точку после имени и характеризует тип файла. Изучаемая нами версия Бейсика (как, впрочем, и практически все другие) автоматически при сохранении добавляет к имени файла расширение bas, что упрощает поиск написанных нами программ и работу с ними.
Для того чтобы хранить свои файлы и результаты работы с ними на диске, лучше завести свой личный каталог (или папку — это одно и то же). Надеюсь, вы знаете как это делается.
В файлах вы можете хранить как исходные данные для обработки, так и результаты работы вашей программы.
Для работы в Бейсике нам чаще нужны файлы, хранящие однородные по типу или структуре сведения о каких-либо объектах. Набор данных о каком-либо одном объекте называется записью.
За самой последней записью находится невидимый символ конца файла, который устанавливается автоматически. Файл может быть пустым, т. е. содержать 0 байт информации, но имя файла и символ конца файла будут присутствовать всегда. Таков закон.
Записи могут содержать данные разных типов, но должны быть обязательно одинаковы по структуре, например:

"Запорожец", "4067 ЛДЕ", "1972", "100$"
"ГАЗ-34", "6666 ЛАА", 1989, "3500$"

В соответствии со способом доступа к файлам они делятся на два вида.

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

В изучаемом нами Бейсике существуют два метода доступа к информации, хранящейся в файлах:

  • последовательный доступ;
  • прямой доступ.

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

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

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

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

  • открытие файла;
  • чтение и запись обрабатываемых данных;
  • закрытие файла.

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

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

Для открытия файла предназначен оператор open, имеющий следующий формат:

OPEN имя_файла FOR режим AS # номер файла

С именем файла должно быть уже все понятно. Режим определяет доступ к данным файла. Возможны следующие режимы:

  • input. Это режим чтения информации из файла. В случае, если указывается несуществующее имя файла, возникнет сообщение об ошибке "Файл не найден".
  • output. Режим записи информации в файл. Обычно при этом создается новый файл. Если же открывается для записи уже существующий файл, то ранее хранимая в нем информация будет безвозвратно утеряна.
  • append. Режим добавления информации в файл. Новая информация будет размешена в конце файла, за последней записью.

Номер файла предваряется необязательным знаком #, после которого следует целое число от 1 до 255.

Запись в файл

Рассмотрим пример записи в файл.

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.
Предупреждение
Во избежание неприятностей не открывайте одновременно слишком много файлов. Рекомендуется по окончании работы с файлом сразу закрыть его.
Представленный далее пример демонстрирует программу создания небольшой базы данных автомобилей, предназначенных для продажи. О каждом автомобиле заносится информация о его марке, номере, цвете, годе производства и продажной цене.

' Программа создания файла данных об автомобилях
CLS
INPUT " Введите имя файла"; F$
' Открытие файла
OPEN F$ FOR OUTPUT 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$, S3 LOOP
' Закрытие файла 1 : CLOSE #1 PRINT "Файл сформирован"

Программа действует следующим образом. Запрашивает имя файла, открывает его для записи, запрашивает информацию, записывает ее в файл до введения пользователем сочетания букв "QWE" или "ЙЦУ" (эти символы расположены на одних клавишах, вследствие чего пользователь может случайно набрать как одну комбинацию, так и другую). Запись в файл может производиться операторами

PRINT # номер_файла, выражение
ИЛИ
WRITE # номер_файла, выражение

Результат работы этих операторов одинаков.

Для закрытия файлов применяется оператор

CLOSE # номер_файла

Предупреждение
Если номер файла в операторе close указан, то будет закрыт именно этот, вполне определенный файл. Если же номер не указан, будут закрыты все открытые файлы.

Наберите эту программу с именем создаваемого файла avto.dat
Занесите сведения о пяти автомобилях: двух "Москвичах" и трех "Волгах". После чего просмотрите созданный вами файл в редакторе Бейсика. Для этого надо в меню Файл выбрать команду Открыть, затем в появившемся диалоговом окне ввести имя файла avto.dat и нажать клавишу <Enter>. Вы увидите, что данные в файле записаны в кавычках, через запятую, т. е. все они текстового типа.

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

Чтение из файла производится аналогично записи, но — вместо режима output используется режим input. Будьте внимательны! Прочитаем занесенные нами данные из файла avto.dat.

' Программа чтения файла данных об автомобилях
CLS
INPUT " Введите имя файла"; F$
1 Открытие файла
OPEN F$ FOR INPUT AS #1
PRINT "База данных автомобилей на 17 декабря 2000 года"
1=1
DO
PRINT "Вывести данные об"; I; "автомобиле?"
INPUT "Для окончания введите QWE, для продолжения — <Enter>"; 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), а в скобках указан номер открытого файла.
Выведите с помощью этой программы данные о первых трех автомобилях.

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

Для изменения какой-либо записи, удаления старых или добавления новых данных в последовательном файле необходимо открыть два файла: подлежащий изменению и новый, в котором
создается обновленная версия исходного файла. Старый файл в дальнейшем можно удалить. Приведенная ниже программа в файле 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.
Добавление данных в файл
Указание 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).
∙ Напишите программу, которая позволяла бы ему вводить в последовательный файл следующие сведения: имя клиента, обвинение, исход дела.
∙ Мицкевич "из огня попадает в полымя". Напишите программу, которая заменяла бы неопределенное решение суда на "Проиграно".
∙ Напечатайте обновленный файл.

Таблица 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. Пусть программа помогает инспектору формировать на основе этого файла группы углубленного обучения. По названию курса она должна выдавать список "умных" студентов, зачисленных в такую группу.


гЮДЮМХЪ ОНБШЬЕММНИ РПСДМНЯРХ, ХМРЕЦПХПНБЮММШЕ, ЮГЮПРМШЕ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

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

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

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

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

Компьютер случайным образом загадывает число от 1 до 100. Задача пользователя — за минимальное количество попыток, но не более шести, угадать это число, предлагая компьютеру свои варианты, в ответ на которые программа указывает номер попытки, и сообщение о том, больше загаданное число или меньше введенного с клавиатуры. При правильной стратегии (делении интервала чисел пополам) наверняка угадать число можно за 7 попыток (27=128). Именно поэтому человеку дается только шесть попыток, чтобы у компьютера тоже был шанс. Игра состоит из пяти партий, и, как показывает практика, человек не всегда побеждает!

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

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

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

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

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

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

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

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

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

Таблица 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

Здесь необходимо перевести плотности в систему СИ. Далее вычислить (все вычисления производить в системе СИ):

  • объем ядра (ядро идеально круглое);
  • массу ядра (М);
  • начальную скорость (по формуле [image]);
  • цену одного ядра (С);
  • количество ядер (N);
  • дальность полета (S), если выстрел производится под углом 45°;
  • убойную силу [image];-, где К— коэффициент убойной силы.
  • рентабельность [image].

Напишите программу, которая поможет:

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

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

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

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

Рис. 1.77. Рассадка зала

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

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

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

Необходимо вычислить прибыль кинотеатра за день, за месяц (считая, что в месяце 30 дней), расходы по статьям в рублях и долларах. Вывести эти данные на экран, выделив зарплату директора цветом.

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

Конечно, сейчас уже далеко не все из вас смотрели фильм "Бег", поставленный по роману М. Булгакова. В частности, в нем есть сюжет о том, как наши эмигранты первой волны зарабатывали себе в Париже на жизнь. Одним из источников их доходов были тараканьи бега. Попробуем реализовать их компьютерную версию.

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

Забег заканчивается, как только какой-либо таракан коснулся "головой" финишной черты. Если никто из сделавших ставки не выиграл, то деньги переходят в доход казино. В случае выигрыша игрока, ему начисляется двойная ставка. Игра идет до тех пор, пока кто-либо не разорится, или кто-либо не наберет сумму в размере двойного кредита.

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

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

Рекомендуется оформить забег музыкально.

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

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

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


пЕЬЕМХЪ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

Решения

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

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

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

Задача 5

10* (25+11)^.5

Задача 6

1/(2+3/(4+5/ (6+7/8)))

Задача 12

4

Задача 19

1

Задача 20

0

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

Задача 23

Нет. Нет знака равенства.

Задача 28

Да.

Задача 29

Нет. Переменные связаны двумя знаками равенства.

Задача 30

Нет. Слева от знака равенства стоит арифметическое выражение.

Задача 35

R=-R

Задача 36

Х=6, Y=6

Задача 37

Необходимо ввести вспомогательную переменную д.

А=Х
X=Y
Y=A

Задача 38

W = K/100 + (К MOD 100) /10 + (К MOD 100) MOD 10

Задача 39

S=3*1СГ 5*365*24*60*60

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

Задача 45

PRINT ((3^(1/4)+2)Л(1/3))^.5

Задача 46

PRINT 6^ (1/4)/((5-8~.5)л(1/3))

Задача 48

PRINT (( (3^.5+3)".5+3)^.5+3)^.5

Задача 51

Решение для последнего варианта:

CLS: PRINT "Результат равен"; 2*3*4*5*6

Задача 52

CLS: PRINT "Печать":PRINT: PRINT "через":PRINT:PRINT "строку"

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

Задача 59

(Х"7+7^Х)"(1/7)

Задача 60

(A+SIN (В^2) Л3) / (COS (25) +ABS (I/TAN (60) ) )

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

Задача 67

CLS
LOCATE 10, 35: ?"СУММА КУБОВ"
LOCATE 12, 38: ? 2"3+3Л3+4"3+5"3

Задача 68

CLS
LOCATE 11, 35: ? "*******+*"
LOCATE 12, 35: ? "^СЕРЕДИНА*"
LOCATE 13, 35: ? "*********"

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

Задача 70

CLS
INPUT "Введите, пожалуйста, Ваш год рождения"; YEAR1
INPUT "Введите, пожалуйста, год рождения Вашей мамы"; YEAR2
? "Ваша мама родила Вас, когда ей было"; YEAR2 - YEAR1; "лет"

Задача 72

CLS
INPUT "Введите три стороны треугольника"; А, В, С
Р=(А+В+С)/2
S=SQR(P*(P-A)*(Р-В)*(Р-С))
? "Площадь данного треугольника равна"; S

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

Задача 74

' Исходные данные для прямоугольников
' В каждом DATA координаты диагоналей и цвет
DATA 30, 50, 130, 150, 1
DATA 160, 100, 280, 170, 4
DATA 300, 180, 450, 270, 14
1 Считывание данных и построение прямоугольников
SCREEN 9
READ XI, Yl, X2, Y2, С
LINE (Xl, Y1)-(X2, Y2), С, BF
READ XI, Yl, X2, Y2, С
LINE (XI, Y1)-(X2, Y2), C, BF
READ XI, Yl, X2, Y2, С
LINE (XI, Y1)-(X2, Y2), C, BF
END

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

Задача 76

1 Полет к ближайшей звезде CLS
' Длина светового года S = 3*10л5*365*24*60*60 9 Количество секунд полета NSEC = S/100
' Количество часов полета NHOUR = NSEC/3600 ' Количество суток полета NDAYS = NHOUR/24 ' Количество лет полета NYEARS = NDAYS/365 ' Вывод результата LOCATE 25, 12
?"С такой скоростью звездолет долетит до звезды за"; NYEARS;
"лет"
END

Задача 80

Информационный объем книги
CLS
1 Количество символов в книге
N = 450*60*80
' Перевод в Мегабайты
М = N/1024/1024
' Количество дискет
DISCS = INT(M/1.44)+1
' Вывод результата
?"Для записи книги понадобится"; DISCS; "дискет"
END

Задача 85

1 Деньги в банке
CLS
М=22000
N1=M+M*.01 ' Первый месяц
N2=N1+N1*.O1 ' Второй месяц
N3=N2+N2*.O1 ' Третий месяц
N4=N3+N3*.O1 ' Четвертый месяц
N5=N4+N4*.O1 ' Пятый месяц
N6=N5+N5*.O1 ' Шестой месяц
N7=N6+N6*.O1 ' Седьмой месяц
N8=N7+N7*.O1 ' Восьмой месяц
N9=N8+N8*.O1 ' Девятый месяц
N10=N9+N9*.01 ' Десятый месяц
Nll=N10+N10*.01 ' Одиннадцатый месяц
N12=N11+N11*.O1 ' Двенадцатый месяц ' Вывод результата
PRINT "Через год у меня на счету будет"; N12; "$" END
Конечно, красивее было бы решение с циклами. Когда их изучите, решите эту
  задачу снова.

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

Задача 90

' Российский флаг
CLS
SCREEN 9
' Белая полоса
LINE (100, 50)-(500, 130), 15, BF
' Синяя полоса
LINE (100, 130)-(500, 210), 1, BF
' Красная полоса
LINE (100, 210)-(500, 290), 4, BF
END

Задача 97

' Летающая тарелка
SCREEN 9
' Основа тарелки
CIRCLE (320, 175), 200, 2, , , .3
1 Рубка
CIRCLE (320, 70), 100, 2, , , .2
LINE (198, 125)-(220, 70), 2
LINE (420, 70)-(440, 125), 2
' Иллюминаторы
CIRCLE (150, 175), 10, 4
CIRCLE (490, 175), 10, 4
CIRCLE (200, 200), 10, 4
CIRCLE (440, 200), 10, 4
CIRCLE (320, 220), 10, 4
1 Ноги
LINE (320, 235)-(320, 280), 2
LINE (197, 223)-(165, 310), 2
LINE (443, 223)-(475, 310), 2
END

Задача 101

1 Гистерезис
SCREEN 9
' Горизонтальные составляющие
LINE (300, 126)-(500, 126), 13 #
LINE (100, 274)-(300, 274), 13
' Левая верхняя четверть дуги
CIRCLE (300, 200), 100, 13, 1.57, 3.14
' Левая нижняя четверть дуги
CIRCLE (100, 200), 100, 13, 4.71, 0
' Правая верхняя четверть дуги
CIRCLE (500, 200), 100, 13, 1.57, 3.14
1 Правая нижняя четверть дуги
CIRCLE (300, 200), 100, 13, 4.71, 0
1 Закраска
PAINT (300, 200), 14, 13
END

Задача 109

' Елочка
SCREEN 9
PRESET (320, 300)
DRAW "С2 L60 Е26 L25 Е26 L25 Е55 F55 L25 F26 L25 F26 L60"
' Закраска
PAINT (320, 250), 2
' Ствол
LINE (300, 300)-(340, 340), 6, BF
END

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

Задача 111

1 Бегущий узор 1 : PRINT "***" PRINT " *******∙∙ PRINT " *н PRINT " *"
PRINT " *"
PRINT " *******" PRINT "***" GOTO 1 END

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

Задача 117

1 Чет-нечет
CLS
INPUT "Введите целое число"; N
IF N MOD 2=0 THEN LOCATE 12, 35: PRINT "Это число четное"
ELSE LOCATE 12, 35: PRINT "Это число нечетное"
END

Задача 120

Переменная X примет следующие значения

  • х=1
  • Х=2
  • Х=0

Задача 123

S=6

Задача 135

Старояпонский календарь CLS
' Запрос года INPUT "Введите год"; YEAR ' Вычисление номера цвета и животного С =( (9910-YEAR) MOD 60)\12 К =(YEAR-3) MOD 12 ' Определение по номеру цвета года SELECT CASE С CASE 0
PRINT "ЗЕЛЕНЫЙ"; CASE I
PRINT "КРАСНЫЙ"; CASE 2
PRINT "ЖЕЛТЫЙ"; CASE 3
PRINT "БЕЛЫЙ"; CASE A
PRINT "ЧЕРНЫЙ"; END SELECT
' Определение по номеру животного года SELECT CASE К CASE 0
PRINT " КАБАН" CASE 1
PRINT " КРЫСА" CASE 2
PRINT " БЫК" CASE 3
PRINT " ТИГР" CASE 4
PRINT " КОТ" CASE 5
PRINT " ДРАКОН" CASE 6
PRINT " ЗМЕЯ" CASE 7
PRINT " ЛОШАДЬ"
CASE 8
PRINT " ОВЦА" CASE 9
PRINT " ОБЕЗЬЯНА" CASE 10
PRINT " ПЕТУХ" CASE 11
PRINT " СОБАКА" END SELECT PRINT "УДАЧИ ВАМ!" END

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

Задача 140

' Пешеходный переход "зебра" FOR Y = 10 ТО 320 STEP 30
LINE (200, У)-(400, Y+20), 15, BF NEXT Y

Задача 143

1 Воздушный шарик
SCREEN 9
' Изменение цвета фона
COLOR , 1
FOR I = 1 ТО 201
' Рисование окружности изменяющегося радиуса
CIRCLE (320, 175), I, 14
' Пауза
FOR T = 1 ТО 2000: NEXT T
' Стирание окружности изменяющегося радиуса
CIRCLE (320, 175), I, 1 NEXT I

Задача 146

F=l
Цикл вообще не будет ни разу исполняться, т. к. начальное значение параметра больше конечного, а шаг по умолчанию принят +1.
Задача 147
1 Да ты крут!
CLS
INPUT "Введи свой возраст"; N
FOR J = 1 ТО N
PRINT "ДА ТЫ КРУТ! "
FOR T = 1 ТО 5000: NEXT T
NEXT J
END

Задача 148

' Таблица умножения
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 ∙
Задача 151
1 Электронный секундомер FOR T = 1 TO 3600
LOCATE 12, 38:? T NEXT T END

Задача 152

' Орнамент с полукольцами
SCREEN 9
' Задание радиусов окружностей
R1 = 20: R2 = 10
FOR X = 50 ТО 600 STEP 4*R1 ' Первое полукольцо CIRCLE (X, 175), Rl, 14, 0, 3.14 CIRCLE (X, 175), R2, 14, 0, 3.14 LINE (X - Rl, 175)-(X - R2, 175), 14 LINE (X + Rl, 175)-(X + R2, 175), 14
PAINT (X, 162), 2, 14
' Второе полукольцо
CIRCLE (X + 2 * Rl, 175), Rl, 14, 3.14, 0
CIRCLE (X + 2 * Rl, 175), R2, 14, 3.14, 0
LINE (X + Rl, 175)-(X + Rl + R2, 175), 14
LINE (X + 2 * Rl + R2, 175)-(X + 3 * Rl, 175), 14
PAINT (X + 2 * Rl, 188), 4, 14
NEXT X
END

Задача 156

  • Правильно, если переменные r, s и н ранее получили значения.
  • Правильно.
  • Правильно.
  • Неправильно. Отсутствует ключевое слово то.
  • Правильно.
  • Неправильно. Цикл выполняться не будет, т. к. начальное значение параметра больше конечного, а шаг неотрицателен.
    Неправильно, т. к. оператор wend не должен содержать параметр.

Задача 157

WAR WAR WAR
SUNDAY PEACE
Так как после окончания цикла параметр имеет значение большее конечного значения параметра, то проверяемое условие r=w ложно, следовательно выполняется следующий оператор печати слова "SUNDAY", а затем "PEACE".

Задача 169

Будут бесконечно печататься нули. Значение s не меняется, поэтому цикл будет длиться бесконечно.

Задача 173

X=INT(RND(1)*ll)+10
Задача 175
X =-INT(RND(l)*101)+65
Задача 179
1 Маленький взрыв RANDOMIZE TIMER SCREEN 9 FOR 1=1 TO 100
X=INT(RND(1)*200)+220
Y=INT(RND(1)*200)+75
C=INT(RND(1)*15)+1
LINE (X, Y)-(320, 175), С NEXT I END

Задача 188

Rem ось абсцисс Rem ось ординат
' Построение графика Y=SQR{X)
SCREEN 9
LINE (0, 175)-(640, 175), 15
LINE (320, 0)-(320, 350), 15
DEF FNY(X)=SQR(X)
FOR X = 320 TO 640
Y = 175-30*FNY*((X-320J/30)
PSET (X, Y), 15 NEXT X END

Пояснение: корень квадратный извлекается только из неотрицательных чисел, следовательно, аргумент функции (х-320)/30) не должен быть меньше нуля, что и достигается его начальным значением 320.

Задача 190

' Поверхность вращения функции у = 1/1+х"
SCREEN 9
LINE (0, 175) - (640, 175), 15 Rem ось абсцисс
LINE (320, 0) - (320, 350), 15 Rem ось ординат
DEF FNY(X) = 1/(1+хл2)
FOR X = 320 ТО 640 STEP 5
Y = 175 - 30*FNY((X - 320)/30)
CIRCLE (X, 175), 175 - Y, 15,,,3 NEXT X END

Задача 196

1 Лестница 1
SCREEN 9
FOR X = 0 TO 64 0 STEP 4 0
LINE(X, X*35/64)-(X + 40, (X + 40)*35/64),15,В NEXT X END

Так как экран представляет собой не квадрат, а прямоугольник, то, чтобы серия прямоугольников располагалась вдоль диагонали, приходится вводить коэффициент соотношения сторон экрана 350/640 или 35/64.

Задача 197

' Пирамида. Вид сверху
SCREEN 9
FOR X = 20 ТО 220 STEP 10
LINE (X, X)-(220-Х, 220-Х),15, В NEXT X END

Задача 200

1 Лоскутный ковер
SCREEN 9
RANDOMIZE TIMER
FOR X = 0 TO 640 STEP 10
FOR Y = О ТО 350 STEP 10
' Выбор случайного цвета для закраски кв. лоскута
С = INT(RNDd) *15) + 1
' Рисование закрашенного квадратика
LINE (X, Y)-(X + 10, Y + 10), С, BF
' Обводка квадратика белым контуром
LINE (X, Y)-(X + 10, Y + 10), 15, В NEXT Y NEXT X END

Задача 205

1 Хронометр CLS
1 Цикл для часов FOR HOURS = 0 to 23 ' Цикл для минут FOR MINUTES = 0 to 59 ' Цикл для секунд FOR SECONDS = 0 to 59 LOCATE 12, 35
? HOURS; ":"; MINUTES; ":"; SECONDS SLEEP 1 NEXT SECONDS NEXT MINUTES NEXT HOURS

Задача 208

' Вычисление числа Пи методом Монте-Карло
CLS : RANDOMIZE TIMER
LOCATE 3, 20
PRINT " Вычисление числа Пи методом Монте-Карло"
SCREEN 9
' Рисование квадрата со стороной 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

Задача 212

1 Сумматор
CLS
' Запрос с клавиатуры количества суммируемых чисел
INPUT "Сколько чисел будем складывать"; N
' Обнуление переменной для накапливания суммы
S = 0
FOR 1=1 ТО 5
? "Введите"; I; "число"; INPUT A S=S+A NEXT I
' Вывод результата на экран ?"Сумма ваших"; N; "чисел равна"; S END

Задача 215

1 Нахождение суммы ряда
CLS
' Запрос значений переменных А и В
INPUT "Введите значения А и В"; А, В
' Обнуление переменной для накапливания суммы
S=0
1 = 0
WHILE (A+I)OB
S=S+1/(1+(A+I)Л2)
1 = 1 + 1 WEND
' Вывод результата на экран ?"Сумма ряда равна"; S END

Задача 216

1 Соприкасающиеся окружности
1 Занесение значений радиусов
DATA 50, 20, 10, 25, 40, 15, 60
SCREEN 9
' Задание начальной координаты X
Х=0
FOR 1=1 ТО 7
READ R
CIRCLE (X+R, 175), R, 14
X=X+2*R NEXT I END

Задача 220

1 Разноцветные окружности. Вариант 1
' Программа с циклом DO...LOOP WHILE
SCREEN 9
' Задание значения первого цвета
ч^— 1
DO
' Определение координаты X центра окружности
Х=10+40*С
CIRCLE (X, X), 30, 15
PAINT (X, X) , С, 15
С=С+1
LOOP WHILE C<7 END
' Разноцветные окружности. Вариант 2
' Программа с циклом DO...LOOP UNTIL
SCREEN 9
' Задание значения первого цвета
С=1
DO
' Определение координаты X центра окружности
Х=10+40*С
CIRCLE (X, X), 30, 15
PAINT (X, X), С, 15
С=С+1 LOOP UNTIL C=7

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

Задача 222

1 Шифровка
CLS
' Запрос количества букв в шифруемом слове
INPUT "Сколько букв в слове"; N
1 Объявление массива для зашифрованного слова
DIM D$ (N)
FOR 1=1 TO N
' Побуквенный запрос исходного слова
PRINT "Введите"; I; "букву";
INPUT C$
' Побуквенная шифровка
D$ (I)=CHR$(ASC(C$)+1) NEXT I
' Вывод на экран зашифрованного слова FOR I = 1 ТО N
PRINT D$(I); NEXT I END
Обратите внимание, что при введении буквы z в результате получается не буква, а символ квадратной скобки. Как избежать этого? Подумайте сами.

Задача 229

' Палиндром
CLS
' Запрос слова с клавиатуры
INPUT "Введите ваше слово"; W$
' Определение длины введенного слова
N=LEN(W$): Wl$=""
' Цикл переворачивания исходного слова задом наперед
FOR I=N TO 1 STEP -I
W1$=W1$+MID$(W$, I, 1) NEXT I
' Вывод исходного и получившегося слов PRINT "Исходное слово - "; W$
PRINT "Исходное слово наоборот - "; Wl$
' Вывод на экран результата
IF W$=W1$ THEN PRINT "Да, это палиндром" ELSE PRINT "Нет, это
не палиндром"
END
Обратите внимание, что программа для фразы "А РОЗА УПАЛА НА ЛАПУ АЗОРА" не сработает. Разберитесь, почему и внесите необходимые поправки.

Задача 231

1 10 слов
DATA STUFF, CAR, SKI, QOIKE, SUN
DATA CARD, PRESS, POOH, GULI, COP
CLS
PRINT "Все слова исходного списка"
FOR 1=1 TO 10
READ W$
PRINT W$; " "; NEXT I
PRINT : PRINT RESTORE
PRINT "Слова списка, отличные от слова SUN" FOR 1=1 ТО 10
READ W$
IF W$O"SUN" THEN PRINT W$; " "; NEXT I
PRINT : PRINT RESTORE
' Определение слова, ближайшего к началу алфавита READ W$ ALFA$=W$ FOR 1=1 TO 9
READ W$
IF W$<ALFA$ THEN ALFA$=W$ NEXT I
PRINT "Слово в списке, ближайшее к началу алфавита - "; PRINT RESTORE
' Определение слова, составленного из последних букв ' всех слов списка

ALFA$
FOR 1=1 ТО 10
READ W$
R$=R$+RIGHT$(WS, 1) NEXT I
PRINT "Слово, составленное из последних букв всех слов списка - "; R$ PRINT RESTORE
PRINT "Все трехбуквенные слова из списка" FOR 1=1 ТО 10
READ W$
IF LEN(W$)=3 THEN PRINT W$; " "; ¦ NEXT I END

Задача 235

' Замена буквосочетаний DATA PHOTO, GRAPH, PHILOPHON, COPHE CLS
FOR 1=1 TO 4 READ W$ FOR J=l TO LEN(W$)
P$=MID$(W$, J, 1): H$=MID$(W$, J + 1, 1)
IF P$o"P" THEN PRINT P$; ELSE IF H$o"H" THEN PRINT H$; ELSE
PRINT "F"; : J=J+1
NEXT J
PRINT NEXT I END

Задача 236

'Столбиковая интерпретация массива
CLS : RANDOMIZE TIMER
INPUT "Сколько чисел будет в массиве"; N
DIM S(N)
' Формирование массива
FOR 1=1 ТО N
S(I)=INT(RND(l)*150)+50
NEXT I
' Графическая интерпретация массива
SCREEN 9
Х=100
FOR 1=1 ТО 10
' Столбик, интерпретирующий элемент массива LINE (X, 300)-(Х+10, 300-S(D), 2, BF ' Белая рамка, обрамляющая столбик LINE (X, 300)-{Х+10, 300-S(I)), 15, В Х=Х+10
NEXT I
' Вывод элементов массива на экран
FOR 1=1 ТО N PRINT S(I) ;
NEXT I
END

Задача 239

1 Вычисление среднего квадратичного элементов
' заданного массива .
DATA 31, 19, 52, 65, 6, 8, 13, 16, 97, 33
CLS
DIM S(10)
' Формирование массива и вывод его элементов на экран
FOR 1=1 ТО 10
READ S(I)
? S(I); NEXT I
' Вычисление среднего арифметического элементов массива Т=0 FOR 1=1 ТО N
T=T+S(I) NEXT I TR=T/N
1 Вычисление среднего квадратичного элементов массива Т=0 FOR 1=1 ТО N
T=T+(S(I)-TR)A2 NEXT I SRKV=S/N
? "Среднее арифметическое элементов массива = "; TR ? "Среднее квадратичное элементов массива = "; SRKV END

Задача 240

' Вывод на экран элементов массива по заданному критерию
CLS: RANDOMIZE TIMER
INPUT "Сколько чисел будет в массиве"; N
DIM S(N)
' Формирование массива и вывод его на экран
FOR 1=1 ТО N
S(I)=INT(RND(1)*21)+2 ? S(I); NEXT I
FOR 1=1 TO INT(SQR(N))
? "Значение элемента массива №"; 1Л2; "равно"; 3(1Л2) NEXT I END

Задача 242

' Вывод массива в строки по 6 элементов, начиная с последнего
CLS: RANDOMIZE TIMER
INPUT "Сколько чисел будет в массиве"; N
DIM S(N)
' Формирование массива и вывод его на экран
FOR 1=1 ТО N
S(I)=INT(RND(1)*90)+10
? 3(1); NEXT I ?: ?
9 Вывод массива в строки по 6 элементов, начиная с последнего I = N WHILE IO6
FOR I=N TO N-5 STEP -1 ? S(I);
NEXT I
N=N-6
9
WEND END

Задача 245

'Столбиковая интерпретация массива, его максимума и минимума
CLS : RANDOMIZE TIMER
' Объявление и формирование массива
INPUT "Сколько чисел будет в массиве"; N
DIM S(N)
FOR 1=1 ТО N
S(I)=INT(RND(1)*150)+50 NEXT I
'Поиск максимального элемента массива и его индекса MAX=S(1): NMAX=1 FOR 1=2 ТО N
IF S(I)>MAX THEN MAX=S(I): NMAX=I NEXT I
'Поиск минимального элемента массива и его индекса MIN=S(1): NMIN=1 FOR 1=2 ТО N
IF S{I)<MIN THEN MIN=S(I): NMIN=I NEXT I
' Графическая интерпретация массива» SCREEN 9 X=100 FOR 1=1 TO 10
LINE (X, 300)-(X+10, 300-S(I)), 14, BF
IF I = NMAX THEN LINE (X, 300)-(X+10, 300-S(I)), 4, BF
IF I = NMIN THEN LINE (X, 300)-(X+10, 300-S(D), 2, BF
LINE (X, 300)-(X+10, 300-S(I)), 15, В
X=X+10 NEXT I
' Вывод на экран элементов массива, его максимума и минимума FOR 1=1 ТО N
PRINT S(I) ; NEXT I PRINT
PRINT "Максимальный элемент массива - "; MAX; "Его индекс -"; NMAX
PRINT "Минимальный элемент массива - "; MIN; "Его индекс - "; NMIN
END

Задача 247

62 55 29
1 Формула Герона
DATA 13, 48, 35, 90,
DATA 35, 40, 20, 71,
DATA 27, 68, 41, 54,
CLS
DIM A(5), B(5), C(5), P(5), S(5)
FOR 1=1 TO 5: READ A(I): NEXT I
FOR 1=1 TO 5: READ B(I): NEXT I
FOR 1=1 TO 5: READ С(I): NEXT I
FOR 1=1 TO 5
PP=P(I)/2
S(I)=SQR (PP*(PP-A(I))*(PP-B(I))*(PP-C(I)))
? "Периметр"; I; "треугольника равен"; Р(1); "см"
? "Площадь"; I; "треугольника равна"; S(I); "кв.см"
NEXT I END

Задача 251

' Расстояния между точками
DATA 120, 58, 280, 440, 157, 99, 350, 290, 500,159
DATA 271, 279, 35, 100, 160, 234, 45, 170, 200, 66
DATA 271, 279, 35, 100, 360, 234, 545, 170, 200, 266
DATA 120, 58, 280, 240, 157, 99, 150, 290, 50, 159
SCREEN 9
1 Объявление и формирование массивов
DIM XI(10), Yl(10), X2(10), Y2(10)
FOR 1=1 TO 10: READ XI (I) : NEXT I
FOR 1=1 TO 10: READ Y1(I): NEXT I
FOR 1=1 TO 10: READ X2(I): NEXT I
FOR 1=1 TO 10: READ Y2(I): NEXT I
' Формирование массива расстояний между точками
FOR 1=1 ТО 10
S(I)=SQR((X1(I)-X2(I))Л2+(У1(I)-Y2(I))Л2) NEXT I
' Поиск максимальной и минимальной длины MAX=S(1): NMAX=1
FOR 1=2 TO 10
IF S{I)>MAX THEN MAX=S(I): NMAX=I NEXT I
MIN=S(1): NMIN=1 FOR 1=2 TO 10
IF S(I)<MIN THEN MIN=S(I): NMIN=I NEXT I
' Графическая интерпретация FOR 1=1 TO 10
LINE (XI (I), Yl (I) )- (X2 (I) , Y2(I)), 15
IF I=NMAX THEN LINE (XI (I) , Yl (I) ) - (X2 (I) , Y2(U), 4
IF I=NMIN THEN LINE (X1(I), Yl (I) ) - (X2 (I) , Y2(D), 2 NEXT I END

Задача 256

1 Сборщики компьютеров
1 Понедельник
DATA 37, 14, 48, 24, 80, 60, 56
' Вторник .
DATA 77, 34, 45, 23, 45, 39, 51
' Среда
DATA 58, 65, 49, 49, 56, 45, 38
' Четверг
DATA 61, 57, 55, 89, 33, 52, 60
' Пятница
DATA 80, 67, 77, 70, 55, 76, 81
CLS
' Объявление и формирование массивов для каждого сборщика DIMA(5), B(5), C(5), D(5), E(5), F(5), G(5), S(7), SR(5) FOR 1=1 TO 5
READA(I), B(I), C(I), D(I), E(I), F(I), G(I) NEXT I
' Общее количество компьютеров за неделю для каждого сборщика
FOR J=l TO 7: S(J)=0: NEXT J
J-l: FOR 1=1 TO 5: S (J) =S (J)+A (I) : NEXT I
J=2: FOR 1=1 TO 5: S (J) =S (J)+B (I) : NEXT I
J=3: FOR 1=1 TO 5: S (J) =S (J)+C (I) : NEXT I
J=4: FOR 1=1 TO 5: S(J)=S(J)+D(I): NEXT I
J=5: FOR 1=1 ТО 5: S(J)=S(J)+E(I): NEXT I
J=6: FOR 1=1 TO 5: S(J)=S(J)+F(I): NEXT I
J=7: FOR 1=1 TO 5: S (J) =S (J)+G (I) : NEXT I
' Максимальное количество за неделю одним сборщиком
MAX=S(1): К=1
FOR J=2 TO 7
IF S(J) > MAX THEN MAX=S(J): K=J NEXT J
PRINT "Максимальное количество компьютеров за неделю: PRINT "собрал рабочий №"; К PRINT
' Среднее количество за каждый день недели FOR 1=1 ТО 5
; МАХ
PRINT "В"; I; "день в среднем собрано"; SR(I); "компьютеров" NEXT I PRINT
' Лучший результат за один день, номер сборщика и день недели RESTORE READ DAY MX=DAY: K=l FOR 1=2 TO 35
READ DAY
IF DAY>MX THEN MX=DAY: K=I NEXT I
PRINT "Максимальное количество компьютеров за один день: " ;
MX
N=K MOD 7
Nl=K/7
IF N1<=1 AND Nl>0 THEN 0$="Понедельник"
IF Nl<=2 AND N1>1 THEN 0$="Вторник"
IF Nl<=3 AND Nl>2 THEN D$="Cpefla"
IF Nl<=4 AND Nl>3 THEN D$="4eTBepr"
IF Nl<=5 AND Nl>4 THEN О$="Пятница"
PRINT "собрал рабочий №"; N
PRINT "Это был день недели "; D$
END

Задача 267

' Сортировка выбором
CLS : RANDOMIZE TIMER
INPUT "Сколько чисел будет в массиве"; N
' Объявление, формирование массива и вывод его на экран
DIM S(N)
FOR 1=1 ТО N
S(I)=INT(RND{1)*150)+50
PRINT S(I) ; NEXT I PRINT
1 Сортировка с использованием вложенных циклов FOR 1=1 ТО N-1
MIN=S(N)
K=N
FOR J=N TO I STEP -1
IF S(J)<MIN THEN MIN=S(J): K=J
NEXT J
SWAP S(K), S(I) NEXT I
' Вывод отсортированного массива FOR 1=1 TO N
PRINT S (I); NEXT I END

Задача 269

' Сортировка методом "пузырька"
CLS
DATA Q,W,E,R,T,Y,U,I,O,P
DATA A, S, D, F, G, H, J, K, L, Z
DATA X,C,V,B,N,M
' Объявление, формирование и вывод исходного массива на экран
N=26: DIM ENG$(N)
PRINT "Исходный массив"
FOR 1=1 ТО N
READ ENG$(I)
PRINT ENG$(I); " ";
NEXT I
PRINT
FOR 1=1 TO N-l
FOR J=l TO N-l
IF ENG$(J)>ENG$(J+1) THEN SWAP ENG$(J), ENG$(J+1)
NEXT J NEXT I PRINT
' Вывод отсортированного массива PRINT "Отсортированный массив" FOR 1=1 ТО N
PRINT ENG$(I); " "; NEXT I END


дНОНКМХРЕКЭМШЕ БНГЛНФМНЯРХ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

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

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

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

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

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

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

Адаптер | Разрешение | Количество цветов
VGA (Video Graphics Array) | 640x480 | 256
SVGA (Super Video Graphics Array) | до 1024x1024 | До 16 миллионов

При запуске Бейсика автоматически загружается текстовый экранный режим screen о. А далее адаптеры VGA и SVGA поддерживают режимы, представленные в табл. 3.2. Воспользовав шись этой таблицей, вы сможете устанавливать графический режим с помощью оператора screen.

Таблица 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

Цвет символов и цвет фона: оператор 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

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

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

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

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

CLS
SCREEN 9
COLOR 9, 1
REM Рисование блохи
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 позиций по .горизонтали и 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 и постарайтесь использовать предоставляемые им возможности.

Цвет точки экрана: функция 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

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

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

Звуковое оформление: оператор 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.

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

Оператор play позволяет составлять музыкальные фрагменты и проигрывать их в различных сочетаниях в ходе выполнения
программы. Как и оператор draw, оператор play имеет свой набор команд для определения мелодии. С помощью этих команд вы можете задать темп, октаву, паузы и другие музыкальные характеристики. Команды объединяются в строку и присваиваются строковой переменной. Когда вы захотите услышать мелодию, обратитесь к оператору play с командой
"X"+VARPTR(строковая переменная)
В представленной ниже программе оператор play используется для последовательного проигрывания нот в семи октавах.
1 Последовательно проигрывает все ноты в 7 октавах scale$ = "CDEFGAB" PLAY "LI6" FOR I = О ТО 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. Испытав их, вы убедитесь, что они предоставляют широкие возможности для "музицирования". Таково еще одно замечательное применение двоичного кода.

Таблица 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 является знаменателем дроби, обозначающей длительность ноты, с возрастанием х длительность звучания становится все короче. Запустите программу и вы услышите музыку, напоминающую звук скачущего пластмассового шарика.


оПХКНФЕМХЕ

оПНДЮБЮИ ЛНАХКЭМШИ ЙНМРЕМР ЯН ЯБНЕЦН ЯЮИРЮ

Приложение

  • Язык Qbasic. Краткий справочник
  • Сообщения об ошибках и их коды
  • Коды ASCII

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

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

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

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

Таблица П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 | Запись данных на экран или в последовательный файл

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Таблица П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 | Путь не найден При попытке обращения к файлу указано неправильное его имя или путь к нему

Коды ASCII

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

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

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