Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №6/2008


Методика

Массивы и как с ними "бороться"

Успешное решение задач по программированию при сдаче вступительных экзаменов в вузы, при сдаче ЕГЭ по информатике практически невозможно без уверенной работы с массивами. Для этого необходимо понимать условие задачи, уметь “читать” текст программы, содержащей работу с массивами, технически грамотно выполнять действия над элементами массива и, конечно, в идеале — знать основные, базовые алгоритмы над массивами.

Наш опыт преподавания программирования в школе показывает, что как только школьники знакомятся с массивами, их интерес к программированию возрастает. Но задачи на обработку массивов не просты и алгоритмически, и технически. У школьников должна быть достаточно большая практика работы с массивами для того, чтобы они могли решать задачи, предлагаемые в ЕГЭ и на вступительных экзаменах по информатике в вузы. А для этого они в первую очередь должны уверенно оперировать с такими понятиями, как “индекс массива”, “элемент массива”, “значение элемента массива”.

К сожалению, на уроках информатики мы всегда ограничены временными рамками, зачастую мы не можем предоставить школьникам достаточно времени для выполнения “технических” задач. Цейтнот времени мы пытаемся преодолеть, совмещая интересные задачи с точки зрения построения алгоритма решения с одновременным приобретением технических навыков. Такой прием хорош для сильных школьников, а в классах у нас есть ребята разного уровня подготовленности и мотивированности.

Для ускоренного приобретения школьниками технических навыков работы с массивами мы проводим на уроках непродолжительные по времени самостоятельные работы. Мы предлагаем вам две самостоятельные работы на языке 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.

Т.. С.. Богомолова ;
Ир. Ни. Фалина ;
В.. А.. Шухардина

TopList