Информатика и программирование алгоритмизация – от проблемы к программе. Курс лекций
.pdf6.Если i < m, идти к 4, иначе идти к 7
7.Вывод значения k
В6-й строке алгоритма слово «иначе» означает переход при не- выполнении условия, указанного после слова «если». Это переход
кследующей по порядку строке, представляющий собой так назы- ваемую естественную последовательность операций. Этот переход во всех языках программирования делается без принудительной ссылки «идти к». Поэтому в следующих алгоритмах такую ссылку будем опускать. Обычно алгоритм проверяется на тестовом примере. Пусть n = 5, m = 3. Проследим действия алгоритма. При первом об- ращении к строке 4 переменная k = 5. Из строки 5 следует i = 1. По- скольку условие в строке 6 выполнено, снова выполняются строки 4 и 5. В результате k = 10, i = 2. Условие в строке 6 снова выполнено. Выполняются строки 4 и 5. В результате k = 15, i = 3. При этом усло- вие в строке 6 (т.е. i < 3) не выполнено и действие переходит к строке 7, которая и завершает работу алгоритма.
Вполученном алгоритме имеется цикл: повторение 4-й строки. Начальная операция цикла – это строка 3: присваивание переменной счетчика i начального значения. Другими элементами цикла являют- ся сам счетчик (строка 5) и конечная операция цикла, представляю- щая собой условный переход (строка 6). Указанные элементы струк- туры цикла являются типовыми и поэтому их можно объединить с целью сокращения записи алгоритма. Заметим, что начальное зна- чение переменной счетчика может быть сделано равным 1. Тогда в операции условного перехода нужно заменить знак условия «мень- ше» на «меньше или равно».
Заметим также, что имена всех переменных совершенно произ- вольные. Тогда можно ввести следующие условные операции, орга- низующие цикл. В начале цикла будем ставить строку: цикл i = 1, m. Будем подразумевать, что в этой строке объединены все три упомянутых выше элемента структуры цикла: присваивание началь- ного значения переменной счетчика, сам счетчик, сравнение значе- ния переменной счетчика с числом m и условный переход. По окон- чании блока операций цикла будем ставить строку: конец цикла i. Блок операций, повторяющихся в цикле, обычно называют телом цикла. Будем выделять тело цикла жирным шрифтом. С учетом вве- денных обозначений алгоритм вычисления произведения k = nm бу- дет выглядеть следующим образом:
1. Ввод значений n и m
2. k = 0
11
3.Цикл i = 1, m (в этом операторе содержится счетчик i = i + 1
4.k = k + n и цикл будет закончен, когда i = m + 1)
5. Конец цикла i |
(этот оператор переводит действие |
|
на начало цикла, если i ≤ m) |
6. Вывод значения k
В операции обновления переменной счетчика i = i + 1 единица на- зывается шагом счетчика. Будем полагать, что если в цикле не задан другой шаг, то он автоматически равен единице. В противном случае в строке начала цикла будем указывать нужный шаг счетчика.
Кстати сказать, в этом случае сам термин «счетчик» теряет смысл. Ниже показан пример алгоритма с шагом, отличным от единицы.
Пример 2.2. Составить алгоритм для вычисления значения функ- ции y = x2 для значений x в пределах от –2 до +3 с шагом 0,2.
Решение. Поскольку возведение в степень не является элементарной операцией, заменим ее умножением. Многократное вычисление значения функции поставим в цикл. В тело цикла должен также входить вывод значений аргумента и функции. Получим следующий алгоритм:
1.Цикл x = –2, +3 шаг 0,2
2.y = x x
3.Вывод значений x и y
4.Конец цикла x
Пример 2.3. Составить алгоритм для возведения числа x в целую степень k: z = xk.
Решение. Поскольку возведение в целую степень – это последова- тельное умножение, то телом цикла должна быть операция z = z x. Очевидно, что первое обращение в цикле к этой операции должно дать значение z = x. Поэтому начальное значение z = 1. Получим сле- дующий алгоритм:
1.Ввод значений x и k
2.z = 1
3.Цикл i = 1, k
4.z = z x
5.Конец цикла i
6.Вывод значения z
Пример 2.4. Вычислить z = k! = 1 2 3 ... k.
Решение. В этом примере так же, как и в предыдущем, использу- ется последовательное умножение. Значения множителей составляют закономерную последовательность. Очередной множитель на едини-
12
цу больше предыдущего. Поэтому можно в качестве множителя ис- пользовать переменную счетчика. В результате получим алгоритм:
1.Ввод значения k
2.z = 1
3.Цикл i = 1, k
4.z = z i
5.Конец цикла i
6.Вывод значения z
Пример 2.5. Составить алгоритм для решения следующей задачи: ввести n чисел ai (i = 1, n) и определить, сколько из них положитель- ных, отрицательных и равных нулю.
Решение. На вопрос «сколько?» должны ответить счетчики чисел по соответствующему признаку. Ввод чисел и указанный подсчет нужно поставить в цикл. Вначале значения переменных счетчиков нужно сделать равными нулю. Пусть в переменных k, l, m фиксиру- ется соответственно количество положительных, отрицательных
инулевых чисел. Тогда имеем следующий алгоритм:
1.Ввод значения n
2.k = 0, l = 0, m = 0
3.Цикл i = 1, n
4.Ввод значения ai
5.Если ai > 0, то k = k + 1
6.Если ai < 0, то l = l + 1
7.Если ai = 0, то m = m + 1
8.Конец цикла i
9.Вывод значений k, l, m
Заметим, что с введением формы «цикл i = 1, n – конец цикла i» исчезла необходимость в номерах строк алгоритма (которые могли использоваться как метки для переходов).
Отметим также, что в этом алгоритме в строках 5, 6 и 7 про- верки условия записан не переход к другой операции («идти к»), а сама эта операция. Если условие не выполнено, то указанная справа от него операция не выполняется. Затем выполняется сле- дующая по порядку строка (это так называемая естественная по- следовательность в алгоритме). Современные алгоритмические языки построены именно таким образом. Поэтому в описании алгоритмов требуется дополнить формальное изображение ус- ловного перехода, как это показано в примере 2.5. В противном случае алгоритмы будут очень громоздкими. Например, в по-
13
следнем алгоритме пришлось бы поставить каждый счетчик в отдельную строку с меткой, а после этой строки ставить строку безусловного перехода на конец цикла. В результате добавились бы лишние строки и алгоритм выглядел бы следующим образом:
1.Ввод значения n
2.k = 0, l = 0, m = 0
3.Цикл i = 1, n (цикл будет закончен, когда i = n + 1)
4.Ввод значения ai
5.Если ai > 0, то идти к 9
6.Если ai < 0, то идти к 11
7.m = m + 1 (это случай, когда ai = 0)
8.Идти к 12
9.k = k + 1
10.Идти к 12
11.l = l + 1
12.Конец цикла i (эта строка производит переход на начало цикла)
13.Вывод значений k, l, m
Конструкция цикла, рассматривавшаяся до сих пор, не является единственно возможной. Дело в том, что встречаются задачи, где число повторений блока операций – тела цикла – не определено по условию задачи. Выход из такого цикла происходит не по значению переменной счетчика, а по некоторому условию, связанному со спецификой задачи. При этом условие выхода из цикла может стоять как в конце цикла, так и в теле цикла.
n |
1 |
|
|
Пример 2.6. Вычислить сумму ∑ |
|
|
для фиксированного значе- |
x |
i |
||
i = 0 |
|
|
|
ния x > 1, определив значение последнего элемента суммы по усло-
вию 1 ≥ ε . Вывести на печать число n (число элементов суммы). xi
Решение. Заметим вначале, что возведение числа x в степень i мо- жет занять много времени, если i достаточно велико. Может, напри- мер, оказаться, что при заданном ε последнее значение i равно 100. Тогда совершенно нецелесообразно вычислять очередной элемент суммы по указанной формуле. В самом деле, зачем возводить x
встепень 100, если в предыдущем вычислении уже есть значение x
встепени 99. Лучше использовать так называемое рекуррентное вы- числение, означающее вычисление очередного элемента суммы через значение предыдущего элемента. Выведем соответствующую фор-
14
мулу. Для этого обозначим через ai i-й элемент суммы. Запишем эле- менты суммы:
a = |
1 |
; a = |
1 |
. |
|
xi |
xi−1 |
||||
i |
i−1 |
|
|||
|
|
|
Отсюда следует, что ai = ai−1 . x
Последняя формула называется рекуррентной. В общем слу- чае она может быть получена делением i-го элемента суммы на (i – 1)-й. При построении алгоритма опустим номера строк, за исключением тех, которые нужно отметить (т.е. поставить метки) для необходимых переходов. Введем переменную s для значения суммы и обратим внимание на то, что a0 = 1, а индекс i в соответствующих формулах можно опустить. Тогда имеем сле- дующий алгоритм:
Ввод значения x
a = 1: s = 0: n = 0: ε = 0.001: x = 2.5 3. Цикл
s = s + a
n = n + 1 a = a/x
Если a ≥ ε, то идти к метке 3 (метка 3 – это начало цикла) Вывод значений s, n
Заметим, что в этом алгоритме счетчик n не участвует в прерыва- нии цикла, хотя и считает число проходов цикла. Условие продолже- ния цикла контролируется в предпоследней строке. Приведем при- мер другой конструкции цикла.
Пример 2.7. Выполнить перечисленные ниже операции. Вводится пара чисел: a – делимое и b – делитель. Число a делится на число b с точностью до целых последовательным вычитанием a – b. Остаток записывается в переменную d, результат деления – в переменную n. Цикл вычитания продолжается, пока d > b. Затем вводится другая пара a, b. Цикл ввода пар продолжается, пока a > b.
Решение. Здесь необходимо сделать два цикла – один внутри дру- гого. При этом будет подразумеваться, что оператор «конец цикла» автоматически переводит операцию на начало цикла. Слова «выйти из цикла» будут означать переход к следующему оператору после оператора «конец цикла».
15
Цикл 1
Ввод чисел a и b
Если a < b, то выйти из цикла 1 (это означает – закончить задачу) n = 0
d = a
Цикл 2
d = d – b n = n + 1
если d < b, выйти из цикла 2
(это означает – вывести результат и перейти к циклу 1) Конец цикла 2
Вывод a, b, n, d
Конец цикла 1 Конец программы
Заметим, что оператор «конец программы» должен завершать любую программу. В предыдущих примерах он намеренно опущен. Кстати, в некоторых алгоритмических языках он добавляется автоматически.
Рассмотренные выше примеры построения алгоритмов достаточ- но полно отражают их общие (типовые) структурные элементы. Од- нако каждый алгоритмический язык имеет свои особые структуры и типовые алгоритмы обычно должны быть адаптированы к ним. Адаптация не бывает слишком сложной, поэтому переход от одного алгоритмического языка к другому не должен вызывать принципи- альных затруднений.
16
3. АЛГОРИТМИЧЕСКИЙ ЯЗЫК VISUAL BASIC. ОСНОВНЫЕ СВЕДЕНИЯ
3.1. Историческая справка
Первые алгоритмические языки появились в 1958 г. Это были Algol (Algorhitmic Language) и первая версия языка Fortran (Formula Translator). В 1962 г. в Дортмундском университете была разработана первая версия языка Basic (Beginners All-purpose Symbolic Instruction Code). Эта версия называлась BasicA и для нее требовалась нумера- ция строк. В 1970 г. вошел в употребление специфический язык для инженерных расчетов PL/1. В том же году были изобретены отечест- венные алгоритмические языки «Наири» и «Мир», с операторами на русском языке, которые были пригодны только для ЭВМ с соот- ветствующими именами, спроектированными в Армении и на Ук- раине. Их время быстро прошло. В 1980 г. появились языки C, C++, Pascal и новая версия языка Basic – GW Basic. Затем возникла целая серия новых версий: 1985 г. – Qbasic, 1988 г. – Quick Basic, 1989 г. – Professional Basic (PDS), 1993 г. – Visual Basic (первая версия). Ниже будет рассматриваться версия Visual Basic 6.0.
В данном курсе лекций не ставился цель рассказать о всех возмож- ностях и особенностях языка Visual Basic 6.0. Они изложены в специальных книгах. Главная цель – познакомить с основными приемами перехода от текстовой формулировки некоторой проблемы к программной реализации, позволяющей получить решение пробле- мы. Это тот процесс, который обычно называют «алгоритмизация». Здесь этот процесс предлагается осваивать на конкретных задачах.
Алгоритмы некоторых простых задач можно написать на привыч- ном для нас языке. Однако в дальнейшем алгоритм должен превра- титься в программу, понятную компьютеру. Для этого алгоритм дол- жен быть переведен на один из алгоритмических языков, а затем транслирован в двоичные коды. Пользователя компьютера обычно мало интересует процесс трансляции. Его скорее интересует результат решения задачи. Но умение грамотно написать программу на алгорит- мическом языке совершенно необходимо, даже если компьютер рас- сматривается как не более чем инструмент. Итак, основная цель – нау- читься строить алгоритмы. Для этого нужно изучить основной словарь и грамматику языка. Но для реализации алгоритмов, т.е. для построе- ния программ и получения результатов их работы, необходимо иметь представление о среде программирования.
17
3.2. Среда программирования Visual Basic 6.0
Программа на Visual Basic называется проектом (Project).
Visual Basic – это объектно-ориентированный язык, в котором имеется специальная терминология. В данном курсе она не изучается во всех подробностях, так как главная наша задача – построение ал- горитмов. Однако основные термины нужно знать.
На рис. 3.1 показано соотношение между основными элементами среды программирования.
Рис. 3.1. Основные элементы среды программирования
Дадим определения этих элементов.
Объект – структурная компонента проекта (Project). Свойство – характеристика объекта.
Событие – действие на объекте.
Метод – процедура, реализованная в результате события. Каждый из указанных элементов имеет множество имен. Имена
эти можно видеть на экране среды в соответствующих окнах. Для того чтобы их увидеть, нужно войти в пункт меню View, затем в пункт Object Brouser (список объектов). Появится окно, где можно видеть все возможные значения (имена) каждого из элементов.
Примеры имен приведены ниже.
Объект:
–Форма (Form1);
–Кнопка (Command1);
–Окно для текста (Text1).
Свойство:
–BackColor (цвет фона);
–Caption (надпись);
–Width (ширина);
–Height (высота).
18
Событие:
–Click (нажата левая клавиша мыши);
–Load (загрузка);
–Terminate (окончание работы).
Методы:
–Print (вывод результатов);
–SetFocus (выделение объекта для передачи ему управления);
–Процедуры, запрограммированные пользователем. Процесс программирования состоит из двух основных операций:
–создание проекта (форма с объектами на ней);
–разработка и запись программного кода.
3.3.Основные конструкции языка
3.3.1.Алфавит
Вкачестве алфавита используются символы из таблицы ASCII.
Впрограммах можно использовать следующие символы:
–буквы латинского алфавита;
–буквы русского алфавита;
–цифры (0–9) для представления чисел;
–знаки операций (табл. 3.1);
–разделители (табл. 3.2);
–символы объявления типов данных (табл. 3.3).
Таблица 3.1
Знаки операций и их смысл
Знак |
|
Значение |
Знак |
|
Значение |
+ |
|
плюс |
= |
равно |
|
– |
|
минус |
< |
меньше |
|
* |
|
умножение |
> |
больше |
|
/ |
|
деление обычное |
^ |
возведение в степень |
|
\ |
|
и целочисленное |
|||
|
|
|
|
||
a mod b |
|
Остаток от целочисленного деления a на b |
|||
|
|
|
|
|
Таблица 3.2 |
|
|
Знаки разделителей и их смысл |
|||
|
|
|
|
|
|
Знак |
|
Значение |
Знак |
|
Значение |
, |
запятая |
‘ |
|
апостроф |
|
. |
точка |
( |
|
открытая скобка |
|
: |
двоеточие |
) |
|
закрытая скобка |
|
; |
точка с запятой |
_ |
|
подчеркивание |
|
19
Таблица 3.3
|
Знаки символов объявления типов данных и их смысл |
|
|
|
|
Знак |
|
Значение |
% |
|
целые |
& |
|
длинные целые |
! |
|
обычной точности |
# |
|
двойной точности |
$ |
|
символьные |
3.3.2. Переменные
Переменная – это величина, которая может меняться при выпол- нении программы, занимая в памяти компьютера определенное ме- сто. Переменные бывают двух основных видов: простые переменные (числовые и символьные) и массивы (числовые и символьные). Для размещения простой переменной в памяти компьютера достаточно указать ее имя.
Массив представляет собой группу переменных под одним име- нем. Для различения элементов группы применяется их индексация. В языке Visual Basic 6.0 имеются и другие типы переменных. Но на начальном этапе, когда основная проблема – построение алгоритмов, эти типы нам не понадобятся.
Имя переменной может состоять из последовательности симво- лов. При этом первый символ должен быть обязательно латинской буквой. Следует избегать имен, являющихся зарезервированными словами языка. К таковым относятся команды, операторы, имена стандартных функций (например, SIN). Однако можно назвать пере- менную SINx. Список зарезервированных слов обычно имеется в конце руководства по программированию. Если же этот список не- доступен пользователю, транслятор Visual Basic 6.0 предупредит его об использовании запрещенного имени.
3.3.3. Константы
Кроме переменных в языке существует конструкция, называемая константой. Числовыми константами являются положительные или отрицательные числа, которые могут быть использованы как значе- ния переменных. Например,
Max = 287: PI = 3.141592: Min = –555
20
