Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

11 / тп / lections / Glava_4_-_Algoritmy

.doc
Скачиваний:
29
Добавлен:
19.05.2015
Размер:
64.51 Кб
Скачать

Глава 3. Алгоритмы

Алгоритмы обработки одномерных массивов

Вычисление суммы элементов массива. Дан массив m, состоящий из n элементов. Найти сумму элементов этого массива. Процесс накапливания суммы элементов достаточно прост. Вначале переменной s, хранящей сумму присваивается значение равное 0, затем последовательно суммируются элементы массива m. Схема алгоритма расчета суммы приведена на рис. 1

Вычисление произведения элементов. Дан массив m, состоящий из n элементов. Найти произведение элементов этого массива. Решение этой задачи сводится к тому, что значение переменной p, в которую предварительно записана 1, последовательно умножается на значение i-го элемента массива. Схема алгоритма расчета произведения приведена на рис. 2

Вычисление произведения положительных элементов. Дан массив m, состоящий из n элементов. Найти произведение положительных элементов этого массива. Решение этой задачи сводится к тому, что значение переменной p, в которую предварительно записана 1, последовательно умножается на значение i-го элемента массива, если он больше 0. Схема алгоритма расчета произведения приведена на рис. 3

Поиск максимального элемента в массиве и его номера. Дан массив m, состоящий из n элементов. Найти максимальный элемент массива и номер, под которым он хранится в массиве. Алгоритм решения этой задачи следующий. Пусть в переменной с именем max хранится значение максимального элемента массива, а в переменной с именем imax – его номер. Вначале предположим, что первый элемент массива является максимальным, и запишем его переменную max, а в imax занесем его номер, то есть 1. Затем все элементы, начиная со второго, сравним в цикле с максимальным. Если текущий элемент массива оказывается больше максимального, то записываем его значение в переменную max, а в переменную imax – текущее значение индекса i. Схема алгоритма приведена на рис. 4.

Циклический сдвиг элементов массива на две позиции влево. Дан массив m, состоящий из n элементов. Сдвинуть элементы массива влево на две позиции циклически. Под «циклически» понимается перемещение первых двух элементов массива на последние позиции, как показано на рис. 5.

Элементы m1 и m2 предварительно запишем в промежуточные переменные a и b, освободив место для сдвига. Затем элементы с 3 по n переместим в позиции на 2 меньше. Затем в элемент n-1 запишем значение a, а в позицию n – значение переменной b.

Схема алгоритма имеет вид, приведенный на рис. 6.

Записать элементы массива в обратном порядке. Алгоритм заключается в следующем: меняем местами 1-ый и n-ый элемент массива, затем 2-ой и (n-1)-ый и т.д. до середины массива. Для обмена местами двух элементов массива необходимо ввести промежуточную переменную того же типа, что и элементы массива. Тогда обмен местами элементов m1 и mn имеет вид:

t = m(1)

m(1) = m(n)

m(n)=t

Программа имеет вид:

Dim i As integer

Dim m(1 to n) As double

Dim t As double

For i=1 to n \ 2

t = m(i)

m(i) = m(n+1-i)

m(n+1-i) = t

Next i

Алгоритмы формирования двумерных массивов

Дан двумерный массив n*n. Необходимо заполнить его числами, как показано на рис.

20000

02000

00200

00020

00002

Из рисунка можно заметить, что элементы главной диагонали равны 2, а остальные элементы равны 0. Элементы главной диагонали имеют свойство равенства номера строки и номера столбца. Для заполнения массива числами необходимо перебирать последовательно элементы всех строк. Для обозначения номера строки введем переменную I, а для обозначения номера столбца введем переменную j. Для перебора всех элементов массива необходимо организовать двойной цикл (во внешнем цикле перебираются строки, а во внутреннем – столбцы). Если элемент mij имеет равные индексы, то в элемент mij записывается число 2, иначе – 0.

Дан двумерный массив n*n. Необходимо заполнить его числами, как показано на рис.

11111

11110

11100

11000

10000

Из рисунка можно заметить, что элементы на побочной диагонали и выше равны 1, а остальные элементы равны 0. Элементы побочной диагонали имеют свойство i+j=n+1, где I – номер строки, j – номер столбца. Элементы выше побочной диагонали имеют свойство i+j<n+1.

Для заполнения массива числами необходимо перебирать последовательно элементы всех строк. Для перебора всех элементов массива необходимо организовать двойной цикл (во внешнем цикле перебираются строки, а во внутреннем – столбцы). Если элемент mij имеет индекс, удовлетворяющий свойству i+j<=n+1, то в элемент mij записывается число 1, иначе – 0.

Дан двумерный массив n*n, где n – четное число. Необходимо заполнить его числами, как показано на рис.

123321

230032

300003

300003

230032

123321

Из рисунка можно заметить, что имеется сложная зависимость. Для упрощения задачи рассмотрим только левую верхнюю четверть массива.

123

230

300

Заметим, что элементы mij на побочной и выше побочной диагонали (i+j-1<=n/2+1) равны mij=i+j-1,

Элементы побочной диагонали имеют свойство i+j=n+1, где I – номер строки, j – номер столбца. Элементы выше побочной диагонали имеют свойство i+j<n+1.

Для заполнения верхней левой четверти массива числами необходимо перебирать последовательно эти элементы. Для перебора всех элементов четверти массива необходимо организовать двойной цикл (во внешнем цикле перебираются строки с первой по n/2, а во внутреннем – столбцы с первой по n/2). Если элемент mij имеет индекс, удовлетворяющий свойству i+j<=n+1, то в элемент mij записывается число i+j-1, иначе – 0.

Далее заметим, что правая верхняя четверть представляет собой зеркальное отражение левой верхней четверти относительно вертикальной оси. Поэтому

M(n-i+1,j) = m(i,j)

Выражение n-i+1 в первом индексе обеспечивает зеркальное отражение относительно вертикальной оси.

Нижняя левая четверть является отражением относительно горизонтальной оси верхней левой четверти. Поэтому m(I, n-j+1) = m(I,j).

Нижняя правая четверть является отражением относительно горизонтальной и вертикальной осей верхней левой четверти. Поэтому m(n-I+1, n-j+1) = m(I,j).

В результате, перебирая элементы верхней левой четверти, заполняем все элементы массива следующим образом:

For i=1 To n/2

For j=1 To n/2

If i+j<=n+1 Then

M(I,j)=i+j-1

Else

M(I,j)=0

End If

M(i, n+1-j)=m(I,j)

M(i+n-1, j)=m(I,j)

M(i+n-1, n+1-j)=m(I,j)

Next j

Next i

Алгоритмы обработки двумерных массивов

Посчитать количество элементов. Дан двумерный массив n*n. Посчитать количество элементов, лежащих в диапазоне [10,20].

Введем переменную c, служащую для хранения количества элементов. Вначале переменную c обнулим, то есть c=0. Затем необходимо перебирать элементы массива и проверять условие 10<=mij<=20. Если условие выполняется, то необходимо к переменной c прибавить единицу.

Схема алгоритма представлена на рис.

Условие 10<=mij<=20 на языке VB записывается как

m(I,j)>=10 And m(I,j)<=20.

Таким образом, программа имеет вид.

Увеличить элементы второй строки на 5. Для выполнения данного алгоритма необходимо перебирать элементы второй строки, что потребует введения одного цикла. В указанном цикле необходимо к элементу прибавлять 5 и заносить полученный результат в этот же элемент. Фрагмент программы имеет вид:

For j=1 to n

M(2, j) = m(2, j)+5

Next j

Найти сумму элементов главной диагонали. Индексы элементов главной диагонали удовлетворяют условиям i=j и условно лежат на одной прямой, поэтому для выполнения данного задания достаточно одного цикла

S=0

For i=1 to n

S=s+M(I,i)

Next I

Использование двух циклов потребует введения дополнительного условия и увеличения вычислительной сложности до 0(n2)

Фрагмент программы в этом случае имеет вид

S=0

For i=1 to n

For j=1 to n

If i=j Then

S=s+M(I,j)

End If

Next j

Next I

Алгоритмы поиска

Алгоритмы сортировки

Соседние файлы в папке lections