Россия, Москва, МИЭМ |
Типовые алгоритмы и задачи, решаемые с их помощью
Типовые алгоритмы обработки одномерных массивов
В данной теме будут рассматриваться такие типовые алгоритмы обработки одномерных массивов:
- Заполнение, вывод элементов массива
- Сумма, произведение элементов
- Выбор по условию
- Максимальный (минимальный) элемент
- Вставка, удаление элементов
- Инвертирование (изменения порядка следования элементов заданного массива на обратный)
Программные реализации типовых алгоритмов обработки одномерных массивов приведены в таблице 2.1:
Типовой алгоритм | Программная реализация (Бейсик) | Программная реализация (Паскаль) |
---|---|---|
Заполнение массива |
input n dim a(n) for i=1 to n input a(i) next i |
const n=10; Var a: array [1..n] of integer; begin for i:=1 to n do readln (a[i]); … |
Вывод в строку |
…for i=1 to n print a(i) ; " " ; next i |
… for i:=1 to n do write (a[i]); … |
Сумма, произведение элементов |
… p=1 for i=1 to n s=s + a(i) p=p * a(i) next i |
… s:=0; p:=1; for i:=1 to n do begin s:=s+a[i]); p:=p*a[i]); end; … |
Выбор по условию |
… p = 1 for i = 1 to n if {условие} then k=k+1:s=s+a(i):p=p*a(i) next i |
… k:=0; s:=0; p:=1; for i:=1 to n do if {условие} then begin k:=k+1; s:=s+a[i]; p:=p*a[i]; end; … |
Максимальный (минимальный) элемент |
… max = a(1): min = a(1) for i = 2 to n if a(i) > max then max = a(i) if a(i) < min then min = a(i) next i |
… max:=a[1]; min:=a[1]; for i:=1 to n do begin if a[i] > max then max:=a[i]; if a[i] < min then min:=a[i]; end; |
Вставка x на k-ое место |
dim a(n + 1) … for i = n to k step -1 a (i + 1) = a(i) next a(k) = x |
Var a: array [1..n+1] of… … for i:=n downto k do a[i+1]:=a[i]; a[k]:=x; … |
Удаление k-ого элемента |
. . . for i = k to n - 1 a(i) = a(i + 1) next |
… for i:=k to (n-1) do a[i]:= a[i+1]; … |
Инвертирование элементов |
. . . for i = 1 to n/2 swap a(i), a(n-i+1) next |
… for i:=1 to (n div 2) do begin х:=a[i]; a[i]:= a[n-i+1]; a[n-i+1] :=х; end … |
Ключевые моменты в типовых алгоритмах:
- Выбор по условию. В качестве условия может проверяться значение элемента массива на четность, кратность элемента какому-либо числу, положительность, отрицательность, равенство нулю. Может проверяться также и значение индекса элемента массива (например, элементы, стоящие на четных местах и др.).
-
Максимальный (минимальный) элемент. Кроме максимального элемента часто требуется найти и индекс максимального элемента:
if a[i]>max then begin max:=a[i]; imax:=i; end;
- Вставка x на k-ое место. Перестановка элементов (для освобождения "места" для вставляемого элемента) происходит с конца массива - последний элемент передвигается на "пустое место", на его место передвигается предпоследний элемент и т.д.
- Инвертирование элементов. Цикл работает n/2 раз, так как за один проход мы меняем сразу два элемента местами.
Задачи использованием типовых алгоритмов обработки одномерных массивов
Задача: На плоскости изображено N прямоугольников (рис. 2.1). Каждый прямоугольник задан координатами левой нижней и правой верхней вершин. Определить, имеют ли прямоугольники общую площадь .
Идея решения:
Если:
- максимальная координата по оси Х левых нижних вершин прямоугольников будет меньше минимальной координаты правых верхних вершин и …
- …максимальная координата по оси У левых нижних вершин прямоугольников будет меньше минимальной координаты правых верхних вершин, то …
- …общая площадь есть.
В задаче необходимо использовать типовой алгоритм нахождения МАКСИМАЛЬНОГО (МИНИМАЛЬНОГО) ЭЛЕМЕНТА МАССИВА.
Для вычисления общей площади необходимо найти произведение разности:
- максимальной координаты по оси Х левых нижних вершин прямоугольников и минимальной координаты правых верхних вершин и …
- …максимальной координаты по оси У левых нижних вершин прямоугольников и минимальной координаты правых верхних вершин.
Программа на Бейсике:
input "введите количество прямоугольников"; n dim x1(n), x2(n),y1(n), y2(n) for i=1 to n input x1(i), x2(i), y1(i), y2(i) next xmax=x1(1) xmin=x2(1) ymax=y1(1) ymin=y2(2) for i=1 to n if x1(i) > xmax then xmax=x1(i) if x2(i) < xmin then xmin=x2(i) if y1(i) > ymax then ymax=y1(i) if y2(i) < ymin then ymin=y2(i) next if xmax<xmin and ymax<ymin then print "общ. площадь есть" else print "общ. площади нет"
Программа на Паскале:
var x1, x2, y1, y2: array [1..10] of integer; n, i, xmax, xmin, ymax, ymin: integer; begin writeln ('введите количество прямоугольников'); readln (n); for i:=1 to n do readln (x1[i], y1[i], x2[i], y2[i]); xmax:=x1[1]; xmin:=x2[1]; ymax:=y1[1]; ymin:=y2[2]; for i:=1 to n do begin if x1[i] > xmax then xmax:=x1[i]; if x2[i] < xmin then xmin:=x2[i]; if y1[i] > ymax then ymax:=y1[i]; if y2[i] < ymin then ymin:=y2[i]; end; if (xmax<xmin) and (ymax<ymin) then writeln ('общая площадь есть') else writeln ('общей площади нет'); end.
Тест:
Дано: |
3 1,1,9,5 2,3,5,6 4,2,7,4 |
4 2,2,5,4 4,3,7,6 6,1,11,2 6,4,12,8 |
Результат: | Общая площадь есть | Общей площади нет |
Задача: Латинским квадратом называется массив, в строках и столбцах которого нет одинаковых элементов. Вывести на экран латинский квадрат размером NxN.
Идея решения: Заполнить 1 строку квадратного массива (NxN) числами от 1 до N. Вторая строка массива получается путем циклического сдвига элементов первой строки и т. д. (табл. 2.2). Циклический сдвиг можно реализовать, используя типовой алгоритм ВСТАВКИ-УДАЛЕНИЯ (в зависимости от направления циклического сдвига).
1 | 2 | 3 | 4 | 5 |
5 | 1 | 2 | 3 | 4 |
4 | 5 | 1 | 2 | 3 |
3 | 4 | 5 | 1 | 2 |
2 | 3 | 4 | 5 | 1 |
Решение на Бейсике:
input "размерность="; n dim a(n,n) for j=1 to n a(1,j)=j next rem=====сдвиг========= for i=2 to n for j=1 to n a(i,j)=a(i-1,j) next x=a(i,n) for j=n to 2 step -1 a(i,j)=a(i,j-1) next a(i,1)=x next rem====вывод========== for i=1 to n for j=1 to n print a(i,j); next print next
Решение на Паскале:
var a: array [1..10,1..10] of integer; n,i,j,x: integer; begin writeln ('размерность='); readln (n); for j:=1 to n do a[1,j]:=j; {======сдвиг======} for i:=2 to n do begin for j:=1 to n do a[i,j]:=a[i-1,j]; x:=a[i,n]; for j:=n downto 2 do a[i,j]:=a[i,j-1]; a[i,1]:=x; end; {======вывод======} for i:=1 to n do begin for j:=1 to n do write(a[i,j]); writeln; end; end.