Автор: Сергеенкова И.М., учитель информатики., ГБОУ Школа № 1191, г. Москва Определения и понятия В математике, экономике, информатике часто используются различные наборы данных: последовательности чисел, списки фамилий, таблицы. Для обработки наборов однотипных данных мы введем понятие массива. Массив – это совокупность однотипных элементов. Математическими прообразами массивов являются векторы и матрицы с числовыми компонентами. В языках программирования все элементы массива объединяются общим именем – идентификатором массива. Элементы массива последовательно располагаются в памяти компьютера. При обращении к элементу массива указывается имя массива (идентификатор), индекс и тип. Если каждый элемент массива имеет только один индекс, то такой массив называют линейным или одномерным. Массивы, элементы которых имеют называют двумерными. Например, массив два индекса, А8 А1, А2, А3, А4, А5, А6, А7, А8 Этот массив является одномерным, причем массив имеет имя А и состоит из восьми элементов. Количество индексов в списке определяет размерность массива. Двухмерный массив удобно представить в виде матрицы с двойными индексами. a11 a12 a21 a22 a31 a32 a13 a23 a331 В таком массиве каждый элемент имеет двойной индекс. Первая цифра индекса указывает номер строки, вторая номер столбца. Элементы, где номер строки и номер столбца одинаковы, называют элементами главной диагонали. Так как каждый элемент массива имеет индекс, то индекс показывает место элемента в массиве. В матрице каждый элемент определяется номером строки и номером столбца, на пересечении которых он находится. Пример1. В программе описан одномерный целочисленный массив A с индексами от 0 до 10. Ниже представлен фрагмент этой программы, в котором значения элементов массива сначала задаются, а затем меняются. A[0] := 1; for i := 1 to 10 do A[i] := 2+A[i-1]; for i := 0 to 5 do A[10-i] := A[i]-1; Чему будут равны элементы этого массива? Решение. Решение. Первый цикл, заполняем массив: i=0: a[0]=1, i=1: a[1]=3, i=2: a[2]=5, i=3: a[3]=7, i=4: a[4]=9, ... i=10: a[10]=21 Второй цикл, меняем значения последних пяти элементов: i=0: a[10]=a[0]-1 = 0, i=1: a[9]=a[1]-1 = 2, ... i=5: a[5]=a[5]-1 = 10, Поэтому в результате выполнения программы элементы массива будут равны: 1, 3, 5, 7, 9, 10, 8, 6, 4, 2, 0. Пример 2. В программе описан одномерный целочисленный массив с индексами от 0 до 10 и целочисленные переменные k, i. В приведенном ниже фрагменте программы массив сначала заполняется, а потом изменяется: for i : = 0 to 10 do A[i] : = i; for i : = 0 to 4 do begin k : = A[i]; A[i] : = A[10-i]; A[10-i] : = k; end; Решение Решение: Первый цикл, заполняем массив: i=0: a[0]=0, i=1: a[1]=1, i=2: a[2]=2, ... i=10: a[10]=10. Второй цикл, меняет местами значения первых пяти элементов с последующими: i=0: a[0]=a[10]=10, i=1: a[1]=a[9] = 9, ... i=4: a[4]=a[6] = 6, причём a[10]=a[0]=0, a[9]=a[1]=1, Поэтому в результате выполнения ... программы элементы массива будут a[6]=a[4]=4. равны: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0. Пример 3. Значения двух массивов A[1..100] и B[1..100] задаются с помощью следующего фрагмента программы: for n:=1 to 100 do A[n] := n - 10; for n:=1 to 100 do B[n] := A[n]*n; Сколько элементов массива B будут иметь положительные значения? Решение: Решение: Массив A: n=1: a[1]=1-10=-9, n=2: a[2]=2-10=-8, n=3: a[3]=-7, ... n=9: a[9]=-1, n=10: a[10]=0, ... n=100: a[100]=90. Элементы массива B имеют такой же знак, как и соответствующие элементы массива A, поскольку n принимает только положительные значения и B[n]=A[n]*n. В массиве A 100 – 10 = 90 положительных значений, следовательно и в B их тоже 90. Правильный ответ: 90 Пример 4. В программе описан одномерный целочисленный массив A с индексами от 0 до 10. Ниже представлен фрагмент этой программы, в котором значения элементов массива сначала задаются, а затем меняются. for i:=0 to 10 do A[i]:=2+i; for i:=0 to 4 do begin A[i]:=A[10-i]-1; A[10-i]:=A[i]+3; end; Чему будут равны элементы этого массива? Решение: Решение: Задаем массив A[i]:=2 + i: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Меняем массив, идя от краев в центр, левый меняем на правый с вычетом 1, а потом правый на измененный левый плюс 3: A[i]:= A[10-i] - 1: 12 - 1, 11 - 1, 10 - 1, 9 - 1, 8 - 1 = 11, 10, 9, 8, 7 - первые пять ячеек. A[10 - i]:= A[i] + 3 = A[10-i] - 1 + 3 = A[10-i] + 2: 12 + 2, 11 + 2, 10 + 2, 9 + 2, 8 + 2 = 14, 13, 12, 11, 10 - вторые пять ячеек в обратном порядке (с номера 10 до номера 6). Элемент A[5] остался неизменным: A[5] = 7. В итоге: 11 10 9 8 7 7 10 11 12 13 14. Пример 5. Значения двумерного массива задаются с помощью вложенного оператора цикла в представленном фрагменте программы: for n:=1 to 5 do for k:=1 to 5 do B[n,k] := n + k; Чему будет равно значение B[2,4]? Решение: Очевидно, что значение элемента B[2,4] = 2 + 4 = 6. Ответ: 6 Пример 6. Значения элементов двухмерного массива A[1..10,1..10] сначала равны 4. Затем выполняется следующий фрагмент программы: for i:=1 to 4 do for j:=1 to 5 do begin A[i,j]:=A[i,j]+4; A[j,i]:=A[j,i]+5; end; Сколько элементов массива будут равны 9? Решение: Решение: Мы имеем матрицу размером 10x10. Операция A[i,j] : = A[i,j]+4 при заданных i и j увеличивает на 4 элементы первых четырёх строк и первых пяти столбцов. Операция A[j,i] : = A[j,i]+5 при заданных i и j увеличивает на 5 элементы первых пяти строк и первых четырёх столбцов. Поскольку все элементы массива изначально равны 4, то после первого оператора 4 * 5 = 20 элементов будут равны 8, а после второго – 16 элементов будут равны 13, 4 элемента будут равны 8 и 4 элемента приобретут значение 9. Нарисуем для наглядности изменяющийся фрагмент числовой таблицы: 4 + 4 + 5 4 + 4 + 5 4 + 4 + 5 4 + 4 + 5 4 + 4 4+4+5 4+4+5 4+4+5 4+4+5 4+4 4+4+5 4+4+5 4+4+5 4+4+5 4+4 4+4+5 4+4+5 4+4+5 4+4+5 4+4 4+5 4+5 4+5 4+5 4 Ответ: 4 Пример 7 В программе обрабатывается двумерный целочисленный массив A [0..n,0..n]. Первый индекс элемента обозначает номер строки, а второй – номер столбца. Дан фрагмент программы: for i:=0 to n do begin c:=A[i,n-i]; A[i,n-i]:=A[1,i]; A[1,i]:=c; end; Что меняет этот фрагмент программы? Решение: Решение: Этот фрагмент меняетместами элементы A[i,n-i] и A[1,i]. Разберёмся, что это за элементы. При i=0 A[i,n-i] = A[0,n] — элемент нулевй строки и последнего столбца. При i=1 A[i,n-i] = A[1,n-1] — элемент первой строки и предпоследнего столбца. Каждый следующий элемент будет сдвигаться на строку вниз и на столбец влево, т. е. мы получим элементы диагонали массива. Элемент A[1,i] — элемент первой строки и столбца с номером i. Значит, данный фрагмент программы меняет элементы диагонали и первой строки в таблице. Ответ: меняет элементы диагонали и строки в таблице Пример 8 Дан фрагмент программы, обрабатывающий массив А из 10 элементов: j := 1; for i:=1 tо 10 do if A[i] = A[j] then j := i; s := j; Чему будет равно значение переменной s после выполнения этого алгоритма? Решение: Решение: Изначально элемент a[j]=a[1]. Условие цикла говорит нам о том, что если какой-то элемент а[i] массива А совпадает с первым элементом этого массива, то индексу j присваивается значение индекса i. Т. к. цикл пробегает все значения i в порядке увеличения, то последним значением j станет наибольшее значение индекса i такое, что a[i]=a[1]. Это значение совпадёт со значением переменной s после выполнения алгоритма. Ответ: s = индексу элемента, равного первому, и имеющему наибольший индекс Пример 9 В программе описан одномерный целочисленный массив с индексами от 0 до 12. Ниже представлен записанный на разных языках программирования фрагмент одной и той же программы, обрабатывающей данный массив: Бейсик Паскаль s=0 n = 12 FOR i = 0 TO n IF A(n–i) – A(i) = A(i) THEN s = s+2*A(i) END IF NEXT i s := 0; n := 12; for i:=0 to n do begin if A[n–i] – A[i] = A[i] then s:=s+2*A[i]; end; Си Алгоритмический язык s = 0; n = 12; for (i = 0; i <= n; i++) { if (A[n–i] – A[i] == A[i]) s = s+2*A[i]; } s := 0 n := 12 нц для i от 0 до n если A[n–i] – A[i] = A[i] то s := s+2*A[i] все кц В начале выполнения этого фрагмента в массиве находились числа 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, т. е. A[0] = 0, A[1] = 10 и т. д. Чему будет равно значение переменной s после выполнения данной программы? Решение: Действие «s:=s+2*A[i];» выполняется, если истинно условие «if A[n–i] – A[i] = A[i]». Данное условие выполнено только для i = 4, в этом случае A[8] − A[4] = 80 − 40 = 40 = A[4]. Переменная s примет значение s = 0 + 2 · 40 = 80. Ответ: s = 80 Источники информации 1. http://inf.reshuege.ru/test?theme=267 2. http://www.rusedu.info/Article651.html 3. http://magnus.jr1.ru/?page_id=304