
- •Задание 1. Простейшие классы и объекты
- •Основные понятия
- •Примеры выполнения задания
- •Постановка задания
- •Варианты контрольных заданий
- •Задание 2. Массивы – члены класса
- •Основные понятия
- •Примеры выполнения задания
- •Постановка задания
- •Варианты контрольных заданий Одномерные массивы – члены класса
- •Двумерные массивы – члены класса
- •Задание 3. Массивы объектов, указатели
- •Основные понятия
- •Постановка задания
- •Примеры выполнения задания
- •Варианты контрольных заданий
- •Задание 4. Перегрузка операций
- •Основные понятия
- •Примеры выполнения задания
- •Постановка задания
- •Варианты контрольных заданий
- •Задание 5. Наследование
- •Постановка задания
- •Пример выполнения задания
- •Варианты заданий
- •Оглавление
Задание 2. Массивы – члены класса
Цель задания – получение практических навыков создания и использования классов в случае, когда членами класса являются мссивы.
Основные понятия
Массивы являются наиболее часто используемыми структурами данных, представляющими собой совокупность элементов одного и того же типа. Наиболее часто в программах применяются одномерные и двумерные массивы (матрицы), но язык С++ позволяет работать и с многомерными массивами.
Одномерный массив представляет собой совокупность однотипных элементов, имеющих одно имя (имя массива), при этом доступ к каждому элементу массива осуществляется по имени массива и индексу элемента. Индекс первого элемента всегда 0, далее следуют 1, 2, и т.д.
int b[10]; // объявление массива b из 10 целых чисел
int a[5] = {1, 2 ,3, 4, 5}; // объявление и иинициализация массива
int c = a[2]; // c = 3
for(int i = 0; i < 5; i++) // доступ к элементам массиваa удобнее
cout<<a[i]<<’ ‘; // всего осуществлять, пользуясь циклом for
// или *(a+i), т. к. имя массива является указателем на начало массива
Любой доступ к элементу массива, осуществляемый индексированием, может быть выполнен с помощью указателя. При этом обычно программа работает быстрее, а во многих случаях имеет место экономия памяти. Адресация элементов массива с помощью указателей выполняется следующим образом:
int a[4]; int *pa; // указатель pa на тип int
pa = a; // pa присваивается адрес массива a
for(int i = 0; i < 4; i++)
cout<<*pa++<<’ ‘; // доступ к элементам массива
// или cout<<*(pa+i); или cout<<pa[i];
Отметим, что прибавление к указателю единицы обеспечивает переход к следующему элементу массива, а также то, что имя массива является константным указателем, поэтому его нельзя изменять, но можно присваивать указателям соответствующего типа.
Чаще всего одномерные массивы используются для создания символьных строк. В С++ строка определяется как массив значений типа char, который завершается нулевым символом (‘\0’). Доступ к элементам строки осуществляется так же, как доступ к элементам любого массива.
char[] = “123456”; // инициализация строки
gets(str); // ввод строки
cout<<"stroka== "<<str<<endl; // вывод строки
for(i = 0; str[i]; i++);
cout<<str[i]; // доступ к элементам строки
Двумерный массив (матрица) – представляет собой массив одномерных массивов. Каждый элемент массива имеет два индекса – номер строки и номер столбца, которые указываются в отдельных квадратных скобках. Например:
int b[3][4]; // объявление двумерного массива
int a[2][2] = {{1, 2}, // явная инициализация 0-й строки
{3, 4}}; // явная инициализация 1-й строки
for(int i = 0; i < 3; i++) // запонение и обработку матриц производят,
for(int j = 0; j < 4; j++) // пользуясь вложенными циклами
cout<<a[i][j]<<’ ‘; // доступ к элементам массива или *(a[i]+j)
Статические массивы – это массивы с фиксированной размерностью, элементы таких массивов занимают сплошой участок в памяти компьютера и располагаются последовательно друг за другом, причём элементы двумерного массива размещаются по строкам. Для создания, просмотра и обработки массивов используются циклы (для двумерных массивов – вложенные).
Динамические массивы – это массивы, для которых выделяется память и определяется размер во время выполнения программы. Создаётся динамический массив с помощью операции new и указателя. После завершения использования массива выделенную под массив память освобождают с помощью операции delete. Явно инициализировать динамические массивы нельзя.
Создание одномерного динамического массива:
int n; cin>>n; // ввод размерности массива n
int *p; // объявление указателя p на целый тип
p= new int[n]; // выделение памяти для массива
delete [] p; // удаление выделенной памяти
for(int i = 0; i < 4; i++)
cout<<p[i]<<’ ‘; // доступ к элементам массива с индексом i
// или *(p+i)
Если с помощью операции new невозможно выделить требуемый объём памяти, то операция new возвратит нулевой указатель. ого массива с индексом i допускаются выражения.
Создание динамической строки :
char *pstr; cin>> len;
pstr = new char[len];
delete [] pstr; // удаление строки
Создание двумерного динамического массива из n строк и m столбцов:
int n, m; int ** p; // указатель p на массив указателей
cin>>n; cin>>m;
p = new *int[n]; // память под массив указателей на строки
for(int i; i < n; i++)
p [i] = new int[m]; // выделение памяти для каждой строки
for(int i = 0; i < 3; i++) // доступа к элементам массива
for(int j = 0; j < 4; j++)
cout<< p [i][j]<<’ ‘ // или *( p [i] + j) или *(*( p + i) + j)
Удаление двумерного динамического массива происходит в несколько этапов:
for(int i = 0; i < n; i++) // удаление одномерных массивов (строк)
delete [] p[i];
delete [] p; // удаление массива указателей на строки
Следует помнить, что выделенная память для двумерного динамического массива не представляет собой сплошной участок, поскольку она выделяется несколькими операциями new.