
- •1. Краткие теоретические сведения
- •1.1. Хранение значений в массивах
- •1.2. Объявление переменной массива
- •1.3. Обращение к элементам массива
- •1.4. Использование индексной переменной
- •1.5. Инициализация массива при объявлении
- •1.6. Передача массивов в функции
- •1.8. Алгоритмы обработки двумерных массивов
- •1.8.1. Ввод и вывод матрицы
- •1.8.2. Заполнение матрицы случайными числами
- •1.8.3. Определение количество элементов, больших заданного а и расположенных в строках с нечетными номерами
- •1.8.4. Поиск в матрице строки с максимальной суммой
- •1.8.5. Определение количества строк матрицы, в которых суммы всех элементов отрицательные
- •1.8.6. Определение, есть ли в матрице столбец, содержащий хотя бы один нулевой элемент
- •1.8.7. Обработка элементов квадратных матриц относительно главной и побочной диагоналей
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Выполнение вычислений в строках и столбцах матрицы
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример для варианта 30
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Дополнительные задачи
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Перестановки строк или столбцов матрицы
- •2.4.4.1. Условие задания
- •2.4.5.2. Пример для варианта 30
- •2.4.5.3. Программа
- •2.4.5.4. Тестирование
- •2.4.6. Задание 6. Вычисление суммы элементов матрицы
- •2.4.6.1. Условие задания
- •2.4.6.2. Пример для варианта 30
- •2.4.6.3. Программа
- •2.4.6.4. Тестирование
- •2.4.7. Задание 7. Вычисление элементов одномерного массива на основе матрицы
- •2.4.7.1. Условие задания
- •2.4.7.2. Пример для варианта 30
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.8. Задание 8. Комбинированные задачи на двумерные массивы
- •2.4.8.1. Условие задания
- •2.4.8.2. Пример для варианта 30
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.9. Задание 9. Работа с матрицами
- •2.4.9.1. Условие задания
- •2.4.9.2. Пример решения задачи (вариант 30)
- •2.4.9.3. Разработка алгоритма решения
- •2.4.9.4. Определение переменных программы
- •2.4.9.5. Разработка текста программы
- •2.4.9.6. Отладка программы
- •2.4.9.7. Результаты работы программы
- •2.4.9.8. Формирование случайных чисел
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Хранение значений в массивах 2
1.5. Инициализация массива при объявлении
Как вы уже знаете, C++ позволяет вашим программам инициализировать переменные при объявлении. То же верно и для массивов. При объявлении массива вы можете указать первоначальные значения, поместив их между левой и правой фигурными скобками, следующими за знаком равенства. Например, следующий оператор инициализирует массив values:
int values[5] = { 100, 200, 300, 400, 500 };
Подобным образом следующее объявление инициализирует массив с плавающей точкой:
float salaries[3] = { 25000.00. 35000.00, 50000.00 };
Если вы не указываете первоначальное значение для какого-либо элемента массива, большинство компиляторов C++ будут инициализировать такой элемент нулем. Например, следующее объявление инициализирует первые три из пяти элементов массива:
int values[5] = { 100, 200, 300 };
Программа не инициализирует элементы values[3] и values[4]. В зависимости от вашего компилятора, эти элементы могут содержать значение 0. Если вы не указываете размер массива, который вы инициализируете при объявлении, C++ распределит достаточно памяти, чтобы вместить все определяемые элементы. Например, следующее объявление создает массив, способяый хранить четыре целочисленных значения:
int numbers[] = { 1, 2, 3, 4 };
При инициализации многомерных массивов начальные значения для каждой новой строки заключаются в фигурные скобки. Если отдельных фигурных скобок нет, то инициализация производится по мере возрастания индексов.
Примеры инициализации двумерного массива:
int s[l][2]={ {4,5,6}, {7,8,9}};
intf[l][2]={10,H, 12,13,14};
charp[2][2]={{1n'},{y}};
Массив s инициализируется полностью заданными значениями. В массиве f из его шести значений (размер массива f — 2 строки и 3 столбца) инициализируется только первые 5 элементов (это элементы с индексами 0,0 0,1 0,2 1,0 1,1). В массиве р инициализируются только 2 элемента: р[0][0]='п'и рШГ01=У.
Если не проинициализировать элементы массива перед началом работы с ним, то внешние и статические массивы инициализируются нулем, а автоматические и регистровые будут содержать «мусор», оставшийся в этом участке памяти.
Если задан размер массива, то значения, не заданные явно, определяются в зависимости от класса памяти.
1.6. Передача массивов в функции
Ваши программы будут передавать массивы в функции точно так же, как и любые другие переменные. Функция может инициализировать массив, прибавить к массиву значения или вывести элементы массива на экран. Когда вы передаете массив в функцию, вы должны указать тип массива. Нет необходимости указывать размер массива. Вместо этого вы передаете параметр например number_of_elements, который содержит количество элементов в массиве:
void some_function(int array[], int number_of_elements);
Следующая программа ARRAYFUN.CPP передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов:
#include <iostream.h>
void show_array (int array [] , int number_of_elements)
{
int i;
for (i = 0; i < number_of_elements; i++) cout << array[i] << ' ';
cout << endl;
}
int main()
{
int little_numbers[5] ={1,2,3,4,5};
int big_numbers[3] = { 1000, 2000, 3000 };
show_array(little_numbers, 5);
show_array(big_numbers, 3);
}
Как видите, программа просто передает массив в функцию по имени, а также указывает параметр, который сообщает функции количество элементов, содержащихся в массиве:
show_array(little_numbers, 5);
Следующая программа GETARRAY.CPP использует функцию get_values, чтобы присвоить три значения массиву numbers:
#include <iostream.h>
void get_values(int array[], int number_of_elements)
{
int i;
for (i = 0; i < number_of_elements; i++)
{
cout “ "Введите значение " << i << ": ";
cin ” array [i];
}
}
int main()
{
int numbers[3];
get_values(numbers, 3);
cout << "Значения массива" << endl;
for (int i = 0; i < 3; i++)
cout << numbers [i] << endl;
}
Как видите, программа передает массив в функцию по имени. Функция в свою очередь присваивает массиву элементы. Из ЛР №14 вы узнаете, что, пока ваша программа не передаст параметры в функцию с помощью адреса, функция не может изменить эти параметры. Однако, как можно заметить в данном случае, функция get_values изменяет параметр-массив numbers. Как вы узнаете из ЛР №15, C++ действительно передает массивы в функцию, используя указатели. Таким образом, функция может изменить элементы массива, если ей это нужно.
1.7. Двумерные массивы в С++
До этого момента мы рассматривали одномерные массивы, которыми не всегда можно ограничиться. Стандартом С определены многомерные массивы. При этом двумерный массив рассматриваются как массив элементов, каждый из которых является одномерным массивом. Трехмерный - как массив, элементами которого являются двумерные массивы и т.д.
Например, после объявления
int a[5][6][7];
в программе могут появиться выражения:
а[i] [j] [k] _ объект типа int;
а[2][0] - объект типа int* - одномерный массив из 7 целых;
а[1] - двумерный массив из 6*7 = 42 целых;
а - сам трехмерный массив.
Так как элементом массива а является двумерный подмассив размером 6*7, то при выполнении выражения а + 1 происходит смещение на величину элемента массива а, т.е. переход от а[0] к а[1]. Значение адреса при этом увеличивается на 6*7*sizeof(int) =84.
Для двумерного массива mas выражение mas[i][j] интерпретируется как *(*(mas+i)+j). Здесь mas[i] - константный указатель на i-ю строку массива mas.
В памяти массивы хранятся по строкам, т.е. при обращении к элементам в порядке их размещения в памяти быстрее всего меняется самый правый индекс.
Так, для массива с[2][3] его шесть элементов расположены в памяти так:
с[0][0] с[0][1] с[0][2] с[1][0] с[1][1] с[1][2].
Простейшая форма многомерного массива — двухмерный массив. Двумерный массив – это массив, каждый элемент которого имеет два индекса.
Двумерные массивы еще называются матрицей.
Простейший пример двумерного массива – таблица.
Допустим, необходимо обработать некоторые данные из таблицы. В таблице есть две характеристики: количество строк и количество столбцов. Также и в двумерном массиве, кроме количества элементов массива, есть такие характеристики как, количество строк и количество столбцов двумерного массива. То есть, визуально, двумерный массив - это обычная таблица, со строками и столбцами. Фактически двумерный массив - это одномерный массив одномерных массивов. Структура двумерного массива, с именем a, размером m x n показана ниже (рис. 11.4), где, m - количество строк двумерного массива; n - количество столбцов двумерного массива; m*n - количество элементов массива.
Рис. 11. 4. Двумерный массив в С++
Синтаксис объявления двумерного массива
/*тип данных*/ /*имя массива*/[/*количество строк*/][/*количество столбцов*/];
В объявлении двумерного массива, также как и в объявлении одномерного массива, первым делом, нужно указать:
тип данных;
имя массива.
После чего, в первых квадратных скобках указывается количество строк двумерного массива, во вторых квадратных скобках - количество столбцов двумерного массива. Двумерный массив визуально отличается от одномерного второй парой квадратных скобок. Рассмотрим пример объявления двумерного массива. Допустим нам необходимо объявить двумерный массив, с количеством элементов, равным 15. В таком случае двумерный массив может иметь три строки и пять столбцов или пять строк и три столбца.
Пример объявление двумерного массива:
int a[5][3];
a - имя целочисленного массива
- число в первых квадратных скобках указывает количество строк двумерного массива, в данном случае их 5;
-число во вторых квадратных скобках указывает количество столбцов двумерного массива, в данном случае их 3.
Инициализация двумерного массива
Инициализация массивов - это присваивание элементам массива некоторых начальных значений. В Си++ для этих целей предусмотрены некоторые специальные возможности. Самый простой способ инициализации состоит в том, что при объявлении массива в фигурных скобках указывается список конкретных значений элементов массива.
При инициализации двумерного массива каждая размерность должна быть заключена в фигурные скобки.
Примеры инициализации двумерного массива:
а) создается 15 элементов массива с именем а типа int:
int a[5][3] = { {4, 7, 8}, {9, 66, -1}, {5, -5, 0}, {3, -3, 30}, {1, 1, 1} };
В данном массиве 5 строк, 3 столбца; после знака присвоить ставятся общие фигурные скобочки, внутри которых ставится столько пар фигурных скобочек, сколько должно быть строк в двумерном массиве, причём эти скобки разделяются запятыми. В каждой паре фигурных скобок записывать через запятую элементы двумерного массива. Во всех фигурных скобках количество элементов должно совпадать. Так как в массиве пять строк, то и внутренних пар скобочек тоже пять. Во внутренних скобах записаны по три элемента, так как количество столбцов - три. Графически наш массив будет выглядеть, как двумерная таблица (рис. 10. 5).
Рис. 11.5. Графическая иллюстрация двумерного массива в С++
В каждой ячейке двумерного массива a показано значение, в нижнем правом углу показан адрес данной ячейки. Адресом ячейки двумерного массива является имя массива, номер строки и номер столбца.
б) создается 6 элементов массива с именем temp типа int:
int temp[2][3] = {
{ 3, 5, 4 },
{ 7, 4, 8 }
};
Доступ к элементам массива
Для доступа к n-ому элементу необходимо написать имя_массива[номер строки] [номер колонки] и работать с ним как с обычной переменной.
Примеры доступа к элементам двумерного массива:
num [0][1]=100; //записать в элемент num(0,1) число 100
test[1][1]=0,5; // в элемент test(1,1) записать 0,5
test[9][9]=10; // в элемент test(9,9) записать число 10