Министерство общего и профессионального образования РФ

Алтайский государственный технический университет

им.

Бийский технологический институт

, ,

ИНФОРМАТИКА. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ QBASIC

Учебно-методическое пособие по курсу "Информатика" для студентов
химико-технологических специальностей

Барнаул 1999

УДК 681.142.2

, ,

Информатика. Основы программирования на алгоритмическом языке qbasic: Учебно-методическое пособие по курсу "Информатика" для студентов химико-технологических специальностей.

Алт. гос. техн. ун-т им. , БТИ.- Бийск.

Изд-во Алт. гос. техн. ун-та, 1999, - 51 с.

В данном учебном пособии представлен лекционный курс «Информатика». Основы программирования на алгоритмическом языке QBasic. Материал, выполненный в объеме требований программы курса, приведен в форме, позволяющей достаточно полно ответить как на вопросы экзаменационных билетов, так и на дополнительные вопросы без помощи дополнительных руководств.

Рассмотрено и одобрено на заседании

кафедры информатики и

вычислительной математики

Протокол №2 от 27.01.99 г.

Рецензент: заведующий кафедрой БиГПИ,

к. ф.-м. н.

Ó БТИ АлтГТУ, 1999

Введение

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

В качестве составляющих данного краткого курса могут быть

НЕ нашли? Не то? Что вы ищете?

названы:

- ознакомление с возможностями современных персональных ЭВМ (PC);

- знакомство с операционной системой MS DOS и оболочкой Norton Commander (NC);

- обучение алгоритмическому языку Бейсик (диалект QBasic);

- обучение работе в системе MathCAD;

- практическое освоение численных расчетов на PC.

1 Общие сведения

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

В дальнейшем аппаратное обеспечение будем для краткости называть компьютер, ЭВМ или РС.

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

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

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

1850 г. – Ч. Бэббидж разработал принципиальную схему “Анали-тической машины”, работающей без участия человека. Машина должна была работать по программам, записанным на специальных картах с отверстиями – перфокартах.

1884 г. – Г. Холлерит сконструировал и опробовал машину

Бэббиджа.

1941 г. – Г. Эйкен и К. Цузе реализовали машину Холлерита на электромагнитных реле.

1943 г. – Д. Мочли и П. Эккерт сконструировали компьютер на электронных лампах.

1945 г. – Дж. Фон Нейман разработал принципиальную схему и теорию компьютеров.

1949 г. – М. Уилкс реализует схему Неймана.

1974 г. – Появляются первые персональные компьютеры (PC).

В дальнейшем происходит бурное развитие аппаратного и программного обеспечения. Это развитие имеет ускоренный характер, поэтому иногда ХХ век называют “веком информатизации” всех сфер деятельности человека.

Устройство компьютера. Основными устройствами компьютера являются:

- арифметическо – логическое устройство (АУ), выполняющее арифметические и логические операции;

- устройство управления (УУ), которое организует процесс выполнения программ;

- запоминающее устройство (ЗУ) или память для хранения программ и данных;

- внешние (периферийные) устройства для ввода и вывода информации.

Принципы работы компьютера. В общих чертах процесс работы компьютера следующий.

- Посредством устройства ввода в память компьютера вводится программа;

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

- Выполнение очередной команды и т. д.

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

Особенности современных компьютеров. Основной особенностью является то, что АУ и УУ объединены, как правило, в единое устройство центральный процессор (ЦП). Кроме того, процесс выполнения различных программ может осуществляться либо как бы параллельно (при наличии одного процессора), либо параллельно (при наличии нескольких процессоров).

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

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

При записи числа в двоичной системе счисления в каждом разряде может находиться либо 0, либо 1. Так, например, число 8 (десятичная система счисления) запишется в двоичной системе как 1000. В каждой ячейке памяти, отведенной для этого числа, следовательно, хранится либо 0, либо 1.

Единицей информации является 1 бит, т. е. двоичный разряд, который принимает значения 0 или 1. Более крупная единица информации 1 байт равняется 8 битам. В одном байте может быть закодировано значение одного символа из 256 возможных (256 = 28). Еще более крупными единицами информации являются килобайт 1 Кб = 1024 = 210 байтам и мегабайт 1Мб = 1024 Кб.

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

В качестве языков высокого уровня могут быть названы Фортран, Бэйсик, Паскаль, Си и др. Написание и отладка программ на том или ином языке обычно осуществляется в программных средах. Так, например, диалекты Бэйсика (основного языка РС) реализованы в средах QBasic, Quick Basic, Visual Basic и др.

Разновидности программ. Программы для компьютеров можно разделить на три категории:

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

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

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

Границы раздела между указанными программами достаточно ус-

ловны.

Системные программы. Число всех разновидностей системных программ очень велико. Остановимся на некоторых из них.

Операционная система. Это программа, которая загружается в первую очередь при включении компьютера. Она осуществляет диалог с пользователем, управление компьютером, запускает другие программы на выполнение. Для компьютеров типа IBM PC чаще всего используется операционная система MS DOS фирмы Microsoft.

Драйверы. Эти программы расширяют возможности DOS по управлению устройствами ввода – вывода (клавиатурой, жестким диском, мышью, принтером и др.), оперативной памятью и т. д. С помощью драйверов возможно подключение к РС новых устройств или нестандартное использование имеющихся устройств.

Программы-оболочки. Эти программы значительно упрощают общение пользователя с компьютером вследствие развитого менюинтерфейса пользователя. Наиболее распространенными в настоящее время являются Norton Commander (NC), DOS Navigator (DN) и др.

Операционные оболочки. Эти программы соединяют в себе возможности операционных систем и программ-оболочек. Их особенности следующие:

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

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

- расширенные средства для обмена информацией между программами.

Наиболее популярной программной оболочкой в настоящее

время является MS Windows.

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

Прикладные программы. Наиболее широко применяются следующие:

- редакторы текстов и издательские системы;

- программы обработки табличных данных – табличные процессоры;

- программы обработки больших массивов информации – системы управления базами данных;

- программы специализированной математической обработки данных – математические пакеты;

- программы обработки графической информации – графические редакторы.

Вся информация в памяти компьютера хранится в виде файлов. Файл (File) –последовательность однотипных записей, совокупность определенных данных. Для возможности различия файлов каждому из них присваивается имя, которое имеет длину не более 8 символов. Имя файла начинается с буквы (обычно латинской). Имена файлов снабжаются расширением, состоящим из точки и максимум трех символов. Расширение указывает на тип файла, использование его не является обязательным.

Для удобства работы принято, что файлы хранятся по каталогам. Каталог (Directory) является местом хранения определенных файлов. Например, отдельную область памяти компьютера можно представлять себе книжным шкафом с полками (каталогами), на которых находятся книги или папки (файлы). Каталоги могут быть вложенными друг в друга, образуя уровни каталогов и подкаталогов. Каталог самого высокого уровня называется корневым.

Для того, чтобы точно указать место расположения файла в памяти, необходимо указать всю цепочку названий каталогов, в которых расположен файл. Косая черта \ (слэш) отделяет в записи один каталог от другого. Например, запись D:\text\user1\text1.txt говорит о том, что текстовый (расширение. txt) файл text1.txt расположен в каталоге user1, который расположен в каталоге text, расположенном, в свою очередь, в разделе памяти D. В данном случае каталог text является корневым. В качестве раздела памяти может фигурировать дисковод (Disk Drive) того или иного типа. Более подробную информацию можно найти в книгах [1], [2].

Основные вопросы

1. Предмет информатики. В чем разница между аппаратным

и программным обеспечением? Из чего состоит программное обеспечение?

2. В чем заключаются принципы Неймана? Из каких эле-

ментов состоит компьютер? Каковы особенности современных ком-пьютеров?

3. В какой форме обрабатывается информация компью-

тером? Что такое двоичная система исчисления? Каковы основные единицы информации?

4. Какие бывают языки программирования? Каковы разно-

видности компьютерных программ? Что относится к системным программам? Что такое утилиты? Какие бывают прикладные программы?

5. Что такое файл и файловая система? Как записывается имя

файла? Что такое каталог и как подразделяются каталоги?

2 Среда программирования QBasic

Запуск среды QBasic осуществляется командой qb. exe в командной строке DOS или посредством Norton Commander. На экране появляются два окна. Верхнее окно – окно редактора, нижнее (Immediate) – непосредственного исполнения. Внизу имеется строка, подсказывающая назначение некоторых функциональных клавиш: <Shift+F1=Help> (вызов помощи), <F6=Window> (активизация окна), <F2=Subs> (работа с подпрограммами), <F5=Run> (запуск программы), <F8=Step> (пошаговое выполнение программы). Набором клавиш <Alt> + <+> и <Alt> + <-> можно менять размеры активного окна.

Верхняя строка представляет собой главное меню. Оно активизируется либо клавишей <Alt>, либо мышью. Команды главного меню следующие:

File – операции с файлами;

View – просмотр;

Edit – редактирование файла;

View – просмотр;

Search – поиск объектов в файле;

Run – запуск программы;

Debug – отладка программы;

Options – настройка опций (параметров) среды;

Help – помощь.

После активизации главного меню выбор той или иной команды осуществляется либо мышью (левая кнопка), либо клавишами со стрелками с последующим нажатием клавиши <Enter>. При этом могут быть открыты следующие меню нижнего уровня.

File:

New – создать новый файл;

Open – открыть существующий файл;

Save – сохранить файл с имеющимся именем;

Save As – сохранить файл с новым именем;

Print – распечатать файл или его фрагмент;

Exit – выход из среды QBasic.

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

Edit:

Cut (Shift+Del) – удалить выделенный фрагмент;

Copy (Ctrl+Ins) – занести в буфер обмена выделенный фрагмент;

Paste (Shift+Ins) – вставить за курсором содержимое буфера обмена;

Clear (Del) – удалить выделенный фрагмент без занесения в буфер обмена;

New SUB – создать новую подпрограмму в данном файле;

New FUNCTION – создать новую подпрограмму-функцию в данном файле.

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

View:

SUBs… (F2) – подпрограммы;

Split – разделить (окно);

Output Screen (F4) – экран вывода.

Search:

Find – найти объект в файле;

Repеat Last Find (F3) – продолжить поиск;

Change – изменить объект поиска.

Run:

Start (Shift+F5) – запустить программу;

Restart – перезапустить программу;

Continue (F5) – продолжить выполнение программы.

Debug:

Step (F8) – пошаговое выполнение программы;

Procedure Step (F10) – пошаговое выполнение подпро-

граммы;

Trace On – включить отладчик;

Toggle Breakpoint (F9) – установить точку прерывания;

Clear All Breakpoints – убрать все точки прерывания;

Set Next Statement – обратиться к следующему оператору.

Options:

Display … – показывать (некие объекты);

Help Path… – установить путь обращения при запросе о помощи;

Syntax Checking – проверка синтаксиса.

Активизация команды Help позволяет получить помощь (ответ) в том или ином затруднительном случае посредством обращения к электронной версии краткого руководства пользователя.

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

Символика алгоритмического языка QBasic включает в себя цифры, буквы, знаки операций, синтаксические знаки, специальные знаки и ключевые (служебные) слова. Ключевое слово – последовательность символов, имеющая особый, раз и навсегда установленный смысл.

Знаки операций следующие: + (сложение), - (вычитание), * (умножение), / (деление), \ (деление нацело), ^ (возведение в степень), < (меньше), > (больше), <= (меньше или равно), => (больше или равно), <> (не равно), AND (логическое И), OR (логическое ИЛИ), NOT (логическое НЕ).

Синтаксические знаки: “.” (точка), “,” (запятая), “’” (кавычка, апостроф), “”” (двойные кавычки), “:” (двоеточие), “;” (точка с запятой), “( )” (скобки).

Специальные знаки: $, %.

Ключевые слова: DIM, ELSE, FOR, GOTO, IF, INPUT, READ, PRINT RETURN, THEN, WHILE и др.

Числа записываются с помощью цифр. Например, 123.6; -18; +0.125. Дробная часть отделяется от целой символом “точка”. Кроме того, числа могут быть записаны в показательной форме. Например, 1.72Е-4; 0.234Е+3; .234Е3. Два последних числа равны.

Строка (string) – это набор любых символов, заключенных в двойные кавычки.

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

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

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

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

Текст программы и подпрограмм обычно снабжается комментариями – текстом, не оказывающим влияния на процесс вычисления, но поясняющим смысл операторов. От операторов комментарий отделяется знаком “’”, например:

S=A*B ‘ вычисление площади: А - длина, В – ширина.

В ранних версиях Бэйсика требовалось нумеровать строки, сейчас это не является обязательным. Если же строка имеет номер, то этот номер считается меткой строки. Например:

10 A=A+1

Следует помнить, что метка оператора начинается с первой позиции строки. В двух приведенных примерах использовался знак “=”. Он называется оператором присваивания.

Текст программы может заканчиваться операторами STOP или END, хотя их наличие в программе не является обязательным. Оператор STOP может встречаться в программе неоднократно.

Программа оперирует объектами, которые принято называть данными. Данные могут быть различного типа. Наиболее распространенными являются данные числовые, логические и строковые.

Числа (числовые данные) могут быть целыми и действительными (вещественными). Запись целых чисел в программе соответствует аналогичной математической, например: 123, -245, -62356. Вещественные числа могут записываться в двух формах: с фиксированной точкой и в показательной форме. Последняя форма удобна при записи очень больших или очень маленьких чисел.

Тип числовых данных отражается в написании соответствующих идентификаторов: по умолчанию все данные считаются относящимися к типу действительных чисел. Например, А1, В2, С3 – всё это действительные числа. Числовые данные целого типа могут выделяться добавлением к их идентификаторам специального символа “%”, например, А1%, В2%, С3%. Строковые данные отличаются тем, что их идентификаторы заканчиваются специальным символом “$”.

Рассмотрим простую программу для вычисления факториала некоторого числа N. Напомним, что по определению

0!=1

1!=1

2!=1.2

3!=1.2.3 и т. д.

Запишем

N=10

i=0

fact=1 ‘ подготовка

10 i=i+1

fact=fact*i

if (i < N) GOTO 10

PRINT fact ‘ печать результата

Пояснения. В первой строке задаем число N, значение факториала которого мы хотим вычислить. Задаем первое значение переменного числа i=0, значение факториала этого числа задано в следующей строке. Далее идет оператор с меткой 10, в котором значение переменной i увеличивается на 1. Значение факториала этого числа вычисляется по известной формуле (следующая строка программы). Далее следует условный оператор, проверяющий: не превзошло ли текущее значение переменной i заданной границы N. В случае, если i < N, с помощью оператора GOTO 10 происходит возврат к оператору с меткой 10. В противном случае (i = N) выполняется очередной оператор программы. Это PRINT - оператор печати результата. С помощью этой программы можно, задав достаточно большое значение N, вычислить значение N!.

Для удобства пользователя (написание более компактных программ) операторы не обязательно располагать по правилу “на каждой строке – один оператор”, можно записать на одной строке и несколько операторов, отделив их друг от друга знаками “:”. В этом случае последняя программа запишется, например, в виде

N = 10: i = 0: fact = 1 ‘ подготовка

10 i = i + 1: fact = fact * i

if (i < N) GOTO 10

PRINT fact ‘ печать результата

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

Iplus:

i = i + 1: fact = fact * i

if (i < N) GOTO Iplus

Здесь в качестве метки выступает имя “Iplus” с двоеточием после него. Двоеточие указывает на то, что это метка.

Замечание 2. Операторы не обязательно располагать, начиная с первой позиции строки, можно располагать их в любом месте строки. Применение этого правила и снабжение операторов комментариями позволяет создавать легко читаемые программы.

Основные вопросы

1. Как осуществляется запуск среды QBasic? Как устроена среда

QBasic? Что такое главное меню и из чего оно состоит? Каково назначение основных команд главного меню?

2. Является ли среда QBasic текстовым редактором? Из чего со-

стоит алфавит языка QBasic? Что такое ключевые слова? Каковы типы выражений языка QBasic?

3. Что такое структура программы на QBasic? Как оформляется

комментарий? Где размещается метка оператора? Что такое оператор присваивания?

4. Каковы простейшие типы данных QBasic? Как различаются

идентификаторы в зависимости от типа данных?

3 Основные операторы

Основными операциями при выполнении программ являются операции ввода – вывода данных.

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

В первом случае используется оператор ввода

INPUT список переменных.

Список переменных состоит из имен переменных, разделенных запятыми.

Например, вместо первого оператора N=10 в предыдущей программе можно было бы записать

INPUT N.

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

Пример. В программе встречается оператор

INPUT P1, P2%, P3$.

Пользователь должен ввести, например, такую информацию

3.5, 12, “Первый этап”.

Ввод информации заканчивается так же, как и ввод каждого оператора – нажатием клавиши <Enter>.

Оператор INPUT допускает помещение в него комментария ввода, ориентированного на пользователя. Например, в рассмотренной ранее программе вместо

INPUT N

можно записать

INPUT “Введите значение N=”; N.

В этом случае на монитор выдается комментарий

«Введите значение N=»,

после чего компьютер переходит в режим ожидания. Символ “;” перед N может быть заменен символом “,”. Тогда комментарий будет сопровождаться знаком вопроса.

Пример. INPUT “Продолжить вычисления Y/N”, YN$

В этом случае переменной YN$ присваивается значение “Y” или “N” после нажатия соответствующей клавиши пользователем.

Оператор INPUT очень удобен при создании программ, работающих в диалоговом режиме.

Второй способ ввода информации заключается в использовании оператора чтения

READ список переменных.

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

DATA список значений.

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

Пример. DATA 4, -2, 5, 7

DATA 5, 8, -7

DATA 2.3, 5.17, .273

DATA “Left”, “Right”

Блок данных в этом случае включает в себя семь целых чисел, три действительных числа и две строчных константы.

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

- при достаточно большом количестве данных они могут не по-

меститься в одном операторе;

- использование нескольких операторов DATA дает возмож-

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

Иногда требуется вновь присвоить выбранные значения тем же переменным или другим. В этом случае необходимо вернуться в начало блока данных. Это позволяет сделать оператор RESTORE, который можно использовать в любом месте программы.

Пример. Результат

DATA 10.1, 12.7, .21, 4

READ A, B A=10.1 B=12.7

………..

RESTORE

READ X, Y, Z X=10.1 Y=12.7 Z=0.21

…………

RESTORE

READ A1, B1 A1=10.1 B1=12.7

Операторы ввода из файла будут обсуждаться в дальнейшем.

Операторы вывода. Простейшим оператором вывода на экран дисплея или принтер является оператор

PRINT список вывода.

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

Пример. В результате выполнения программы

READ A, B, C, D, E, F, G, H

PRINT A, B

PRINT C; D,

PRINT E; F, G;

PRINT H

DATA 1.1, 1.2, 1.3, 1.4

DATA 1.5, 1.6, 1.7, 1.8

будет напечатано

Дополнительную возможность дает использование функции TAB. Эта функция используется только в операторе печати и располагается между элементами списка вывода. Ее аргументом может быть число, переменная или арифметическое выражение. Целая часть аргумента указывает позицию, в которой должно печататься значение элемента списка вывода, следующего за функцией TAB.

Пример. В результате выполнения программы

A = 12.6 : B = 14.75

PRINT ‘A =’; A; ‘B =’ ; B; TAB(20), ‘A + B =’; A + B,

PRINT TAB(35), ‘A - B =’; A - B

X = 2.5: Y = 13.6

PRINT TAB(X), INT(X); ‘Позиция’, TAB(Y), INT(Y);

PRINT ‘Позиция’, TAB(X+Y), INT(X+Y); ‘Позиция

будет напечатано

A=12.6 B=14.75 A+B=27.35 A-B=-2.15

2 Позиция 13 Позиция 26 Позиция

В этом примере INT – стандартная функция вычисления целой части действительного числа.

Замечание. При использовании функции TAB в операторе PRINT соглашение об использовании разделителей “,” и “;” отменяется, т. е. все равно, какими разделителями окружена функция TAB.

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

PRINT USING “форматы вывода”; список вывода

Форматы вывода могут быть следующих типов:

###### - для целых чисел (количество символов # указывает число выводимых знаков);

##.#### - для действительных чисел (до точки – число знаков целой части, после точки – число знаков дробной части);

##.###^^^^ - для действительных чисел (четыре символа ^^^^ указывают на то, что число будет представлено в показательной форме).

Пример. В результате работы программы

A = 12.345, B = 18, C = -45634.25

………………….

PRINT USING “A=#.###”; A

PRINT USING “B=####”; B

PRINT USING “C=##.##^^^^”; C

будет напечатано

A = 1.234

B = 18

C = -4.56 E+4

Более детально с действием оператора PRINT можно ознакомиться на практике с использованием команды HELP.

Операторы вывода в файл будут обсуждаться в дальнейшем.

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

IF условие THEN оператор

Условие – выражение логического типа. Иногда допустимо опускать слово THEN (обычно это тогда, когда за ним следует GOTO, как в программе вычисления факториала).

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

IF A=> 0 THEN B=SQR(A)

Здесь SQR – стандартная функция вычисления квадратного корня.

Условие может быть сложным по форме, например

IF (Alfa=0 AND Beta>0) OR (Alfa<0 AND Beta>1) THEN

Иногда необходимо выполнить несколько операторов при некотором условии. Тогда записывают

IF условие THEN

оператор 1

оператор 2

………

оператор n

END IF

В дальнейшем совокупность операторов 1, 2, …., n будем называть блоком операторов.

Иногда существуют два условия, для которых необходимо использовать разные операторы. Тогда удобно воспользоваться условным оператором вида

IF условие 1 THEN оператор 1 ELSE оператор 2.

Здесь слово ELSE означает ИНАЧЕ.

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

IF условие 1 THEN

блок операторов 1

ELSEIF условие 2 THEN

блок операторов 2

…………………

ELSE

блок операторов n

END IF

……..

END IF

Это наиболее общая форма условного оператора.

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

FOR счетчик = начало TO конец STEP шаг

блок операторов

NEXT

Здесь счетчик – переменная (параметр цикла), начало – начальное значение счетчика, конец – конечное значение счетчика, шаг – приращение (положительное или отрицательное) значения счетчика. При записи

FOR счетчик = начало TO конец

блок операторов

NEXT

по умолчанию полагается: шаг=1.

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

Пример. Расчет факториала с помощью оператора цикла может быть оформлен так

N = 1: fact = 1

FOR i = 1 TO N

fact = fact * i

NEXT

PRINT fact

10

Пример. Рассчитать сумму чисел S = S(i + i2/2 + i3/3)

i=1

Решение. Программу можно записать так

S = 0 ‘ подготовка

FOR i = 1 TO 10

dS = i + i^2/2 + i^3/3 ‘ приращение суммы на одном

шаге

S=S+dS ‘ новое значение суммы

NEXT

PRINT USING “Значение суммы S = ##.####^^^^”; S

Основные вопросы

1. Как осуществляется ввод данных в программу? Какие бывают

операторы ввода и как они оформляются? В чем разница между операторами INPUT и READ?

2. Какие бывают операторы вывода? Зачем нужен оператор TAB?

Что такое формат вывода и каким оператором он задается?

3. Зачем нужны условные операторы? Как оформляются различ-

ные типы условных операторов? В чем разница между этими типами операторов?

4. Что такое оператор цикла и для каких целей он предназначен?

Можно ли организовать вложенные циклы?

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

WHILE условие

блок операторов

WEND

Здесь условие – некоторое логическое выражение (см. ранее). Блок операторов выполняется до тех пор, пока условие справедливо (имеет логическое значение TRUE – истина). Если же условие несправедливо (имеет логическое значение FALSE – ложь), то блок операторов не выполняется.

Пример. Требуется подсчитать сумму целых чисел от 1 до 99. Это можно оформить в виде программы

N=99

i=0

S=0

WHILE i < N

i = i +1

S = S + i

WEND

PRINT S

Утверждение пока записывается как WHILE, а утверждение до тех пор пока – как UNTIL. Оператор цикла с условием, содержащим эти утверждения, может записываться в двух формах.

Первая из них выглядит так

DO

блок операторов

LOOP WHILE ( или UNTIL) условие

В этом случае циклическое выполнение блока операторов происходит пока (WHILE) или до тех пор (UNTIL) пока условие имеет значение TRUE (истинно). Особенность такой конструкции (проверка условия – в конце действий) состоит в том, что блок операторов выполняется по крайней мере один раз даже, если условие имеет значение FALSE (ложно).

Пример. Запишем программу из предыдущего примера с помощью конструкции DO…LOOP рассмотренного типа:

N=99

i=0

S=0

DO

i = i + 1

S = S + i

LOOP WHILE i <= N

PRINT S

При использовании оператора UNTIL эта же программа запи-

шется в виде:

N=99

i=0

S=0

DO

i = i + 1

S = S + i

LOOP UNTIL i = N

PRINT S

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

DO WHILE ( или UNTIL) условие

блок операторов

LOOP

В этом случае циклическое выполнение блока операторов происходит лишь пока (WHILE) или до тех пор (UNTIL), пока условие имеет значение TRUE (истинно). В противном случае блок операторов не выполняется ни одного раза.

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

Замечание. Из операторов цикла FOR … NEXT и DO … LOOP возможен выход и в случаях, когда счетчик цикла еще не принял своего конечного значения (оператор FOR … NEXT) или не выполнено условие (оператор DO … LOOP). Оператор выхода из тела цикла имеет вид

EXIT FOR ( соответственно EXIT DO )

или

условие EXIT FOR (условие EXIT DO ).

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

i=0

S=0

DO WHILE i > 0

i = i + 1

S = S + i

IF S => Slim THEN EXIT DO

LOOP

PRINT S

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

SELECT CASE анализируемый перечень выражений

CASE первое выражение

блок операторов 1

CASE второе выражение

блок операторов 2

…………………

[CASE ELSE

блок операторов n ]

END SELECT

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

выражение [, выражение ……..]

или

выражение TO выражение

или

выражение IS выражение с оператором отношения

Под оператором отношения понимается один из следующих: = (равно), <> (не равно), > (больше), >= (больше или равно), < (меньше), <= (меньше или равно).

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

Пример. Предположим, что переменная Color$ может принимать значения “Green”, “Blue”, “Red” и другие – по английским названиям цвета. В зависимости от значения переменной Color$ переменной RealColor$ должно присваиваться соответствующее русское название цвета, которое надо вывести на экран дисплея. Допустим, что в процессе выполнения программы переменной Color$ присвоено значение “Red”. Тогда фрагмент программы по анализу цвета можно записать так

Color$ = “Red”

………….

SELECT CASE Color$

CASE “Green”

RealColor$ = “Цвет зеленый

CASE “Blue”

RealColor$ = “Цвет голубой

CASE “Red”

RealColor$ = “Цвет красный

CASE ELSE

RealColor$ = “Цвет незнакомый

END SELECT

PRINT RealColor$

В процессе выполнения записанного выше фрагмента программы на экран монитора будет выведен текст : Цвет зеленый

Разумеется, в только что приведенном фрагменте программы за каждым из операторов вида RealColor$ = “Цвет красный” может располагаться последовательность других операторов.

Замечание. Перечислить все примеры использования структуры SELECT CASE … END SELECT вряд ли возможно. По-видимому, лишь практическое программирование позволяет понять все возможности этой структуры.

С некоторыми из встроенных функций системы программирования QBasic мы уже познакомились. Это функции SQR – вычисление квадратного корня, INT – вычисления целой части действительного числа (округление числа до целого), TAB – функция установки позиции печати результата. Существует еще целый ряд встроенных (стандартных) функций:

ABS(x) – вычисление модуля (абсолютного значения) числа х;

ATN(x) – вычисление арктангенса числа х (заданного в радианной мере);

COS(x) – вычисление косинуса числа х (заданного в радианной мере);

EXP(x) – вычисление экспоненты числа х (функция ех);

FIX(x) – вычисление целой части числа х (отбрасывание дробной части);

LOG(x) – вычисление натурального логарифма числа х;

MOD – функция сравнения по модулю (например, 7 MOD 4 = 3);

RND, RANDOMIZE – функции получения случайных значений;

SIN(x) – вычисление синуса числа х (заданного в радианной мере);

SLEEP – функция приостанова выполнения программы;

SWAP – функция перестановки двух переменных;

TAN(x) – вычисление тангенса числа х (заданного в радианной мере);

TIMER – функция вывода числа секунд от начала суток до включения таймера.

Этот список не является полным.

Наряду со стандартными пользователь может применять в вычислениях и свои собственные функции одного или нескольких аргументов. Определение функций пользователя осуществляется с применением оператора DEF FN двумя способами.

Первый способ:

DEF FNимя [(аргумент 1, аргумент 2, …)] = выражение

Здесь имя (обычно состоящее не более, чем из 40 латинских букв, цифр и символов) – название функции, выражение – алгебраическое выражение. Содержимое квадратных скобок может быть опущено.

Пример. Определим функцию следующего вида z(x, y) = x2 + y3: DEF FNZ(x, y) = x^2 + y^3

Второй способ задания функции:

DEF Fnимя [(аргумент 1, аргумент 2, …)]

оператор 1

оператор 2

……….

FNимя = выражение

[EXIT DEF]

……….

END DEF

Здесь (необязательный) оператор EXIT DEF позволяет выйти из тела определения функции.

Пример. Определим функцию f1 = A. sin2(x) + B. cos3(y), где A = 20.p2 + 40.p, B = 30.p2 - 20.p.

DEF FNF1 (x, y)

Pi = 3.1415926

A = 20 * Pi^2 + 40 * Pi

B = 30 * Pi^2 – 20 * Pi

FNF1 = A * SIN(x)^2 + B * COS(y)^3

END DEF

Основные вопросы

1. Зачем нужен оператор цикла с условием? В чем разница между

операторами цикла FOR…NEXT и WHILE…WEND? Как влияет разница в оформлении оператора цикла с условием посредством операторов WHILE и UNTIL на результат вычислений? Можно ли выйти из цикла вычислений?

2. Зачем нужен оператор выбора? Как в общем случае оформля-

ется оператор выбора? Что понимается под перечнем выражений? Какова наиболее часто употребляемая форма оператора SELECT CASE?

3. Что такое встроенные функции? В чем разница между встро-

енными функциями и функциями пользователя? Каковы основные встроенные функции? Каковы способы оформления функций пользователя? Можно ли организовать выход из оператора задания функции пользователя?

4 Массивы. Описание переменных

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

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

Объединение элементов в массив позволяет, с одной стороны, облегчить обработку данных, а с другой – упростить идентификацию элементов массива.

Например, если рассматривается вектор А в трехмерном пространстве с компонентами Ax, Ay и Az (проекциями на соответствующие оси декартовой системы координат), то его можно рассматривать именно как указанный упорядоченный набор, состоящий из трех чисел, а именно Ai, где i = 1, 2, 3. Тогда при программировании имеет смысл говорить об одномерном массиве (один индекс i) с именем А, состоящем из трех элементов. В случае же матрицы В с элементами bij, где i=1,2,…m; j=1,2,…n, следует говорить о двухмерном массиве (два индекса: i и j) с именем В и размерами m x n. Этот перечень примеров может быть продолжен.

Прежде, чем использовать массив при вычислениях, его необходимо описать. Для этого служит оператор

DIM список имен массивов,

где список имен массивов – разделенные запятыми идентификаторы, за которыми в круглых скобках указаны максимальные значения индексов, например: DIM A(15), B(4, 15), C(3, 25, 50).

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

В качестве индексов допустимо использовать числовые выражения, переменные и константы. Если индекс – вещественное число, то берется его целая часть. Например, если записано А(k), а значение k = 2.6, то такая запись будет восприниматься как А(2).

Минимальные значения индексов могут принимать значения 0 или 1, что определяется оператором

OPTION BASE 0

или

OPTION BASE 1

в начале программы. Операторы DIM в программе могут использоваться в любом количестве при условии, что одно и то же имя не должно встречаться в различных операторах. Располагаться в программе эти операторы могут произвольно, главное – до того, как встретятся в исполняемых операторах элементы описываемых в них массивов.

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

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

DIM C(1, 1)

а в нужном месте программы записать, допустим,

REDIM С(15, 20)

Кроме того, возможно, задав значения границ массива в виде числовых переменных, например, N1 и N2, записать

DIM C(N1, N2) - первое описание массива С,

и, определив новые значения границ индексов (K1, K2), записать в нужном месте программы

REDIM С(K1, K2)

Эти правила относятся к массивам любой допустимой размерности.

Рассмотрим примеры использования массивов в программах.

Пример 1. Пусть требуется подсчитать средний возраст студентов в группе. Полагается, что данные о возрасте каждого студента содержатся в некоторой таблице. Обозначим число студентов в группе через N, а одномерный массив возрастов студентов – Age(N), где N, вообще говоря, может быть произвольно. Тогда программа расчета среднего возраста студента может быть записана так:

DIM Age(2)

INPUT “Введите число студентов в группе N= “; N

REDIM Age(N)

FOR i = 1 TO N

READ Age(i)

NEXT

AgeMid = 0

FOR i = 1 TO N

AgeMid = AgeMid + Age(i)

NEXT

IF N < > 0 THEN AgeMid = AgeMid / N

PRINT “Средний возраст студента AgeMid = “; AgeMid

DATA 16.1 , 17.2 , 17.7 , ………….

Замечание. Эту программу можно было бы запускать неоднократно для обсчета данных по разным группам студентов с целью статистической обработки: средний возраст, средний балл по математике, информатике, физике, химии и т. д. Однако становится ясно, что препятствием к этому являются оператор READ и оператор DATA. Можно, разумеется, организовать интерактивный ввод данных посредством оператора INPUT, например, в цикле FOR…NEXT, но это тоже не очень хорошо – утомительно каждый раз вводить по одному числу или по несколько чисел в ответ на запрос о вводе, при этом, кроме того, трудно избежать ошибок. В таких случаях пользуются вводом данных из предварительно созданного файла, о чем будет сказано в дальнейшем.

Пример 2. Заданы одномерные массивы А(30) и В(30). Полагаем их координатами двух точек в 30-мерном евклидовом пространстве. Требуется определить расстояние между точками А и В.

Известно, что расстояние между двумя точками в евклидовом пространстве любой размерности может быть рассчитано по формуле:

N

D = [S(Ai - Bi)2]1/2

i=1

В нашем случае N = 30. Тогда программу можно записать так:

DIM A(30), B(30)

FOR i = 1 TO 30

READ A(i)

NEXT

FOR i = 1 TO 30

READ B(i)

NEXT

D = 0

FOR i = 1 TO 30

AminB2 = (A(i) – B(i)) * (A(i) – B(i))

D = D + AminB2

NEXT

D = SQR(D)

PRINT D

DATA …………. ‘ элементы массива А

DATA …………. ‘ элементы массива В

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

DIM переменные [(индексы ), (индексы), ….] AS тип,

где переменные – перечень констант или переменных, разделенных запятыми;

индексы (для массивов) – записи вида, например,

1 TO 20, 1 TO 30 и т. д.

тип – тип константы или переменной:

INTEGER – целый;

LONG – длинный (большей длины, чем стандартная);

SINGLE – обычной точности;

DOUBLE – двойной точности;

STRING – строковая или определенный пользователем тип.

Например, двухмерный массив целых чисел А(i, j), где i = 1…15, j=1…25, можно описать следующим образом:

DIM A (1 TO 15, 1 TO 25) AS INTEGER

Набор из различных типов переменных (SINGLE - обычной точности, DOUBLE - двойной точности и STRING - строковых) можно описать, например, так:

DIM A1, A2, B1, D3 AS SINGLE

DIM E, F, G AS DOUBLE

DIM H, P, Q AS STRING

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

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

Например, запись вида

DEFINT I – N

DEFLNG A – C

DEFSNG X – Z

DEFDBL D – H

DEFSTR P – S

предписывает: все константы и переменные, имена которых начинаются с букв от I до N, являются заведомо целыми, типа INTEGER; имена которых начинаются с букв от A до C, являются заведомо длинными, типа LONG; имена которых начинаются с букв от X до Z, являются заведомо обычными, типа SINGLE; имена которых начинаются с букв от D до H, являются заведомо двойной точности, типа DOUBLE; имена которых начинаются с букв от P до S, являются заведомо строковыми, типа STRING.

Такой прием, расширяющий так называемый принцип “по умолчанию”, берущий начало, по-видимому, в языке ФОРТРАН, зачастую позволяет избежать многих неприятностей.

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

Основные вопросы

1. Что такое массивы и чем обусловлена необходимость их ис-

пользования? Каковы правила описания массивов? Можно ли в качестве индекса массива использовать числовое выражение?

2. Каковы минимальные значения индексов массива? В чем раз-

ница между статическими и динамическими массивами? Где в программе записываются операторы описания массивов DIM и REDIM?

3. Как с помощью оператора DIM описываются переменные? Ка-

ковы операторы описания типов переменных? Чем отличается оператор описания DEF от оператора описания DIM?

5 Функции-подпрограммы и подпрограммы

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

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

Подпрограмма-функция оформляется следующим образом:

FUNCTION имя [переменная [(индексы )] [AS тип ], …] [STATIC]

……………………….

имя = выражение

……………………….

END FUNCTION

Здесь

имя – имя функции;

переменная – любое допустимое имя переменной;

индексы – границы изменения индексов (для массивов);

тип – любой стандартный тип (INTEGER, LONG и т. д.) или тип пользователя;

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

выражение – любое допустимое выражение, значение которого возвращается в программу при вызове функции;

END FUNCTION – означает конец определения функции.

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

Создание описанной конструкции осуществляется через меню посредством команд: Edit -> New FUNCTION. Система QBasic запрашивает имя функции, а затем автоматически создает описанную выше конструкцию.

Вызов функции-подпрограммы осуществляется из основной программы оператором

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

Пример. Допустим, что в некоторой программе приходится многократно использовать значения функции факториал (см. 2.5) от различных значений целочисленного аргумента n, т. е. y(n) = n!. Тогда эта подпрограмма-функция может быть оформлена следующим образом:

FUNCTION Fact(n)

i = 0: f = 1

DO WHILE i <= n

i = i + 1

f = f * i

LOOP

Fact = f

END FUNCTION

В программе могут встретиться неоднократные обращения к этой функции:

……………..

k1 = 10

y1 = Fact(k1)

……………..

k2 = 15

y2 = Fact(k2)

……………..

k3 = 25

y3 = Fact(k3)

……………..

и т.д.

Здесь k1, k2, k3 – глобальные (фактические) переменные, а n в функции-подпрограмме Fact – локальная переменная, воспринимаемая только в данной подпрограмме-функции.

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

образом:

SUB глобальное имя [(список параметров)] [STATIC]

…………………..

[EXIT SUB]

…………………..

END SUB

Здесь:

глобальное имя – допустимое имя (не более 40 символов);

список параметров – содержит имена аргументов, переменных в подпрограмме; имеет следующую форму (тип может быть INTEGER, LONG и т. д.):

переменная [(индексы)] [AS тип] [, переменная [(индексы)] [AS тип], ……..]

Как уже отмечалось ранее, все, стоящее в квадратных скобках, можно не писать. Имя, параметры и операторы, стоящие между SUB….END SUB, образуют тело подпрограммы. Использование оператора EXIT SUB позволяет осуществить выход из подпрограммы до конца ее выполнения. Значение ключевого слова STATIC пояснялось ранее.

Вызов подпрограммы осуществляется оператором вида

CALL глобальное имя [(список фактических параметров)]

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

Создание описанной конструкции так же, как и для подпрограммы-функции, осуществляется через меню посредством команд: Edit -> New SUB. Система QBasic запрашивает имя подпрограммы, а затем автоматически создает описанную выше конструкцию.

Редактировать функции-подпрограммы или подпрограммы можно лишь обратившись к их текстам посредством команд меню View -> SUBs.

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

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

Структура указанного оператора следующая:

COMMON [SHARED] [/имя блока/] переменная [([размерность])] [AS тип] [,…]

Здесь:

SHARED указывает на то, что переменные являются разделен-

ными между всеми структурными единицами в программе;

имя блока – любое допустимое имя (не более 40 символов);

переменная – имя переменной;

размерность – размерность массива, если переменная – массив;

тип – любой допустимый тип переменной (INTEGER, LONG и

др.).

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

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

Несколько иным способом является описание общих для структурных единиц программы переменных с помощью оператора SHARED. Эта форма имеет вид:

[RE] DIM [SHARED] переменная [(индексы)] [AS тип] [, …]

Выделенное курсивом пояснено ранее. Таким образом, оператор SHARED является атрибутом операторов COMMON, DIM и REDIM на уровне структурных единиц, и дает возможность доступа к переменным из указанного в нем списка.

Кроме того, оператор SHARED может использоваться и в форме

SHARED переменная [AS тип] [, переменная [AS тип], …]

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

Основные вопросы

1. Что такое структура программы? В чем отличие между функ-

цией подпрограммой и подпрограммой?

2. Как оформляется подпрограмма–функция? Когда употребля-

ется ключевое слово STATIC? Как осуществляется вызов подпрог-

раммы – функции?

3. Как оформляется подпрограмма? Что такое глобальное имя и

из чего оно состоит? Как осуществляется вызов подпрограммы? Можно ли выйти из подпрограммы до конца ее выполнения? Обязательно ли использовать ключевое слово CALL?

4. Зачем нужен обмен данными между структурными блоками

программы? Какими способами осуществляется обмен данными? В чем разница при использовании операторов COMMON и DIM при обмене данными между структурными единицами программы? Зачем нужно ключевое слово SHARED, что оно означает? Как еще можно использовать оператор SHARED в отдельной структурной единице?

6 Обмен данными и элементы графики

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

INPUT #номер файла, список переменны;

WRITE #номер файла, список переменных;

PRINT #номер файла, список переменных;

где #номер файла – номер файла, заданный оператором OPEN (см. ниже), список переменных – список имен, предписываемых данным, которые вводятся из файла или выводятся в файл.

Открытие файла, с которым будет осуществляться обмен данными, осуществляется оператором

OPEN тип обмена, [#]имя файла , вид доступа [, длина записи],

где тип обмена – следующий параметр:

“I” – последовательный ввод (INPUT);

“О” – последовательный вывод (OUTPUT);

“R” – произвольный доступ (RANDOM);

[#]имя файла – имя файла, с которым будет осуществляться обмен данными;

вид доступа:

READ - только чтение,

WRITE – только запись,

READ WRITE – чтение и запись;

[, длина записи – параметр, устанавливающий длину записи для файлов с произвольным доступом (предельная длина 32767 байт).

Закрытие файла (файлов), с которыми осуществлялся обмен данными, производится оператором

CLOSE [ [#]номер файла [, [#]номер файла…].

Здесь номер файла – номер файла, предписанный ранее оператором OPEN.

Пример. Пусть при выполнении программы из файла DAT1 необходимо ввести три числа, присвоив их значения переменным А1, А2 и А3, а затем, в процессе выполнения расчетов, сохранить значения переменных В1 и В2 в файле DAT2. Тогда фрагмент такой программы можно записать так:

……………………

OPEN “I”, #1 DAT1

INPUT #1, А1, А2, А3

……………………..

OPEN “O”, #2 DAT2

WRITE #2, B1,B2

CLOSE #1, #2

……………………

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

Точка может изображаться с помощью оператора

PSET [STEP] (x-координата, y-координата) [, цвет].

Здесь STEP – параметр, который делает координаты точки относительными к последнему положению курсора; (x-координата, y-координата) – координаты точки в пикселах (элементах - единицах измерения пространства экрана; например, размер экрана: 800х600); цвет – номер цвета, которым будет изображаться точка (например, 0 – черный, 15 – белый и т. д.).

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

PRESET [STEP] (x-координата, y-координата) [, цвет],

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

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

LINE [[STEP] (x1,y1)] – [STEP] (x2,y2) [, [номер цвета] [B[F]] ].

Здесь значение параметра STEP то же, что и в рассмотренных выше случаях;

(x1, y1) – положение начальной точки линии;

(x2, y2) – положение конечной точки линии;

номер цвета – номер цвета линии;

B – рисуется прямоугольник с диагональю в указанных точках;

F – осуществляется заливка прямоугольника выбранным цветом.

Нарисовать окружность, эллипс или дугу на экране можно с помощью оператора

CIRCLE [STEP] (x, y), радиус [, [цвет] [, [начало] [, конец][, отношение]]]].

Здесь STEP – определенный выше параметр,

(x, y) – координаты центра окружности или эллипса;

радиус – величина радиуса окружности;

цвет – номер цвета;

начало, конец – начальное и конечное значения угла (в радианах) для дуги;

отношение – величина отношения полуосей (y-координаты к x-координате) эллипса.

При печати текстовой информации для оформления графики служит оператор

LOCATE [строка] [, [столбец] [, [n],

который устанавливает курсор в определенную позицию экрана.

Здесь строка – номер строки, начиная сверху, столбец – номер столбца, начиная слева, n – параметр (n=0 – курсор невидим, n=1 – курсор видим).

Полагается, что на экране (в текстовом режиме) помещается 24 строки и 80 столбцов.

Прежде, чем выводить на экран графическую информацию, необходимо воспользоваться операторами WINDOW и/или VIEW. Оператор WINDOW имеет вид

WINDOW [[SCREEN] (x1, y1) – (x2, y2).

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

SCREEN – активизирует направленность оси y от верхней части графического окна к нижней; в противном случае (при отсутствии этого параметра) – наоборот;

(x1, y1) – логические координаты нижнего левого угла окна (верхнего левого при наличии параметра SCREEN);

(x2, y2) – логические координаты верхнего правого угла окна (нижнего правого при наличии параметра SCREEN).

Оператор VIEW имеет вид:

VIEW [[SCREEN] (x1, y1) – (x2, y2) [, [цвет] [, граница]]].

Этот оператор определяет графическую область или прямоугольник на экране для графического вывода. Его параметры следующие:

SCREEN – сохраняет координаты в последующих графических операциях абсолютными по отношению к экрану;

(x1, y1) – (x2, y2) – координаты верхнего левого и нижнего правого углов видимой области;

цвет – номер цвета заливки видимой области;

граница – номер цвета окантовки видимой области.

Перед началом вывода информации на экран возникает необходимость воспользоваться операторами SCREEN и CLS. Первый из этих операторов имеет вид:

SCREEN [тип экрана],

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

Например,

SCREEN 0 - текстовый режим,

SCREEN 9 - высокое разрешение по цвету и числу строк.

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

CLS [n].

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

При значении n = 0 происходит очистка экрана от текста и

графики.

При n = 1 очищается весь экран (очищается только графическая область после исполнения оператора VIEW).

При n = 2 очищается только текстовая область без нижней строки.

Отметим в заключение, что сама по себе работа с компьютерной графикой требует значительного объема практики.

Основные вопросы

1. Зачем нужен обмен данными с файлами и устройствами? По-

средством каких операторов осуществляется обмен данными? Зачем нужны операторы OPEN и CLOSE и где они располагаются? Какие типы обмена существуют и как они задаются?

2. Что такое графические примитивы? В чем разница между опе-

раторами PSET и PRESET, как они оформляются? Для чего нужен оператор LINE и какова его форма записи? Как нарисовать прямоугольник? Что означает ключевое слово STEP? Для чего служит оператор CIRCLE и как он записывается? Каким способом можно нарисовать дугу окружности? Как изобразить эллипс?

3. Для чего служит оператор LOCATE и как он записывается?

Для чего служат операторы WINDOW и VIEW, в чем между ними разница? Какой цели служит ключевое слово SCREEN в этих операторах? Чем отличается оператор SCREEN от аналогичного ключевого слова в операторах WINDOW и VIEW? Какой цели служит оператор CLS и каковы формы его записи?

7 Пример создания простой программы

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

A. x2 + B. x + C = 0

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

x1 = [B + (D)1/2]/(2A),

x2 = [B - (D)1/2]/(2A),

где дискриминант D = B2 - 4.A. C.

На первый взгляд задача представляется чрезвычайно легкой и сводится к реализации следующего алгоритма:

- требуется организовать ввод значений параметров A, B и C;

- провести расчеты по приведенным выше формулам;

- вывести результат на экран монитора или на принтер.

Однако, можно заметить сразу, что расчеты по приведенным формулам возможны лишь тогда, когда А не равно нулю. Кроме того, возможен еще ряд случаев, в которых пользоваться этими формулами или нельзя, или нерационально. Например, при D < 0 корень квадратный из D будет числом мнимым, а при D = 0 оба корня будут равны.

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

1) A = B = C = 0 (множество решений);

2) A = 0, B и C не равны нулю (один корень);

3) B = 0, A и C не равны нулю (равные корни);

4) A = B = 0 (вырожденное уравнение).

Кроме того, имеется еще ряд ситуаций: например, значение А очень велико или очень мало.

В соответствии с этими соображениями и составим программу, построив ее из структурных блоков – подпрограмм.

Согласно сказанному головная программа может иметь следующий вид:

DIM SHARED A, B, C, eps, YN$, Message$, Lprint, X1, X2, I

OneMoreTime:

Begin

SolveEquation

PrintOut

IF YN$ = “Y” OR YN$ = “y” THEN GOTO OneMoreTime

Здесь оператор DIM SHARED содержит имена глобальных переменных и параметров, таких как A, B, C, X1, X2 и других, значения которых будут ясны из дальнейшего. Метка OneMoreTime позволяет возобновить расчет при условии, которое содержится в последнем операторе: параметр YN$ принимает значения “Y” или “y” – первая буква слова “Yes” (Да).

Вслед за меткой идет вызов подпрограмм:

Begin – начало расчета;

SolveEquation – решение уравнения;

PrintOut – вывод на печать полученных результатов.

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

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

SUB Begin

‘======= Подпрограмма подготовки

eps = 1Е-15

YN$ = “ ”

Lprint = 0

CLS 0

PRINT “ Решение квадратного уравнения A*x*x + B*x + C = 0”

PRINT

INPUT “ Введите через запятую значения A, B, C: “, A, B, C

PRINT

END SUB

В тексте подпрограммы вслед за комментарием задаются значения параметрам eps, YN$ (пустая строка) и Lprint. Необходимость первого и последнего параметров будет ясна из дальнейшего рассмотрения. Последующие операторы в объяснениях не нуждаются.

В соответствии с тем, что обсуждалось выше, текст этой подпрограммы можно записать так:

SUB SolveEquation

‘=========== Решение уравнения

IF A*B*C = 0! THEN

SpecialCase

ELSE

RegularCase

END IF

END SUB

Структура этой подпрограммы очевидна: при условии равенства нулю хотя бы одного из параметров задачи (А, В или С) происходит рассмотрение какого-либо специального (частного) случая – вызов подпрограммы SprcialCase, в противном случае – вызов подпрограммы RegularCase для расчета по основным формулам.

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

SUB SpecialCase

‘======== Хотя бы один корень не равен нулю

IF A = 0 AND B = 0 AND C = 0 THEN

Message$ = “ Корни произвольны

ELSEIF A = 0 AND B = 0 AND C < > 0 THEN

Message$ = “ Уравнение вырождено: корней нет”

ELSEIF A = 0 AND B < > 0 THEN

X1 = - C/B

Message$ = “ Корень единственный: “

Lprint = 1

ELSEIF B = 0 AND A < > 0 THEN

X1 = C/A

X2 = - C/A

Message$ = “ Корни действительные: “

Lprint = 2

ELSEIF C = 0 AND A < > 0 THEN

X1 = 0!

X2 = - B/A

Message$ = “ Корни действительные: ”

Lprint = 2

END IF

END SUB

Из текста этой подпрограммы становится ясен смысл строчной переменной Message$ и параметра Lprint. Других пояснений, видимо, не требуется.

Текст этой подпрограммы можно записать так:

SUB RegularCase

‘======= Обычный случай

IF (ABS(A) => eps ) THEN

A0 = A

A = A/A0: B = B/A0: C = C/A0

D2 = B^2 – 4*A*C

IF D2 > 0 THEN

D = SQR(D2)

X1 = (-B + D)/2/A

X2 = (-B – D)/2/A

Message$ = “ Корни действительные: “

Lprint = 2

ELSEIF D2 < 0 THEN

D = SQR(ABS(D2))

I = ABS(D/2/A)

X1 = - B/2/A

X2 = - B/2/A

Message$ = “ Корни комплексные: “

Lprint = 4

ELSEIF D2 = 0 THEN

X1 = - B/2/A

X2 = - B/2/A

Message$ = “ Корни совпадают: “

Lprint = 2

END IF

END IF

IF (ABS(A) < eps ) THEN

X1 = - C/B

Message$ = “ Корни действительные: “

Lprint = 3

END IF

END SUB

Из текста этой подпрограммы становится ясен смысл параметра eps.

Это последняя из подпрограмм. Она может быть записана, например, в такой форме:

SUB PrintOut

‘====== Подпрограмма вывода результатов”

PRINT Message$

IF Lprint = 1 THEN PRINT USING “ X1 = ##.######^^^^”; X1

IF Lprint = 2 THEN

PRINT USING “ X1 = ##.######^^^^”; X1

PRINT USING “ X2 = ##.######^^^^”; X2

END IF

IF Lprint = 3 THEN

PRINT USING “ X1 = ##.######^^^^”; X1

PRINT “ X2 очень большое число”

END IF

IF Lprint = 4 THEN

PRINT USING “ X1 = ##.######^^^^ + ##.######^^^^ * I”; X1; I

PRINT USING “ X2 = ##.######^^^^ + ##.######^^^^ * I ”; X2; I

END IF

PRINT

INPUT “ Решить еще одно уравнение? Y/N”; YN$

END SUB

Из текста этой подпрограммы становится очевиден смысл параметра YN$: при желании пользователя решить еще одно уравнение необходимо ввести с клавиатуры букву “Y” или “y”, т. е. ответить “Да”. В противном случае надо ввести букву “N” или “n”.

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

Список литературы

1. IBM PC для пользователя.-УФА: ПК “Дегтярёв и

сын”, 1993.

2. Персональный компьютер IBM PC и операционная сис-

тема MS DOS.-М.: “Радио и связь”, 1991.

3. , Печенкина на IBM PC.-М.: АО “Книга и

бизнес”, 1992.

4. Дьяконов по алгоритмам и программам на языке

Бэйсик для персональных ЭВМ.-М.: “Наука”, 1989.

5. Форсайт Дж., Машинные методы мате-

матических вычислений.-М.: “Мир”, 1980.

6. Дьяконов MathCAD.-М.: “Радио и связь”, 1993.

7. , Барашков работы в системе MathCAD.-

Бийск: НИЦ БиГПИ, 1996.

СОДЕРЖАНИЕ

Введение. .3

1 Общие сведения4

1.1 Обеспечение решения задач информатики4

1.2 Краткая историческая справка4

1.3 Принципы Неймана. 4

1.4 Представление информации в компьютере5

1.5 Программы для компьютеров. Языки программирования. . 6

1.6 Понятие о файловой системе.8

2 Среда программирования QBasic9

2.1 Запуск среды и главное меню.9

2.2 Текстовый редактор11

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

2.4 Структура программы122

2.5 Простейшие типы данных. . . 13

2.6 Пример простой программы. 13

3 Основные операторы. 15

3.1 Операторы ввода – вывода. .15

3.2 Условные операторы19

3.3 Оператор цикла. . . 20

3.4 Операторы цикла с условием22

3.5 Оператор выбора. . 24

3.6 Встроенные функции и функции пользователя. .26

4 Массивы. Описание переменных28

4.1 Массивы и их описание8

4.2 Описание переменных31

5 Функции-подпрограммы и подпрограммы. .31

5.1 Структура программ33

6.2 Подпрограмма-функция33

5.3 Подпрограмма35

5.4 Обмен данными между программой и подпрограммами. . 37

6 Обмен данными и элементы графики38

6.1 Обмен данными с файлами и устройствами38

6.2 Элементы графики.40

7 Пример создания простой программы43

7.1 Постановка задачи.43

7.2 Головная программа44

7.3 Подпрограмма Begin45

7.4 Подпрограмма SolveEquation45

7.5 Подпрограмма SpecialCase. . 46

7.6 Подпрограмма RegularCase. .46

7.7 Подпрограмма PrintOut48

Список литературы. .49

СОДЕРЖАНИЕ

Информатика. Основы программирования на алгоритмическом языке qbasic. Учебно-методическое пособие "Информатика" для студентов химико-технологических специальностей.

Подписано в печать 16.03.99. Формат 60 х 84 1/16

Усл. п.л. 3,19 . Уч.- изд. л.2,97.

Печать – ризография, множительно-копировальный

аппарат «RISO TR 1510».

Редактор

Технический редактор

Тираж 50 экз. Заказ 99-43

Издательство Алтайского государственного

технического университета им.

г. Барна

Оригинал-макет подготовлен ВЦ БТИ АлтГТУ

им.

Отпечатано на ВЦ БТИ АлтГТУ

им.

659305 9.