Массивы Массив используется для обработки упорядоченного набора величин одного типа, обозначенного одним именем. Доступ к элементам массива осуществляется по их номерам (индексам). Номер элемента в массиве называется индексом. Массив – это переменная с индексом. Массив это таблица. Таблица может быть линейной (одномерной) и прямоугольной (двумерной) здесь первый индекс номер строки, второй – номер столбца а1а1 а2а2 а3а3 а4а4 а5а5 в 11 в 12 в 13 в 14 в 15 в 21 в 22 в 23 в 24 в 25 в 31 в 32 в 33 в 34 в 35
Для работы с массивом он должен быть описан. Для описания массива используется служебное слово ARRAY. Переменная, обозначающая массив, должна быть описана так: VAR Имя: ARRAY[ Минимальное.. Максимальное ] OF Тип массива значение значение элементов индекса индекса массива Например: var a: array[1..10] of real ; Массив может быть построен из элементов любого типа. А – линейный массив, состоящий из 5 элементов 5 – индекс максимального элемента. В – двумерный массив, состоящий из трех строк и пяти столбцов. 3 – номер максимальной строки, 5 – номер максимального столбца. В имени двумерного массива первой указывается строка. А[1]А[2]А[3]А[4]А[5] В[1,1]В[1,2]В[1,3]В[1,4]В[1,5] В[2,1]В[2,2]В[2,3]В[2,4]В[2,5] В[3,1]В[3,2]В[3,3]В[3,4]В[3,5]
Заполнение массива. Заполнение массива – это задание значений каждого его элемента. Для заполнения массива используются разные способы. 1. Оператор присваивания Используется тогда, когда нужно заполнить массив любыми числами. A[1]:=33;A[2]:=74;A[3]:=-2 2. Оператор присваивания в цикле Используется для заполнения массива числами, связанными с индексом или одинаковыми числами. FOR i:=1 TO 9 DO A[i]:=i При изменении формулы в операторе присваивания получим в массиве другие числа: Например: А[i]:=0 A[i]:=i*2 A[i]:=10-i
3. Оператор ввода READLN. Используется в тех случаях, когда нужно заполнять массив во время выполнения программы. for i := 1 to n do begin write(a[,i,]=);readln(a[i]) end; 4. Использование случайных чисел randomize – стандартная процедура инициализации генератора случайных чисел. random(n) – стандартная функция: возвращающая случайное число в интервале от 0 до n. Пример первый UROK6PR1 – заполнение и распечатка массива. Используется генератор случайных чисел. Следующие пять примеров показывают приемы работы с массивом целых чисел. Во всех этих примерах массив BAL - это оценки, полученные группой из десяти школьников. Каждый пример отличается от предыдущего добавлением в программу нового фрагмента.
UROK6PR1 program mass;{Заполнение массива случайными числами} uses crt; const n=10; var i:integer; mas:array[1..n]of integer; begin Randomize; for i:=1 to 10 do begin mas[i]:=random(100); writeln('mas[',i,']=',mas[i]); end; repeat until keypressed end. UROK6PR2 - заполнение и распечатка массива. Заполнение – оператор присваивания. program mass; var bal : array[1..10] of integer; i:integer; begin bal[1]:=2;bal[2]:=5;bal[3]:=3;bal[4]:=4; bal[5]:=1; bal[6]:=5;bal[7]:=4;bal[8]:=5;bal[9]:=3; bal[10]:=2; for i:=1 to 10 do writeln(i,' ',bal[i]); end.
UROK6PR3 - Распечатка словесного наименования оценок. program mass; var bal : array[1..10] of integer; i:integer; begin bal[1]:=2;bal[2]:=5;bal[3]:=3;bal[4]:=4;bal[5]:=1; bal[6]:=5;bal[7]:=4;bal[8]:=5;bal[9]:=3;bal[10]:=2; for i:=1 to 10 do begin write(bal[i],':'); case bal[i] of 1..2 : writeln('неуд'); 3 : writeln('уд'); 4 : writeln('хор'); 5 : writeln('отл'); end; end; end. UROK6PR4 - подсчет числа пятерок. program mass var bal : array[1..10] of integer; i:integer; sc : integer; begin bal[1]:=2;bal[2]:=5;bal[3]:=3;bal[4]:=4; bal[5]:=1; bal[6]:=5;bal[7]:=4;bal[8]:=5;bal[9]:=3; bal[10]:=2; sc:=0; for i:=1 to 10 do if bal[i]=5 then sc:=sc+1; writeln('количество пятерок=',sc); end.
UROK6PR5 - использование оператора CASE для подсчета количества каждой оценки. program mass; var bal : array[1..10] of integer; i:integer; sc1,sc2,sc3,sc4,sc5 : integer; begin bal[1]:=2;bal[2]:=5;bal[3]:=3;bal[4]:=4; bal[5]:=1; bal[6]:=5;bal[7]:=4;bal[8]:=5; bal[9]:=3;bal[10]:=2; sc1:=0;sc2:=0;sc3:=0;sc4:=0;sc5:=0; for i:=1 to 10 do case bal[i] of 1: sc1:=sc1+1; 2: sc2:=sc2+1; 3: sc3:=sc3+1; 4: sc4:=sc4+1; 5: sc5:=sc5+1; end; writeln('количество единиц=',sc1); writeln('количество двоек=',sc2); writeln('количество троек=',sc3); writeln('количество четверок=',sc4); writeln('количество пятерок=',sc5); end.
UROK6PR6 - в предыдущем примере было введено пять переменных - счетчиков числа оценок. В этом примере взамен всех их введен массив счетчиков. Программа стала компактнее. Program mass; var bal : array[1..10] of integer; i,j:integer; sc : array[1..5] of integer; begin bal[1]:=2;bal[2]:=5;bal[3]:=3;bal[4]:=4; bal[5]:=1;bal[6]:=5;bal[7]:=4;bal[8]:=5; bal[9]:=3;bal[10]:=2; for i:=1 to 5 do sc[i]:=0; for i:=1 to 10 do for j:=1 to 5 do if bal[i]=j then sc[j]:=sc[j]+1; writeln('количество единиц=',sc[1]); writeln('количество двоек=',sc[2]); writeln('количество троек=',sc[3]); writeln('количество четверок=',sc[4]); writeln('количество пятерок=',sc[5]); end.
Поиск максимального элемента массива Пусть массив А, состоящий из N элементов, заполнен любым способом. Алгоритм поиска максимального элемента: M := A[1]; {запоминание первого элемента массива} FOR I :=1 TO N DO IF A[I]>M THEN M=A[I]; WRITE(максимальный элемент =,M]); Если нужно найти не только максимальный элемент, но и его индекс, можно использовать такой алгоритм: Алгоритм поиска индекса максимального элемента: M := 1; {запоминание индекса первого элемента} FOR I := 1 TO N DO IF A(I)>A(M) THEN M=I; WRITE(максимальный элемент =,A[M]); Задание: Составить полностью программу поиска максимального элемента массива и его индекса, используя второй алгоритм.
Перестановка элементов массива: Для того, чтобы поменять местами значения двух переменных А и В, нужно: запомнить значение одной из них в третьей переменной (С); присвоить той переменной, которую запомнили, значение другой переменной; другой переменной присвоить значение третьей переменной. В программе это будет выглядеть так: С:=А; А:=В; В:=С; Решим задачу перестановки элементов массива, стоящих на четных и нечетных местах. Массив состоит из N элементов I:=1;REPEAT C:=A[I];A[I]:=A[I+1];A[I+1]:=C; I:=I+2; UNTIL I>N – 1 Задание: Составить полностью программу перестановки элементов массива. Найти индексы максимального и минимального элементов массива. Поменять местами: А) максимальный и минимальный элемент Б) максимальный и последний элемент В) минимальный и первый элемент Г) максимальный и первый элемент Д) минимальный и последний элемент.
Сортировка элементов массива Сортировка – упорядочение элементов массива по какому-то признаку. Упорядочим массив по не убыванию, т.е. каждый следующий элемент должен быть не меньше предыдущего. Существуют разные способы сортировки. Рассмотрим один из них. Сортировка прямой выбор. Находим максимальный элемент массива и меняем его местами с последним элементом. Потом ищем максимальный элемент среди всех кроме последнего, и опять меняем его местами с предпоследним элементом и так далее. При последнем поиске максимального элемента будем выбирать его среди первых двух. Пусть заполнен массив А, состоящий из N элементов. FOR K:=N DOWNTO 2 DO BEGIN M=1; FOR I:=1 TO K DO IF A(I)>A(M) THEN M:=I; C:=A(M);A(M):=A(K);A(K):=C; END;
Сортировка методом «Всплывающего пузырька» Сравниваем соседние элементы массива и если они стоят «неправильно» меняем их местами K:=N-1; REPEAT PR:=TRUE; {предполагается, что массив может быть уже упорядоченным} FOR I:=1 TO K DO IF A[I]>A[I+1] THEN BEGIN B:=A[I];A[I]:=A[I+1];A[I+1]:=B;PR:=FALSE END; K:=K-1; UNTIL PR; Задания: Написать программу сортировки массива полностью. Упорядочить массив А(N) по не убыванию следующим образом: найти минимальный элемент и поменять его местами с первым элементом. Затем найти минимальный элемент среди всех элементов кроме первого и так далее. Упорядочить массив А(N) по не возрастанию, то есть первым должен стать самый большой элемент.
Косвенная сортировка метод пузырька Меняются местами не сами элементы массива А, а их индексы (в массиве IND): USES CRT; CONST N=10; VAR I,C,K:INTEGER; PR:BOOLEAN; A,IND:ARRAY[1..N]OF INTEGER; BEGIN FOR I:=1 TO N DO IND[I]:=I;{заполнение массива индексов числами от 1 до N} A[1]:=2;A[2]:=5;A[3]:=3;A[4]:=4;A[5]:=4; A[6]:=5;A[7]:=4;A[8]:=5;A[9]:=3;A[10]:=2; K:=N-1; REPEAT PR:=TRUE; FOR I:=1 TO K DO IF A[IND[I]]>A[IND[I+1]] THEN BEGIN C:=IND[I];IND[I]:=IND[I+1];IND[I+1]:=C; PR:=FALSE END; K:=K-1; UNTIL PR; FOR I:=1 TO N-1 DO WRITELN(A[IND[I]]); WRITELN; REPEAT UNTIL KEYPRESSED END.