Ege 19 ( повышенный уровень, время – 5 мин )
Работа с массивами (заполнение, считывание, поиск, сортировка, массовые операции и др.)
Что нужно знать :
- работу цикла for (цикла с переменной)
- массив – это набор однотипных элементов, имеющих общее имя и расположенных в памяти рядом
- для обращения к элементу массива используют квадратные скобки, запись A[i] обозначает элемент массива A с номером (индексом) i
- матрица (двухмерный массив) – это прямоугольная таблица однотипных элементов
- если матрица имеет имя A, то обращение A[i,k] обозначает элемент, расположенный на пересечении строки i и столбца k
- элементы, у которых номера строки и столбца совпадают, расположены на главной диагонали
A[1 , 1]
A[ 2,2 ]
A[ 3,3 ]
A[ 4,4 ]
- выше главной диагонали расположены элементы, у которых номер строки меньше номера столбца:
A[1 ,2 ]
A[1 , 3]
A[1 , 4]
A[2 ,3 ]
A[2 , 4]
A[ 3, 4]
- ниже главной диагонали расположены элементы, у которых номер строки больше номера столбца:
A[2,1]
A[3 , 1]
A[4 , 1]
A[3 , 2]
A[4 , 2]
A[4 ,3 ]
Пример I :
В программе описан одномерный целочисленный массив с индексами от 0 до 10. Ниже представлен фрагмент программы, обрабатывающей данный массив:
s:=0;
n:=10;
for i:=0 to n-2 do begin
s:=s+A[i]-A[i+2]
end;
В начале выполнения этого фрагмента в массиве находились трёхзначные натуральные числа. Какое наибольшее значение может иметь переменная s после выполнения данной программы?
Решение :
1. чтобы понять, что же делает эта программа; возьмем массив из пяти элементов ( n = 4 ):
0
A[0]
1
2
A[1]
3
A[2]
4
A[3]
A[4]
2. переменная s будет изменяться следующим образом:
s:=0;
n:=10;
for i:=0 to n-2 do
begin
s:=s+A[i]-A[i+2]
end;
s := 0
s := s + A[0] – A[2]
s := s + A[1] – A[3]
s := s + A[2] – A[4]
3. в итоге после всех действий
= A[0] + A[1] – A[3] – A[4]
4. это значит, что значение s всегда будет равно сумме двух первых элементов массива минус сумма двух последних элементов
5. все числа – трёхзначные , то есть принадлежат отрезку [ 100;999 ]
6. максимальное значение s равно 999 + 999 – 100 – 100 = 1798
7. обратите внимание, что это число не зависит от размера массива
Ответ: 1798
Пример II :
В программе используется одномерный целочисленный массив A с индексами от 0 до 9 . Значения элементов равны 6; 9; 7; 2; 1; 5; 0; 3; 4; 8 соответственно, т.е. A[0] = 6; A[1] = 9 и т.д. Определите значение переменной c после выполнения следующего фрагмента программы :
c := 0;
for i := 1 to 9 do
if A[i-1]
begin
c := c + 1;
t := A[i];
A[i] := A[i-1];
A[i-1] := t
end;
Решение :
1. что же делает эта программа:
- в цикле рассматриваются пары соседних элементов, начиная с пары ( A[0] , A[1] ) и заканчивая парой ( A[8] , A[9] );
- если предыдущий элемент A[i-1] ( A[i] ), они меняются местами через вспомогательную переменную t ;
таким образом, цикл выполняет один этап (один проход по массиву) метода сортировки массива по убыванию , который называется «методом пузырька»
- начальное значение переменной c , которая нас интересует, равно нулю ; при каждой перестановке оно увеличивается на 1 (начиная с нуля), то есть, c – счётчик перестановок
2. для первой пары выполняется условие A[0] , поэтому выполняется перестановка:
6
9
9
7
6
2
7
1
2
1
5
0
5
3
0
4
3
8
4
8
3. следующая перестановка будет для пары ( A[1] , A[2] ):
9
6
9
7
7
2
6
2
1
5
1
5
0
3
0
3
4
8
4
8
4. следующая – для пары ( A[4] , A[5] ):
9
9
7
6
7
2
6
1
2
5
5
0
1
3
0
3
4
4
8
8
5. и далее еще 3 перестановки, в результате которых значение 0 перемещается до конца массива:
9
9
7
9
7
6
7
2
6
6
5
2
2
5
1
5
1
3
3
1
0
4
3
4
4
0
8
8
8
0
6. всего было сделано 6 перестановок, при каждой счётчик увеличивался на 1 , поэтому после выполнения этого фрагмента значение переменной c будет равно 6
Ответ: 6
Пример III :
В программе используется одномерный целочисленный массив A с индексами от 1 до 25 . Ниже представлен фрагмент программы, в котором задаются значения элементов:
n := 25;
A[1]:= 2 ;
for i:= 2 to n do begin
A[i]:= 2*A[i–1] mod 10;
end;
Чему будет равно значение A[25] после выполнения фрагмента программы?
Решение :
1. заметим особенность: внутри цикла берется остаток от деления 2* A [ i –1] на 10 , то есть последняя цифра десятичной записи; поэтому все элементы массива – однозначные числа
2. если бы не было этого взятия остатка, каждое последующее число в 2 раза больше предыдущего, цепочка начинается с 2 , поэтому в массиве были бы записаны степени числа 2 : 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 , 1024 и т.д.
3. выделим последние цифры в этой цепочке: 2, 4, 8, 6, 2, 4, 8, 6, 2, 4 , … они повторяются через 4 элемента
4. таких полных групп в массиве с 25 элементами будет
25 div 4 = 6
эти 6 групп займут первые 24 элемента, а 25 -м будет первый элемент в четвёрке, то есть 2
Ответ: 2
Пример IV :
В программе описан одномерный целочисленный массив. Ниже представлен фрагмент программы, обрабатывающей этот массив:
s:=0;
n:=8;
for i:=0 to n-4 do
begin
s:=s+A[i]-A[i+3]
end;
До выполнения этого фрагмента в массиве находились четырехзначные нечетные натуральные числа.
Какое наименьшее значение может иметь переменная s после выполнения данной программы?
Решение :
1) Расписываем вычисление суммы в виде одной строки, помня, что значение i меняется в цикле от 0 до 6 (т.е. до 10 – 4 ):
s = 0 + A [0] – A [3] + A [1] – A [4] + A [2] – A [5] + A [3] – A [6] + + A [4] – A [7] + A [5] – A [8] + A [6] – A [9]
2) Сокращаем одинаковые переменные (элементы массива), записанные со знаками «плюс» и «минус»:
s = 0 + A [0] – A [3] + A [1] – A [4] + A [2] – A [5] + A [3] – A [6] + + A [4] – A [7] + A [5] – A [8] + A [6] – A [9]
Получаем:
s = A[0] + A[1] + A[2] – A[7] – A[8] – A[9]
3) Получаемая сумма (разность) должна, по условию, иметь наименьшее значение. А элементы массива – это четырехзначные нечетные натуральные числа, т.е. числа в диапазоне от 1001 до 9999 .
Следовательно, элементы массива, которые записаны в выражении со знаком «плюс» , должны быть наименьшими из возможных, а элементы массива со знаком «минус» должны быть наибольшими из возможных.
Значит, нужно выбрать их следующими:
A [0] = A [1] = A [2] = 1001 , A [7] = A [8] = A [9] = 9999
4) Вычисляем значение s при этих значениях элементов массива:
s = 1001 + 1001 + 1001 – 9999 – 9999 – 9999 = 3 (1001 – 9999) =
= –26994
Ответ: -26994
Пример V :
В программе описан одномерный целочисленный массив A с индексами от 0 до 9 . Ниже представлен фрагмент программы, в котором значения элементов сначала задаются, а затем меняются:
Чему будут равны элементы этого массива после выполнения фрагмента программы?
for i:=0 to 9 do
A[i]:=9-i;
for i:=0 to 4 do begin
k:=A[i];
A[i]:=A[9-i];
A[9-i]:=k;
end;
1) 9 8 7 6 5 4 3 2 1 0
2) 0 1 2 3 4 5 6 7 8 9
3) 9 8 7 6 5 5 6 7 8 9
4) 0 1 2 3 4 4 3 2 1 0
Решение :
for i:=0 to 9 do
A[i]:=9-i;
1) как заполняется массив в первом цикле?
- здесь элемент A [0] равен 9, элемент A [1]=8 и т.д. до A [9]=0
2) во втором цикле операторы
k:=A[i];
A[i]:=A[9-i];
A[9-i]:=k;
- меняют местами элементы A [ i ] и A [9- i ]
3) второй цикл выполняется всего 5 раз, то есть останавливается ровно на половине массива
for i:=0 to 4 do begin
...
end ;
Т.е. в нем меняются элементы A [0] A[ 9], A [1] A[ 8], A [2] A[ 7], A [3] A[ 6] и A [4] A[ 5]
4) в результате массив оказывается «развернут» наоборот, элемент A [0] (он был равен 9 ) стал последним, следующий ( A [1]=8 – предпоследним и т.д.
то есть получили
0 1 2 3 4 5 6 7 8 9
Ответ: 2
Пример VI :
Дан фрагмент программы, обрабатывающей двухмерный массив A размера n × n .
k := 1;
for i:=1 to n do begin
c := A[i,i];
A[i,i] := A[k,i];
A[k,i] := c;
end
Представим массив в виде квадратной таблицы, в которой для элемента массива A[i,j] величина i является номером строки, а величина j – номером столбца, в котором расположен элемент. Тогда данный алгоритм меняет местами
1) два столбца в таблице
2) две строки в таблице
3) элементы диагонали и k -ой строки таблицы
4) элементы диагонали и k -го столбца таблицы
Решение :
1) операторы
c := A[i,i];
A[i,i] := A[k,i];
A[k,i] := c;
меняют местами значения A [ i , i ] и A [ k , i ] , используя переменную c в качестве вспомогательной ячейки;
- элемент матрицы A [ i , i ] , у которого номера строки и столбца одинаковые, стоит на главной диагонали
- элемент A [ k , i ] стоит в том же столбце i , но в строке с номером k
- это значит, что в столбце i меняются местами элемент на главной диагонали и элемент в строке k
k
i
i
A[k,i]
A[ i,i ]
- так как эти операторы находятся в цикле, где переменная i принимает последовательно все значения от 1 до n , обмен выполняется для всех столбцов матрицы;
- то есть, все элементы главной диагонали меняются с соответствующими элементами строки k
- перед циклом стоит оператор присваивания k := 1 , а после него переменная k не меняется;
- поэтому в программе элементы главной диагонали обмениваются с первой строкой
Ответ: 3
Пример VII :
Значения двух массивов A [1..100] и B [1..100] задаются с помощью следующего фрагмента программы:
for n :=1 to 100 do
A [ n ] := (n-80)*(n-80);
for n:=1 to 100 do
B[101-n] := A[n];
- B[1]
- B [21]
- B [80]
- B [100]
Какой элемент массива B будет наибольшим ?
Решение :
1) в элемент массива A [ n ] записывается квадрат числа n -80
- некоторые элементы массива А :
- т.е. максимальное значение в массиве A – это A[1] = 79 2
A[1] = (1–80) 2 = (–79) 2 = 79 2
A[2] = ( 2 –80) 2 = (–78) 2 = 78 2
...
2) во втором цикле для всех n от 1 до 100 выполняется оператор
A[ 80 ] = ( 80 –80) 2 = ( 0 ) 2 = 0
A[ 81 ] = ( 81 –80) 2 = ( 1 ) 2 = 1
...
B [101- n ] := A [ n ];
- элемент A [1] будет записан в B [100], а A [ 100 ] – в B [1]
A[ 99 ] = ( 99 –80) 2 = 19 2
A[ 100 ] = ( 100 –80) 2 = 20 2
- поэтому B[100] – наибольший элемент в массиве В
Ответ: 4
k then A [ i , k ] := 1 else A [ i , k ] := 0; Чему равна сумма элементов массива после выполнения этого фрагмента программы? Решение : 1) в программе есть вложенный цикл, в котором переменная i обозначает строку, а k – столбец матрицы элементы, для которых i=k – это главная диагональ матрицы элементы, для которых i k (только они будут равны 1 ), находятся под главной диагональю в первой строке единичных элементов нет, во 2- й есть один такой элемент, в 3-ей – 2 , в последней (10-ой) их 9 поэтому сумма элементов массива равна 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45 Ответ: 45 " width="640"
Пример VIII :
Значения элементов двухмерного массива A[1..10,1..10] задаются с помощью следующего фрагмента программы:
for i :=1 to 10 do
for k :=1 to 10 do
if i k then
A [ i , k ] := 1
else
A [ i , k ] := 0;
Чему равна сумма элементов массива после выполнения этого фрагмента программы?
Решение :
1) в программе есть вложенный цикл, в котором переменная i обозначает строку, а k – столбец матрицы
- элементы, для которых i=k – это главная диагональ матрицы
- элементы, для которых i k (только они будут равны 1 ), находятся под главной диагональю
- в первой строке единичных элементов нет, во 2- й есть один такой элемент, в 3-ей – 2 , в последней (10-ой) их 9
- поэтому сумма элементов массива равна
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
Ответ: 45
Пример IX :
Значения элементов двухмерного массива A[1..10,1..10] сначала равны 5 . Затем выполняется следующий фрагмент программы:
Сколько элементов массива будут равны 10 ?
for i :=1 to 5 do
for j :=1 to 4 do begin
A[i,j]:=A[i,j]+5; A[j,i]:=A[j,i]+5;
e nd;
{1}
Решение :
1) обратим внимание, что в двойном цикле переменная i изменяется от 1 до 5 , а j – от 1 до 4 (на 1 шаг меньше)
{2}
1
1
2
2
3
3
4
4
5
5
6
6
7
7
2) внутри цикла { 1 } , в записи A[i,j] переменная i – это строка, а j – столбец, поэтому по одному разу обрабатываются все элементы массива, выделенные зеленым цветом:
3) это значит, что если оставить только один первый оператор внутри цикла, все выделенные элементы увеличиваются на 5 и станут равны 10
1
1
2
2
3
3
4
4
5
5
6
6
7
7
4) теперь рассмотрим второй оператор внутри цикла: в записи A[ j , i ] переменная i – это столбец, а j – строка, поэтому по одному разу обрабатываются (увеличиваются на 5 ) все элементы массива, выделенные рамкой красного цвета на рисунке :
1
1
2
2
3
3
4
4
5
5
6
6
7
7
5) хорошо видно, что левый верхний угол массива (квадрат 4 на 4 , синяя область ) попадает в обе области, то есть, эти 16 элементов будут дважды увеличены на 5 : они станут равны 15 после выполнения программы
6) элементы, попавшие в зеленый и красный « хвостики » обрабатываются (увеличиваются на 5 ) по одному разу, поэтому они-то и будут равны 10
всего таких элементов – 8 штук
Ответ: 8
ДЕМО - 2017
В программе используется одномерный целочисленный массив A с индексами от 0 до 9 . Значения элементов равны 1, 2, 5, 8, 9, 3, 4, 0, 7, 6 соответственно, т.е. A[0] = 1, A[1] = 2 и т.д.
Определите значение переменной j после выполнения следующего фрагмента программы
j := 5;
while A[ j ] j -1] do
begin
t := A[ j ];
A[ j ] := A[ j -1];
A[ j -1] := t;
j := j - 1;
end;
В данном фрагменте программы сравнивается очередной элемент (начиная с 5-го) с предыдущим. Если очередной элемент меньше предыдущего, то они меняются местами. При j=2 программа завершится.
Ответ: 2