ПРОСТЕЙШИЕ АЛГОРИТМЫ ОБРАБОТКИ МАССИВОВ

advertisement
Модуль 4
Алгоритмизация и программирование
ВЕДЕНИЕ
1.Элементы алгоритмизации ......................................................................................2
1.1. Понятие алгоритма. Свойства алгоритмов.
1.2. Способы представления алгоритмов.
1.3. Основные структуры алгоритмов.
1.3.1. Следование.
1.3.2. Ветвление.
1.3.3. Циклы.
1.4.Трансляторы, компиляторы , интерпретаторы.
2.Простейшие конструкции языка программирования QBASIC.
( Синтаксис и семантика языка программирования QBASIC.)
2.1. Алфавит
2.2. Структура данных
2.2.1. Целые типы.
2.2.2. Вещественные типы.
2.2.3. Логические данные.
2.2.4. Массив
2.2.5. Символьные данные.
2.2.6. Файл.
2.3. Операторы языка
2.3.1. Оператор присваивания.
2.3.2. Простейшие операторы графики.
2.3.3. Операторы ввода - вывода.
2.3.4. Оператор безусловного перехода .
2.3.5. Блочные операторы.
2.3.5.1. Оператор условной передачи управления
2.3.5.2.Условный оператор IF/THEN/ELSE/END IF.
2.3.5.3. Оператор выбора SELECT CASE.
2.3.6. Процедуры-функции и процедуры
2.4.Вспомогательные алгоритмы и процедуры.
2.5. Контрольная работа.
2.6.Образцы выполнения заданий.
1
Алгоритмизация и программирование (НА QBASIC).
ВВЕДЕНИЕ
Basic(Beginner’s All-purpose Symbolic Instruction Code)- один из первых
языков высокого уровня был разработан в 1963 году в Дартмудском
колледже для учебных целей .Это язык-долгожитель, число версий его не
поддаётся пересчёту.
Basic
— язык программирования, на котором Билл Гейтс, будучи в
возрасте 13-ти лет, написал свою первую программу для игры в крестикинолики. Этот язык для главы корпорации Microsoft явился трамплином к
тому, чтобы стать и лидером наиболее современных компьютерных
технологий, и одним из самых богатых людей в мире . Билл Гейтс сам
заработал свои капиталы исключительно благодаря своему уму,
дальновидности и предприимчивости.
Важным шагом стала версия языка Quick Basic,реализованная в QBasic и
Visual Basic.
Большинство инженеров и научных сотрудников сходятся во мнении, что
одинаково хорошо можно выполнить программирование как на языке Turbo
Pascal, так и на языке QBasic.
Удалось сгладить многие недостатки QBasic, обусловленные длительным
периодом его развития (более 40 лет ), в этом принимали участие большое
количество специалистов, принадлежащих разным поколениям.
Знать QBasic полезно, поскольку на нём пишутся DOS-инструкции для
конфигурирования компьютера, подпрограммы в многочисленных
приложениях Windows. Хорошо зная одну, базовую версию Бейсика —
QBasic, в дальнейшем можно свободно переходить к работе с другими
версиями этого популярного языка.
В наше время популярным инструментом разработки приложений Windows
является язык визуального программирования Visual Basic . Поэтому перед
изучением Visual Basic разумно изучить вначале QBasic, который является
его составной частью.
Освоить QBasic должен, пожалуй, каждый желающий научиться
программировать, ведь он является
распространенным языком
программирования . Такова действительность — QBasic завоевал мир, сделал
он это всерьёз и надолго.
Для глубокого понимания очень полезно «прокручивать» все шаги
компьютера у себя в голове, следует уметь читать коды программ. Каждую
лекцию и , на первый взгляд, хорошо усвоенную программу обязательно
необходимо закреплять практической работой на компьютере. Иначе
научиться программировать просто невозможно.
2
1.Элементы алгоритмизации
1.1.Понятие алгоритма. Свойства алгоритмов.
Слово «алгоритм» появилось как результат латинской транскрипции имени
великого ученого IX в. Мухаммеда ибн Мусы Аль-Хорезми , который
сформулировал общие правила (алгоритмы) выполнения арифметических
операций над десятичными числами.
Алгоритм — это определенная последовательность действий
(команд ,шагов), чёткое предписание конкретному исполнителю ,
выполнение которого приводит к достижению поставленной цели.
( существуют и другие формулировки).
Основные свойства алгоритма: дискретность , определенность,
результативность, массовость.
Программирование — это реализация заданного алгоритма на формальном
языке программирования. Программирование позволяет переложить
проведение и анализ информационных процессов на современную
вычислительную технику.
1.2.Способы представления алгоритмов.
Алгоритм может быть задан способами:
1) на естественном языке ;
2) аналитически (формулой);
3) графически ( в виде блок-схемы);
4) на алгоритмическом языке(РАЯ);
5) на языке программирования.
1.3.Основные структуры алгоритмов .
Основные структуры алгоритмов — это ограниченный набор блоков и
стандартных способов их соединения для выполнения типичных
последовательностей действий.
Структурный подход предполагает использование только нескольких
основных структур (линейных, ветвящихся, циклических), комбинация
которых дает все многообразие алгоритмов и программ.
В процессе изготовления программного продукта программист должен
пройти определенные этапы.
Рис.1.
Процесс решения задачи на компьютере состоит из этапов:
I . Постановка задачи.
II. Математическая модель.
III. Алгоритмизация задачи.
IV. Программирование.
V .Отладка задачи на компьютере.
VI .Анализ результата.
3
В конце 60-х — начале 70-х гг. XX столетия появляется дисциплина,
которая получила название структурного программирования. Её развитие
связано с именами Э.В. Дейкстры , Х.Д. Миллса , Д. Е. Кнута и других
ученых. Структурное программирование до настоящего времени остается
основой технологии программирования. Соблюдение его принципов позволяет программисту быстро научиться писать ясные , безошибочные,
надёжные программы.
В основе структурного программирования заложена теорема, которая
была строго доказана в теории программирования. Она утверждает, что
алгоритм для решения любой логической задачи можно составить только из
структур «следование, ветвление, цикл».
Их называют базовыми алгоритмическими структурами.
1.3.1. Следование
Следование — это линейная последовательность действий:
Рис.2.
Каждый блок может содержать в себе как простую команду, так и
сложную структуру, но обязательно должен иметь один вход и один выход.
1.3.2. Ветвление
Ветвление — алгоритмическая альтернатива. Управление передается
одному из двух блоков в зависимости от истинности или ложности условия.
Затем происходит выход на общее продолжение:
Рис.3.
Неполная форма ветвления имеет место, когда на одной ветви пусто:
Рис.4.
4
1.3.3. Цикл
Цикл — повторение некоторой группы действий по условию.
Различаются следующие типы цикла:
Цикл с предусловием (цикл-пока):
Рис.5.
Пока условие истинно, выполняется серия, образующая тело цикла.
Другой тип циклической структуры — цикл с постусловием (цикл-до):
Рис.6.
Здесь тело цикла предшествует условию цикла. Тело цикла повторяет
свое выполнение, если условие ложно. Повторение кончается, когда условие
станет истинным.
Теоретически необходимым и достаточным является лишь первый тип
цикла — цикл с предусловием. Любой циклический алгоритм можно
построить с его помощью. Это более общий вариант цикла, чем цикл-до.
Рассмотренные выше блок-схемы можно изобразить и так:
Рис.7.Базовые алгоритмические структуры: следование , ветвление ,
цикл- пока.
Кроме базовых алгоритмических структур используют дополнительные
структуры, производные от базовых:
• выбор - обозначающий выбор одного варианта из нескольких в
зависимости от значения некоторой величины (рис.8 а);
• цикл-до - обозначающий повторение некоторых действий до выполнения
заданного условия, проверка которого осуществляется после выполнения
действий в цикле (рис8. в);
5
• цикл с заданным числом повторений (счетный цикл) - обозначающий
повторение некоторых действий указанное количество раз (рис. 8, д).
Рис.8. Дополнительные структуры и их реализация через базовые структуры:
выбор (а-б), цикл-до (в-г) и цикл с заданным числом повторений (д-е)
На рис. 8,6 ,г и е показано, как каждая из дополнительных структур может
быть реализована через базовые структуры.
Перечисленные структуры были положены в основу структурного программирования - технологии, которая представляет собой набор рекомендаций по уменьшению количества ошибок в программах .
Сложный алгоритм состоит из соединенных между собой базовых
структур. Соединяться эти структуры могут двумя способами:
последовательным и вложенным.
Наряду с блок-схемами для описания алгоритмов часто используются
псевдокоды. Учебный алгоритмический язык школьной информатики
является примером такого псевдокода. Учебный АЯ (или его ещё называют
РАЯ) — структурный псевдокод. . Обучение составлению алгоритмов на
этом языке способствует «структурному воспитанию» программиста.
6
Пример 1. Разработать алгоритм вычисления наибольшего общего делителя
двух натуральных чисел.
Существует несколько способов нахождения наибольшего общего делителя
двух натуральных чисел. Самым простым из них является так называемый
«алгоритм Евклида». Суть этого метода заключается в последовательной
замене большего из чисел на разность большего и меньшего. Вычисления
заканчиваются, когда числа становятся равными.
На рис. 9. показана блок-схема алгоритма, а рядом приведено его
описание на псевдокоде.
Алгоритм Евклида:
Ввести А,В
цикл-пока А ≠ В
если А > В
то А := А - В
иначе В := В - А
все-если
все-цикл
Вывести А
Конец алгоритма.
Рис. 9. Схема алгоритма Евклида
Структурная методика алгоритмизации — это не только форма
описания алгоритма, но это ещё и способ мышления программиста. Создавая
алгоритм, нужно стремиться составлять его из стандартных структур. Если
использовать строительную аналогию, можно сказать, что структурная
методика построения алгоритма подобна сборке здания из стандартных
секций в отличие от складывания по кирпичику.
1.4.Трансляторы, компиляторы , интерпретаторы.
Точнее надо заголовок записать так-
Трансляторы: компиляторы + интерпретаторы. Поясним, почему.
Составлять программу на языке высокого уровня, конечно, удобно. Набрал
текст в редакторе, записал команды по алгоритму решения задачи — и всё.
Но текст программы — это ещё не готовое приложение, это только набор
символов, которые «запустить» в работу невозможно.
Для того чтобы набранный на каком-то языке программирования исходный
текст приложения ожил, заработал, смог выполнять заложенные в него
команды, применяются так называемые трансляторы.
**
7
Реализовать тот или иной язык программирования на ЭВМ — это
значит создать транслятор с этого языка для данной ЭВМ.
Существуют два принципиально различных метода трансляции. Они
называются соответственно компиляция и интерпретация. Чтобы понять их
различия рассмотрим аналогию: лектор должен выступить перед аудиторией
на незнакомом ей языке. Перевод можно организовать двумя способами:
• полный предварительный перевод — лектор заранее передает текст
выступления переводчику, тот записывает перевод, размножает его и раздает
слушателям ;
• синхронный перевод — лектор читает доклад, переводчик
одновременно с ним слово в слово переводит выступление.
Компиляция является аналогом полного предварительного перевода;
интерпретация — аналогом синхронного перевода. Транслятор,
работающий по принципу компиляции, называется компилятором;
транслятор, работающий методом интерпретации,-интерпретатором.
При компиляции в память ЭВМ загружается программа компилятор.
Она воспринимает текст программы на ЯПВУ как исходную информацию.
После завершения компиляции получается программа на языке машинных
команд. Затем в памяти остается только программа на ЯМК которая
выполняется, и получаются требуемые результаты.
Интерпретатор в течение всего времени работы программы находится
во внутренней памяти. В ОЗУ помещается и программа на ЯПВУ.
Интерпретатор в последовательности выполнения алгоритма <<читает»
очередной оператор программы, переводит его в команды и тут же
выполняет эти команды. Затем переходит к переводу и выполнению
следующего оператора. При этом результаты предыдущих переводов в
памяти не сохраняются. При повторном выполнении одной и той же команды
она снова будет транслироваться.
При компиляции исполнение программы разбивается на два этапа:
трансляцию и выполнение. При интерпретации, поскольку трансляция и
выполнение совмещены, программа на ЭВМ проходит в один этап. Однако
откомпилированная программа выполняется быстрее, чем интерпретируемая.
Поэтому использование компиляторов удобнее для больших программ,
требующих быстрого счета. Программы на Паскале, Си, Фортране всегда
компилируются. Бейсик чаще всего реализован через интерпретатор.
Компиляторы созданы сегодня абсолютно для всех более-менее популярных
языков программирования, в том числе и для Бейсика.
Есть и другой подход. Каждая команда исходного текста не переводится в
машинный код, а сразу исполняется. Конечно, исполняет её не процессор , он
и не подозревает о существовании Бейсика или Фортрана, а способен только
обрабатывать числа, кодирующие элементарные инструкции.
Идеальная программа-интерпретатор, которая интерпретирует исходный
текст в соответствии с заложенным в инструкции языка смыслом, и
покомандно его выполняет.
Для большинства языков программирования созданы и компиляторы, и
интерпретаторы(исключением являются языки низкого уровня ,например,
8
Ассемблер, которые не имеет смысла интерпретировать, и языки,
обладающие определенной машинной независимостью (компиляция
программы уничтожит эту независимость). При использовании одного и того
же стандарта языка программирования результат выполнения программы под
управлением интерпретатора и результат запуска исполняемого файла,
созданного компилятором, полностью совпадут.
Один из главных недостатков компиляторов — это высокая . трудоемкость
их создания, для чего требуется многолетняя работа большой группы
высококлассных специалистов, а написать интерпретатор вполне по силам
программисту среднего класса.
2.Простейшие конструкции языка программирования QBASIC.
2.1. Алфавит
Совокупность допустимых символов образует алфавит: это буквы
(прописные и строчные латинские буквы), цифры (арабские цифры то 0 до 9)
и специальные символы(знаки операций, знаки пунктуации и
зарезервированные слова).
Между группами символов алфавита вставляются разделители.
Из букв и цифр и знаков подчеркивания строятся идентификаторы.
Написание прописных и строчных букв в идентификаторах не различается:
слова VAR, vAR и VaR трактуются, как одно слово.
Длина идентификатора может быть любой, но существенны только первые
63 символа.
Знаки операций:
+, -, *, /, \, ^ , >, <, <>, <= , >=, а также арифметические и логические
функции (NOT, AND, OR, XOR, IMP и т. д.).
Множество знаков пунктуации складывается из следующих символов:
' выделение комментария;
( ) выделение индексов массивов, алгебраические скобки;
' апостроф;
; и, разделение списка ввода-вывода операторов PRINT и INPUT;
: отделение нескольких операторов друг от друга в одной строке;
= знак присваивания;
, разделение элементов списка; отделение целой части от дробной;
% признак целого числа;
& признак длинного целого числа;
!
признак дробного числа;
# признак дробного числа двойной точности;
$ признак символьной строки,
? приглашение оператора PRINT
К зарезервированным словам относятся операторы, имена логических и
арифметических функций. Список зарезервированных слов приводится в
таблице.
9
2.2. Структура данных
Под типом данных понимается множество допустимых значений
переменных, а также совокупность операций над ними.
В QBASIC можно выделить следующие группы типов:
• целые;
• вещественные;
• логические данные;
• массив;
• символьные данные;
• файлы.
2.2.1. Целые типы.
В QBASIC введено два стандартных целых типа, которые отличаются
форматами и диапазонами допустимых значений.
Таблица1
Тип
Значение
Формат
% - INTEGER
-32768.. 32767
Знаковый
& - LONGINT
-2147483648..2147483647 Знаковый
Для работы с целыми типами данных используются следующие арифметические функции, результат которых тоже целое число:
Таблица2
ABS(N)
Абсолютная величина N
А\В
Целая часть от деления
A MOD В
Остаток от деления
+,*,Сложение , умножение , вычитание
^
Возведение в степень
FIX (X)
Получение целой части вещественного числа X
CINT(X)
Округление до целого вещественного числа X
CLNG(X)
Округление до длинного целого вещественного числа X
INT(X)
Получение наибольшего целого числа, которое меньше
или равно X
2.2.2. Вещественные типы.
В QBASIC определено два стандартных вещественных типа, которые
отличаются форматами и диапазонами допустимых значений:
Таблица3
Тип
Значение
Число цифр
!-REAL
-2.9*10-38.1.7*1038
32
#- DOUBLE
-2.9*10-38..1.7*Ю38 64
Результат работы функций сложения, умножения, деления, вычитания и
возведения в степень вещественных чисел дает вещественное число.
Кроме этого, используются следующие функции, результат которых вещественное число:
10
Функция
Таблица 4
Назначение
ABS(X)
ATN(X)
COS(X)
SIN(X)
TAN(X)
EXP(X)
LOG(X)
SQR(X)
RND(X)
CDBL(X)
CSNG(X)
Абсолютное значение X
Арктангенс X
Косинус X
Синус X
Тангенс X
Ех
Натуральный логарифм
Квадратный корень X
Получение случайного числа
Представление числа с двойной точностью
Представление числа с одинарной точностью
2.2.3. Логические данные.
Логические данные, которые имеют значение либо "истина" - 1, либо "ложь"
- 0, обрабатываются с помощью логических операций и операций сравнения.
К ним относятся:
• NOT - отрицание;
• OR - объединение, или логическое сложение;
• AND - пересечение, или логическое умножение;
• XOR - исключающее ИЛИ или сложение по модулю два;
• EQV - эквивалентность;
• IMP - импликация, или следование.
Результат работы операций задается следующей таблицей истинности
(таблицы значений):
2.2.3. Логические данные.
Логические данные, которые имеют значение либо "истина" - 1, либо "ложь"
- 0, обрабатываются с помощью логических операций и операций сравнения.
К ним относятся:
• NOT - отрицание;
• OR - объединение, или логическое сложение;
• AND - пересечение, или логическое умножение;
• XOR - исключающее ИЛИ или сложение по модулю два;
• EQV - эквивалентность;
• IMP - импликация, или следование.
Результат работы операций задается следующей таблицей истинности
(таблицы значений):
Запомнить таблицу можно ,помня следующее:
▫операция отрицания меняет значение операнда на противоположное;
▫для того чтобы результат операции логического умножения был истинен,
все операнды должны быть истинны;
▫для того чтобы логическое сложение дало истину, нужно, чтобы хотя бы
один операнд был истинен,
11
▫а сложение по модулю два дает истину, только если операнды имеют разные
значения; иногда эту операцию называют выбором альтернативы (или жегалкинским сложением).
▫Для определения результата операции эквивалентности нужно помнить, что
он истинен, если операнды равны между собой, и ложен в противном случае.
▫Для операции импликации из ложного операнда следует все что угодно результат будет истинен, а из истины следует только истина.
▫При обработке логических данных используются также операции сравнения,
которые называются логическими отношениями:
=, < >, X, >, <, <= ,>=.
▫Результат операции логического отношения равен минус единице, если
задаваемое отношение выполняется, и нулю, если условие ложно.
2.2.4. Массив
Представляет собой заранее известное количество однотипных элементов,
снабженных индексами. Массив может быть одномерным или многомерным.
▪Чтобы задать массив, необходимо использовать зарезервированное слово
DIM, значения индексов массива и тип элементов массива.
Например, объявление одномерного массива 11 целых чисел может быть
задано так: DIM N%(10)
Обратите внимание, что интерпретатор устанавливает минимальное значение индекса, равное нулю.
Например, запись DIM BB(5,7), х(5)
объявляет двумерный массив BB из 48 чисел обычной точности и одномерный массив из шести таких чисел.
▪Оператор OPTION BASE устанавливает минимальное значение индексов
массива. Он должен быть указан до объявления массивов:
OPTION BASE n, где n равно единице или нулю.
▪Оператор ERASE отменяет объявление массивов, сделанных оператором
DIM:
ERASE список имен массивов.
2.2.5. Символьные данные.
В QBASIC имеется ещё тип данных, который называется символьным. Для
того чтобы показать, что вы используете переменную такого типа,
необходимо в имени этой переменной справа записать знак $:
например, А$, DF$, STR$.
▪ Этот тип является порядковым, и значения символьных переменных можно
сравнивать между собой (>, <, >=, <=):
например ,"vit" < "vita"<”vitaon”.
▪Возможна между ними и конкатенация (+): "мото" + "цикл" = "мотоцикл".
К символьным переменным относятся все прописные латинские буквы :
"А", "В", "С", ..., "Z", строчные :"а", "b", "с", ..., "z", цифры :"0", "1", "2", ...,
"9", знаки препинания, всевозможные скобки, русские буквы и т. д.
▪ В программах их значения всегда заключаются в апострофы.
▪Внутри каждого такого ряда коды символов упорядочены:
• "А" < "В"< "С" <...< "Z";
12
• "а" < "b" < "с" <...< "z";
• "0" < "1" < "2" <...< "9";
• "А" < "Б" < "В" <...< "Я";
• коды всех строчных букв меньше всех прописных.
Для работы с таким типом данных часто используются функции, аргументы
которых могут быть символьными переменными.
Таблица 6
Функция
Назначение
CHR$ (N)
Преобразование кода N в символьное представление
ASC (Х$)
Преобразование символа Х$ в десятичный код
LEFT$(X$,N)
Выделение N символов, начиная с самого левого
символа в символьном выражении Х$
MID$ (X$,N,M)
Выделение М символов, начиная с N-ro символа в
символьном выражении Х$ (М может быть опущено)
RIGHT$(X$,N)
Выделение N символов, начиная с самого правого
символа в символьном выражении Х$
SWAP X$,Y$
Обмен символьными выражениями Х$ и Y$
STRINGS (N, X$) Формирование строки из N одинаковых символов
SPACE$(N)
Формирование строки из N пробелов
OCT$ (N)
Перевод десятичных чисел в восьмеричное счисление
HEX$(N)
Перевод десятичных чисел в шестнадцатеричное
счисление
LEN(X$)
Определение длины символьного выражения
STR$(N)
Переводит число в символьную форму, резервируя
перед символьным выражением один пробел для знака
INSTR(N,X$,Y$)
Поиск подстроки YS в строке Х$ начиная с N-ro
символа N можно опустить
2.2.6. Файл.
Одним из типов данных в QBASIC является файловый тип, который есть
последовательность связанных между собой однотипных компонентов записей, расположенных на внешнем носителе. Запись рассматривается как
единое целое.
В QBASIC имеется 2 категории файлов, работа с которыми отличается
• последовательные;
• с произвольным доступом.
2.3.Операторы языка
Операторы языка описывают алгоритмические действия, которые
необходимо выполнить для решения задачи. Сама программа представляет
собой последовательность таких операторов. Каждый оператор помещается в
своей строке, длина которой не превышает 255 байт. Все операторы можно
разбить на выполняемые и невыполняемые.
Выполняемые операторы служат для выполнения определенных операций
или изменения порядка выполнения операторов в программе.
13
К невыполняемым операторам относятся операторы управления, такие, как
оператор конца программы END, объявления массивов DIM, комментария
REM и т. д.
В свою очередь, выполнимые операторы могут быть вычислительными и
невычислительными.
Кроме того, в QBASIC используются блочные операторы, состоящие из
операторов.
Итак , мы рассмотрим:
 Оператор присваивания
 Операторы графики(простейшие)
 Операторы ввода- вывода информации
 Операторы ветвления
 Циклические операторы
 Процедуры-функции и процедуры
2.3.1. Оператор присваивания.
С помощью оператора присваивания ( = или LЕТ) какой-либо переменной
присваивается значение, например:
A= 7
LET H=A+B+Q/C. Оператор LET в программе можно опустить.
2.3.2.Операторы графики
1) Нарисовать точку на экране : PSET (X,Y), C
Здесь х и у – координаты точки на экране, С – её цвет
2)Нарисовать отрезок АВ :
LINE (5, 100)-(550, 220),С
Здесь (5, 100)-координаты А,(550, 220)- координаты В, а С-цвет линии.
3) Нарисовать прямоугольник с диагональю АВ:
LINE (5, 100)-(550, 220),С, В
4) Закрасить прямоугольник с диагональю АВ:
LINE (5, 100)-(550, 220),С, ВF
Другой способ:
PAINT(X,Y),С
(X,Y)-точка внутри замкнутой области прямоугольника, С-цвет заливки.
5) Нарисовать окружность:
CIRCLE(X,Y),R,C
Здесь (X,Y)-координаты центра ,R-радиус окружности,C-цвет.
Для рисования окружности вытянутой вдоль оси ОХ(или ОY) надо указать
коэффициент сжатия К(k=1/n для OX и k=n для OY.
Например,
a) CIRCLE(X,Y),R,C,,,1/4
b) CIRCLE(X,Y),R,C,,,4
14
c) CIRCLE(X,Y),R,C,ф1,ф2
Здесь ф1 –начало дуги и ф2-конец дуги в радианной мере .Например,
REM ' Длина дуги 1-ой четверти окружности
CIRCLE(X,Y),R,C,0,1.57
6) Наконец , чтобы задать графический экран ,существуют разные режимы;
оптимальный из них :
SCREEN 9
7) Оператор выбора отображаемого цвета
COLOR [передний план] , [фон]
Например,
COLOR 4, 2
-красные символы на зелёном фоне
COLOR
-по умолчанию, фон – чёрный, символы – белые.
Таблица цветов 7
Номер
Название цвета
цвета
Номер
цвета
Название цвета
0
Чёрный
8
Серый
1
Синий
9
Светло-синий
2
Зелёный
10
Светло-зелёный
3
Голубой
11
Светло-голубой
4
Красный
12
Светло-красный
5
Пурпурный
13
Светло-пурпурный
6
Коричневый
14
Жёлтый
7
Белый
15
Ярко-белый
2.3.3.Операторы ввода- вывода информации
REM-неисполняемый оператор, оператор-комментарий.
Ввод и вывод в QBASIC в основном осуществляются через простейшие
операторы INPUT и PRINT.Оператор INPUT производит ввод данных,
присваивая значения соответствующим переменным во время ввода.
Оператор ввода информации INPUT
В процессе выполнения программы приходится вводить с клавиатуры
недостающую информацию, вести диалог. Значит нужен оператор, который
будет запрашивать и ждать ввода этой информации, иначе не будет
продолжения работы по программе. Таким оператором является INPUT.
Когда в программе встречается этот оператор, останавливается
выполнение программы, на экране появляется знак вопроса и компьютер
ждет ввода такого количества данных, какое указано в этом операторе.
Например, при следующей записи необходимо ввести значения трёх
переменных.
15
INPUT A,B,C
RUN
? 5,8,3
Если точка с запятой стоят перед именами переменных, то знак вопроса
не выводится.
INPUT; A,B,C -;подавляет знак вопроса
В большинстве случаев приходится пояснять текстовым сообщением о
том, какие данные необходимо ввести. Для этого текст сообщения
помещается в кавычки, затем ставится разделительный знак (точка с запятой
или запятая) и перечисляются имена переменных.
INPUT; “Введите три числа “;A,B,C
RUN
Введите три числа
-появляется на экране без знака вопроса
Если вводится фамилия (или какая другая символьная переменная),то
надо указывать знак $. Например, А$, В$; тогда с этими переменными
нельзя производить вычисления.
Вводить данные , особенно когда их много, можно и с помощью
оператора READ, он работает в паре с оператором DATA одновременно.
Например,
DATA 6,9,4,45,3,12,56,41,6,8
READ А
Операторов DATA бывает несколько, и они могут располагаться в
любом месте программы.
И данные считываются всё равно последовательно сверху вниз и слева
направо. Если данных недостаточно, то выдаётся сообщение об ошибке типа
«Нет данных». Можно восстановить все данные, хранящиеся в DATA
командой RESTORE.
Например,
READ A,B,C,D
DATA 10.6,0.1,15,1.2
RESTORE: READ E,А
Если арифметическое выражение отсутствует, осуществляется возврат
к началу списка. После выполнения этого фрагмента будет присвоено
A=10.6,B=0.1,C=15,D=1.2,E=10.6,F=0.1.
Оператор вывода PRINT.
Применяется для вывода данных на экран дисплея оператор PRINT.
Общий вид: PRINT список.
Список может содержать имена переменных , числа, арифметические
выражения ,тексты. При отсутствии списка просто осуществляется перевод
строки.
При использовании этого оператора можно употреблять в качестве разделителей запятую или точку с запятой:
PRINT А, В; С;
Использование запятой приводит к так называемому "зонному" выводу
данных, где под "зоной" понимается расстояние в 14 символов (колонок).
16
При использовании точки с запятой в качестве разделителя данные
выводятся последовательно, друг за другом.
Например, для того чтобы вывести на экран 3 символа, нужно написать так:
PRINT "A","B","C"
тогда на экране появится :
A B C
Если вы вводите
PRINT "A";"B";"C"
то на экране появится :
ABC
А вот диалоговая программа:
PRINT”Давайте познакомимся! Как Вас зовут?”
INPUT A$
PRINT “Очень приятно, ”;A$
RUN
Давайте познакомимся! Как Вас зовут?
? Марина
Очень приятно, Марина
Если вы хотите вывести на экран фамилию ИВАНОВ в позицию(10,5), надо
применить ещё и оператор LOCATE
LOCATE –оператор перемещения курсора на заданную позицию экрана
(строк – 25, столбцов – 80).
LOCATE номер строки , номер столбца
REM‘Строка 10,позиция 5,печатать на экран ИВАНОВ
LOCATE 10, 5: PRINT " ИВАНОВ "
PRINT USING
PRINT USING формат,список позволяет выводить данные с заданной
точностью. Например,
PRINT USING”x=##.#”,.152.15478
RUN
x=0.2
PRINT TAB
PRINT TAB (10);5 ВЫВОДИТ НА ЭКРАН ЧИСЛО 5 в 21-ю позицию строки
экрана.
Пример 2.Составить программу ,которая выводила бы на экран
ведомость получения зарплаты.
Фамилия,F
Зарплата, S
Премия,P
Налог 13%,PN
К выдаче ,S1
Решение
‘ОЧИСТИТЬ ЭКРАН
CLS
‘Задать оптимальный графический режим экрана
SCREEN 9
INPUT "Введите фамилию"; F$
17
INPUT "Введите размер заработанной платы "; S
INPUT "Введите размер премии"; Р
PN = (S + P) *0.13
S1 = S + P- PN
‘РИСУЕМ ТАБЛИЦУ
LINE (5, 100)-(550, 220),2, В
LINE (10, 170)-(550, 170)
LINE (110, 100)-(110, 220)
LINE (220, 100)-(220, 220)
LINE (330, 100)-(330, 220)
LINE (420, 100)-(420, 220)
‘Оформляем заголовок таблицы
‘Строка 10,позиция 5,печатать на экран ФАМИЛИЯ,F
LOCATE 10, 5: PRINT "ФАМИЛИЯ,F"
‘Строка 10,позиция 16,печатать на экран ЗАРПЛАТА,S
LOCATE 10, 16: PRINT "ЗАРПЛАТА,S"
LOCATE 10, 30: PRINT "ПРЕМИЯ,P"
LOCATE 10, 45: PRINT "НАЛОГ,PN"
LOCATE 10, 55: PRINT "ВЫДАТЬ,S1"
‘Заполнение таблицы
LOCATE 14, 2: PRINT F$
LOCATE 14, 17: PRINT S
LOCATE 14, 30: PRINT P
LOCATE 14, 45: PRINT PN
LOCATE 14, 55: PRINT "ВЫДАТЬ " ;S1
2.3.4. Оператор безусловного перехода GOTO.
Оператор безусловного перехода GOTO нарушает нормальное выполнение
программы и переводит его на строку с указанным номером.
Современный стиль программирования не рекомендует использование этого
оператора, т. к. он затрудняет чтение и отладку.
2.3.5. Блочные операторы.
К блочным операторам относятся:
• условный оператор IF/THEN/ELSE/END IF;
• оператор выбора SELECT CASE;
• оператор цикла FOR... TO;
• оператор цикла DO LOOP [{WHILE | UNTIL}];
• операторы цикла DO WHILE/UNTIL LOOP и WHILE WEND}
• процедурные блоки SUB и FUNCTION.
2.3.5.1. Оператор условной передачи управления
Оператор условной передачи управления (рис. 10) используют для программирования ветвлений, т. е. ситуаций, когда возникает необходимость
при определённых условиях выполнять различные действия. Условие запи18
сывают в виде логического выражения, в зависимости от результата которого
осуществляется выбор одной из ветвей: если результат true, то выполняется
оператор, следующий за служебным словом then, иначе - оператор, следующий за служебным словом else.
В каждой ветви допускается запись одного оператора (в том числе и другого
if) или составного оператора.
Рис. 10
Рис.11.Фрагменты алгоритмов
В соответствии с синтаксической диаграммой допускается использовать
оператор условной передачи управления с неуказанной (пустой) ветвью else.
В некоторых случаях использование укороченных конструкций может привести к неоднозначности, например, не понятно, какому из двух вариантов
схем алгоритма (рис. 11.) соответствует фрагмент:
В этих случаях используется так называемое «правило вложенности»:
альтернатива else всегда относится к ближайшему if, что соответствует варианту алгоритма на рис. 11, а. Если необходимо реализовать вариант алгоритма, изображенный на рис. 11, б, то вместо действия 2 используют
переход на конец программы , а в ПАСКАЛЕ операторные скобки:
Пример3.
19
Составить программу, которая вычисляет значение кусочно-непрерывной
функции:
Программа должна начинаться с ввода значения аргумента.
Затем в зависимости от того, в какой интервал попадает введенное значение,
вычисляем значение функции по одному из заданных выражений.
Алгоритм решения данной задачи представлен на рис.12 .
Рис. 12. Блок-схема алгоритма программы примера 2.
2.3.5.2.Условный оператор IF/THEN/ELSE/END IF.
Условный оператор позволяет исполнять те или иные действия в
зависимости от выполнения логического условия. Предлагается использовать
две разновидности этого оператора:
IF условиеF THEN <оператор 1> : <оператор 2>: <оператор М>
или IF условиеF THEN
IF <условие> THEN
<оператор 1>
<действие 1>
<оператор 2>
ELSE
….
<действие2>
<оператор М >
END IF
END IF
В первом случае, при истинности логического условия F, выполняется
последовательность операторов 1...М. Альтернативная конструкция отсутствует или заменена END IF , то есть если условие ложно, ничего
не выполняется.
Неполная форма записи оператора
IF усл THEN опер (или метка перехода)
20
Метка — это числовое значение, стоящее перед строкой, которой надо
передать управление.
В неполной форме может быть опущен оператор ELSE, тогда при
невыполнении условия управление передается следующему оператору,
стоящему за оператором условного перехода.
На блок-схеме этот оператор обозначается фигурой, которая
называется ромб, и имеет два выхода. Один когда поставленное условие
выполняется, другой, когда нет.
Условия могут быть простые и сложные, которые состоят из двух или
более простых условий. Если надо ,чтобы выполнялись одновременно все
условия ,они соединяются логическими связками AND; когда должно
выполняться хотя бы одно из перечисленных условий , то- OR.
Пример 4
Составьте программу, которая вводит два числа и выводит наибольшее
из них.
Рис.13.
CLS
INPUT А, В
IF A> В THEN PRINT "Наибольшее из чисел A"; A
ELSE
PRINT"Наибольшее из чисел В"; В
Строка с условием выбирает одно из двух вариантов: если введенное
значение переменой А окажется больше переменной В, то в результате будет
напечатано значение А, иначе значение В.
Пример 5
Определить, является ли введённые числа А, В, С углами треугольника.
21
IF (А > 0) AND (В > 0) AND (С > 0) AND (А + В + С = 180) THEN
PRINT "ЯВЛЯЮТСЯ УГЛАМИ ТРЕУГОЛЬНИКА"
ELSE
PRINT "НЕ ЯВЛЯЮТСЯ УГЛАМИ ТРЕУГОЛЬНИКА"
ENDIF
2.3.5.3. Оператор выбора SELECT CASE.
С помощью оператора CASE возможен любой вариант из допустимых
значений переменной. Он имеет структуру:
SELECT CASE параметр
CASE значение параметра 1
<оператор 1>
CASE значение параметра 2
<оператор 2>
CASE значение параметра Х
<оператор X>
CASE ELSE
<оператор L>
END SELECT
Если при выборе альтернативы необходимо выполнение нескольких
операторов , то нужно записать их в одной строке через двоеточие либо
каждый в своей строке.
Например,
Программа «Кодирование школьных оценок»
Эта программа показывает, что использование оператора SELECT CASE
делает запись программы более компактной, чем при использовании блокового или строчного оператора IF.
REM Пример 6
CLS INPUT "Введи целое положительное из диапазона 1...5"; а
b$ = "Этой цифрой кодируется оценка "
SELECT CASE a
CASE 1: PRINT b$; "очень плохо"
CASE 2: PRINT b$; "плохо"
CASE 3: PRINT b$; "удовлетворительно"
CASE 4: PRINT b$; "хорошо"
CASE 5: PRINT b$; "отлично"
CASE ELSE: PRINT "Такой оценки нет"
22
END SELECT
END
На рисунке показана блок-схема алгоритма.
Рис.14. Блок-схема алгоритма с многоальтернативным выбором
Пример 7.
Даны длины сторон треугольника, определить вид треугольника и его
площадь. Выполнить контроль вводимых чисел. Составить блок-схему и
программу.
Решение
Вид треугольника определим, сравнивая стороны, а площадь вычислим по
формуле Герона. Задание «выполнить контроль вводимых чисел» означает,
что программа в случае ввода чисел, которые не могут быть сторонами
треугольника, должна выдавать сообщение об ошибках данных.
Три числа нельзя рассматривать как стороны треугольника, если хотя бы
одно из них меньше или равно 0, или сумма двух любых чисел больше
третьего ( Должно быть: а+b≤c )
23
На рис. 15 представлена схема алгоритма данной программы.
Рис.15. Блок-схема алгоритма программы определения вида
треугольника
А вот её программа на языке Паскаль:
24
Таблица-результат к примеру 7
Составьте теперь программу на языке QBASICк примеру 7.
Пример 8. Разработать программу, которая вычисляет значение одной из
заданных функций в указанной точке.
25
Предоставим пользователю возможность выбрать функцию через простейшую имитацию меню, в котором каждой функции соответствует некоторое число (код):
В зависимости от значения введенного кода выбирается одна из функций. На
рис. 16.представлена схема алгоритма программы.
Ниже представлена программа, реализующая разработанный алгоритм.
Рис.16.Блок-схема к примеру 8: вычисление значений функции согласно меню.
26
Самостоятельно:
Составьте программу к примеру 8 на языке QBASIC.
2.3.6.Процедуры-функции и процедуры.
Процедурой называется часть программы, реализующая вспомогательный
алгоритм и допускающая многократное обращение к ней из различных мест
основной программы.
Процедуры
Оператор SUB…END SUB выделяет начало и конец процедуры.
Синтаксис: SUB имя [ (список) ] [STATIC]
[ операторы ]
[EXIT SUB]
[ операторы ]
END SUB
Параметры:
имя – глобальное имя процедуры, ограниченное длиной в 40 символов
список – список, разделённых запятыми имён переменных, передаваемых
процедуре при её вызове.
В операторе предусмотрен альтернативный выход с помощью EXIT SUB.
Процедура-функция FUNCTION…END FUNCTION
Синтаксис:
FUNCTION имя [список ][STATIC]
[операторы]
имя = выражение
[операторы]
END FUNCTION
Параметры:
- имя объявляет имя функции
- список – это список разделённых запятой аргументов – формальных
параметров, которым из основной программы передаются и
присваиваются значения аргументов – фактических параметров
- атрибут STATIC указывает, что переменные являются локальными в
функции и сохраняются между её вызовами.
27
- Запись имя = выражение возвращает значение функции, присвоенное
её имени
В отличие от процедуры-функции FUNCTION имя процедуры SUB не может
быть использовано в выражениях. Процедуры могут быть рекурсивными, т.е.
могут вызывать сами себя. Вызов процедуры SUB…END SUB выполняется
оператором CALL.
Синтаксис 1:
CALL имя процедуры [(список аргументов)]
Синтаксис 2:
имя процедуры [список аргументов]
..
2.4.Вспомогательные алгоритмы и процедуры.
….
----*----*--*---
ЦИКЛЫ
Для реализации циклических процессов используют операторы циклов.
В теории программирования выделяют несколько основных видов циклов:
• цикл-пока (рис. 17, а);
• цикл-до (рис. 17, б);
• счетный цикл (рис. 17, в).
Цикл-пока. Синтаксическая диаграмма оператора «цикл-пока» приведена на
рис. 18. Условие представляет собой логическое выражение. Оператор тела
цикла повторяется, пока условие истинно, условие проверяется на входе.
Если при входе в цикл условие не выполняется, то оператор тела цикла
игнорируется.
Если в тело цикла необходимо поместить несколько операторов, то используют составной оператор.
Цикл-до. Операторы тела цикла повторяются до выполнения условия,
условие проверяется на выходе, т.е. тело цикла всегда выполняется хотя бы
один раз. Синтаксическая диаграмма оператора «цикл-до» приведена на рис.
19. В тело цикла можно поместить несколько операторов, разделив их точкой
с запятой «;».
Рис. 17. Структура циклов:а - цикл-пока, б - цикл-до и в — счетный цикл
28
Рис. 18. Синтаксическая диаграмма <Цикл-пока>
Рис. 19. Синтаксическая диаграмма <Цикл-до>
Рис. 20. Синтаксическая диаграмма <Цикл с заданным количеством
повторений>
Счетный цикл. Цикл выполняется, пока переменная (параметр) цикла
принимает значения в заданном диапазоне с определенным шагом.
Синтаксическая диаграмма оператора приведена на рис.20.
Переменная цикла должна иметь порядковый тип. Выражение 1 определяет
начальное значение параметра цикла, выражение 2 - конечное значение
параметра цикла. Соответственно начальное и конечное значения должны
принадлежать к тому же типу, что и параметр цикла. Если используется
служебное слово to, то при каждом выполнении цикла переменной цикла
присваивается следующее значение порядкового типа переменной
Пример 9. Разработать программу вычисления суммы n первых
натуральных чисел.
Сумма определяется методом накопления. Количество суммируемых чисел
известно, поэтому используем цикл с заданным количеством повторений.
При каждом проходе к сумме будем добавлять переменную цикла, которая
будет изменяться от 1 до n. Перед циклом переменную суммы необходимо
обнулить.
29
INPUT n
S=0
FOR I=1 TO n
S=S+I
NEXT I
PRINT”Сумма “;n;”чисел равна”;S
На рис. 21представлен алгоритм программы. Анализ
алгоритма показывает, что он неструктурный, так как в
нем присутствует цикл суммирования, который не
является ни циклом-пока, ни циклом-до, ни циклом с заданным количеством повторений. Для реализации
данного алгоритма необходимо его преобразовать в
структурный, чтобы можно было использовать один из
имеющихся операторов цикла.
Пример 10. Разработать программу, определяющую сумму ряда
с заданной точностью ε (епсилон).
Из соответствующих разделов математики известно, что суммой ряда
называется предел, к которому стремится последовательность частичных
сумм .данного ряда, если он существует. Если такой предел существует, то
ряд называется сходящимся, в противном случае -расходящимся. Также
известно, что знакопеременный ряд сходится, если
где
- соответственно n-й и n+1-й члены ряда.
Кроме того, доказано, что
где S - сумма ряда, а {- сумма n членов ряда.
Следовательно, для получения требуемого результата будем накапливать
частичную сумму элементов ряда, пока очередной член ряда не станет меньше заданной погрешности:
Поскольку количество повторений цикла определить нельзя, попробуем
преобразовать неструктурный цикл к циклу-пока. Для этого необходимо
операцию S=S+R продублировать: одну копию поместить до цикла, а вторую
- в конце цикла. Операторы S=0 и S=S+R, записанные до цикла, заменим
оператором S=l, так как в этот момент R=l. Условие выхода из цикла также
необходимо заменить на противоположное. Окончательный вариант
фрагмента алгоритма с циклом-пока показан на рис. 23,
30
Его реализация представлена ниже:
Рис. 22. Алгоритм определения суммы
ряда с заданной точностью
Рис. 23. Структурные варианты алгоритма:
а - с использованием цикла-пока и б - с использованием цикла-до
Тот же алгоритм можно преобразовать так, чтобы цикл можно было
реализовать с использованием цикла-до (рис. 23,6). Ниже представлена
соответствующая программа.
31
Оператор цикла DO LOOP [{WHILE | UNTIL}].
Этот оператор называется циклом с постусловием, т. к. проверка условия
осуществляется после каждого выполнения тела цикла.
DO
<операторы>
LOOP [{WHILE | UNTIL} условие]
Цикл выполняется до тех пор, пока условие не станет истинным. Например,
проверка на то, чтобы задать длину последовательности, осуществляется
следующим образом:
DO
PRINT "ВВЕДИТЕ ДЛИНУ ПОСЛЕДОВАТЕЛЬНОСТИ N - "
INPUT N%
LOOP UNTIL N%>0
Цикл выполняется до тех пор, пока пользователь не введет положительное
число.
При использовании UNTIL цикл выполняется до тех пор, пока не выполнится
условие, а при использовании WHILE цикл выполняется только при
выполнении условия и заканчивается, если условие нарушается.
Операторы цикла DO WHILE/UNTIL LOOP и WHILE WEND.
Эти циклы называются циклами с предусловием, т. к. проверка проводится
до начала очередной итерации:
DO [{WHILE | UNTIL} condition]
<тело цикла>
LOOP
или
32
WHILE <условие>
<тело цикла>
WEND
Цикл WHILE выполняется, пока условие истинно. Как только условие
нарушается, выполнение цикла завершается. Если используется UNTIL, то
выполнение происходит до тех пор, пока условие не станет истинным.
Например, та же проверка вводимой длины последовательности может быть
задана как
INPUT N%
WHILE N%<=0
PRINT "ВВЕДИТЕ ДЛИНУ ПОСЛЕДОВАТЕЛЬНОСТИ N= "
INPUT N%
WEND
Замечание.До первого входа в цикл переменной N% уже должно быть
присвоено какое-либо значение.
Процедурные блоки SUB и FUNCTION.
В QBASIC можно объявлять и использовать подпрограммы.
При вызове подпрограммы (функции или процедуры) выполнение основной
программы приостанавливается и управление передается в подпрограмму По
окончании работы подпрограммы управление возвращается основной
программе.
Основное, не формальное, различие между процедурой и функцией состоит
что процедура только выполняет какую-либо законченную
последовательность действий , не возвращая результата работы в основную
программу, а функция и выполняет действия, и возвращает результат.
Например, вызов функции М = MIN (X, Y) вернет в основную программу
значение наименьшего из двух чисел, и это значение будет присвоено
переменной М.
Функция может быть объявлена так:
FUNCTION имя функции [(список параметров)] [STATIC]
<операторы>
имя функции = выражение
<операторы>
END FUNCTION
где ИМЯ функции - имя функции и тип данных, которые она возвращает
(%,&, !,#, or $);
список параметров - список переменных, с помощью которых вызывается с
указанием типов в этих переменных:
переменная [( )] [AS тип ] [,переменная[( )] [AS тип]]...
Тип (INTEGER, LONG, SINGLE, DOUBLE, STRING и т. д.).
33
STATIC - объявляет, что локальные переменные данной функции
сохраняются между вызовами самой функции.
Можно объявлять функции и по-другому.
Главное, чтобы вызовы функции в программе следовали после её
объявления.
DEF FN имя функции [(список параметров)]
<операторы>
FN имя функции = выражение
<операторы>
[EXIT DEF]
<операторы>
END DEF
Считается, что второй способ объявления функций более традиционен.
Процедура объявляется следующим образом:
SUB имя подпрограммы [(список параметров)][STATIC]
<операторы>
END SUB
***
ПОДПРОГРАММЫ
CLS
RANDOMIZE TIMER
S1 = 0: S2 = 0
PRINT
PRINT “K11"; “K12", “S1“; SPC(20); “K21"; “K22", “S2"
1:
PRINT
S=S1: GOSUB 2 : S1 = S
S=S2: GOSUB 2 : S2 = S
IF (S1 < 101) AND (S2 < 101) THEN GOTO 1
IF S1 > S2 THEN PRINT "Выиграл первый игрок“ : END
IF S1 < S2 THEN PRINT "Выиграл второй игрок“ ELSE PRINT "Ничья"
END
2:
K1 = INT(RND(1) * 6) + 1
K2 = INT(RND(1) * 6) + 1
S = S + K1 + K2
PRINT K1; K2, S; SPC(20);
RETURN
***
ЗАДАЧИ С РЕШЕНИЯМИ К
КОМПЬЮТЕРНОМУ ПРАКТИКУМУ
1. Ввести три целых числа.
34
INPUT А, В, С
Числа вводятся с клавиатуры через запятую, а затем нажимается клавиша
<Enter>:
687,32345,-985 <Enter>.
2. Для вывода данных на экран дисплея применяется оператор PRINT. При
использовании этого оператора можно употреблять в качестве разделителей
запятую или точку с запятой:
PRINT А, В; С;
Точка с запятой в конце списка выражений отменяет символы "возврат
каретки" и "перевод строки". Использование запятой приводит к так называемому "зонному" выводу данных, где под "зоной" понимается расстояние в
14 символов (колонок). При использовании точки с запятой в качестве
разделителя данные выводятся последовательно, друг за другом.
Например, для того чтобы вывести на экран 3 символа, нужно написать так:
PRINT "A”,”B”,”'C"
тогда на экране появится :
A B C
Если вы вводите
PRINT "A";'rB";"C"
то на экране появится :
ABC
Самостоятельные задания
1. Написать программу, которая позволяет вычислить банковский процент
на вклады из расчета 12 % годовых..
-------------
3. Задача
Даны натуральные числа M u N. Определить их наибольший общий делитель
NOD.
Для решения этой задачи можно использовать несколько алгоритмов.
Например, самый простой из них состоит в порождении с помощью цикла
натуральных чисел, которые являются делителями одновременно М и N.
Самый большой из этих делителей и является, по определению, NOD.
REM НОД
INPUT "N = "; N
INPUT " M >= N, M = "; M
WHILE M < N OR N <=0 OR M <=0
INPUT "N = "; N
INPUT " M >= N, M = "; M
WEND
NOD=1
FOR I = 2 TO N
IF (N / I = N \ I) AND (M / I = M \ I) THEN NOD = I
NEXT I
35
PRINT " MOD ("; N; ", "; M; ") ="; NOD
N = ?12
M>=N,M = ?15
MOD(12,15) =3
N = ?13
M>=N,M = ?59
MOD(13,59) =1
Результат
Для решения задачи:
• вводим натуральные числа М и N;
• в цикле от двух до наименьшего числа N порождаем число I и проверяем,
является ли оно одновременно делителем М и N;
• запоминаем этот делитель в переменной NOD;
• выводим результат.
Переменные:
M,N- исследуемые числа;
I- переменная цикла;
NOD- наибольший общий делитель.
Это задача может быть решена с помощью алгоритма Евклида.
REM
INPUT M,N
R0=M:R=N
R1= R MOD R0
IF R1=0 THEN NOD = R
PRINT R1,R, R0
WHILE R1>0
R0=R
R=R1
R1=R MOD R0
PRINT R1, R, R0
WEND
PRINT”NOD(“;M;”,”;N;”N;”)=”;R
? 17,12
5 12 17
2 5 12
1 2 5
0 1 2
NOD(17, 12)= 1
? 9,6
3 6 9
0 3 6
NOD(9, 6) =3
4.Даны натуральные числа M u N. Определить их наименьшее общее кратное
NOК.
36
REM NOK
INPUT "N = "; N
INPUT " M >= N, M =”;M
WHILE M < N
INPUT "N = "; N
INPUT " M >= N, M =”;M
WEND
NOD= 1
FOR I = 2 TO N
IF (N / I = N \ I) AND (M/I=M \ I) THEN NOD = I
NEXT I
NOK = NOD * (N \ MOD)*(M \ NOD)
PRINT ”NOK (”;”N”,”;”M;”)=”;NOK
Для решения задачи
• вводим натуральные числа М и N;
• в цикле от двух до меньшего числа N порождаем число I и проверяем,
является
ли
оно
одновременно делителем М и N;
• запоминаем этот делитель в переменной NOD;
• учитывая, что NOK= NOD* (N\NOD) * (M\NOD), выводим результат.
Переменные:
Ми N-исследуемые числа
I-переменная
NOD – наибольший общий делитель;
NOK – наименьшее общее кратное.
5.
Составить программу, которая выводила бы на
экран сведения об экзаменах и находила бы в ней
фамилии студентов, сдавших экзамен на
"ОТЛИЧНО".
Решение
Дано: F$(i,l) — фамилия i-го студента;
F$(i,2) — номер билета, доставшегося ему ;
F$(i,3) — полученная им оценка
на экзамене ( i= 1, 2, 3, 4).
Требуется: вывести F$(i,J), где i = 1, 2, 3, 4; j = 1,
2, 3; F$(k,l) — фамилия k-го ученика при F$(k,3) =
"ОТЛИЧНО".
Сначала
разработаем
алгоритм
будущей
программы, блок-схема которого наглядно
демонстрирует вложенность циклов по i и по j,
характерную для обработки двумерных массивов
В таких циклах счетчики шагов — независимо
37
изменяющиеся переменные. Причем переменная, допустим i, управляющая
работой внешнего цикла, меняется медленнее, чем переменная J,
управляющая работой внутреннего цикла. Алгоритм начинается с команды
печати названия столбцов будущей таблицы. Эта команда не содержит имен
переменных, значения которых связаны со значениями I или J, и поэтому
выполняется однажды, до начала работы циклов с I и J в качестве счетчиков
шагов цикла. Далее при каждом закрепляемом значении номера I строки
таблицы ( i= 1, 2, 3, 4), изменяя значения номеров столбцов J в границах, указанных постановкой задачи, мы построчно вводим элементы таблицы и тут
же выводим их на экран дисплея.
Отметим, что ввод исходных значений и их вывод могут осуществляться
раздельно, в двух
последовательных, никак не связанных, но также
вложенных циклах. Для этого тела внутренних циклов должны быть
различными: в первом из них тело внутреннего цикла будет содержать
команду ввода, во втором — команду вывода.
Теперь запишем программу:
'Очистка экрана
CLS
Резервируем в ОЗУ место под объявляемый двумерный массив
DIM F$(l TO 4, 1 TО 3)
'Выводим на экран названия полей ( заголовки трёх столбцов) таблицы
LOCATE 10, 20
COLOR 14
PRINT "ФАМИЛИЯ", "НОМЕР БИЛЕТА", "ОЦЕНКА"
‘Из блока данных считываем символьные данные таблицы по строкам
FOR I = 1 TО 4
FOR J = 1 TО 3
READ F$(I, J)
NEXT J
NEXT I
FOR I = 1 TO 4
LOCATE 10 + I * 2, 20
FOR J = 1 TO 3
COLOR 2
'Отличные оценки выводим красным цветом
IF F$(I, 3) = "ОТЛИЧНО" AND J = 1 THEN COLOR 4
PRINT F$(I, J),
NEXT J
NEXT I
'Хранение исходных данных в блоках данных.
'Данные храним как символьные константы
' Выравнивание текста в таблице осуществляем с помощью пробелов
DATA ИВАНОВ," 1", ХОРОШО, ПЕТРОВ, " 14", ОТЛИЧНО
DATA СИДОРОВ," 22", ОТЛИЧНО , СИДОРОВА," 5",ХОРОШО
END
38
RUN
ФАМИЛИЯ
ИВАНОВ
ПЕТРОВ
СИДОРОВ
СИДОРОВА
НОМЕР БИЛЕТА
1
14
22
5
ОЦЕНКА
ХОРОШО
ОТЛИЧНО
ОТЛИЧНО
ХОРОШО
6. Ввод массивов.
Элементами ввода операторов INPUT (READ) могут быть только
переменные — неиндексированные (простые) или индексированные
(элементы массивов). Поэтому для ввода массивов нужно составить
программу, обеспечивающую изменение индексов и последовательное
заполнение элементов массивов данными.
Ввод одномерного массива
PRINT *ВВЕДИТЕ" ;N; “ ЭЛЕМЕНТОВ МАССИВА А"
FOR I=l TO N
INPUT A(I)
NEXT I
7. Ввод двумерного массива
При вводе двумерного массива необходимо организовать двойной цикл:
внешний — по номеру строки, внутренний — по номеру столбца.
Ввод матрицы по строкам
PRINT "ВВЕДИТЕ МАССИВ В ПО СТРОКАМ”
FOR 1=1 ТО N
PRINT "ВВЕДИТЕ “;I;” –Ю СТРОКУ”
FOR J=l TO М
INPUT B(I,J)
NEXT J
В случае необходимости можно организовать заполнение массива
по столбцам. Для этого внешний цикл должен быть организован по номеру
столбца (J), а внутренний — по номеру строки (I) с соответствующими
границами изменения индексов.
PRINT "ВВЕДИТЕ МАССИВ В ПО СТОЛБЦАМ”
FOR J=l ТО M.
PRINT “ВВЕДИТЕ";J;”-ЫЙ СТОЛБЕЦ”
FOR I=1 ТО N
INPUT B(I,J)
NEXT I
NEXT J
В соответствии с приведенной программой элементы массива должны
набираться на клавиатуре в следующем порядке: В (1,1),В(2,1).....B(N,1),
В(1,2), (2,2).....B(N,2).....В(1,М),
В(2,М)..... B(N,M).
39
Если число вводимых элементов невелико, можно не использовать циклы, а
все элементы указать явно в списке ввода.
Например, для ввода массива В размером 2X2 можно использовать
операторы
PRINT "ВВЕДИТЕ МАССИВ В П0 СТРОКАМ”
INPUT B(1,l),B(1,2),B(2,1),B(2,2)
8. Пример. Ввод нескольких массивов одного размера можно осуществлять в
одном цикле.
PRINT "ВВЕДИТЕ МАССИВЫ АИС”
PRINT "НАБИРАТЬ ЭЛЕНЕНТЫ МАССИВОВ ПООЧЕРЕДНО"
FOR I=1 ТО N
INPUT А(I)_,С(I)
NEXT I
Нажатие клавиши ВК можно осуществлять после набора на клавиатуре двух
чисел (значений А(1), С(1)).
Однако такой способ ввода часто является причиной ошибок. Более
естественно вводить сначала все элементы одного массива, затем другого.
Для этого ввод каждого массива нужно осуществлять в отдельном цикле.
Если вводимые массивы имеют разные размеры, то второй способ является
практически единственно возможным.
9. Вывод (печать) массивов.
При выводе массивов необходимо обеспечить наглядность и удобство
восприятия полученных результатов.
Вывод одномерного массива, как правило, целесообразно осуществлять в
строку, сопровождая поясняющим текстом.
PRINT "МАССИВ А"
FOR 1=1 ТО N
PRINT А(I);
NEXT I
PRINT
В приведенной программе вывод массива А в строку обеспечивается
использованием точки с запятой в операторе PRINT. PRINT без списка
(последняя строка ) осуществляет возврат каретки после окончания вывода
массива А.
При выводе двух или нескольких одномерных массивов одного размера
часто удобно вывести их как расположенные параллельно столбцы
10.
PRINT "МАССИВ А","МАССИВ В”
FOR I=1 ТО N
PRINT А(I)_,B(I)
NEXT I
Вывод двух или более массивов различных размеров, как правило,
осуществляется в строку. Вывод нового массива начинается с новой строки.
Двумерные массивы необходимо выводить в привычном виде (по строкам),
начиная вывод новой строки массива в новую строку экрана.
11.
40
PRINT "МАССИВ В “
FOR I=1 ТО N
FOR J=1 TO M
PRINT B(I,J),
NEXT J
PRINT
NEXT I
Для улучшения наглядности в этом случае можно предложить два способа.
1) В операторе (4 –я строка ) вместо точки с запятой использовать запятую
Тогда вывод каждого элемента строки будет осуществляться в новую зону,
так что элементы одинаковых столбцов будут располагаться в одинаковых
зонах, т. е. строго друг под другом.
2) Вывод всех элементов матрицы по единому формату с использованием
оператора PRINT USING (##.##),B(I,J);
12. Суммирование элементов массива.
Для одномерного массива А={ x 1, x2, x3, … x n } размерности п необходимо
вычислить S=
n
x
i 1
i
S=0
FOR 1=1 ТО N
S=S+A(I)
NEXT I
13.Для двумерного массива В размером NXM необходимо вычислить
n
S=
m

i 1 j 1
xij
REМ ВЫЧИСЛЕНИЕ СУММЫ ЭЛ-ТОВ МАТРИЦЫ
S=0
FOR 1=1 ТО N
FOR J=l TO M
S-S+B(I,J)
NEXT J
NEXT I
14.
REM СУННИРОВАНИЕ МАТРИЦЫ ПО СТРОКАМ
FOR 1=1 ТО N
S=0
FOR J=l TO M
S=S+B(I,J)
NEXT J
D(I)=S
NEXT I
На поиск в массиве элемента с заданными значениями индексов
затрачивается время. (Адрес 1-го элемента определяется прибавлением к
адресу начала массива значения I.) Поэтому для повышения эффективности в
приведенной выше программе при вычислении суммы каждой строки
41
используется простая переменная S, что исключает многократное обращение
к элементам массива D.
15.
Транспонирование матрицы. Необходимо заменить строки матрицы её
столбцами, а столбцы — строками.
RЕМ ТРАНСПОНИРОВАНИЕ КВАДРАТНОЙ МАТРИЦЫ
FOR I=1 ТО N-1
FOR J=I+1 TO N
Р=А(I,J) : A(I,J)=A(J,I) : A(J,I)=P
NEXT J
NEXT I
16. СУММИРОВАНИЕ ЭЛЕМЕНТОВ МАССИВА, УДОВЛЕТВОРЯЮЩИХ
ЗАДАННОМУ УСЛОВИЮ.
REM СУММИРОВАНИЕ ЭЛЕМЕНТОВ МАССИВА, УДОВЛЕТВОРЯЮЩИХ
ЗАДАННОМУ УСЛОВИЮ.
S=o
FOR 1=1 ТО N
IF P(I)<=T TO 100
90 S=S+P(I)
100 NEXT I
110RETURN
Список используемых переменных.
Исходные данные: N — размер массива, Р — массив размером N,
Т — заданное значение, с которым сравниваются элементы массива Р.
Результат: S — сумма элементов массива Р, удовлетворяющих заданному
условию.
Вспомогательные переменные: I — индекс — управляющая переменная
цикла.
17.
Упорядочение массива. Требуется расположить элементы массива в порядке
возрастания (убывания).
Для решения этой задачи существует много различных методов .Здесь
рассматривается один из методов, основанный на поиске минимального
(максимального) элемента массива или его части.
Вначале найдем минимальный элемент массива и поменяем его местами с
первым элементом, затем найдем минимальный элемент из оставшихся
элементов (кроме первого) и поменяем его местами со вторым элементом.
После нахождения минимального из последних двух элементов массива и
размещения его на. предпоследнем месте на последнем автоматически
останется самый большой элемент .
Список используемых переменных.
Исходные данные: N — размер массива, А — массив размером N.
Результат: А — массив размером N, упорядоченный по возрастанию.
42
Вспомогательные переменные: Р — переменная для хранения
промежуточного значения минимального элемента, К — индекс
минимального элемента, I — индекс элемента упорядоченного массива —
управляющая переменная внешнего цикла, J — индекс элемента части
массива, в которой ищется минимальный элемент — управляющая
переменная внутреннего цикла.
При перестановке элементов (минимального и 1-го (строка 1070)) вспомогательная переменная не требуется, так как значение минимального элемента
находится в переменной Р.
Проверка массива на упорядоченность. Для заданного массива А размером
п требуется определить, является ли массив упорядоченным. Результат
присвоить символьной переменной.
Для определенности предположим, что проверяется упорядоченность
массива по возрастанию. Если массив упорядочен, то для каждой пары
соседних элементов должно выполняться условие ai<ai-1 i=1, . . ., п— 1.
Если ни для какого i условие не было нарушено, то массив упорядочен. Если
для какого-либо i условие нарушается, массив не является упорядоченным
Список используемых переменных. Исходные данные: N — размер массива, А
— массив размером N,
For i=1 to N-1
P=A(I):K=1
FOR J=1+1 TO N
IF A(J)>=P THEN
1060
1050 P=A(J):K=J
1060 NEXT J
A(K)= A(I): A(I)=P
NEXT I
RETURN
18.
Сортировка методом «без возврата в начало» ,то есть «простым обменом»
или «метод пузырька».
43
Повысить быстродействие алгоритма можно, просматривая каждый раз
массив до конца.
При просмотре сравнивать пары рядом стоящих элементов массива и при
необходимости менять их местами. В худшем случае, при сортировке по
возрастанию наименьший по величине элемент может стоять в конце
массива. Чтобы переместить его на место первого элемента, требуется n-1
просмотр (n — размер массива). В других случаях сортировку можно
заканчивать, если при очередном просмотре массива не было смены мест
элементов. Алгоритм использует вложенные циклы. Параметр внешнего
цикла — счетчик просмотров (шагов). Параметр внутреннего цикла —
номера сравниваемых при просмотре элементов массива.
Возьмем массив: [6, 3, 8, 1, 4]. Каждый шаг работы алгоритма — это
просмотр массива с начала до конца, сравнение пар рядом стоящих
элементов и смена мест элементов, не удовлетворяющих условию
сортировки (если первый элемент пары по величине больше второго
элемента).
Исходный массив: 6, 3, 8, 1, 4:
Исходный массив:
6 3
8
1
4
после первого шага:
после второго шага:
после третьего шага:
после четвертого шага:
6
1
3
1 3
1
4
4
4
4
6
6
6
8
8
8
8
после пятого шага:
1 3
4
6
8
В первом шаге происходит последовательно смена мест элементов, равных 6
и 3, затем 8 и 1, затем 8 и 4. Во втором шаге меняются местами числа 6 и 1, 6
и 4. После третьего шага получаем упорядоченный массив. Можно
заканчивать сортировку. Но алгоритм продолжает работать, если не вставить
в него проверку окончания работы по отсутствию смены мест элементов. В
следующей программе 1 такой проверки нет. В программе используется
оператор SWAP.
SWAP — оператор
Обменивает величины двух переменных.
Синтаксис:
SWAP переменная 1, переменная 2
Программа 18
REM ‘сортировка методом пузырька
CLS:RANDOMIZE TIMER
INPUT “РАЗМЕРНОСТЬ МАССИВА РАВНА”,N
DIM A(N)
PRINT ‘‘Исходный массив‘‘
FOR I=1 TO N
A(I)=INT(RND*100): PRINT A(I);
NEXT:PRINT
44
FOR I=1 TO N
‘ внешний цикл-счётчик шагов’
FOR J=1 TO N-1
‘ внутренний цикл-счётчик номеров’
IF A(J)>A(J+1) THEN SWEP A(I),A(J+1)
NEXT J
NEXT I
PRINT”Упорядоченный массив: “
FOR I=1 TO N:PRINT A(I);:NEXT I
END
Двумерный массив преобразовать в одномерный, выполнить сортировку по
возрастанию и упорядоченный одномерный массив преобразовать в
двумерный. Все четыре массива вывести на экран.
Решение
В программе объявляются два массива — двумерный и одномерный. Затем
двумерный массив заполняется случайными числами и распечатывается.
После этого двумерный массив преобразуется в одномерный, который в
процессе преобразования распечатывается. Далее одномерный массив сортируется по возрастанию и распечатывается. Завершает программу
преобразование упорядоченного одномерного массива в двумерный и
распечатка двумерного массива.
Программа 19
DIM a(n, m), b(n* m)
FOR i = 1 TO n: FOR j = 1 TO m
a(i, j) = INT(RND * 10): PRINT a(i, j);
NEXT j: PRINT : NEXT i: PRINT
FOR i = 1 TO n: FOR j = 1 TO m
b(i- 1)*m + j) = a(i, j): PRINT b((i- !)*r
NEXT j, i: PRINT FOR i = 1 TO n* m - 1: FOR j = i + 1 TO n * m
IF b(i ) > b( j) THEN SWAP b( i) , b(j)
NEXT j: NEXT i: PRINT
FOR i = 1 TO n * m
PRINT b(i );
NEXT: PRINT : PRINT
FOR i = 1 TO n: FOR j = 1 TO m
a(i, j) = b(i-1)*m + j): PRINT a(i, j);
NEXT j: PRINT : NEXT i :END
Пусть задан исходный двухмерный массив а( 2, 3).
45
Запишем результаты требуемых в задаче его преобразований:
1) 2,0,7 2)2,0,7,1,6,4 3)0,1,2,4,6,7 4)0, 1, 2
1, 6, 4
4, 6, 7
Выпишем фрагмент программы:
FOR i = 1 ТО n: FOR j = 1 ТО m
b((i - 1) * m + j) = a(i, j): PRINT b((i - 1) * m + j);
NEXT j, i: PRINT
Первый оператор тела цикла — оператор присваивания. Он последовательно
присваивает элементам одномерного массива b(n*m) значения
соответствующих элементов исходного двухмерного массива.
Развернем работу выделенного фрагмента по циклам преобразования
выбранного массива a(n, m) = а(2, 3).
b((j-1)*m+j)=a(i,j)
i=1 j=1 b(1)=a(1,1) b(1)=2
i=1 j=2 b(2)=a(1,2) b(2)=0
…………………………..
REM ‘Сортировка двумерного массива’
CLS
RANDOMIZE TIMER
INPUT”n,m”;n,m
DIM z(m, n)
FOR i = I TO m: FOR i = 1 TO n
z(i, j) = INT(RND * 10): PRINT z(i, j);
NEXT j: PRINT
NEXT i
max => -10^9
FOR i= 1 TO m
min =-10^9: s = 0
FOR j = 1 TO n
s = s + z(i, j)
IF z(i, j) < min THEN min = z(i, j): p = j
NEXT j
IF s > max THEN max = s: r = i: t = min: w = p
NEXT i
PRINT "Smax = "; max; "Nmax = "; r; "Zmin = "; t; "Nmin =”;w
END
20. Задача коммивояжера
Дано множество из N (N < 11) городов, между которыми проложены
дороги, длина которых известна. В каком порядке должен посетить их все
коммивояжер, чтобы путь его был минимальным? Маршрут начинается в
46
городе L. На каждом шаге коммивояжер выбирает тот город, расстояние
до которого минимально.
Алгоритм, описанный в данной задаче, называется "жадным", т. к. на
каждом шаге приходится выбирать экстремальное значение.
Решение
Для решения этой задачи нам надо задать матрицу расстояний
METR(N, N), где каждый элемент, находящийся на I-й строке и в J-м столбце, соответствует расстоянию между городами I и J. Очевидно, что матрица
расстояний симметрична относительно главной диагонали и сами элементы
главной диагонали равны нулю.
Для того чтобы отделять города , в которых уже был коммивояжер от
городов, которые он еще не посетил, нам понадобится вспомогательный
массив В. В этот массив последовательно будем заносить города, которые
коммивояжер уже посетил. Находясь в городе X и пытаясь определить
следующий город У, до которого расстояние минимально, города из
массива В рассматривать не нужно.
Выбрав город У, мы заносим его в массив В.
REM ‘Задача коммивояжера’
INPUT "ВВЕДИТЕ РАЗМЕР МАТРИЦЫ N = “;N%
DIM METR (N%, N%), B(N%)
REM формируем матрицу расстояний
K= 1
FOR I = 1 ТО N%
FOR J = I TO N%
IF I <> J THEN METR (I, J) = К + RND (K) ELSE METR (I, J) = 0
METR (J, I) = METR (I, J)
K = K+ 1
NEXT J
NEXT i
REM ‘выводим на экран матрицу расстояний’
FOR i = 1 ТО N
FOR J = 1 TO N
PRINT METR ( i , J),
NEXT J
PRINT
NEXT i
REM ‘вводим город - начало маршрута’
INPUT "ВВЕДИТЕ НОМЕР ГОРОДА, ИЗ КОТОРОГО НАЧИНАЕТСЯ
МАРШРУТ ";X
47
К = 1: В(1) = X: COST = О
FOR I = 1 ТО N - 1
MIN = 100
FOR J = 1 ТО N
REM ‘определяем, посетил ли коммивояжер город J’
F=0
FOR T = 1 ТО N%
IF J = B(T) THEN F = 1
NEXT T
IF F = 0 AND METR(X, J) <> 0 AND METR(X, J) < MIN THEN
Y = J: MIN = METR(X, J)
ENDIF
NEXT J
REM ‘определяем город для посещения ‘
COST = COST + MIN
В( i + 1) = Y
X=Y
NEXT i
REM ‘выводим цену маршрута и сам маршрут’
PRINT "COST = "; COST
FOR i = 1 TO N%-1
PRINT B( i) ;
NEXT i
Для решения задачи:
• вводим размер матрицы;
• формируем матрицу расстояний METR и выводим ее на экран;
• вводим город X, из которого начинаем движение;
• организуем 3 вложенных цикла, с помощью которых находим
минимальный маршрут;
• выводим результат на экран.
Переменные:
В - массив городов, которые посетил коммивояжер;
N % - количество городов;
X - первый город, из которого коммивояжер начинает маршрут;
F, К, X, Y, MIN - вспомогательные переменные;
J, I, T - переменные циклов;
COST - стоимость наименьшего маршрута, т. е. его длина;
METR - матрица расстояний.
48
Рис. Результат работы программы
21. ВЕДОМОСТЬ СДАЧИ ЭКЗАМЕНОВ
REM’ ВЕДОМОСТЬ‘
REM’ Ввод числа студентов и экзаменов’
20 FOR I=1 то 5
PRINT
Next I
INPUT ” Введите число студентов-“; M
INPUT ” Введите число экзаменов - “; N
DIM A (M, N), B(M)
REM’ Ввод оценок за экзамены’
FOR I=1 то M
FOR J=1 то N
80 PRINT “ Студент- “; I ; “ экзамен-“; J
INPUT “ Получил оценку “; A (I,J)
IF A (I, J)>=2 AND A (I,J)<=5 Then 100
PRINT “ некорректный ввод оценки ! Повторите!;”
PRINT “ (допустимый диапазон – от 2 до 5)”
GOTO 80
100 NEXT J
NEXT I
REM’ Вывод таблицы оценок на экране’
FOR I=1 то 20
PRINT
NEXT I
PRINT “ оценки по экзаменам “
FOR I=1 TO M
PRINT “ студент – “; I ; “
“;
FOR J=1 TO N
PRINT A(I,J); “
“;
NEXT J
PRINT
NEXT I
REM анализ успеваемости
FOR I=1 TO M
B(I) = 0
49
NEXT I
FOR I=1 TO M
FOR Y =1 TO N
IF A(I,Y) < > 2 THEN G0T0 260
B (I) =2
J=N
260 G0T0 270
270 B (I) = B (I) + A(I,J)
NEXT J
NEXT I
OTL = 0
HOR = 0
NEU=0
FOR I=1 TO M
IF B(I) < > 2 THEN GOTO 360
NEU = NEU+1
GOTO 390
360 FL = B (I) / N
IF FL = 5 THEN OTL = OTL + 1
IF FL <5 AND FL >= 4 THEN HOR = HOR + 1
390 NEXT I
REN « Вывод результатов анализа на экране»
FOR I=1 TO 4
PRINT
NEXT I
PRINT «В ГРУППЕ СТУДЕНТОВ- »; M ; » ИЗ НИХ:»
PRINT
PRINT «ОТЛИЧНИКОВ - »; OTL
IF OTL > 0 THEN PRINT OTL ELSE PRINT «НЕТ»
PRINT «ХОРОШИСТОВ - » ; HOR
IF HOR >0 THEN PRINT HOR ELSE PRINT «НЕТ»
PRINT «НЕУСПЕВАЮЩИХ - »; NEU
IF NEU >0 THEN PRINT NEU ELSE PRINT «НЕТ»
END
RUN
ОЦЕНКИ ПО ЭКЗАМЕНАМ
СТУДЕНТ- 1
4 4 4 5
2 3 4 4 4
50
3 2 5 5 4
…………………….
В ГРУППЕ СТУДЕНТОВ-3, ИЗ НИХ:
ОТЛИЧНИКОВ-0
ХОРОШИСТОВ-3
НЕУСПЕВАЮЩИХ-1
22.
Дан числовой массив, состоящий из известного количества элементов.
Найти сумму положительных элементов массива.
Пусть имеем массив А(5,4) из чисел, которые будем вводить с
клавиатуры.
В ячейку S будем собирать сумму элементов , для этого организуем
цикл.
DIM A(5,4)
S=0
REM’ВВОД ЭЛЕМЕНТОВ МАССИВА
FOR I=1 TO 5
FOR J=1 TO 4
INPUT A(I,J)
NEXT J
NEXT I
REM’ПЕЧАТЬ ЭЛЕМЕНТОВ МАССИВА
FOR I=1 TO 5
FOR J=1 TO 4
PRINT”ИСХОДНЫЕ ДАННЫЕ”; A(I,J);
NEXT J
PRINT
NEXT I
REM’СУММИРОВАНИЕ ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА
FOR I=1 TO 5
FOR J=1 TO 4
IF A(I,J)>0 THEN S=S+ A(I,J)
NEXT J
PRINT “СУММА “;I; “ ПОЛОЖИТЕЛЬНЫХ ЧИСЕЛ МАССИВА РАВНА “; “S= “ ;S
NEXT I
RUN
ИСХОДНЫЕ ДАННЫЕ
4871
5942
6367
2475
6318
СУММА 20 ПОЛОЖИТЕЛЬНЫХ ЧИСЕЛ МАССИВА РАВНА S=98
23.
51
Соревнования по плаванию проводятся отдельно в Европе и в Америке.
Результаты 100 лучших спортсменов каждого континента представлены в
виде таблиц, содержащая в порядке занятых мест фамилии спортсменов,
страны, которые они представляют, и результаты.
Составить список 100 лучших спортсменов мира в порядке,
определяемом результатами.
Решение. Результаты по каждому континенту могут быть
представлены в виде двух символьных массивов (фамилий стран) и одного
числового (результатов) размером 100. Массивы результатов упорядочены по
возрастанию.
Задача сводится к объединению двух упорядоченных массивов
результатов в один упорядоченный массив. Массивы фамилий и стран также
объединяются в соответствии с результатами.
При решении задачи может быть использован алгоритм o6ъединения
двух упорядоченных массивов в один, также упорядоченный с некоторой
модификацией, СВЯЗАННОЙ с необходимостью объединения не одного, а трех
массивов , и получением при объединении только первых M=I00 элементов,
так что ситуация, когда один из исходных массивов полностью исчерпан, не
возникает и, следовательно, завершение цикла определяется окончанием
формирования результирующих массивов.
Список используемых переменных.
Исходные данные:A$, E$— массивы фамилий, размером N;
A1$, Е1$— массивы представляемых стран, размерам N; А2, Е2 —
упорядоченные массивы результатов, размером N;
N — размер исходных таблиц, М — размер результирующей таблицы
(М N).
Результат:W$, W1$, W2$,- массивы фамилий, стран в результатов
лучших спортсменов, размером М.
Вспомогательные переменные:
К — индекс — управляющая переменная цикла, I, J – индексы.
Программа № 1
DIM A$(100), E$(100), А1$(100), Е1$(100)
DIM A2(100), E2(100), W$(100), W1$(100), W2(100)
PRINT "ВВЕДИТЕ РАЗМЕРЫ ТАБЛИЦ ( ИСХОДНОЙ И
РЕЗУЛЬТАТОВ)"
INPUT N,M
PRINT "ВВОД РЕЗУЛЬТАТОВ ПЕРВЕНСТВА EBPOПЫ –
ФАМИЛИЯ,”;
PRINT "СТРАНА, РЕЗУЛЬТАТ”
FOR I=1 ТО N
INPUT Е$(I), Е1$(I), Е2(I)
NEXT I
PRINT "ВВОД РЕЗУЛЬТАТОВ ПЕРВЕНСТВА АМЕРИКИ –
ФАМИЛИЯ,";
PRINT ”СТРАНА, РЕЗУЛЬТАТ”
FOR I=1 ТО N
52
INPUT А$(I), A1$(I), A2(I)
NEXT I
GOSUB 220
PRINT ТАВ(10); M; “ТАБЛИЦА СПОРТСМЕНОВ МИРА”
PRINT
FOR I=1 ТО М
PRINT TAB (5);W$(I);TAB(30);W1$(I);TAB(50);W2(I)
NEXT I
210 STOP
220 REM ПОДПРОГРАММА ОБЪЕДИНЕНИЯ ТАБЛИЦ
230 I=1 : J=1 : K=0
240 IF K>M G0TO 290
250 K=K+1
260 IF A2(I)<E2(J) G0TO 280
270 W2(K)=E2(J) : W$(K)=E$(J) : W1$(K)=E1$(J) : J=J+1 : G0TO 240
280 W2(K)=A2(I) : W$(K)=A$(I) : W1$(K)=A1$(I) : I=I+1 : G0TO 240
290 RETURN
Результат:
A$— массив фамилий, упорядоченный по результатам,
R — упорядоченный массив результатов.
Вспомогательные переменные:
Р — переменная для хранения промежуточного значения
максимального элемента, К — индекс максимального элемента,
I — индекс элемента упорядоченного массива — управляющая
переменная внешнего цикла подпрограммы упорядочения,
J — управляющая переменная внутреннего цикла в подпрограмме
упорядочения,
Q$ — переменная, используемая при перестановке фамилий (элементов
массива A$).
В программе используется алгоритм упорядочения массива .
После упорядочения место спортсмена определяется индексом
соответствующего элемента массива (возможность одинаковых результатов
игнорируется).
24. Группа из шести студентов сдала пять экзаменов но пяти
различным предметам. Составьте программу, которая бы выводила на экран
эти сведения. Кроме этого, программа должна вычислять:
 сколько отличников , хорошистов , троечников; их фамилии;
 количество неуспевающих студентов и их фамилии.
DECLARE SUB Chtenie ( )
DECLARE SUB Obrabotka (RezTest AS INTEGER, ocenka AS INTEGER)
CONST n = 20 'Максимальное число студентов в группе
53
CONST Baza ="Baza2.bas"
CONST Rez = "Rezyltat.Bas"
TYPE ItogiSesZap
Famil AS STRING * 14
NaborOcenok AS STRING * 9
END TYPE 'ItogiSesZap
DIM SHARED ChisloStyd AS INTEGER 'Фактическое число студентов
DIM SHARED Stydentu(1 TO n) AS ItogiSesZap
DIM SHARED RezTest AS INTEGER
DIM SHARED ocenka AS INTEGER 'Исследуемая 'оценка
'Основная программа
Chtenie
'Прочла данные из файла #1 в массив Stydentu( ) и определила ChisloStyd
OPEN Rez FOR OUTPUT AS #2 'Открыли файл #2 для записи
PRINT #2, "Успеваемость группы студентов: "
FOR ocenka = 5 ТО 2 STEP -1
SELECT CASE ocenka
CASE 5
PRINT #2, Spase$'Пропуск строки
PRINT #2, "Отличники: "
CASE 4
PRINT #2. Spase$'Пропуск строки
PRINT #2, "Хорошисты: "
CASE 3
PRINT #2, Spase$'Пропуск строки
PRINT #2, "Троечники: "
CASE 2
PRINT #2, Spase$'Пропуск строки
PRINT #2, "Неуспевающие: "
END SELECT
Obrabotka RezTest. ocenka
54
IF RezTest = 1 THEN
PRINT #2, "отсутствуют"
END IF
NEXT ocenka
CLOSE #2
END 'Zad_4_3
SUB Chtenie
'Построчно считывает из файла Bazal.Bas в массив записей Stydentu( ) данные
'об успеваемости студентов, подсчитывает их число
ChisloStyd
DIM i AS INTEGER
DIM Stroka AS STRING
OPEN Baza FOR INPUT AS #1
i = 0 'ChisloStyd = 0
WHILE (NOT EOF(D) OR i = n
'Читает из файла #1 в строку Stroka
LINE INPUT #1, Stroka
i = i + 1 'Счетчик числа строк
Stydentu(i).Famil = MID$(Stroka , 1, 14)
Stydentu(i).NaborOcenok = MID$(Stroka , 15, 9)
WEND #1
CLOSE #1
ChisloStyd = i - 1
END SUB 'Chtenie
SUB Obrabotka (RezTest AS INTEGER, ocenka AS INTEGER)
'Распечатывает фамилии студентов с минимальной оценкой Ocenka
'Если таких студентов нет, то RezTest = 1
DIM i AS INTEGER ' Текущий номер строки
DIM s AS INTEGER ' Счетчик числа студентов с MinOcenka> Ocenka
DIM j AS INTEGER ' Номер предмета
DIM k AS INTEGER ' Для выбора оценки в NaborOcenok
55
DIM MinOcenka AS INTEGER ' Минимальная оценка
DIM MasOcenok(1 TO 5) AS INTEGER 'Массив оценок для каждого
студента
RezTest = 0 'Исходное состояние флага тестирования
s = 0 'Для накопления числа студентов, не удовлетворяющих критерию
к = 0 'Для выбора оценки из Stydentu(i).NaborOcenok
FOR i = 1 TO ChisloStyd
FOR j = 1 TO 5
k=2*j-1
MasOcenok(j) = VAL(MID$(St.ydentu(i) .NaborOcenok, k, 1))
NEXT j
MinOcenka = MasOcenok(1)
FOR j = 2 TO 5
IF MasOcenok(j) < MinOcenka THEN MinOcenka = MasOcenok(j)
NEXT j
IF MinOcenka = ocenka THEN
PRINT #2, Stydentu(i).Famil ELSE
s=s+1
END IF
IF s = ChisloStyd THEN RezTest = 1
NEXT i
END SUB 'Obrabotka
Пример набора файла Baza2.Bas
Гришин
55555
Гурованов
43455
Комаров
44545
Кошкин
44444
Матроскин
33343
Федосеева
35242
56
Отличники:
Гришин
Хорошисты:
Комаров, Кошкин
Троечники:
Гурованов , Матроскин
Неуспевающие: Федосеева
24. Вычислить, за сколько лет в Сбербанке при начальном вкладе S и
процентах годового прироста р будет накоплена сумма S1 .
Все величины в постановке задачи имеют имена-идентификаторы, кроме
числа лет, за которые будет накоплена требуемая сумма. Обозначим ее
буквой к.
Для упрощения записей введем переменную d — величину прироста за год.
Эта задача на сложные проценты.
Результат вычисляем по формулам: d = S*p/100 (прирост за год),
S = S+d (накопленная сумма),
к = к+1 (счетчик лет).
Программа 24
RЕМ Задача с неизвестным заранее числом циклов
RЕМ "Храните деньги в Сбербанке"
CLS
'очистка экрана
INPUT "Вклад, процент, сумма"; S, p, S1
DO WHILE S<S1
d = S*p/100
' прирост за год
S = S+d
'вклад в конце года
к = к+1
'число лет
STOP
PRINT "Сумма ";S1;" будет накоплена за ";к; " лет"
END
Для проверки правильности работы программы «Храните деньги в
Сбербанке» можно предложить , например, такой контрольный тест:
S = 200, р = 10, S1 = 250.
Тест легко рассчитать вручную:
S = S+d
k = k+1
200+20 = 220
k = 0+1 = 1
220+22 = 242
k = 1+1 = 2
242+24.2 = 266.2
k = 2+1 = 3
d = S*p/100 200*10/100 = 20 220*10/100 = 22 242*10/100 = 24.2
Расчеты показывают, что при начальном вкладе 200 и проценте годовых -10, желаемую сумму накоплений (250 рублей) нужно ждать 3 года.
Решая подобные задачи, интересно проследить динамику роста искомой
величины по циклам. В нашем случае — роста вклада по годам. Для этого в
тело цикла включают операторы PRINT, которые выводят на экран
интересующие программиста переменные. Вывод можно оформить в виде
таблицы с заголовками колонок.
57
Для уменьшения числа ошибок и удобства ввода с клавиатуры большого
количества разнотипных данных используют несколько операторов INPUT.
Особенно полезно это делать при приглашениях ввода, содержащих
подробные требования к вводимым данным. С учетом последних замечаний
программу, использующую Синтаксис 2 оператора DO...LOOP, можно
записать так:
RЕМ Накопления в Сбербанке
CLS
INPUT "Начальный вклад = ", S
INPUT "Процент за год = ", р
INPUT "Желаемая сумма = ", S1
PRINT "Прирост", "Сумма ", "Год"
DO
d = S*p/100 : PRINT d, S = S+d : PRINT S,k = k+1 : PRINT k
LOOP UNTIL S> = S1
PRINT "За "; k; " года накоплено"; S1
END
На экране монитора:
Начальный вклад = 200 Процент за год = 10 Желаемая сумма = 250 Прирост
d; " руб." Сумма
20
220
1
22
242
2
24.2
266.2
3
За 3 года накоплено 266.2 руб.
При решении задач желательно по возможности освобождаться от
ввода констант с клавиатуры. Особенно их ввод нежелателен при
многочисленных запусках, сопровождающих отладку сложной
программы. В рассмотренной задаче константой может быть,
например, процент за год р. Его можно ввести в программу оператором LET или, например так: р = 10.
25.
REM Вложенные циклы. Таблица умножения.
CLS
PRINT "Таблица умножения"
FOR i = 1 ТО 9
'внешний цикл, номера строк таблицы
FOR j = 1 ТО 9
'внутренний цикл, номера столбцов таблицы PRINT
USING "###"; i * j;
'печать произведения
NEXT j
PRINT
'переход к печати на следующей строке
NEXT: END
В программе используется оператор PRINT USING. Рассмотрим его.
PRINT USING - оператор
Выводит строковые и числовые данные в соответствии с заданным
форматом.
58
Синтаксис (сокращённый): PRINT USING формат; список [{,|;}]
Параметр формат содержит специальные символы, определяющие формат
вывода данных, в частности, символы #.
Параметр список — это строковые или числовые выражения, разделенные
запятыми или точками с запятой.
Рассмотрим примеры.
В программе:
На экране монитора:
PRINT USING "# #.# #"; .78
0.78
PRINT USING "##.##"; 86.4
86.40
PRINT USING "# # #.# #"; 525.4637
525.46
Как правило, одну и ту же задачу можно решить различными способами.
Наиболее привлекательны при этом наиболее простые, оригинальные,
быстрые алгоритмы решения. При реализации алгоритмов программами
приходится решать задачу выбора операторов, оформления ввода данных,
вывода результатов, записи комментариев и т.д. Считают, что лучшей из
решающих задачу программ будет та, которая при прочих равных условиях
имеет в своем составе меньше операторов. Такую программу быстрее вводить, легче исправлять и отлаживать.
59
Download