Программирование на visual basic
Скачать 1.19 Mb.
|
10.3. Задачи на двухмерные массивы действительных чисел 10.3.1. Написать программу, которая получает единичную матрицу размерности N, где N случайное число в диапазоне от 5 до 20. Полученную матрицу вывести на рабочий лист Excel. Sub МатрицаЕдиничная() Dim a() As Long, i As Long, j As Long, N As Long Randomize Timer ' Построить ряд случайных чисел N = Rnd * 15 + 5 ' N -- случайное число [5,20] ReDim a(N, N) ' Динамический двухмерный массив Sheets("Лист2").Select For i = 1 To N For j = 1 To N a(i, j) = 0 ‘ Все элементы обнулить Next j a(i, i) = 1 ' Записать на диагональ 1 Next i For i = 1 To N ' Вывести двухмерный массив на рабочий лист For j = 1 To N Cells(i, j) = a(i, j) Next j, i End Sub 10.3.2. Написать программу, которая получает матрицу размерности N, в которой элементы выше побочной диагонали равны 1, на побочной диа- гонали 0, а ниже побочной диагонали –1. N случайное число в диапазоне от 5 до 20. Полученную матрицу вывести в окно отладки. Sub МатрицаПобочнаяДиагональ1() Dim a() As Long, i As Long, j As Long, N As Long Randomize Timer ' Построить ряд случайных чисел N = Rnd * 15 + 5 ' N – случайное число [5,20] ReDim a(N, N) ' Динамический двухмерный массив For i = 1 To N For j = 1 To N If i + j < N + 1 Then 'Выше побочной диагонали a(i, j) = 1 ElseIf i + j = N + 1 Then ' На побочной диагонали a(i, j) = 0 Else 'Ниже побочной диагонали a(i, j) = -1 121 End If Next j, i For i = 1 To N ' Вывести массив в окно отладки For j = 1 To N Debug.Print Tab((j - 1) * 4); a(i, j); Next j Debug.Print ‘ Перейти на другую строку Next i End Sub 10.3.3. Написать программу, которая получает матрицу размерности N. N случайное число в диапазоне от 5 до 20. Полученную матрицу вывести в ячейки рабочего листа Excel. Раскрасить различными цветами ячейки с разными числами. 10 1 1 1 … 1 1 1 20 4 10 1 1 … 1 1 20 2 4 4 10 1 … 1 20 2 2 … … … … … … … … … 4 4 4 20 … 10 2 2 2 4 4 20 3 … 3 10 2 2 4 20 3 3 … 3 3 10 2 20 3 3 3 … 3 3 3 10 Sub Матрица933() Dim a() As Long, i As Integer, j As Integer, N As Long, alph As String Randomize Timer ' Построить ряд случайных чисел N = Rnd * 15 + 5 ' N -- случайное число [5,20] ReDim a(N, N) ' Динамический двухмерный массив Sheets("Лист1").Select alph = "abcdefghijklmnopqrstuvwxyz" Range("a1:z26").Clear For i = 1 To N For j = 1 To N If j > i And i + j < N + 1 Then a(i, j) = 1: Call FillColor(i, Mid(alph, j, 1), 22) ElseIf j > i And i + j > N + 1 Then a(i, j) = 2: Call FillColor(i, Mid(alph, j, 1), 23) ElseIf j < i And i + j > N + 1 Then a(i, j) = 3: Call FillColor(i, Mid(alph, j, 1), 24) ElseIf j < i And i + j < N + 1 Then a(i, j) = 4: Call FillColor(i, Mid(alph, j, 1), 27) ElseIf i = j Then a(i, j) = 10: Call FillColor(i, Mid(alph, j, 1), 26) Else a(i, j) = 20: Call FillColor(i, Mid(alph, j, 1), 28) End If Next j, i For i = 1 To N ' вывести массив на рабочий лист 122 For j = 1 To N Cells(i, j) = a(i, j) Next j, i End Sub ‘ закрасить ячейку ci цветом Color Sub FillColor(i As Integer, c As String, Color As Integer) Range(c + Trim(Str(i))).Interior.ColorIndex = Color End Sub 10.3.4. Написать програм- му, которая получает приведенную справа матрицу размерности N+1. N случайное число в диапазоне от 5 до 15. Sub Матрица934() Dim a() As Long, i As Integer, j As Integer, N As Long Randomize Timer ' Построить ряд случайных чисел N = Rnd * 10 + 5 ' Т -- случайное число [5,15] ReDim a(N, N) ' Динамический двухмерный массив For i = 1 To N ' Это заполнение матрицы ниже главной диагонали a(i, i) = 1 ' На главной диагонали For j = 1 To i - 1 'Ниже главной диагонали элементы=0 a(i, j) = 0 Next j, i For i = 1 To N - 1 ' Выше главной диагонали For j = i + 1 To N a(i, j) = a(i, j - 1) * 2 Next j, i For i = 1 To N ' Вывод полученной матрицы For j = 1 To N Debug.Print Tab((j - 1) * 6); a(i, j); Next j, i End Sub 10.3.5. При помощи датчика случайных чисел получить матрицу A по- рядка N. (N – целое случайное число в диапазоне от 6 до 15). Отсортиро- вать по убыванию только те строки матрицы A , в которых среднеарифме- тическая сумма элементов больше среднеарифметического значения сум- мы элементов матрицы A Вывести обе матрицы в ячейки рабочего листа Sub Матрица935() Dim a() As Long, i As Integer, j As Integer, N As Long, sm As Double Dim sc As Long, k As Long, t As Long, Alph As String Randomize Timer ' Построить ряд случайных чисел N = Rnd * 10 + 5 ' N – случайное число [5,15] ReDim a(N, N) ' Динамический двухмерный массив 1 0 0 0 0 0 0 2 1 0 0 0 0 0 2 2 2 2 1 0 0 2 2 2 4 2 1 0 2 2 2 8 4 2 1 2 3 4 1 2 3 1 2 − − − − − − − − N N N N N N N N N 123 Sheets("Лист3").Select Alph = "abcdefghijklmnop" ' Очистить область вывода матриц Range("a1:" + Mid(Alph, N + 3, 1) + Trim(Str(2 * N + 2))).Clear 'Закрасить область вывода матриц Range("a1:" + Mid(Alph, N, 1) + Trim(Str(N))).Interior.ColorIndex = 35 Range("a" + Trim(Str(N + 2)) + ":" + Mid(Alph, N, 1) + _ Trim(Str(2 * N + 1))).Interior.ColorIndex = 36 sm = 0 ' Сумма всех элементов матрицы For i = 1 To N For j = 1 To N a(i, j) = Rnd * 100 sm = sm + a(i, j) Cells(i, j) = a(i, j) Next j, i sm = sm / N ^ 2 ' Среднее значение элементов матрицы Debug.Print "среднее значение элементов матрицы ="; sm For i = 1 To N sc = 0 For j = 1 To N ' Сумма элементов j-того столбца sc = sc + a(i, j) Next j ' Среднеарифметическое значение элементов j-того столбца sc = sc / N Cells(i, N + 2) = sc If sc > sm Then ' Выделить строку, которую изменяли, цветом номер 37 Range("a" + Trim(Str(N + 1 + i)) + ":" + Mid(Alph, N, 1) + _ Trim(Str(N + 1 + i))).Interior.ColorIndex = 37 For k = 1 To N - 1 ' Это сортировка методом пузырька For j = 1 To N - k If a(i, j + 1) > a(i, j) Then t = a(i, j + 1): a(i, j + 1) = a(i, j): a(i, j) = t End If Next j, k End If For j = 1 To N ' Вывод преобразованной матрицы Cells(N + 1 + i, j) = a(i, j) Next j Next i End Sub 10.3.6. Дана действительная квадратная матрица A порядка N. Получить одномерный массив b размерности 2N-1 по формулам: ; ; ; ; ; ; ; , 1 1 2 , 2 1 , 1 2 2 , 2 , 2 1 , 1 3 , 2 , 1 1 , 2 3 2 , 1 , 1 2 1 , 1 n n n n n n n n n n n n n n a b a a b a a a b a a a b a a b a b = + = + + + = + + = + = = − − − − − − … … … 124 Т.е. сумма элементов по поддиагоналям параллельным главной диаго- нали. Sub Матрица936() Dim a() As Long, b() As Long, i As Integer, j As Integer, N As Long, _ k As Long Randomize Timer ' Построить ряд случайных чисел N = Val(InputBox("Введите размерность матрицы")) ReDim a(N, N), b(2 * N - 1) ' Динамические массивы Sheets("Лист1").Select For i = 1 To N For j = 1 To N a(i, j) = Rnd * 100 Cells(i, j) = a(i, j) ' Номер элемента массива b, соответст. элементу a(i,j) k = N - (i - j) b(k) = b(k) + a(i, j) ' Накопить в массиве b Next j, i For i = 1 To 2 * N - 1 Cells(N + 2, i) = b(i) Next i End Sub 10.3.7. Дана действительная квадратная матрица A порядка N. Повер- нуть ее на 90 0 против часовой стрелки. Решение. Нетрудно доказать, что поворот матрицы на 90 0 можно осу- ществить при помощи двух последовательных преобразований: 1) транспонирования матрицы, т.е. перестановки местами строк и столбцов; 2) инвертирования строк матрицы, т.е. перестановки 1-ой строки с по- следней; 2-ой с предпоследней и так до средней строки. Sub Матрица937() Dim a() As Long, i As Integer, j As Integer, N As Long, t As Long Randomize Timer ' построить ряд случайных чисел N = Val(InputBox("Введите размерность матрицы")) ReDim a(N, N): Sheets("Лист1").Select For i = 1 To N ' Получить матрицу и вывести на Лист1 For j = 1 To N a(i, j) = Rnd * 100 Cells(i, j) = a(i, j) Next j, i ' Транспонировать матрицу (поменять местами строки со ‘столбцами) For i = 2 To N For j = 1 To i - 1 t = a(i, j): a(i, j) = a(j, i): a(j, i) = t Next j, i ' Переставить местами 1-ю строку с N-ой; 2-ую с N-1 и 125 ‘так до средней For i = 1 To N \ 2 For j = 1 To N t = a(i, j): a(i, j) = a(N + 1 - i, j): a(N + 1 - i, j) = t Next j, i For i = 1 To N ' Вывести преобразованную матрицу For j = 1 To N Cells(N + 1 + i, j) = a(i, j) Next j, i End Sub 11. Хранение чисел в памяти компьютера К числовой информации относятся следующие типы данных: • Целые числа ─ Byte, Integer, Long. • Числа с фиксированной запятой ─ Currency, Decimal. • Вещественные числа ─ Single, Double. • Числа для описания даты ─ Date. • Логические числа ─ Boolean. Все эти числа в памяти компьютера хранятся в двоичном виде, но раз- ными методами. Мы рассмотрим методы хранения некоторых из стан- дартных типов. 11.1. Перевод натуральных чисел в различные системы счисления Существуют несколько систем счета и записи числовой информации. Наиболее известные системы счисления, дошедшие до наших дней, это римская система счисления и десятичная позиционная система. Римская система счисления основана на семи символах: I, V, X, L, C, D и M. Каждый символ равен определенному десятичному числу. Символ I =1, V=5, X=10, L=50, C=100, D =500 и M=1000. Любое число записывает- ся в виде комбинации этих цифр, при этом действуют следующие правила. Если в комбинации буквы идут в порядке от больших к меньшим, то соот- ветствующие числа складываются, а если какие-то буквы нарушают этот порядок, то их значения вычитаются из следующей буквы. Примеры XXXVII = 10+10+10+5+1+1=37. MMDCXVIII = 1000+1000+500+100+10+5+1+1+1=2617. IV = (5-1) = 4. MCMXCIX = 1000+(1000-100)+(100-10)+(10-1)=1999. В настоящее время особую роль играет десятичная позиционная систе- ма счисления. Она основана на десяти цифрах: 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9. Кроме того, информацию несет не только цифра, но и ее позиция в числе. 126 Любое n-значное число A в десятичной системе счисления можно записать в виде суммы n+1 слагаемого: A =α n 10 n + α n-1 10 n-1 +…+ α 2 10 2 + α 1 10 1 + α 0 10 0 С появлением компьютеров особое значение приобрела двоичная, восьмеричная и шестнадцатеричная системы счисления. В двоичной системе счисления используются только две цифры: 0 и 1. В восьмеричной системе – восемь цифр: 0, 1, 2, 3, 4, 5, 6 и 7. В шестна- дцатеричной – 16 цифр: 0,1,2,3,4,5,6,7,8,9,a, b, c, d, e и f. Можно все по- следние системы обобщить и назвать p-ичной системой. Число p называет- ся основанием системы счисления. Мы будем рассматривать системы счисления с основанием p в пределах от 2 до 36. Для p–ичной системы счисления выбираем p первых цифр из строки Alph, состоящей из 36 сим- волов: Alph=”0123456789abcdefghijklmnopqrstuvwxyz”. (11.1) При этом маленькие и большие латинские буквы принимаются одинаковыми. Запись числа A в p-ичной системе счисления представляется в виде по- следовательности цифр, после которой на нижнем индексе записывается число p, указывающее основание системы счисления. A= α n α n-1 … α 1 α 0 p Это же число можно представить в виде суммы n+1-го слагаемого: A = p n + α n-1 p n-1 +…+ α 2 p 2 + α 1 p 1 + α 0 p 0 , (11.2) где α i – i-тая цифра числа. Алгоритм перевода числа A = α n α n-1 … α 1 α 0 p в десятичную систему счисления. По формуле (11.2) находим сумму n-1-го слагаемого, при этом вместо цифр α i берется десятичное число, которое на единицу меньше положения символа α i в строке Alph (11.1). Примеры. 7CF 16 =7 . 16 2 + 12 . 16 1 + 15 . 16 0 = 1999. 3717 8 =3 . 8 3 +7 . 8 2 +5 . 8 1 +6 . 8 0 =1999. 11111001111 2 =1 . 2 11 +1 . 2 10 +1 . 2 9 +1 . 2 8 +1 . 2 7 +1 . 2 6 +0 . 2 5 +0 . 2 4 +1 . 2 3 + 1 . 2 2 + 1 . 2 1 + 1 . 2 0 = 1999. 1jj 36 =1 . 36 2 + 19 . 36 1 +19 . 36 0 =1999. Рассмотрим теперь обратную задачу – перевод десятичного числа в произвольную систему. Результатом перевода является строка S, состоя- щая из символов соответствующей системы счисления. Алгоритм перевода положительного десятичного числа A в p-ичную систему счисления: 1. S=””. 2. Вычисляем остаток от деления A на p. α = A Mod p. Дописываем слева к символьной переменной S символ номер α+1 из строки Alph (11.1). 3. Делим нацело десятичное число A на p, записав результат в ту же переменную A. 127 4. Если A≠0, перейти на пункт 2. 5. Вывести полученное в p-ичной системе счисления число S. Пример 1. Число 172 перевести в двоичную систему счисления. В таблице представлены этапы перевода этого числа в двоичную сис- тему счисления. Таким образом, 172 = 10101100 2 . Делимое 172 86 43 21 10 5 2 1 Результат деления 86 43 21 10 5 2 1 0 Остаток 0 0 1 1 0 1 0 1 Строка S 0 00 100 1100 01100 101100 0101100 10101100 Пример 2. Число 1999 перевести в шестнадцатеричную и тридцатише- стеричную системы счисления. 1999=7CF 16 =1JJ 36 16-ричная 36-ричная Делимое 1999 124 7 Делимое 1999 55 1 Частное 124 7 0 Частное 55 1 0 Остаток 15 12 7 Остаток 19 19 1 Строка S F CF 7CF Строка S J JJ 1JJ 11.2. Программы перевода чисел в p-ичную систему счисления 11.2.1. Написать программу, которая переводит введенное с клавиату- ры число в двоичную, восьмеричную, шестнадцатеричную и тридцатише- стеричную системы счисления. Решение: Напишем вначале функцию, которая по приведенному выше алгоритму переводит целое неотрицательное число в произвольную систе- му счисления. Функция имеет два параметра a и p . Параметр a внутри функции из- меняется, поэтому он передается по значению. Т.е. при вызове функции создается копия переменной a и в программе происходят изменения толь- ко копии параметра. Function ПереводЧиселИз10ВP(ByVal a As Long, p As Integer) _ As String Dim alph As String, k As Integer, i As Integer, s As String alph = "0123456789abcdefghijklmnopqrstuvwxyz" ПереводЧиселИз10ВP = "" ‘ Если ошибка входных параметров If p< 2 Or p > 36 Then 'Контроль основания системы счисления MsgBox "Ошибка в основании системы счисления!” + “ Основание системы не может быть равно" + Str(p) Exit Function End If If a < 0 Then ' Контроль. Число должно быть положительное MsgBox "Ошибка! Число должно быть >0. Число = " + Str(a) Exit Function 128 End If Do ‘ Алгоритм перевода числа из десятичной в p-ичную ' К строке s слева дописываем цифру, соответствующую ‘ остатку от деления a на p s = Mid(alph, (a Mod p) + 1, 1) + s a = a \ p Loop While a <> 0 ПереводЧиселИз10ВP = s End Function Ниже приведена основная программа, в которой при помощи функции InputBox вводится число a. В окно отладки выводятся само число a , а так- же двоичное, восьмеричное, шестнадцатеричное и тридцатишестеричное значения этого числа. Sub ТестПереводЧиселИз10() Dim a As Long a = Val(InputBox("Введите натуральное число")) Debug.Print "Десятичное ="; a Debug.Print "Двоичное ="; ПереводЧиселИз10ВP(a, 2) Debug.Print "Восьмеричное ="; ПереводЧиселИз10ВP (a, 8) Debug.Print "Шестнадцатеричное ="; ПереводЧиселИз10ВP (a, 16) Debug.Print "Тридцатишестеричное ="; ПереводЧиселИз10ВP (a, 36) End Sub 11.2.2. Написать программу, которая переводит введенное с клавиату- ры число, записанное в произвольной системе счисления, в десятичную систему счисления. Function ПереводЧиселИзПроизвольнойВ10 (S As String, p As Integer) _ As Long Dim i As Integer, n As Integer, pow As Long, a As Long, alph As String Dim digit As Integer alph = "0123456789abcdefghijklmnopqrstuvwxyz" n = Len(Trim(S)) ' Количество цифр в числе pow = 1: a = 0 For i = 1 To n ' Код цифры в десятичной системе счисления. Цифры выбираем ‘ справа налево (с младшего разряда к старшему) digit = Val(InStr(alph, Mid(S, n + 1 - i, 1)) - 1) If digit > p Or digit < 0 Then ' Если цифра выходит из диапазона [0,p-1] MsgBox ("Ошибка при вводе числа") Exit Function End If a = a + digit * pow ' Накопление суммы (11.2) digit*p^(i-1) if i < n then pow = pow * p 'p в степени i Next i ПереводЧиселИзПроизвольнойВ10 = a 129 End Function Для проверки правильности работы функции напишем основную про- грамму. Sub ТестПереводЧиселИзПроизвольнойВ10() Dim a As String, p As Integer a = InputBox("Введите число в произвольной системе счисления") p = Val(InputBox("Введите основание системы счисления")) Debug.Print "Число в "; p; "-pичной системе ="; a Debug.Print "Десятичное значение числа="; _ ПереводЧиселИзПроизвольнойВ10(a, p) End Sub |