Основы программирования на C++, PASCAL
Пусть из рассмотренного выше массива температур требуется отобрать самую высокую температуру и номер месяца, ей соответствующего. Идея алгоритма решения этой задачи: чтобы получить максимальную температуру в вещественной переменной TMах, сначала в нее заносится первое значение массива T[1]. Затем поочередно сравнивается значение TMах с остальными элементами массива температур, и каждое значение большее, чем TMах, присваивается этой переменной. Для получения номера самого теплого месяца в целой переменной NumMax в нее следует каждый раз засылать номер элемента массива температур одновременно с занесением в TMах его значения.
ТМах:=Т[1];
NumMax:=1;
For I:=2 To 12 Do
If T[I]>Tmax
Then
Begin
TMax:=T[I];
NumMax:=1
End;
Заметим, что если в массиве температур несколько значений, равных максимальному, то в NumMax будет получен первый номер из этих элементов. Чтобы получить последнюю дату, нужно в операторе If заменить знак отношения > на >=.
Пример 3. Сортировка массива. В одномерном массиве Х из N элементов требуется произвести перестановку значений так, чтобы они расположились по возрастанию, т.е. Х1 ≤ Х2 ≤... ≤ ХN.
Существует целый класс алгоритмов сортировки. Ниже описан алгоритм, который называется «метод пузырька».
Идея: производится последовательное упорядочивание смежных пар элементов массива: Х1 и X2, Х2 и Х3,.... ХN-1 и ХN. В итоге максимальное значение переместится в ХN. Затем ту же процедуру повторяют до XN-1 и т.д., вплоть до цепочки из двух элементов Х1 и X2. Такой алгоритм будет иметь структуру двух вложенных циклов с внутренним циклом — переменной (сокращающейся) длины.
For I:=1 То N-l Do
For K:=l To N-I Do
If Х[К]>Х [K+l]
Then
Begin
А:=Х[К];
Х[К]:=Х[К+1];
Х[К+1]:=А
End;
Пример 4. Дан описанный выше двумерный массив среднемесячных температур за 10 лет. Определить, в каком году было самое теплое лето, т. е. в каком году была наибольшая средняя температура летних месяцев.
Идея решения: в векторе S получить средние температуры летних месяцев за 10 лет. Затем найти номер наибольшего элемента в этом векторе, это и будет искомый год.
Program Example_2;
Type Month=Array[l..12] Of Real;
Year=Array[1981..1990] Of Month;
Var H: Year;
S: Array[1981..1990] Of Real;
I,J,K: Integer;
Begin {Ввод данных с клавиатуры)
For I:=1981 То 1990 Do
For J:=l To 12 Do
Begin
Write(J:2,'.',I:4,':');
ReadLn(H[I,J])
End;
{Вычисление вектора средних летних температур}
For I:=1981 To 1990 Do
Begin S[I]:=0;
For J: =6 To 8 Do
S[I]:=S[I]+H[I,J];
S[I]:=S[I]/3
End;
{Определение года с самым теплым летом}
К:=1981;
For I:=1982 То 1990 Do
If S[I]>S[K] Then K:=I;
WriteLn('Самое теплое лето было в', К,'-м году')
End.
Упражнения
1. Дан вектор {zi}, i = 1,..., 50. Вычислить длину этого вектора:
2. Вычислить полином 10-й степени по формуле Горнера:
3. Для вектора {хi}, i = 1,..., 20, подсчитать количество компонент, значения которых лежат в интервале [0,1].
4. Даны два вектора {хi}, {уi}, i = 1,..., 10, упорядоченные по возрастанию. Слить их в один вектор {zi}, i = 1, …, 20, так чтобы сохранилась упорядоченность.
5. Дан массив, состоящий из 100 целых чисел. Вывести все числа, которые встречаются в этом массиве:
а) несколько раз;
б) только по одному разу.
6. В целочисленной матрице размером 10 х 10 найти значение и индексы максимального элемента.
7. В двоичной матрице 5 х 10 определить номер строки с наибольшим количеством нулей.
8. Все строки вещественной матрицы 10 х 15 упорядочить по убыванию значений их элементов.
9. Транспонировать целочисленную матрицу 5 х 5, т.е. отразить относительно главной диагонали.
10. В двоичной матрице 10 х 10 найти совпадающие строки.