Главная страница
Навигация по странице:

  • 11. Хранение чисел в памяти компьютера

  • 11.1. Перевод натуральных чисел в различные системы счисления

  • Alph=”0123456789abcdefghijklmnopqrstuvwxyz”.

  • Примеры. 7CF 16 =7. 16 2 + 12. 16 1 + 15. 16 0 = 1999. 3717 8 =3. 8 3 +7.

  • Пример 1. Число 172 перевести в двоичную систему счисления. В таблице представлены этапы перевода этого числа в двоичную сис- тему счисления. Таким образом, 172

  • 10101100 2 .

  • Программирование на visual basic


    Скачать 1.19 Mb.
    НазваниеПрограммирование на visual basic
    Анкорvb.pdf
    Дата05.06.2021
    Размер1.19 Mb.
    Формат файлаpdf
    Имя файлаvb.pdf
    ТипУчебное пособие
    #214287
    страница14 из 17
    1   ...   9   10   11   12   13   14   15   16   17
    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
    1   ...   9   10   11   12   13   14   15   16   17


    написать администратору сайта