- •Тема: «Разработка приложений с использованием одномерных массивов»
- •1. Массивы
- •1.1. Общие принципы организации массивов
- •1.2. Обращение к элементу массива имя_массива(Индекс)
- •1.3. Статический массив
- •1.4. Динамический массив
- •1.5. Типовые приемы работы с одномерными массивами
- •1. Заполнение массива данными
- •2. Преобразование массива (действия с элементами массива)
- •3. Вывод массива или отдельных его элементов
- •1.6. Массивы однотипных элементов
- •2. Типовые задачи на обработку одномерных массивов
- •2.1. Поиск максимального (минимального) значения в массиве
- •2.2. Подсчет суммы значений элементов массива и среднего значения для элементов массива
- •2.3. Перестановка элементов массива в обратном порядке
- •2.4. Циклический сдвиг элементов массива
- •2.5. «Сжатие» массива
- •2.6. Сортировка элементов массива
- •3. Упражнения
- •4. Задания для самостоятельного выполнения
- •1. Выполните следующие задания на заполнение массива
- •4. Выполните следующие задания на обработку элементов одномерного массива. Дополнительный массив не использовать.
- •5. Выполните следующие задания на обработку элементов одномерного массива. Дополнительный массив не использовать.
2.2. Подсчет суммы значений элементов массива и среднего значения для элементов массива
3. Дан целочисленный массив. Подсчитать число элементов, больших среднего значения всех элементов массива.
Решение. Задача делится на две подзадачи: сначала надо найти среднее значение элементов массива (за один проход по массиву), а затем подсчитать количество элементов со значением, превышающим найденное среднее (второй проход по массиву).
4. Магазин обслуживает за день 200 покупателей, каждый из которых потратил на покупку не более 1000 рублей. Подсчитать дневную прибыль магазина и сумму среднего потребительского чека.
Решение. Ниже представлен фрагмент кода для решения этой задачи. Отметим, что данную задачу можно решить без использования массива, обрабатывая каждый элемент последовательно. Если же в условии задачи необходимо будет найти всех покупателей, которые потратили на покупку сумму, превосходящую средний чек за день, то использование массива будет необходимостью.
Const n As Integer = 200, m As Integer = 1000
Dim mas(1 To n) As Integer
Dim i As Integer, sum As Long
Randomize
For i = 1 To n
mas(i) = Int(m * Rnd)
Next
sum = 0
For i = 1 To n
sum = sum + mas(i)
Next
MsgBox "Прибыль магазина: " + str(sum)
MsgBox "Средний чек: " + Format(sum / n,”0.00”)
2.3. Перестановка элементов массива в обратном порядке
5. Не используя других массивов, переставить элементы целочисленного массива в обратном порядке.
Решение. Для всех индексов
необходимо
каждый i-й элемент поменять местами
с
-м
элементом. Обратите внимание, что для
обмена местами левой и правой половин
массива цикл должен отработать только
раз при любом n (как четном, так и
нечетном). Ниже приведен фрагмент кода.
For i = 1 To n \ 2
t = X(i)
X(i) = X(n – i + 1)
X(n – i + 1) = t
Next
2.4. Циклический сдвиг элементов массива
6. Значения массива сдвинуть циклически вправо на одну позицию так, чтобы последний элемент стал первым.
Решение
Const n As Integer = 10
Dim X(1 To n) As Integer
Dim i As Integer, t As Integer
... 'заполнение массива данными
t = X(n)
For i = n To 2 Step -1
X(i) = X(i - 1)
Next
X(1) = t
7. Значения массива сдвинуть циклически вправо на k позиций.
Решение. Эту задачу можно решить следующим способом: выполнить k раз код из предыдущей задачи.
2.5. «Сжатие» массива
«Сжатие» (уплотнение) массива – это удаление из него элементов, отвечающих тем или иным условиям.
8. Дан целочисленный массив размерности n. «Сожмите» массив, выбросив из него каждый второй элемент. «Освободившиеся места» в правой части массива заполните нулями. Дополнительный массив не использовать.
Решение
Const n As Integer = 10
Dim A(1 to n) As Integer
Dim i As Integer, j As Integer, k As Integer
... ' заполнение массива данными
k = 0
i = 1
Do while i <= n
A(i – i \ 2) = A(i) ' перемещаем элемент с нечетным индексом
' на «свое» (новое) место
i = i + 2
Loop
For i = n – n \ 2 + 1 to n
A(i) = 0 ' последние (n – n \ 2 + 1) элементы обнуляем
Next
... ' вывод элементов массива
9. Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [0,10]. Удалить из него все нулевые элементы. Дополнительный массив не использовать.
Решение
1-й способ:
Dim n As Integer
Dim A() As Integer ' описание динамического массива целых чисел
Dim i As Integer, j As Integer
n = InputBox("Введите количество элементов массива")
ReDim A(1 To n) ' задать массиву А длину n
Randomize
For i = 1 To n
A(i) = Int(Rnd * 11) ' присвоить элементу массива случайное
' целое число из отрезка [0, 10]
Next i
i = 1
Do While i <= n ' цикл последовательного перебора имеющихся в
' массиве элементов; изначально их n штук
If A(i) <> 0 Then
i = i + 1 ' увеличение параметра цикла, если элемент не равен 0
Else
For j = i to n – 1 ' цикл для удаления из массива нулевого
A(j) = A(j + 1) ' элемента, т.е. на его место записывается
' значение элемента с индексом i+1, на его
Next ' место следующий элемент и т.д.
n = n - 1 ' уменьшение на единицу количества элементов массива
End If
Loop
ReDim Preserve A(1 To n)' изменить размер массива, сохранив данные
... ' вывод элементов массива
2-й способ:
Dim n As Integer
Dim A() As Integer
Dim i As Integer, k As Integer
n = InputBox("Введите количество элементов массива")
ReDim A(1 To n)
... ' заполнение массива случайными числами
k = 0
For i = 1 To n
If A(i) = 0 Then ' подсчитываем количество нулей
k =k + 1
Else
A(i – k) = A(i) ' перемещаем ненулевой элемент на первое
End If ' свободное место
Next
n = n – k ' количество элементов массива
ReDim Preserve A(1 To n)
... ' вывод элементов массива
