Авторы:
Забавникова Евгения Александровна, учитель информатики МАОУ "Лицей №29" г.Тамбова
Очень часто при решении задач приходится сталкиваться с большим количеством данных одного типа. Такие данные реализуются в программе в виде массива. Массив – это совокупность переменных одного типа, имеющих одно имя и расположенных в памяти рядом. Переменные, входящие в состав массива, называются элементами массива. Обращение к каждому элементу массива осуществляется через его индекс или номер.
Массивы бывают:
- статические (размер известен при компиляции программы)
- динамические (размер определяется при выполнении программы).
Динамические массивы изучаются только в классах с информационно-технологическим профилем.
В школьной программе рассматриваются одномерные и двумерные массивы. Рассмотрим особенности изучения одномерных массивов, реализуя их на языке программирования С++.
Под одномерным массивом подразумевают массив, для индексации элементов которого используют один индекс. Чтобы работать с массивом, необходимо знать, как реализовать в языке программирования следующие пункты:
- Объявление массива.
- Формирование массива и вывод массива на экран.
- Поэлементная работа с массивом.
Рассмотрим их более подробно.
1. Объявление массива
Объявление массива в С++ производится следующим образом: указывается тип данных, к которым принадлежат элементы массива; имя массива; размерность массива.
Например:
int A[10];
char V[8];
bool mas[5];
В первом примере мы объявили массив из 10 целочисленных элементов с именем А, во втором – массив для 8 элементов символьного типа с именем V, в третьем – массив с именем mas из 5 логических элементов (компилятор языка программирования C++, различает строчные и прописные буквы).
Размер массива должен быть перечисляемого типа, его необходимо задать на момент компиляции программы и не менять в процессе ее выполнения.
Объявить массив можно через константу:
const int N=10;
int A[N];
Оформление массива с помощью константы N рекомендуется, так как вся программа будет написана с использование этой константы и, изменив количество элементов только в одной строке, программа будет выполняться для другого количества элементов массива.
Обращение к элементу массива выполняется через имя массива с индексом элемента в квадратных скобках. При этом следует помнить, что индексация элементов в С++ начинается с нуля. Таким образом, первым элементом означенного выше массива является А[0] , а последним, десятым – элемент A[9]. Эта особенность языка С++ очень важна с учетом того, что при компиляции и выполнении программ проверка на предмет выхода за пределы массива не выполняется. Язык С++ – это язык профессионалов и требует профессионального отношения, поэтому какие ошибки ложатся на плечи программистов. Выход за пределы массива опасная ошибка для вашей операционной системы.
Важной особенностью языка С++ является то, что ячейки памяти, в которые заносятся значения элементов массива, размещены рядом, т.е. являются смежными.
Еще одна особенностью С++ заключается в том, что имя массива (без индексов) является указателем на первый элемент массива. В рассмотренном выше примере имя массива А является указателем (адресом) на первый элемент массива A[0]. Адрес этого элемента можно получить, как и для обычной переменной, с помощью команды &A[0]. Однако профессионалы предпочитают использовать более простой синтаксис, основанный на имени массива. Зная, что элементы располагаются в смежных ячейках, и зная адрес первого элемента и количество элементов в массиве, получаем доступ ко всему массиву. Тема «Указатели в С++» является сложной и ее следует разбирать в классах, информационно-технологической направленности и до изучения одномерных и двумерных массивов. Это позволит на другом уровне производить обработку элементов массива.
2. Формирование массива
Чтобы заполнить массив элементов, необходимо обращение к каждому элементу. Это удобно выполнить, используя циклические конструкции while или for. Индексная переменная i пробегает значения от начального до конечного в цикле, позволяя обрабатывать все элементы массива.
Циклические конструкции:
i = 0;
while ( i < N )
{
// обработать A[i]
i ++;
}
for( i = 0; i < N; i++ )
{
// обработать A[i]
}
Можно предложить три способа формирования массива:
- Заполнение элементов массива алгебраическим способом.
Рассмотрим фрагмент программы формирования массива:
main()
{
const int N = 10;
int A[N];
int i;
for ( i = 0; i < N; i++ )
A[i] = 2*i;
}
Определите, чему будут равны элементы массива.
- Ввод с клавиатуры.
Рассмотрим фрагмент программы:
for ( i = 0; i < N; i++ )
{
cout << "A[" << i << "]=";
cin >> A[i];
cout <<endl;
}
В этом фрагменте на экран сначала выводится номер элемента массива, а дальше программа ждет ввод соответствующего элемента.
- С помощью датчика случайных чисел.
Приведен код программы, в которой формируется массив из 10 целочисленных элементов с помощью датчика случайных чисел в интервале [-10, 10], а потом эти значения выводятся в строчку на экране (на вывод каждого элемента массива отводится 5 знакомест).
#include <iostream>
#include <iomanip>
#include <locale.h>
#include <cstdlib>
#include <ctime>
using namespace std;
int random(int a) {
return rand() % a;
}
int main()
{
const int N = 10;
int a[N], i;
setlocale(LC_ALL, “Rus”);
cout << “Элементы массива:”<< endl;
srand(time(NULL));
for (i = 0; i < N; i++)
{ a[i]=random(21)-10; cout << setw(5) << a[i]; }
return 0;
}
В этой программе используется функция, возвращающая случайное число в основную программу. Для генерации случайных чисел используется функция rand() из стандартной библиотеки <cstdlib>, поэтому ее необходимо подключать в начале программы. Для начального значения при расчетах в датчике случайных чисел используется функция srand(), тоже из этой же библиотеки. Чтобы на всех компьютерах генерировались разные числа, за начальное число в функции srand() взято время с процессора. Для этого нам нужен #include <ctime>. Include <iomanip> служит для управления потоками ввода-вывода. Функция setw(5) позволяет выводить элементы массива с определенным интервалом, т.е. на вывод числа отводится 5 знакомест.
Команда return 0 является формальным подтверждением того, что работа программы завершена корректно.
3. Поэлементная работа с массивом
При любой обработке элементов массива необходимо организовать цикл, в котором переменная цикла изменяет свое значения для выполнения заданного алгоритма.
Обработка элементов массива
Можно выделить следующие группы задач на обработку элементов массива:
- Поиск заданного элемента массива.
- Поиск максимального и минимального элементов массива.
- Поиск полной или частичной суммы (произведения, количества) элементов массива.
- Работа с несколькими массивами.
- Рекурсия элементов массива.
- Циклический сдвиг элементов влево и вправо.
- Удаление одного или нескольких элементов массива.
- Вставка одного или нескольких элементов массива.
- Сортировка элементов массива.
- Алгоритмы быстрой сортировки.
- Двоичный поиск.
В каждой группе успех овладения материалом зависит от правильной подборки задач, т.е. по каждой теме необходимо разработать систему задач от простых алгоритмов к сложным.
Рассмотрим методику преподавания темы: «Удаление и вставка элементов массива» с подборкой задач по этой теме.
Удаление элементов из одномерного массива
Задача 1: Удалить из массива элемент с номером k.
Алгоритм:
- Первые (k – 1) элементы оставить без изменения.
- Сдвинуть все элементы, начиная с (k – 1)-го на один элемент влево.
- Последнему элементу присвоить значение 0.
- Вывести новый массив без последнего элемента.
Можно разобрать и составить блок-схему этого алгоритма, учащиеся должны разработать и провести отладку программы по данному алгоритму.
Задача 2: Удалить из массива максимальный элемент, если все элементы разные.
Примечание:
Необходимо найти номер максимального элемента и решение задачи сводится к рассмотренной выше.
Задача 3: Удалить все максимальные элементы.
Примечание:
Если необходимо удалить несколько элементов, то просматривать массив на нахождение нужных элементов надо с конца (т.к. иначе нужно будет снова возвращаться к элементу с номером, который только что удалили) и если элемент найден применить к нему удаление. Вести счетчик удаленных элементов. Вывести новый массив.
Система задач по этой теме:
- Удалить первый отрицательный элемент, если такого элемента, то вывести об этом сообщение.
- Удалить все отрицательные элементы.
- Удалить все элементы, большие данного числа А (А вводить с клавиатуры).
- Удалить все четные элементы, стоящие на нечетных местах.
- Удалить все повторяющиеся элементы, оставив только их первые вхождения, т.е. получить массив различных элементов.
- Удалить все элементы, кратные 3 или 5.
Вставка элементов в одномерный массив
Задача 1: Вставить число 100 после элемента с номером k.
Алгоритм:
- Первые (k – 1) элементы оставить без изменения.
- Все элементы, начиная с k-го, необходимо сдвинуть на один вправо.
- На место k-го элемента записываем значение x, то есть после (k – 1) элемента массива.
Важно! Необходимо выделять память при описании массива на один больше.
Задача 2: Вставить число 100 перед пятым элементом массива.
Примечание:
Эта вставка отличается от предыдущей тем, что сдвигать вправо надо элементы не с k-го, а с (k-1)-го элемента.
Задача 3: Вставит число 100 после всех элементов массива, кратных 3.
Примечание:
На сколько элементов может увеличиться массив? (Надо резервировать массив на 2*N элементов).
Лучше всего просматривать массив, начиная с конца, тогда вставляемый элемент мешать не будет. Номер последнего элемента можно будет знать (если знать, сколько элементов вставлено на данный момент), при этом просмотр будет последовательным от (N-1)-го до 0-го.
Система задач по этой теме:
- Вставить элемент после первого отрицательного элемента.
- Вставить элемент перед последним отрицательным элементом.
- Вставить два элемента: первый – после максимального элемента, второй – перед максимальным элементом (удобнее всего применить именно такой порядок вставки).
- Вставить по одному элементу перед всеми элементами, кратными заданному числу.
- Вставить по одному элементу перед всеми отрицательными элементами.
- Вставить число А перед всеми элементами, большими А, а число В – после всех элементов, меньших его.
В качестве контроля знаний провести следующую контрольную работу. Она рассчитана на 2 часа.
Контрольная работа по теме:
«Вставка и удаление элементов массива»
1 вариант.
Дан массив целых чисел (n=10), заполненный случайными числами в диапазоне [-5, 5].
- Удалить из него первый элемент, равный цифре 5.
- Удалить из него все элементы, кратные 3.
- Вставить число k после первого элемента, кратного своему номеру (k – вводится с клавиатуры).
- Вставить число m между всеми соседними элементами, которые образуют пару элементов с одинаковыми знаками.
- Поменять местами первый положительный и последний отрицательный элементы.
2 вариант.
Дан массив целых чисел (n=10), заполненный случайными числами в диапазоне [-20, 20].
- Удалить из него первый однозначный элемент (т.е. первый элемент меньший 10).
- Удалить из него все элементы, в которых последняя цифра четная, а само число делится на нее.
- Вставить число k перед первым элементом, в котором есть цифра 1 (k – вводится с клавиатуры).
- Вставить число m после всех элементов кратных 3.
- Переставить первые три и последние три элемента местами, сохраняя их следование.
3 вариант.
Дан массив целых чисел (n=10), заполненный случайными числами в диапазоне [0, 30].
- Удалить из него первый элемент, в котором последняя цифра четная.
- Удалить из него все элементы, которые состоят из одинаковых цифр (включая однозначные числа).
- Вставить число k после первого элемента, равного числу А (k и А – вводятся с клавиатуры).
- Вставить число k перед всеми элементами, в которых есть цифра 1 (k – вводится с клавиатуры).
- Переставить первые два и последние два элемента местами, сохраняя их следование.
4 вариант.
Дан массив целых чисел (n=10), заполненный случайными числами в диапазоне [-40, 40].
- Удалить из него первый элемент, в котором последняя цифра кратна 3.
- Удалить из него все элементы, первая цифра которых четная.
- Вставить число k перед первым элементом, в котором есть цифра 7 (k – вводится с клавиатуры).
- Вставить число m после всех элементов, кратных своему номеру.
- Поменять местами первый четный и последний нечетный элементы.