3 семестр / ПрограммированиеCPP / Lab04
.docЛабораторная работа № 4
Работа с массивами в С++
Цель работы: изучение технологии работы с массивами в С++.
Задание
-
Изучить правила объявления массивов и работы с ними в С++.
-
Разработать консольный проект решения задачи в соответствии с вариантом, заданным в файле Var04.doc.
-
Оформить отчет о работе. В раздел "Выполнение" включить постановку задачи, код программы и тестовый пример. Для защиты работы продемонстрировать решение задачи на компьютере.
Учебная информация
Массивы предназначены для хранения множества данных одинакового типа. Общая форма описания массива:
тип имя[N1][N2]...;
где N1, N2, ... – значения размерностей массива, задаваемые константами.
Если массив одномерный, то N1 соответствует максимальному количеству элементов массива, например, описание
int x[10];
означает выделение памяти для хранения десяти элементов целого типа.
Объем памяти под двумерный массив равен произведению размерностей N1*N2, умноженному на количество байтов, занимаемое одним элементом данного типа, например, описание
double matr[5][3];
резервирует 5*3*8=120 байтов оперативной памяти под массив matr.
Для обращения к конкретному элементу массива следует задать его индекс. Индексы должны быть целого типа, причем начальным значением индекса всегда является нуль. Таким образом, в первом рассмотренном примере возможен доступ к элементам x[0], x[1], ... , x[9], а во втором – от matr[0][0] до matr[4][2].
Массив может быть инициализирован при описании, например:
int y[5]={4, 6, 2, 1, 9};
или
float z[2][2]={{1.5, 3.2}, {2.0, 4.5}};
Рассмотрим использование массивов для решения следующей задачи.
Даны массивы a[N] и b[N] целого типа, оба упорядоченные по возрастанию. Получить массив С, упорядоченный по возрастанию слиянием массивов a и b.
Ниже приведен листинг программы решения задачи.
#include <iostream>
using namespace std;
void main() {
int N=4, // 1
a[5]={4, 6, 8, 10}, // 2
b[5]={7, 9, 11, 20}, // 3
C[8], // 4
i=0,
j=0,
k;
if (a[N-1]>b[N-1]) a[N]=a[N-1]+1; // 5
else a[N]=b[N-1]+1; // 6
b[N]=a[N]; // 7
for (k=0; k<2*N; k++) // 8
if (b[i]<a[j]) { // 9
C[k]=b[i]; i++;
} else {
C[k]=a[j]; j++;
}
cout << "C = ";
for (k=0; k<2*N; k++) // 10
cout << C[k] << " ";
}
Поясним строки, помеченные в комментариях числами:
1 – задали количество элементов в массивах (в окончательном варианте программы данные лучше вводить с клавиатуры);
2, 3 – задали тестовые массивы. Размер указан на единицу больше для хранения дополнительного элемента ("сторожа"). Его необходимость определяется применяемым алгоритмом. После инициализации a[4] и b[4] будут равны нулю. Обычно границы массивов при их описании задаются "с запасом", с учетом требований конкретной задачи. Если инициализируются не все элементы массива, оставшиеся автоматически обнуляются;
4 – описали выходной массив;
5-7 – добавляем в a и b по одному элементу ("сторожу"), значения которых больше максимального элемента среди элементов обоих массивов;
8 – начинаем цикл слияния двух массивов;
9 – один шаг слияния выполняется как выбор минимального из двух элементов: a[j] и b[i], где i и j – переменные, указывающие на очередные элементы этих массивов. При исчерпании всех элементов одного из массивов "сторож" не дает выйти индексу за допустимый предел;
10 – вывод полученного результата. Рекомендуется для вывода результата в виде массива применять отдельный цикл, а не выводить элементы по мере их получения в основном алгоритме.
Для рассмотренного примера получен следующий результат: