Информатика и программирование алгоритмизация – от проблемы к программе. Курс лекций
.pdfvectorc a, b, c, n1 'Вызов Sub vectorc vectorc a1, b1, c1, n2
Print "++++++++++++++++++++++++++++++" 'Вывод результатов на экран (в форму)
Print "Sum1 ="; Sum1, "Sum2 ="; Sum2 Print "Вектор c _________"
For i = 1 To 5 Print c(i);
Next i Print
Print "Вектор c1 _______________________" For i = 1 To 10
Print c1(i); Next i
End Sub
'Тексты подпрограмм
Private Function sumab(u, v, n) As Integer Dim s As Integer
s = 0
For i = 1 To n
s = s + u(i) * v(i)
Next i sumab = s
End Function
Private Sub vectorc(u, v, w, n) For i = 1 To n
w(i) = u(i) + v(i)
Next i End Sub
Результат работы программы на экране
+++++++++++++++
205 5710
12 14 16 18 20
37 39 41 43 45 57 59 61 63 65
Вызов Sub в этом примере сделан без слова Call, что приводит к трудностям восприятия текста программы.
Следует обратить внимание на форму описания типов переменных – некоторые из них имеют описание вне текста главной программы.
Приведем еще один пример передачи информации в подпрограмму.
41
Пример 4.4. Подпрограмма Sub b (с передачей информации через список параметров) вычисляет элементы массива d (вектор d)
по формуле d(i) = k a(i) + q y.
Здесь элементы вектора a(i) вводятся присваиванием в тексте, число k вводится с помощью InputBox, значение q присваивается в тексте программы, а число у задано в списке фактических парамет- ров ( y равно 5).
Текст программы:
Private Sub Command1_Click() 'ПРИМЕР 4_4 'Главная программа
Dim a(3) As Integer: Dim d(3) As Integer Dim k As Integer: Dim q As Integer
Cls
Open "F:\Tout_le_VB6\My_files\out\out4_5.txt"For Output As #1 a(1) = 1: a(2) = 2: a(3) = 3
Print #1, Spc(10);
Print #1, "Вектор a() ----------" Print #1, Spc(20);
For i = 1 To 3: Print #1, a(i); : Next i: Print #1, k = InputBox("k= ")
q = 2
Print #1, "k="; k; " q="; q b 5, a, k, d, q
'Операция: d(i) = a(i) k + q y –
'вызов подпрограммы
Print #1, Spc(10);
Print #1, "Вектор d() ----------" Print #1, Spc(20);
For i = 1 To 3: Print #1, d(i); : Next i End Sub
Private Sub b(y, a, k, d, q) 'Подпрограмма
For i = 1 To 3: d(i) = k a(i) + q y: Next i
End Sub
4.2.3. Локальные переменные формы
Существует способ передачи значений переменных между про- граммными модулями, при котором не требуется использование спи- ска. Такие переменные объявляются вне текста главной программы и называются локальными переменными формы.
42
Пример 4.5. Приведены некоторые операции с использованием указанной выше формы обмена информацией. Подпрограммы Sub a() и Sub d() производят арифметические операции с данными, которые отсутствуют в списках этих подпрограмм.
Текст программы:
Dim c As Integer: Dim d As Integer: Dim e As Integer: Dim f As Integer Dim ra As Integer: Dim rb As Integer
'Локальные переменные формы
Private Sub Command1_Click() 'Пример 4.5.
'Главная программа
Cls
Open "F:\Tout_le_VB6\My_files\out\out4_7.txt" For Output As #12 c = 1: d = 3: e = 2: f = 5
Print #12, "c ="; c, "d ="; d, "e ="; e, "f ="; f a ' Это вызов подпрограммы
Print #12, "sub a: ra ="; ra; "e ="; e
b ' А это вызов другой подпрограммы
Print #12, "sub b: rb = "; rb; " c = "; c
Print " Все хорошо!" End Sub
Sub a() ra = c + d e = e + f
End Sub
Sub b() rb = e f c = c d
End Sub
Обратите внимание на способ передачи значений переменных, при которых списки отсутствуют. Это несколько затрудняет воспри- ятие текста программы, но зато позволяет продемонстрировать об- мен информацией в случае, когда описание переменных находится вне текста главной программы и они называются при этом локальными переменными формы.
43
5.ОПЕРАТОРЫ И ФУНКЦИИ, РАБОТАЮЩИЕ
ССИМВОЛЬНЫМИ ДАННЫМИ
5.1.Ввод символов с целью управления действиями
При написании сложных программ обычно существует потреб- ность управления действиями с клавиатуры. Этой цели может слу- жить оператор InputBox, как показано в следующем примере.
Пример 5.1. Запрос и ввод пароля «можно» из пяти символов. Знаки < > («меньше» и «больше») соответствуют смыслу «не равно».
Private Sub Command1_Click()
'Пример 5.1. Запрос и ввод пароля «можно» из пяти символов. 'Знаки <> ("меньше" и "больше") соответствуют символу "не равно". Print "Введите пароль!"
Do
Par$ = InputBox("???????") Loop While Par$ <> "можно" Print "Продолжайте"
End Sub
Пароль может не потребоваться. Зато может возникнуть необхо- димость приостановить счет, например, чтобы посмотреть на проме- жуточный результат.
Пример 5.2. Пауза до нажатия клавиши.
Private Sub Command1_Click()
'Пример 5.2. Пауза до нажатия клавиши
P$ = InputBox ("Для продолжения нажмите любую клавишу") Print "Спасибо! Программа пошла."
End Sub
Пример 5.3. Управление выходом из цикла (например, для за- вершения программы). Для выхода из цикла выбрана клавиша «s». Значение нажатой клавиши присваивается переменной a$.
Private Sub Command1_Click()
'Пример 5.3. Управление выходом из цикла '(например, для завершения программы) 'Для выхода из цикла выбрана клавиша "s".
44
Do
'Тело цикла (т.е. Ваша программа) a$ = InputBox(" ")
If a$ = "s " Then Exit Do
Loop
Print "Работа программы закончена" End Sub
Private Sub Command2_Click() 'Другой вариант
Do
' Тело цикла (т.е. Ваша программа) a$ = InputBox(" ")
Loop While a$ <> "s"
Print " Работа программы закончена " End Sub
Отметим, что в этом примере на форме находятся две кнопки управления, включающие тот или иной вариант программы.
5.2. Функции, работающие с таблицей ASCII-кодов
Эти функции также могут быть использованы для управления действиями в программе.
Функция SCREEN(x, y) определяет ASCII-код символа на экране, координаты которого x и y – это номера строки и столбца.
Функция CHR$(код), аргументом которой является ASCII-код, определяет символ из таблицы, который соответствует этому коду. Обратная функция ASC(строка) определяет код первого символа строки, являющейся ее аргументом.
Употребление этих функций будет показано ниже в примерах.
5.3. Функции, работающие со строкой символов
Следующие ниже функции используются в программах при работе с некоторым текстом, а также находят применение при управлении последовательностью действий. В скобках указаны аргументы функций.
LCASE$(строка) – переводит все латинские буквы строки в строчные. UCASE$(строка) – переводит все латинские буквы строки в заглавные. LEFT$(строка, n) – выбирает n символов слева из строки.
RIGHT$(строка, n) – выбирает n символов справа из строки.
45
MID(строка, m, n) – выбирает фрагмент строки из n символов, на- чиная с m-го.
LEN(строка) – вычисляет количество символов в строке. LTRIM$(строка) – удаляет пробелы слева от строки. RTRIM$(строка) – удаляет пробелы справа от строки. STR$(число или числовая переменная) – переводит число в сим-
вольную форму.
VAL(символьное представление числа) – переводит символы (цифры) в число.
Пример 5.4. Определение скан-кодов.
Таблица ASCII-кодов имеет ограниченный объем. Поэтому не все клавиши стандартной клавиатуры могут иметь ASCII-код. В связи с этим многие функциональные клавиши (например, стрелки пере- мещения курсора – Up, Down, Left, Right, клавиши движения страниц
– Page Up, Page Doun и др.) имеют так называемые скан-коды. Скан- код представляет собой строку из двух символов. Первый символ – это пробел. Второй символ – один из символов таблицы ASCII- кодов. В приведенной программе выводятся на экран символ нажа- той клавиши, а также ASCII-код символа:
Private Sub Command1_Click() 'Пример 5.4 ASCII-коды
Cls i = 1 Do
a$ = InputBox("Нажмите клавишу ") cod = Asc(a$)
Print a$; " --"; cod, i = i + 1
If i > 5 Then
Print i = 1
End If
Loop While a$ <> "S" End
End Sub
Обратите внимание на пустой оператор Print. Счетчик i отсчиты- вает число символов, выведенных в строку на форме. Размер формы здесь ограничен пятью символами. Поэтому после заполнения стро-
46
ки пятью символами пустой оператор Print переводит операцию «Вывод» на новую строку. Обратим внимание на то, что цикл закон- чится при нажатии клавиши «S». Служебные клавиши нажимать нельзя, так как они закодированы другим способом (скан-код).
Пример 5.5. Решается следующая задача: в бухгалтерии некото- рой фирмы ведется учет должников. Оператор заполняет файл дан- ных, не заботясь о правильности с точки зрения программирования. Между фамилией должника и суммой долга он оставляет произ- вольное количество пробелов. Если перед суммой стоит минус, то это долг бухгалтерии. Требуется написать программу, которая вы- дает отчет в заданном формате.
Для написания программы первоначальная информация из файла данных считывается построчно в символьный массив pot$(n), где n – число строк в файле данных. Затем в подпрограмме Sub extraction каждая строка анализируется посимвольно. Для этого каждый сим- вол считывается функцией MID и присваивается переменной simb$. Пока в данной строке не встречается пробел, символы собираются (суммируются) в символьную переменную name$(i) – элемент массива. Таким образом, из строки выделяется фамилия. Когда встречается первый пробел, появляется сигнал о наличии конца фа- милии – переменная flag, равная до этого нулю, становится равной единице. При этом значении переменной flag никаких действий не производится, пока в строке идут пробелы. Как только очередной символ будет отличен от пробела, фиксируется число прошедших символов в переменной jfix. Очевидно, что если теперь из длины строки (определенной раньше функцией LEN и зафиксированной в переменной k) вычесть значение jfix без единицы, то получится длина правой части исходной строки, содержащая сумму долга. Эта часть выделяется функцией RIGHT$ и преобразуется в число функ- цией VAL, а число фиксируется в переменной sum(i).
Private Sub Command1_Click() 'Работа с символьными строками 'Пример 5.5
'Файл данных inp5_5.txt '_____________________
'Гамалетдинов 550 'Андреев –200 'Мордюков 320 'Костюк 770
47
'Савва 980 'Парамонишвили 300 'Чен –440 'Главная программа
Cls
Dim n As Integer
n = InputBox("Число должников (7)")
Dim pot(100) As String: Dim sum(100) As Integer: Dim name(100) As String
Open "F:\Tout_le_VB6\My_files\inp\inp5_5.txt" For Input As #1 For i = 1 To n: Input #1, pot$(i): Next i
extraction n, pot, name, sum summ = add(n, sum)
Open "F:\Tout_le_VB6\My_files\out\out5_5.txt" For Output As #2 For i = 1 To n
Print #2, name$(i); Tab(20); sum(i) 'Tab – функция, определяющая
'координату x при выводе
Next i
Print #2, "*****************************" Print #2, "Сумма долга "; summ
Print "*****************************" Print "Сумма долга "; summ
End Sub
Private Function add(n, sum) s = 0
For i = 1 To n: s = s + sum(i): Next i add = s
End Function
Private Sub extraction (n, pot, name1, sum)
Dim summa(100) As String: Dim simb As String: Dim si As String
Dim k As Integer: Dim i As Integer: Dim j As Integer: Dim flag As Integer
Print "n ="; n For i = 1 To n k = Len(pot(i)) 'Print k
si = "" 'будущая фамилия flag = 0
48
For j = 1 To k + 1
simb = Mid(pot(i), j, 1)
If flag = 0 Then si = si + simb 'сборка фамилии по символам
If flag = 0 And simb = " " Then flag = 1
If flag = 1 And simb <> " " Then jfix = j: Exit For Next j
name1(i) = si summa(i) = ""
summa(i) = Right$(pot(i), k – jfix + 1) sum(i) = Val (summa(i))
‘Print k, summa(i), sum(i) – этот оператор применялся при отладке
Next i
End Sub
Файл результатов out5_5.txt:
Гамалетдинов 550 Андреев –200 Мордюков 320 Костюк 770 Савва 980
Парамонишвили 300
Чен –440
*************************
Сумма долга 2280
Значения sum(i) суммируются подпрограммой Function add. Сум- ма передается в главную программу и присваивается переменной summ, которая и выводится в файл результатов out5_5.txt вслед за фамилиями name$(i) и суммами sum(i), выведенными до этого c помощью функции разметки строки Tab.
49
6.ГРАФИКА
6.1.Воспроизведение цвета
Любое графическое изображение на экране монитора образу- ется движением светящейся точки, размер которой равен одному твипу. Точка движется по форме, начиная с верхнего левого угла, и постепенно строчка за строчкой засвечивает всю форму. Этот процесс происходит за очень малое время (доли секунды) и по- вторяется автоматически, т.е. независимо от программы. Про- грамма же обеспечивает задание цвета точки в определенных ко- ординатах формы.
Цвета закодированы. Имеется три варианта кодировки и, соответ- ственно, три способа воспроизведения цвета.
Первый способ – указание цвета из основной палитры (табл. 6.1).
Таблица 6.1
|
|
Основная палитра |
|
|
|
|
|
|
Цвет |
|
Кодовое имя |
1. |
Черный |
|
vbBlack |
2. |
Красный |
|
vbRed |
3. |
Зеленый |
|
vbGreen |
4. |
Синий |
|
vbBlue |
5. |
Голубой |
|
vbCyan |
6. |
Фиолетовый |
|
vbMagenta |
7. |
Желтый |
|
vbYellow |
8. |
Белый |
|
vbWhite |
Необходимо помнить, что цвета основной палитры указаны для черного фона. Если фон другой, то основной цвет меняет оттенок.
Второй способ – смешивание красок с помощью функции RGB (по первым буквам названий цветов из основной палитры). Функция эта имеет вид RGB(c1, c2, c3), где в скобках указыва- ются три числа, устанавливающие пропорции красного, зеленого и синего цветов.
Каждое из чисел (c1, c2, c3) имеет предел от 0 до 255. Если все числа задать одинаковыми, то цвет будет одного из серых оттенков. Если все они равны нулю – цвет черный, а если 255 – цвет белый.
Третий способ – число от 0 до 16 777 215.
50
