Решение задач с помощью стандартных программ
Алгоритмы, с помощью которых обрабатываются одномерные массивы, очень похожи на обработку последовательностей. Особенностью использования массивов заключается в том, что в массиве одновременно доступны все его компоненты. Такой доступ называется параллельным.
Пример 29. Дан массив чисел. Найти значение максимального элемента. Если таких элементов несколько, то определить, сколько их.
Решение. Эта задача может быть решена за один просмотр элементов массива. Вначале устанавливаем текущий max по первому элементу массива MAX = MASS(1) и запоминаем количество максимумов К = 1. Затем выбираем очередной элемент MASS(1) массива и сравниваем его с MAX. В случае равенства увеличиваем значение К на 1. Если текущий максимум меньше элемента MAS (I), то переписываем его MAX = MASS(1) и устанавливаем значение К в единицу. После окончания просмотра выводим результаты на экран.
В данном случае считывание элементов массива разумно совместить с процессом обработки, но можно осуществить и двумя последовательными циклами (первый цикл - ввод элементов массива, второй цикл - поиск максимума).
Sub Max()
Dim n As Integer
Dim i As Integer
Dim Mass() As Integer
Dim Max As Integer, k As Integer
n = InputBox("Введите количество элементов массива")
ReDim Mass(n)
Mass(1) = InputBox("Введите значение 1-го элемента", "Ввод элементов массива")
For i = 2 To n
Mass(i) = InputBox("Введите значение " & i & "-го элемента массива", " Ввод элементов массива ")
If Mass(i) = Max Then k = k + 1
If Mass(i) > Max Then k = 1: Max = Mass(i)
Next i
MsgBox "Максимальный элемент равен " & Max & ". Их количество_ равно " & k, , "Ответ"
End Sub
Пример 30. Дан массив чисел. Найти, сколько в нем пар одинаковых соседних элементов.
Sub Para()
Dim n As Integer
Dim i As Integer
Dim Mass() As Integer
Dim k As Integer
n = InputBox("Введите количество элементов массива")
ReDim Mass(n)
For i = 1 To n
Mass(i) = InputBox("Введите значение " & i & "-го элемента массива", " Ввод элементов массива ")
Next i
k = 0
For i = 2 To n%
If Mass(i) = Mass(i - 1) Then k = k + 1
Next i
MsgBox "Количество пар равно " & k, , "Ответ"
End Sub
Пример 31. Расположить N чисел массива А в порядке возрастания.
Решение. Сравниваем между собой первый и второй элементы массива и переставляем их, если это необходимо в порядке возрастания. Затем то же самое проделываем со вторым и третьим элементами и т.д. до конца массива. В результате этих сравнений и перестановок наибольшее число окажется последним. Второй этап сравнений и перестановок будем производить для (n -1) элементов, начиная с первого. В этом случае предпоследним окажется наибольший из (n -1) членов массива. Уменьшая каждый раз количество элементов на единицу, операции сравнения и перестановок закончим тогда, когда останется всего один элемент массива. Перестановку элементов будем осуществлять через промежуточную переменную p.
Sub Sotirovka()
Dim n As Integer
Dim i As Integer, j As Integer, p As Integer
Dim Mass() As Integer
n = InputBox("Введите количество элементов массива")
ReDim Mass(n)
Dim str_msg1 As String, str_msg2 As String
str_msg1 = "": str_msg2 = ""
For i = 1 To n
Mass(i) = InputBox("Введите значение " & i & "-го элемента массива", " Ввод элементов массива ")
str_msg1 = str_msg1 & Mass(i) & ", "
Next i
For j = n - 1 To 2 Step -1
For i = 1 To j
If Mass(i) > Mass(i + 1) Then
p = Mass(i + 1): Mass(i + 1) = Mass(i): Mass(i) = p
End If
Next i
Next j
For i = 1 To n
str_msg2 = str_msg2 & Mass(i) & ", "
Next i
MsgBox "Исходный массив:" & Chr(13) & str_msg1 & Chr(13) & "Отсортированный массив:" & Chr(13) & str_msg2, , "Результат"
End Sub
Результат:
Пример 32. Найти в массиве А числа, кратные заданному целому М, вывести на печать их численное значение и индекс.
Для выбора кратных чисел используем следующее соображение: делимое делится без остатка на делитель в том случае, когда целая часть такой дроби равна самой дроби. В QB подобное сравнение можно записать, используя элементарную функцию INT. Так, если А (I) – элемент массива, а М – делитель, условный оператор будет иметь следующий вид:
IF INT(a(i) / m) = a(i) / m THEN PRINT i, a(i)
Для уменьшения количества циклов ввод элементов массива и проверку делимости объединим в один цикл.
Sub Para()
Dim n As Integer, m As Integer
Dim i As Integer
Dim Mass() As Integer
n = InputBox("Введите количество элементов массива")
ReDim Mass(n)
Dim str_msg As String
str_msg = ""
For i = 1 To n
Mass(i) = InputBox("Введите значение " & i & "-го элемента массива", " Ввод элементов массива ")
Next i
m = InputBox("Введите целое положительное число")
For i = 1 To n
If Int(Mass(i) / m) = Mass(i) / m Then str_msg = str_msg & "i= " & i & " Mass(i)= " & Mass(i) & ", " & Chr(13)
Next i%
MsgBox "Ответ:" & Chr(13) & str_msg
End Sub
Результат:
Алгоритмы, предназначенные, для обработки двумерных массивов могут быть структурированы как:
– алгоритмы поиска;
– алгоритмы выборки;
– алгоритмы сортировки;
– алгоритмы преобразования матрицы.
Пример 33. Дана матрица N x M, состоящая из натуральных чисел. Найти в ней наименьший элемент и определить его местоположение. Если таких элементов несколько, то вывести на экран положение каждого из них.
Решение. Для решения воспользуемся тем, что к элементам массива осуществляется параллельный доступ и возможен многократный просмотр. Поэтому можно организовать два просмотра матрицы. За один просмотр находим минимальный элемент, и если таких элементов несколько, то за другой просмотр определяем их местоположение. Для решения задачи:
1. вводим размеры массива MAS и значения его элементов;
2. просматриваем элементы массива, ищем минимальное значение и запоминаем значение индексов;
3. считаем количество минимальных элементов;
4. в зависимости от К либо выводим информацию о единственном минимальном элементе, либо организуем повторный просмотр массива MAS для вывода информации о всех минимальных элементах.
Sub Min()
Dim n As Integer, m As Integer, k As Integer
Dim i As Integer
Dim Mass() As Integer
Dim min As Integer, imin As Integer, jmin As Integer
n = InputBox("Введите количество строк")
m = InputBox("Введите количество столбцов")
ReDim Mass(n, m)
Dim str_msg As String
str_msg = ""
k = 0
'ввод массива
For i = 1 To n
For j = 1 To m
Mass(i, j) = InputBox("Введите значение для " & "элемента (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)
Next j
Next i
'поиск минимумов и их подсчет
min = Mass(1, 1)
imin = 1: jmin = 1: k = 0
For i = 1 To n
For j = 1 To m
If min = Mass(i, j) Then k = k + 1
If Mass(i, j) < min Then k = 1: imin = i: jmin = j: min = Mass(i, j)
Next j
Next i
str_msg = str_msg & "Количество минимальных элементов " & k & Chr(13)
If k = 1 Then
str_msg = str_msg & " i = " & imin & " j = " & jmin & " min = " & min
ElseIf k > 1 Then
For i = 1 To n
For j = 1 To m
If Mass(i, j) = min Then
str_msg = str_msg & " i = " & i & " j = " & j & " min = " & min & Chr(13)
End If
Next j
Next i
End If
MsgBox "Ответ:" & Chr(13) & str_msg
End Sub
Результат:
Пример 34. Дана матрица N x M состоящая из натуральных чисел. Выбрать в строках самые левые наименьшие элементы и поставить их в первый столбец.
Решение. Для решения этой задачи нужно сначала найти самый левый минимальный элемент в строке и запомнить его местоположение, а затем поменять его местами с элементом в первом столбце.
Sub Min()
Dim n As Integer, m As Integer, k As Integer
Dim i As Integer, j As Integer
Dim Mass() As Integer
Dim Min As Integer, jmin As Integer
n = InputBox("Введите количество строк")
m = InputBox("Введите количество столбцов")
ReDim Mass(n, m)
Dim str_msg As String, str_msg1 As String
str_msg = "": str_msg1 = ""
'ввод массива и подготовка вывода на печать
For i = 1 To n
For j = 1 To m
Mass(i, j) = InputBox("Введите значение для " & "элемента (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)
str_msg = str_msg & Mass(i, j) & ","
Next j
str_msg = str_msg & Chr(13)
Next i
For i = 1 To n
Min = Mass(i, 1)
jmin = 1
For j = 1 To m - 1
If Mass(i, j) < Min Then jmin = j: Min = Mass(i, j)
Next j
k = Mass(i, 1): Mass(i, 1) = Mass(i, jmin): Mass(i, jmin) = k
Next i
For i% = 1 To n%
For j% = 1 To m%
str_msg1 = str_msg1 & Mass(i, j) & ","
Next j
str_msg1 = str_msg1 & Chr(13)
Next i
MsgBox "Исходный массив: " & Chr(13) & str_msg & Chr(13) & "Преобразованный массив: " & Chr(13) & str_msg1
End Sub
Результат:
Пример 35. Дана матрица N x M. Отсортировать каждую строку в порядке возрастания.
Решение. Для решения задачи:
1. вводим размеры массива MAS и значения его элементов;
2. просматриваем строки массива и упорядочиваем их;
3. выводим матрицу на экран.
Для решения этой задачи воспользуемся алгоритмом упорядочивания одномерного массива.
Sub Sortirovka()
Dim n As Integer, m As Integer, k As Integer, p As Integer
Dim i As Integer, j As Integer
Dim Mass() As Integer
Dim Min As Integer, jmin As Integer
n = InputBox("Введите количество строк")
m = InputBox("Введите количество столбцов")
ReDim Mass(n, m)
Dim str_msg As String, str_msg1 As String
str_msg = "": str_msg1 = ""
'ввод массива и подготовка вывода на печать
For i = 1 To n
For j = 1 To m
Mass(i, j) = InputBox("Введите значение для " & "элемента (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)
str_msg = str_msg & Mass(i, j) & ","
Next j
str_msg = str_msg & Chr(13)
Next i
For i = 1 To n
'сортировка одномерного массива
For k = m - 1 To 2 Step -1
For j = 1 To k
If Mass(i, j) > Mass(i, j + 1) Then
p = Mass(i, j): Mass(i, j) = Mass(i, j + 1): Mass(i, j + 1) = p
End If
Next j
Next k
Next i
'подготовка к печати отсортированного массива
For i = 1 To n
For j = 1 To m
str_msg1 = str_msg1 & Mass(i, j) & ","
Next j
str_msg1 = str_msg1 & Chr(13)
Next i
MsgBox "Матрица до преобразования: " & Chr(13) & str_msg & Chr(13) & "Матрица после преобразования: " & Chr(13) & str_msg1
End Sub
Решение:
Дата добавления: 2015-08-14; просмотров: 884;