1 Массивы Массивы Массив – это область памяти компьютера, имеющая уникальное имя и содержащая данные одного типа. Особенности: • все элементы имеют один тип • весь массив имеет одно имя • все элементы расположены в памяти рядом Примеры: • список учеников в классе • квартиры в доме • школы в городе • данные о температуре воздуха за год 2 * Имя (имя переменной) * Размер (количество элементов) * Индекс (номер элемента) * Тип элемента (все элементы одного типа) * 4 Массивы A массив 1 НОМЕР элемента массива (ИНДЕКС) 2 5 10 A[1] A[2] 33 15 15 4 5 20 25 A[3] A[4] ЗНАЧЕНИЕ A[5] элемента массива НОМЕР (ИНДЕКС) элемента массива: 2 A[2] ЗНАЧЕНИЕ элемента массива: 10 5 Объявление массивов Зачем объявлять? • определить имя массива • определить тип массива • определить число элементов • выделить место в памяти Массив целых чисел: имя начальный индекс конечный индекс тип элементов var A : array[ 1 .. 5 ] of integer ; Размер через константу: const N=5; var A: array[1.. N ] of integer; Объявление массивов Массивы других типов: var X, Y: array [1..10] of real; C: array [1..20] of char; 6 7 Массивы Объявление: const N = 5; var a: array[1..N] of integer; i: integer; Ввод с клавиатуры: for i:=1 to N do begin write('a[', i, ']='); read ( a[i] ); end; a[1] = a[2] = a[3] = a[4] = a[5] = 5 12 34 56 13 ? Почему write? Поэлементные операции: for i:=1 to N do a[i]:=a[i]*2; Вывод на экран: writeln('Массив A:'); for i:=1 to N do write(a[i]:4); Массив A: 10 24 68 112 26 8 Максимальный элемент массива Максимальный элемент Дополнение: как найти номер максимального элемента? max := a[1]; { считаем, что первый – максимальный } pMax := 1; for i:=2 to N do { проверяем все остальные } if a[i] > a[pMax] max then { нашли новый максимальный } begin max := a[i]; { запомнить a[i] } pMax := i; { запомнить i } end; ? Как упростить? По номеру элемента pMax всегда можно найти его значение a[pMax]. Поэтому везде меняем max на a[pMax] и убираем переменную max. 9 Программа program max_mas; const N = 5; var a: array [1..N] of integer; i, pMax: integer; begin случайные числа в writeln('Исходный массив:'); интервале [50,150) for for i:=1 i:=1 to to NN do do begin begin a[i]:=:=random(100) random(100)+ +50; 50; a[i] поиск write(a[i]:4); write(a[i]:4); максимального end; end; pMax pMax := := 1; 1; {{ считаем, считаем, что что первый первый –– максимальный максимальный }} for {{ проверяем for i:=2 i:=2 to to NN do do проверяем все все остальные остальные }} if if a[i] a[i] >> a[iMax] a[pMax] then then {{ новый новый максимальный максимальный }} iMax := i;pMax := i; { запомнить i } { запомнить i } writeln; {перейти на новую строку} writeln('Максимальный элемент a[', pMax, ']=', a[pMax]); end. 10 * Алгоритм «Поиск максимума/минимума и его места в последовательности» (массиве) Задача: Данные о росте учащихся в классе вводятся в соответствии со списком в журнале. Определить рост самого высокого ученика и его номер в журнале. *Программа: program max_1; const r =100; var a:array[1..r] of integer; i, imax, n: byte; begin writeln ('klass='); readln(n); {кол-во учащихся} imax:=1; {номер 1-го ученика в журнале} for i:=2 to n do if a[i]>a[imax] then imax:=i; {номер в журнале самого высокого} write(‘макс. рост =', a[imax], ‘ у ученика N=‘, imax); end. *Алгоритм «Поиск количества максимумов/минимумов в последовательности» Задача: Дана последовательность из n натуральных чисел. Сколько самых маленьких чисел в последовательности? program kol_min; const r =100; var a:array[1..r] of integer; i, imin, n, k: byte; begin writeln ('n='); readln(n); {количество чисел в последовательности <100} imin:=1; k:=1; {начальное значение количества минимумов} for i:=2 to n do if a[i]<a[imin] then begin imin:=i; {место нового минимума} k:=1; {и его количество} end else if a[i]=a[imin] then inc(k); {подсчет количества минимумов} writeln('min=',a[imin],' k=',k); end. *Алгоритм «Поиск 2-х максимумов/минимумов в последовательности» Задача: Дана последовательность из n натуральных чисел. Найдите два самых маленьких числа в этой последовательности? program min_2; const n=10; var a:array[1..n] of integer; i, imin1, imin2: byte; Begin Imin1:=1; imin2:=1; for i:=2 to n do if a[i]<a[imin1] then begin imin2:=imin1; {новый второй минимум} imin1:=i; {новый первый минимум} end else if a[i]<a[imin2] then imin2:=i; {новый 2-ой минимум} writeln('min1=',a[imin1],' min2=',a[imin2]); end. *Проверка Начальное Ввод элементов a[2] значение 8 Min1 5 Min2 5 5 5 -5 -5 5 0 -5 0 -10 -10 -5