Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика и программирование алгоритмизация – от проблемы к программе. Курс лекций

.pdf
Скачиваний:
0
Добавлен:
09.08.2026
Размер:
416 Кб
Скачать

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]