- •Министерство образования российской федерации
- •Введение
- •Программирование функций
- •Основные теоретические положения
- •Задания
- •Контрольные вопросы
- •Обработка массивов
- •Основные теоретические положения
- •1. Определение массивов
- •2. Массивы и указатели
- •3. Передача массивов функциям
- •Задания
- •Контрольные вопросы
- •Задания
- •Контрольные вопросы
- •Разработка абстрактных типов данных
- •Основные теоретические положения
- •1. Определение классов
- •3. Дружественные функции
- •4. Указатель this
- •5. Статические компонентные данные и компонентные функции static и const
- •6. Изменчивость
- •7. Вложенные классы
- •Задания
- •Контрольные вопросы
- •Раздел V создание и уничтожение объектов класса
- •Основные теоретические положения
- •Задания
- •Контрольные вопросы
- •Рекомендуемая литература
- •Раздел I. Программирование функций 4
2. Массивы и указатели
Имя массива является базовым (начальным) адресом в памяти, где хранится массив, это адрес элемента массива с индексом 0: m = &m[0]. В этой связи доступ к памяти для массивов и указателей ничем не отличается:
int m[10], *p = m; //p = &m[0]
for (int i = 0 ; i < 10; i++)
m[i] = i; // p[i] = i;
Выражения вида: m[i], mm[i][j] соответствуют выражениям более низкого уровня: *(m + i), *(*(mm + i) + j).
Имя массива-матрицы mm является базовым адресом одномерного массива указателей (mm[i] – адрес i-й строки), каждый элемент которого – также одномерный массив.
Например, массив int mm[N][M] может быть сформирован на базе массива int *mm[N] при выделении для каждого элемента (mm[i]) памяти для хранения M целых чисел или на базе указателя int **mm при выделении сначала памяти для хранения N указателей на int, а затем для хранения M целых по каждому из N указателей.
3. Передача массивов функциям
Для обработки массива функций базовый адрес массива передается по значению, содержимое массива при этом не копируется.
П р и м е р: определение функции
int summa (const int m[], int s) // m – указатель, m = massiv, s – размер, s = size
{ int i, sum = 0;
for (i = 0; i < s; i++)
sum+ = m[i];
return sum;
}
вызов функции
y = summa(massiv, size); // massiv – имя массива, size – размер
Наличие const в объявлении формального параметра m не позволит функции изменить содержимое массива.
Массивы-строки
Тип char* или char[] является формой строкового типа при условии, что последовательность символов заканчивается нулевым символом – ‘\0’. Только в этом случае функции из типа string или string.h могут обрабатывать строки. В библиотеке string (ANSI C++) реализован шаблонный класс string, который может использоваться как стандартизованный строковый тип. При этом необходимо подключить пространство имен стандартных библиотек: using namespace std;
П р и м е р : char *s1 = ”C++”; // объявление и инициализация
сhar s2[] = {‘C++’,’+’,’+’,’\0’}; //инициализация
string s3 = ”C++”; // строк
Операторы управления свободной памятью
Для создания и уничтожения объектов применяются операторы new и delete, которые отвечают за выделение и освобождение свободной памяти. Это необходимо при работе с динамическими структурами данных такими, как векторы, матрицы, списки, деревья.
В общем виде операторы new и delete принимают следующие формы:
new имя_типа
new имя_типа (инициализатор)
new имя_типа [выражение]
delete выражение
delete [] выражение
П р и м е р : int *p, *m; // объявление p и m
p = new int(10); // выделение памяти и инициализация
m=new int[10]; // выделение памяти для массива из 10 целых
delete p; // освобождение памяти
delete []m; // освобождение памяти
Задания
1. Сформировать случайным образом два массива, расположив их, соответственно, в статической и динамической памяти; тип массива: 1) «вектор»; 2) «матрица»; 3) «куб».
2. Реализовать функцию обработки массива для следующих вариантов:
вычислить сумму и число положительных элементов вектора (каждой строки матрицы, каждой матрицы куба);
найти два максимальных элемента;
выполнить сортировку по возрастанию;
вычислить произведение положительных элементов вектора (матрицы, куба);
вычислить среднее арифметическое суммы элементов вектора (матрицы, куба);
если элемент вектора (матрицы, куба) 10, то вычислить произведение этих элементов, иначе вычислить сумму;
переставить элементы вектора (строк матрицы, матриц куба): 1 N, 2 N-1 и т.д.;
найти произведение первых трех элементов вектора (элементов третьего столбца матрицы, элементов третьей матрицы куба);
вычислить сумму последних трех положительных элементов вектора (элементов третьей строки матрицы, элементов третьей снизу матрицы куба);
выполнить сортировку по убыванию;
найти число элементов вектора (матрицы, куба), кратных пяти;
записать в вектор (матрицу, куб) на место отрицательных элементов нули, а на место положительных элементов – единицы;
найти два минимальных элемента;
найти сумму четных элементов вектора (элементов каждой четной строки матрицы, элементов четных матриц куба);
если элементы вектора (матрицы, куба) кратны двум, то вычислить произведение этих элементов, вычислить сумму оставшихся элементов;
найти сумму нечетных элементов вектора (элементов каждой нечетной строки матрицы, элементов нечетных матриц куба);
найти число элементов вектора (матрицы, куба), кратных трем;
вычислить сумму первых двух положительных элементов вектора (элементов второй строки матрицы, элементов второй матрицы куба);
вычислить сумму положительных элементов вектора (матрицы, куба) и вывести на экран индексы этих элементов;
найти квадраты элементов вектора (матрицы, куба) и вывести на экран новый вектор (матрицу, куб).
Проверьте работоспособность программы на тестовом наборе данных.