Массивы и как с ними "бороться"
Массивы и как с ними "бороться"
Успешное решение задач по программированию при сдаче вступительных экзаменов в вузы, при сдаче ЕГЭ по информатике практически невозможно без уверенной работы с массивами. Для этого необходимо понимать условие задачи, уметь “читать” текст программы, содержащей работу с массивами, технически грамотно выполнять действия над элементами массива и, конечно, в идеале — знать основные, базовые алгоритмы над массивами.
Наш опыт преподавания программирования в школе показывает, что как только школьники знакомятся с массивами, их интерес к программированию возрастает. Но задачи на обработку массивов не просты и алгоритмически, и технически. У школьников должна быть достаточно большая практика работы с массивами для того, чтобы они могли решать задачи, предлагаемые в ЕГЭ и на вступительных экзаменах по информатике в вузы. А для этого они в первую очередь должны уверенно оперировать с такими понятиями, как “индекс массива”, “элемент массива”, “значение элемента массива”.
К сожалению, на уроках информатики мы всегда ограничены временными рамками, зачастую мы не можем предоставить школьникам достаточно времени для выполнения “технических” задач. Цейтнот времени мы пытаемся преодолеть, совмещая интересные задачи с точки зрения построения алгоритма решения с одновременным приобретением технических навыков. Такой прием хорош для сильных школьников, а в классах у нас есть ребята разного уровня подготовленности и мотивированности.
Для ускоренного приобретения школьниками технических навыков работы с массивами мы проводим на уроках непродолжительные по времени самостоятельные работы. Мы предлагаем вам две самостоятельные работы на языке Pascal, которые позволяют закрепить технические навыки работы с массивами.
Самостоятельная работа “Индекс и значение элемента массива”
Цель работы — проверить, насколько учащиеся различают понятия “индекс элемента” и “значение элемента”, умеют выполнять простейшие действия с элементами массивов. Работа представлена в четырех вариантах одинакового уровня сложности и рассчитана на 30 минут.
Вариант 1
1. Дано описание массива mas: array [-2..8] of integer. Сколько элементов содержит данный массив?
2. Дано описание массива:
const m = const1; n = const2;
{const1 < const2}
var mas: array [m..n] of integer;
Напишите оператор присваивания, который в элемент массива, находящийся ровно в центре массива (при нечетном количестве элементов), заносит значение суммы двух соседних элементов.
3. Для массива из задания 2 напишите фрагмент программы, который выводит на экран значения всех элементов с четными индексами.
Вариант 2
1. Дано описание массива mas: array [-10..10] of integer. Сколько элементов содержит данный массив?
2. Дано описание массива:
const m = const1; n = const2;
{const1 < const2}
var mas: array [m..n] of integer;
Напишите оператор присваивания, который в элемент, находящийся ровно в центре массива (при нечетном количестве элементов), заносит значение суммы крайних элементов массива.
3. Для массива из задания 2 напишите фрагмент программы, который вычисляет сумму элементов с нечетными значениями.
Вариант 3
1. Дано описание массива mas: array [-6..2] of integer. Сколько элементов содержит данный массив?
2. Дано описание массива:
const m = const1; n = const2;
{const1 < const2}
var mas: array [m..n] of integer;
Напишите оператор присваивания, который в элемент массива, находящийся ровно в центре массива (при нечетном количестве элементов), заносит значение произведения двух соседних элементов.
3. Для массива из задания 2 напишите фрагмент программы, который выводит на экран значения всех элементов с нечетными индексами.
Вариант 4
1. Дано описание массива mas: array [-22..0] of integer. Сколько элементов содержит данный массив?
2. Дано описание массива:
const m = const1; n = const2;
{const1 < const2}
var mas: array [m..n] of integer;
Напишите оператор присваивания, который в элемент массива, находящийся ровно в центре массива (при нечетном количестве элементов), заносит значение модуля разности крайних элементов массива.
3. Для массива из задания 2 напишите фрагмент программы, который обнуляет значения отрицательных элементов с четными индексами.
Решение самостоятельной работы “Индекс и значение элемента массива”
Вариант 1
1. 11 элементов.
2. Определяем номер центрального элемента массива:
r := (n + m) div 2, тогда
mas[r] := mas[r — 1] + mas[r + 1]
3. for i := m to n do
begin
k := i mod 2 ;
if k = 0 then write(mas[i]: 4)
end;
Вариант 2
1. 21 элемент.
2. Определяем номер центрального элемента массива:
r := (n + m) div 2, тогда
mas[r] := mas[m] + mas[n]
3. s := 0;
for i := m to n do
begin
k := mas[i] mod 2;
if k <> 0 then s := s + mas[i]
end;
writeln('Сумма элементов с нечетными значениями = ', s);
Можно предложить другой способ решения этой задачи: с использованием процедуры odd:
if odd(mas[i]) then s := s + mas[i];
Вариант 3
1. 9 элементов.
2. Определяем номер центрального элемента массива:
r := (n + m) div 2, тогда
mas[r] := mas[r — 1] * mas[r + 1]
3. for i := m to n do
begin
k := i mod 2;
if k <> 0 then write(mas[i]: 4)
end;
Вариант 4
1. 23 элемента.
2. Определяем номер центрального элемента массива:
r := (n + m) div 2, тогда
mas[r] := abs (mas[m] — mas[n])
3. for i := m to n do
begin
k := i mod 2;
if (k = 0) and (mas[i] < 0)
then mas[i] := 0;
write(mas[i]: 4)
end;
В процессе обучения школьников программированию важно обращать их внимание на осознанный выбор типа данных, который будет использоваться при решении конкретной задачи. Часто возникает такая ситуация: как только школьники освоили работу с массивом, они пытаются использовать этот тип данных при решении всех задач, даже тогда, когда это не является необходимостью.
Самостоятельная работа “Выбор типа данных”
Предлагаемая самостоятельная работа своей целью ставит проверить:
-
умение учащихся “читать” программу, в которой используются массивы;
-
умение учащихся выбирать такой тип данных, который позволит решить задачу наиболее эффективным способом;
-
навыки работы учащихся с циклами как базовыми алгоритмическими конструкциями.
Под эффективной программой мы понимаем такую программу, которая при решении использует минимальную память и решает поставленную задачу за приемлемое (минимальное) время.
Самостоятельная работа представлена в 14 вариантах одинакового уровня сложности и рассчитана на 20–30 минут. Рекомендуется раздавать задание ученикам в напечатанном виде на отдельных листах.
В этой работе описание и задание начальных значений массива выполнено через описание массива с помощью типизированных констант. Если ваши учащиеся не знакомы с таким заданием массива, то следует исправить условия задач (описать массив в блоке описания переменных и указать, с какими начальными значениями массива программа начинает работать).
Вариант 1
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (1, 4, 0, –1, 6);
var i, b: integer;
begin
b := a[1];
for i := 2 to n do if a[i] < b then b := a[i];
writeln(b)
end.
2. Напишите программу, вычисляющую факториал числа n.
Вариант 2
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (2, 9, 10, -19, 6);
var i, b: integer;
begin
b := a[1];
for i := 2 to n do if a[i] > b then b := a[i];
writeln(b)
end.
2. Напишите программу, вычисляющую x в степени n, где n — любое целое число.
Вариант 3
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (5, -8, 15, 15, 6);
var i, b, c: integer;
begin
b := a[1];
c := 1;
for i := 2 to n do if a[i] >= b then
begin
b := a[i];
c := i
end;
writeln(c)
end.
2. Напишите программу, вычисляющую сумму ряда
1 + 2 + 3 + 4 + 5…+ n, где n — натуральное число.
Вариант 4
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (5, -8, 15, 15, -8);
var i, b, c: integer;
begin
b := a[1];
c := 1;
for i := 2 to n do if a[i] <= b then
begin
b := a[i];
c := i
end;
writeln(c)
end.
2. Напишите программу, выводящую на экран первые n членов геометрической прогрессии с начальным членом b и знаменателем q (q > 0).
Вариант 5
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (5, -8, -10, 7, 14);
var i, b, c: integer;
begin
b := a[1];
for i := 2 to n do if a[i] <= b then
begin
c := b;
b := a[i];
a[i] := c
end;
for i := 1 to n do write(a[i]: 3)
end.
2. Напишите программу, выводящую на экран первые n членов арифметической прогрессии с начальным членом a и шагом d.
Вариант 6
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (1, 5, 2, -8, 14);
var i, b, c: integer;
begin
b := a[1];
for i := 2 to n do if a[i] >= b then
begin
c := b;
b := a[i];
a[i] := c
end;
for i := 1 to n do write(a[i]: 3)
end.
2. Напишите программу, вычисляющую среднее арифметическое введенных n чисел.
Вариант 7
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (1, 2, 3, 4, 5);
var i, b: integer;
begin
b := a[1];
for i := 2 to n do b := a[i] + b;
writeln(b)
end.
2. Напишите программу, которая находит максимальное число из введенных n чисел.
Вариант 8
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (-1, 2, 5, 4, 1);
var i: integer;
begin
for i := 2 to n do a[i] := a[i] + a[i — 1];
for i := 1 to n do write(a[i]: 3)
end.
2. Напишите программу, которая находит минимальное число из введенных n чисел.
Вариант 9
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (1, 2, 3, -1, -2);
var i: integer;
begin
for i := 2 to n do a[i] := a[i] * a[i — 1];
for i := 1 to n do write(a[i]: 3)
end.
2. Напишите программу, которая выведет номер последнего введенного нуля в последовательности из n чисел.
Вариант 10
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (1, 1, 2, 2, 3);
var i, c: integer;
begin
c := 0;
for i := 1 to n do if a[i] = i then c := c + 1;
writeln(c)
end.
2. Напишите программу, которая в последовательности из n чисел выведет номер первой введенной единицы.
Вариант 11
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (0, 7, -9, 12, -123);
var i, c: integer;
begin
c := 0;
for i := 1 to n do if a[i] <= 0 then c := c + 1;
writeln(c)
end.
2. Напишите программу, которая выведет на экран произведение n введенных чисел.
Вариант 12
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (0, 7, -5, 98, -967);
var i, c: integer;
begin
c := 0;
for i := 1 to n do if a[i] > 0 then c := c + 1;
writeln(c)
end.
2. Напишите программу, которая выведет на экран сумму первых n членов гармонического ряда (1/1 + + 1/2 + 1/3 + … + 1/n).
Вариант 13
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..5] of integer = (1, -9, 3, 98, 6);
var i: integer;
begin
for i := 1 to n do if a[i] = i then a[i] := a[i] + i;
for i := 1 to n do write(a[i]: 3)
end.
2. Напишите программу, которая выведет разность максимального и минимального из n введенных чисел.
Вариант 14
1. Определите, что делает следующая программа и какой результат она выдаст на заданном массиве:
const n = 5;
a: array [1..n] of integer = (4, 15, 9, 8, -78);
var i: integer;
begin
for i := 1 to n do if i mod 2 = 0 then a[i] := a[i] * (-1);
for i := 1 to n do write(a[i]: 3)
end.
2. Напишите программу, которая выведет на экран количество четных чисел в последовательности из n чисел.
Решение самостоятельной работы “Выбор типа данных”
Обратите внимание, что во вторых заданиях всех вариантов для решения задачи нецелесообразно использовать массивы. В группах углубленного изучения информатики (программирования) за использование массивов при решении этих задач рекомендуется снижать оценку.
Вариант 1
1. Реализован алгоритм нахождения значения минимального элемента массива. На заданном массиве на экран будет выведено значение –1.
2.
var i, n: integer; f: longint;
begin
readln (n);
f := 1;
for i := 1 to n do f := f * i;
writeln('Факториал числа' ,n,' равен ',f)
end.
Вариант 2
1. Реализован алгоритм нахождения значения максимального элемента массива. На заданном массиве на экран будет выведено значение 10.
2.
var x, n, i: integer; pow: real;
begin
readln (x, n);
pow := 1;
for i := 1 to abs (n) do pow := pow * x;
if n < 0 then pow := 1 / pow;
writeln (x,'в степени ',n,' = ', pow: 20: 15)
end.
Вариант 3
1. Реализован алгоритм нахождения индекса максимального элемента в массиве. При наличии несколь-
ких максимальных элементов программа выдаст но-
мер последнего. На заданном массиве программа выдаст на экран число 4.
2.
var n, i, sum: integer;
begin
readln (n);
sum := 0;
for i := 1 to n do sum := sum + i;
writeln('Сумма ряда до числа' ,n,' = ',sum)
end.
Вариант 4
1. Реализован алгоритм нахождения индекса мини-
мального элемента в массиве. Если минимальных эле-
ментов несколько, то будет выведен индекс последнего. На заданном массиве программа выдаст на экран число 5.
2.
var n, i, b, q, geom: integer;
begin
readl (n, b, q);
geom := b;
write (b, ' ');
for i := 2 to n do
begin
geom := geom * q;
write(geom, ' ')
end
end.
Вариант 5
1. Реализован алгоритм замены минимального из обработанных чисел на предыдущее минимальное значение. На массиве {5, –8, –10, 7, 14} будут произведены две замены: –8 на 5 и –10 на –8. Результат работы программы: _ _ 5 _ _ 5 _ –8 _ _ 7 _ 14 (пробелы для наглядности обозначены символом “_”).
2.
var n, i, a, d, arifm: integer;
begin
readln (n, a, d);
arifm := a;
write (a, ' ');
for i := 2 to n do
begin
arifm := arifm + d;
write (arifm, ' ')
end
end.
Вариант 6
1. Реализован алгоритм замены максимального из обработанных чисел на предыдущее максимальное число. В массиве {1, 5, 2, –8, 14} будут произведены две замены: 5 на 1 и 14 на 5. Результат работы программы: _ _ 1 _ _ 1 _ _ 2 _ –8 _14 (пробелы для наглядности обозначены символом “_”).
2.
var n, i, a, sum: integer; mean: real;
begin
readln (n);
sum := 0;
for i := 1 to n do
begin
read (a);
sum := sum + a
end;
mean := sum / n;
writeln (mean)
end.
Вариант 7
1. Реализован алгоритм суммирования всех элементов массива. На экран будет выведено число 15.
2.
var n, i, a: integer; max: integer;
begin
readln (n);
read (a);
max := a;
for i := 2 to n do
begin
read (a);
if max < a then max := a
end;
writeln (max)
end.
Вариант 8
1. Реализован алгоритм, в котором каждому i-му элементу массива присваивается сумма первых i элементов массива. На экран будет выведено: _–1_ _1_ _ 6 _ 10 _ 11 (пробелы для наглядности обозначены символом “_”).
2. Текст программы отличается от предыдущего варианта только условием в условном операторе
(if min > a then min := a).
Вариант 9
1. Реализован алгоритм, в котором каждому i-му элементу массива присваивается произведение первых i элементов массива. На экран будет выведено:
_ _ 1 _ _ 2 _ _ 6 _ –6 _12 (пробелы для наглядности обозначены символом “_”).
2.
var n, i, a, last: integer;
begin
readln (n);
for i := 1 to n do
begin
readln (a);
if a = 0 then last := i
end;
writeln (last)
end.
Вариант 10
1. Реализован алгоритм подсчета количества элементов, значение которых равно их индексу. На экран будет выведено число 1.
2.
var n, i, a: integer;
begin
readln (n);
i := 1;
repeat
readln (a);
if a = 1 then writeln (i);
i := i + 1
until (a = 1) or (i – 1 = n)
end.
Вариант 11
1. Реализован алгоритм подсчета неположительных элементов в массиве: на экран будет выведено число 3.
2.
var n, i, a, mult: integer;
begin
read(n);
i := 0;
mult := 1;
repeat
readln (a);
mult := mult * a;
i := i + 1
until i = n;
writeln(mult)
end.
Вариант 12
1. Реализован алгоритм подсчета положительных элементов в массиве: на экран будет выведено число 2.
2.
var n, i, a: integer; garm: real;
begin
readln (n);
garm := 0;
for i := 1 to n do garm := garm + 1 / i;
writeln (garm)
end.
Вариант 13
1. Реализован алгоритм, в котором каждый элемент массива, совпадающий со своим индексом, удваивается. Ответ: _ _2 _ –9 _ _ 6 _ 98 _ _ 6 (пробелы для наглядности обозначены символом “_”).
2.
var n, i, a, max, min: integer;
begin
readln (n,a);
max := a;
min := a;
i := 1;
while i < n do
begin
i := i + 1 ;
read (a);
if max < a then max := a
else if min > a then min := a
end;
writeln('Разница между макс. и миним. равна ',max-min)
end.
Вариант 14
1. Реализован алгоритм умножения на –1 каждого элемента массива, стоящего на четном месте. На экран будет выведено: _ _ 4 –15 _ _ 9 _ –8 –78 (пробелы для наглядности обозначены символом “_”).
2.
var n, a, count: integer;
begin
readln (n);
count := 0;
for i := 1 to n do
begin
read (a);
if a mod 2 = 0 then count := count + 1
end;
writeln('Количество четных чисел равно: ', count)
end.