Информатика и программирование алгоритмизация – от проблемы к программе. Курс лекций
.pdf3.7. Примеры типовых программ
Нам уже известны основные операторы языка Visual Basic 6.0. По- смотрим теперь, как будут выглядеть программы, соответствующие про- стым типовым алгоритмам. Во многих случаях это прямой перевод рус- ского текста на английский язык, хотя и характеризующийся некоторыми особенностями, связанными, например, с наименованием конца цикла или форматом операторов условного перехода, а также с описанием типа переменных. В табл. 3.5 приведены примеры типовых алгоритмов и их программная реализация.
|
|
Таблица 3.5 |
|
Программная реализация типовых алгоритмов |
|||
|
|
|
|
Алгоритм |
|
Программа |
|
Пример 1. Вычислить произведение |
Private Sub Command1_Click() |
||
чисел n и m, не используя |
Dim n As Integer: Dim i As Integer |
||
операцию умножения. |
|
'PrS_1 Произведение k = nm |
|
Ввод значений n и m |
MsgBox "Введите n и m" |
||
|
n = InputBox("n =") |
||
k = 0 |
|
||
|
m = InputBox("m =") |
||
i = 0 |
|
||
|
k = 0 |
||
4. k = k + n |
|
||
m4: |
k = k + n |
||
I = i + 1 |
|||
|
i = i + 1 |
||
если i < m, идти к 4, иначе идти к 7 |
|
||
|
If i < m Then GoTo m4 Else GoTo m7 |
||
7. Вывод значения k |
|
||
m7: |
Print "final k ="; k |
||
|
|||
|
End Sub |
||
|
|
||
Пример 1 в модифицированном виде |
Private Sub Command1_Click() |
||
Ввод значений n и m |
'PrS_1_mod |
||
Dim n As Integer: Dim i As Integer |
|||
k = 0 |
|||
Dim m As Integer: Dim k As Integer |
|||
Цикл i = 1, m (в этом операторе со- |
|||
|
n = InputBox("n =") |
||
держится счетчик i = i + 1 и цикл бу- |
|
||
|
m = InputBox("m =") |
||
дет закончен, когда i = m + 1) |
|
||
|
k = 0 |
||
k = k + n |
|
||
For i = 1 To m |
|||
Конец цикла i (этот оператор переводит |
|||
|
k = k + n |
||
действие на начало цикла, если i ≤ m) |
|
||
Next i |
|||
Вывод значения k |
|||
|
Print "k ="; k |
||
|
|
||
|
End Sub |
||
Пример 2. Вычислить функцию y = x2 |
Private Sub Command1_Click() |
||
для x от –1 до +1 с шагом 0,2. |
'PrS_2 |
|
|
Цикл x = –1, +1 шаг 0,2 |
Dim x As Single |
||
Dim y As Single |
|||
y = x x |
|||
|
For x = –1 To 1 Step 0.2 |
||
Вывод значений x и y |
|
||
|
y = x x |
||
Конец цикла x |
|
Print "x ="; x, " y ="; y |
|
|
|
||
Ввиду особенностей представления |
|
Next x |
|
31
|
|
Продолжение табл. 3.5 |
|
|
|
||
Алгоритм |
Программа |
||
чисел программа, приведенная в при- |
End Sub |
|
|
мере 1, выдает не очень удобную для |
Private Sub Command1_Click() |
||
восприятия информацию. Введите эту |
'PrS_2_mod |
|
|
программу и посмотрите на результат. |
Dim x As Single |
|
|
Для исправления этого неудобства |
Dim y As Single |
|
|
предлагается программа, представ- |
For x = –1 To 1.1 Step 0.2 |
||
ленная в примере 2. Сравните ее ре- |
y = x x |
|
|
зультат с первым. |
x = CInt(1000 |
x) / 1000 |
|
Функция Cint округляет дробное чис- |
y = CInt(1000 |
y) / 1000 |
|
ло до ближайшего целого. |
Print " x ="; x, " y ="; y |
||
|
|||
|
Next x |
|
|
|
End Sub |
|
|
Пример 3. Вычислить xk, не используя |
Private Sub Command1_Click() |
||
операцию возведения в степень. |
'PrS_3 z = x^k |
|
|
Ввод значений x и k |
MsgBox ("x в степени k. Ввод x и k ") |
||
x = InputBox("x =") |
|||
z = 1 |
|||
k = InputBox("Степень k =") |
|||
Цикл i = 1, k |
|||
z = 1 |
|
||
z = z x |
|
||
Конец цикла i |
For i = 1 To k |
|
|
z = z x |
|
||
Вывод значения z |
|
||
Next i |
|
||
|
|
||
|
Print " z ="; z |
|
|
|
End Sub |
|
|
Пример 4. Вычислить |
Private Sub Command1_Click() |
||
z = k! = 1 2 3 ... k |
'PrS_4 Вычисление факториала z = k! |
||
Ввод значения k |
k = InputBox(" k =") |
|
|
z = 1 |
|
||
z = 1 |
|
||
For i = 1 To k |
|
||
Цикл i = 1, k |
|
||
z = z * i |
|
||
z = z i |
|
||
Next i |
|
||
Конец цикла i |
|
||
Print " z ="; z |
|
||
Вывод значения z |
|
||
End Sub |
|
||
|
|
||
Пример 5. Составить алгоритм для |
Private Sub Command1_Click() |
||
решения следующей задачи. Ввести n |
'PrS_5 |
|
|
чисел ai (i = 1, n). Определить, сколь- |
n = InputBox("Ввод значения n") |
||
ко из них положительных, отрица- |
k = 0: l = 0: m = 0 |
|
|
тельных и равных нулю. |
For i = 1 To n |
|
|
Ввод значения n |
ai = InputBox("Ввод значения ai") |
||
If ai > 0 Then k = k + 1 |
|||
k = 0, l = 0, m = 0 |
|||
If ai < 0 Then l = l + 1 |
|||
Цикл i = 1, n |
|||
If ai=0 Then m = m + 1 |
|||
Ввод значения ai |
|||
Next i |
|
||
Если ai > 0, то k = k + 1 |
|
||
Print "Вывод k, l, m "; k, l, m |
|||
Если ai < 0, то l = l + 1 |
|||
End Sub |
|
||
Если ai = 0, то m = m + 1 |
|
||
Конец цикла i |
|
|
|
Вывод значений k, l, m |
|
|
|
32
|
|
|
|
|
|
|
Продолжение табл. 3.5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Алгоритм |
|
Программа |
|
Пример 5 в модифицированном виде. |
|
Private Sub Command1_Click() |
||||||
Ввод значения n |
'PrS_5_mod |
|||||||
n = InputBox("Ввод значения n") |
||||||||
k = 0, l = 0, m = 0 |
||||||||
|
k = 0: l = 0: m = 0 |
|||||||
Цикл i = 1, n (цикл будет закончен, |
|
|||||||
|
For i = 1 To n |
|||||||
когда i = n + 1) |
|
|||||||
|
ai = InputBox("Ввод значения ai") |
|||||||
|
|
|
Ввод значения ai |
|
||||
|
|
|
|
If ai > 0 Then GoTo 9 |
||||
|
|
|
Если ai > 0, то идти к 9 |
|
||||
|
|
|
|
If ai < 0 Then GoTo 11 |
||||
|
|
|
Если ai < 0, то идти к 11 |
|
||||
|
|
|
|
m = m + 1 |
||||
|
|
|
m = m + 1 (это случай, |
|
||||
|
|
|
|
GoTo 12 |
||||
|
|
|
|
|
когда ai = 0) |
|
||
|
|
|
|
|
9: k = k + 1 |
|||
|
|
|
Идти к 12 |
|||||
|
|
|
|
GoTo 12 |
||||
9. |
|
k = k + 1 |
|
|||||
|
11: l = l + 1 |
|||||||
|
|
|
Идти к 12 |
|||||
|
|
|
12: Next i |
|||||
11. |
l = l + 1 |
|||||||
Print " Вывод k, l, m "; k, l, m |
||||||||
12. |
Конец цикла i |
|||||||
End Sub |
||||||||
Вывод значений k, l, m |
||||||||
|
|
|||||||
Пример 6. Вычислить сумму |
Private Sub Command1_Click() |
|||||||
|
n |
1 |
'PrS_6 Сумма ряда 1/x^n |
|||||
|
∑ |
|
для фиксированного значе- |
|
x = InputBox("x =") |
|||
|
i |
|
a = 1: s = 0: n = 0: eps = 0.001 |
|||||
|
i = 0 x |
|
|
|||||
|
|
3: |
s = s + a |
|||||
ния x > 1, определив значение по- |
||||||||
|
n = n + 1 |
|||||||
следнего элемента суммы по условию |
|
|||||||
|
a = a / x |
|||||||
|
1 |
|
≥ ε . Вывести на печать число эле- |
|
If a >= eps Then GoTo 3 |
|||
|
xi |
|
Print "s ="; s, "n ="; n |
|||||
ментов суммы n. |
End Sub |
|||||||
|
Ввод значения x |
|
Эта же программа может быть записана без |
|||||
|
|
a = 1: s = 0: n = 0: ε = 0.001 |
употребления метки 3 с помощью цикла Do: |
|||||
3. Цикл |
Private Sub Command2_Click() |
|||||||
|
|
|
|
|
s = s + a |
|
x = InputBox("x =") |
|
|
|
|
|
|
n = n + 1 |
|
a = 1: s = 0: n = 0: eps = 0.001 |
|
|
|
|
|
|
a = a/x |
|
Do |
|
|
|
Если a ≥ ε, то идти к 3 |
|
s = s + a: n = n + 1: a = a / x |
||||
(метка 3 – это начало цикла) |
|
Loop While a >= eps |
||||||
|
Print "s ="; s, "n ="; n |
|||||||
|
|
|
Вывод значений s, n |
|
||||
|
|
|
End Sub |
|||||
|
|
|
|
|
|
|||
Пример 7. Вводится пара чисел: |
Private Sub Command1_Click() |
|||||||
a – делимое и b – делитель. Число a |
'PrS_7_ Целое деление a\b |
|||||||
делится на число b с точностью |
Do |
|||||||
до целых последовательным вычита- |
|
a = InputBox("a =") |
||||||
нием a – b. Остаток записывается |
|
b = InputBox("b =") |
||||||
в переменную d, результат деления – |
|
if a < b Then Exit Do |
||||||
в переменную n. Цикл вычитания |
|
n = 0 |
||||||
продолжается, пока d > b. Затем вво- |
|
d = a |
||||||
дится другая пара a, b. Цикл ввода |
|
Do |
||||||
пар продолжается, пока a > b. |
|
If d < b Then Exit Do |
||||||
33
|
Окончание табл. 3.5 |
|
|
Алгоритм |
Программа |
Цикл 1 |
n = 0 |
Ввод чисел a и b |
d = a |
Если a < b, то выйти из цикла 1 |
Do |
(это означает – закончить задачу) |
If d < b Then Exit Do |
n = 0 |
d = d – b |
d = a |
n = n + 1 |
Цикл 2 |
Loop |
если d < b, выйти из цикла 2 (это оз- |
Print "a ="; a, "b ="; b |
начает – вывести результат и перейти |
Print "n ="; n, "d ="; d |
к циклу 1) |
Loop |
d = d – b |
End Sub |
n = n + 1 |
|
Конец цикла 2 |
|
Вывод a, b, n, d |
|
Конец цикла 1 |
|
Конец программы |
|
34
4. АЛГОРИТМИЧЕСКИЙ ЯЗЫК VISUAL BASIC. БОЛЕЕ СЛОЖНЫЕ СТРУКТУРЫ
4.1. Файловый ввод и вывод
При работе со сложными программами часто требуется ввод
ивывод большого количества информации, которая может не помес- титься на экране монитора. Это причиняет явное неудобство. Кроме того, сложная программа может быть построена в виде последова- тельности нескольких программ, каждая из которых должна после своей работы передавать результаты другой программе. Для органи- зации ввода и вывода информации в этих случая используются фай- лы данных. Файлом называется блок информации, имеющий опре- деленное имя и размещенный в памяти компьютера. Файлы бывают текстовые и кодовые (их называют также бинарными). Текст про- граммы после его сохранения в памяти также является файлом. Фай- лы различаются по типу операции (ввод или вывод).
Для начала работы с файлом нужно указать его полное имя, тип
икодовое имя, называемое номером файла. Соответствующая строка программы называется открытием файла. Номер файла вводится для удобства обращения к файлу после его открытия, так как полное имя может быть очень длинным. После работы с файлом – ввода (чтения) или вывода (записи) информации – файл необходимо закрыть.
Строка открытия имеет следующий вид:
Open [полное имя файла] for [ввод или вывод] as #[номер файла] Полное имя файла – это строка символов, указывающая путь к файлу,
начиная с имени диска и заканчивая собственным именем файла. Ввод или вывод указывается словами Input или Output. Слово Append, упот- ребленное на том же месте, означает вывод с добавлением информации в имеющийся файл. Номер файла – целое число от 1 до 255.
Пример 4.1. Требуется ввести из файла матрицу размером 3 на 4, умножить ее элементы на число 3 и вывести в другой файл.
Назовем вводной файл inp4_1.txt (имя произвольно), запишем в него матрицу и поместим его в личную папку. Файл inp4_1.txt име- ет следующий вид:
23, 45, 57, 189 12, 451. 573, 3 33, 44, 555, 8
Все файлы сохраняются автоматически в текстовом формате.
35
Программа, решающая указанную выше задачу, приведена ниже. Следует обратить внимание на знак апострофа « ' », поставленный пе- ред комментарием. Строка, начинающаяся с апострофа, не исполняется (не является оператором) и служит для пояснений в тексте программы.
Private Sub Command1_Click() 'Ex 4_1
' Описание двумерных массивов matr и m1
Dim matr(3, 4) As Integer ' Описание двумерных массивов matr и m1 Dim m1(3, 4) As Integer
'Открытие файла inp4_1.txt для чтения (ввода) Open "F:\Tout_le_VB6\My_files\inp\inp4_1.txt" For Input As #1 For i = 1 To 3
For j = 1 To 4
Input #1, matr(i, j) ' Ввод элементов матрицы из файла
Next j Next i Close #1
For i = 1 To 3 For j = 1 To 4
matr(i, j) = 3 * matr(i, j) ' Умножение матрицы на число 3 m1(i, j) = matr(i, j)
Next j Next i
'Открытие файла out4_1.txt для записи (вывода) Open "F:\Tout_le_VB6\My_files\out\out4_1.txt" For Output As #2 For i = 1 To 3
For j = 1 To 4
Print #2, m1(i, j); ' Вывод в файл новых элементов матрицы
Next j 'Write #2, Print #2,
Next i Close #2 End Sub
Выводной файл out4_1.txt (имя произвольно) записан по указан- ному пути. Файл out4_1.txt имеет следующий вид:
69 135 171 567
36 1353 1719 9
99 132 1665 24
36
После считывания информации из файла или после ее записи
вфайл, открытый оператором Open, файл нужно закрыть оператором
Close #n (n – номер файла).
При записи файла в среде Visual Basic 6.0 в конце его автоматиче- ски добавляется специальный код – признак конца записи End of file (сокращенно EOF). Если программа считывания запрашивает больше строк, чем их имеется в файле, – возникает сообщение об ошибке: "Input past end of file". Чтобы этого избежать, можно использовать функцию EOF(n), аргумент которой n есть номер файла, указанный
встроке открытия файла (For Input As#n). Значение этой функции равно –1, если конец файла обнаружен, и нулю в противном случае.
Предположим, что в примере 4.1 программа должна обеспечить ввод различных матриц, отличающихся числом строк. Тогда ввод очередной матрицы следует выполнить так, как показано в примере 4.2 (предпола- гается, что максимальное число строк равно 10).
Пример 4.2
Private Sub Command1_Click() ' Ex4_2
Dim matr(10, 4) As Integer
Open "F:\Tout_le_VB6\My_files\inp\inp4_1.txt" For Input As #1 For i = 1 To 10
If EOF(1) Then Exit For ' Выход из цикла i For j = 1 To 4
Input #1, matr(i, j) Next j
Next i Close #1
Print "Файл прочитан" For i = 1 To 10
For j = 1 To 4 Print matr(i, j);
Next j
Print Next i
End Sub
Если в файле окажется больше 10 строк, то будут прочитаны пер- вые десять.
37
4.2. Подпрограммы и их использование для написания сложных программ
4.2.1. Назначение подпрограмм
Важной проблемой программирования является написание программ, которые легко могли бы читаться не только автором программы, но
идругими лицами, желающими (и имеющими разрешение) их использо- вать. Выше были представлены очень простые программы, для пони- мания которых не требуется большого труда. Но чем сложнее проблема, тем большее число разнообразных операций необходимо использовать
итем длиннее становится текст программы. В конце концов его будет трудно воспринимать. В этом случае требуется придать программе опре- деленную структуру – т.е. программу нужно структурировать.
Придать программе структуру означает разбить ее на отдельные блоки
иуказать связи между ними. Эта операция не только является целесообразной с точки зрения понимания программы другими пользова- телями, кроме автора, но и помогает самому автору при отладке про- граммы. Ведь чем программа длиннее, тем больше вероятность ошибок при ее написании. Выделяя в программе блоки, автор получает возмож- ность более быстрого поиска ошибок, отлаживая отдельно каждый блок.
Для выделения в программе блоков используются так называемые процедуры. В большинстве случаев они оформлены в виде подпрограмм. Подпрограммой называется относительно небольшая программа, которая выполняет, как правило, одну простую функцию среди множества других функций, сформулированных в прикладной проблеме. Действия подпрограмм связаны между собой через так называемую главную про- грамму, которая управляет обменом информацией и получением финаль- ного результата. Основной частью текста главной программы является последовательное обращение к подпрограммам, определяемое логикой поставленной прикладной задачи.
4.2.2. Типы подпрограмм
Основными типами подпрограмм являются подпрограмма общего вида Sub и подпрограмма-функция Function. Необходимыми элемен- тами подпрограммы, кроме указания типа (Sub или Function), явля- ются имя подпрограммы и список переменных, с которыми она рабо- тает. При этом главная программа, как было показано выше, также имеет формальный вид Sub:
38
Private Sub Command1_Click()
Текст программы
End Sub
Оформление подпрограммы состоит из двух компонент: 1. Вызов подпрограммы по формату:
Call Имя (Список переменных) – для подпрограмм типа Sub. Воз- можен также вызов без слова Call.
Переменная = Имя (Список переменных) – для подпрограмм типа
Function.
2. Текст подпрограммы, который заключен между следующими двумя строками:
Sub (или Function) Имя (Список переменных) Текст подпрограммы
End Sub (или Function)
Подпрограммы обмениваются между собой и с главной программой значениями переменных. Различие между типами Sub и Function состоит в том, что подпрограмма Sub может передавать зна- чения многих переменных. В отличие от нее подпрограмма Function передает значение только одной переменной: значение функции. Употребление двух типов вызвано желанием ускорить обмен инфор- мацией: тип Function имеет преимущество перед типом Sub, если нужно передать значение только одной переменной.
В приведенном ниже примере показано использование подпро- грамм обоих типов.
Пример 4.3. Текстовый файл vector.txt содержит исходные дан- ные – три строки по десять чисел. Из первой строки числа поочеред- но присваиваются элементам массивов a(i) и b(i), так что в массиве a содержатся числа от 1 до 5, а в массиве b – числа от 11 до 15.
Подпрограмма Function sumab вычисляет сумму произведе- ний a(i) b(i) (т.е. скалярное произведение указанных векторов) и передает эту сумму в главную программу через свое имя – sumab. Значение суммы присваивается переменной sum. Подпрограмма Sub vectorc производит массив c, элементы которого вычисляются по формуле c(i) = a(i) + b(i).
Числа из второй и третьей строк файла vector.dat присваиваются соответственно элементам массивов a1(i) и b1(i) (каждый из масси- вов a1 и b1 состоит из десяти элементов). С числами a1(i) и b1(i) производятся те же операции, что и раньше с числами a(i) и b(i). При этом сумма произведений a1(i) b1(i) присваивается переменной sum1, а суммы a(i) + b(i) присваиваются элементам массива c1.
39
В программе используется файл данных с именем vector.txt: 1,11,2,12,3,13,4,14,5,15 6,7,8,9,10,21,22,23,24,25 31,32,33,34,35,36,37,38,39,40
Программа имеет следующий вид:
Dim a(1 To 5) As Integer: Dim b(1 To 5) As Integer: Dim c(1 To 5) As Integer
Dim a1(1 To 10) As Integer: Dim b1(1 To 10) As Integer: Dim c1(1 To 10) As Integer
Dim n1 As Integer: Dim n2 As Integer Private Sub Command1_Click() 'Пример 4_3
'Файл vector.txt '1,11,2,12,3,13,4,14,5,15 '6,7,8,9,10,21,22,23,24,25 '31,32,33,34,35,36,37,38,39,40
'Открытие файла для ввода
Open "F:\Tout_le_VB6\My_files\inp\vector.txt" For Input As #1 Print "Входные данные"
For i = 1 To 5
Input #1, a(i) 'Ввод 1-й строки Input #1, b(i)
Print a(i), b(i) ‘ Это сигнальный вывод
Next i
Print "============================" For i = 1 To 10
Input #1, a1(i) ' Ввод 2-й строки Print a1(i);
Next i
Print "******************************************" For i = 1 To 10
Input #1, b1(i) ' Ввод 3-й строки Print b1(i);
Next i Print
Print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" n1 = 5: n2 = 10
Sum1 = sumab(a, b, n1) 'Вызов Function sumab Sum2 = sumab(a1, b1, n2)
40
