Не зависят от конкретного компьютера Язык Си
Скачать 5.8 Mb.
|
Обработка матриц max = arr[0][0]; imax = 0; jmax = 0; for (i = 0; i < r; i++ ) for ( j = 0; j < c; j++ ) if (max < arr[i][j]) { max = arr[i][j]; imax = i; jmax = j; } cout << "Максимальный элемент [" << imax << "][" << jmax << “] = " << max << endl; … } Обработка матриц Обработка матриц Поиск максимального элемента матрицы и его номера. Результат работы программы: Обработка матриц При работе со строками инициализирующие действия производятся внутри внешнего цикла и до начала внутреннего цикла. При работе со строками матрицы количество результирующих элементов равно количеству строк матрицы. Работа со столбцами матрицы отличается от работы со строками матрицы тем, что цикл обработки столбцов становится внешним и количество результирующих элементов становится равным количеству столбцов матрицы. Поиск максимального элемента каждой строки матрицы … main () { setlocale(LC_ALL,"Russian"); const int r = 5, c = 7; int arr[r][c], i, j, max[r]; int a = -50, b = 50; … // заполнение матрицы случайными числами из диапазона [a,b] и вывод ее на экран Обработка матриц // поиск максимального элемента каждой строки матрицы for (i = 0; i < r; i++ ) { max[i] = arr[i][0]; for ( j = 0; j < c; j++ ) if (max[i] < arr[i][j]) max[i] = arr[i][j]; cout << "Максимальный элемент в строке " << i << " = " << max[i] << endl; } … } Обработка матриц Обработка матриц Поиск максимального элемента каждой строки матрицы. Результат работы программы: Поиск максимального элемента каждого столбца матрицы … main () { setlocale(LC_ALL,"Russian"); const int r = 5, c = 7; int arr[r][c], i, j, max[c]; int a = -50, b = 50; … // заполнение матрицы случайными числами из диапазона [a,b] и вывод ее на экран Обработка матриц // поиск максимального элемента каждого столбца матрицы for ( j = 0; j < c; j++ ) { max[j] = arr[0][j]; for ( i = 0; i < r; j++ ) if (max[j] < arr[i][j]) max[j] = arr[i][j]; cout << "Максимальный элемент в столбце " << j << " = " << max[j] << endl; } … } Обработка матриц Обработка матриц Поиск максимального элемента каждого столбца матрицы. Результат работы программы: Обработка матриц При работе с диагональными элементами матрицы предполагают, что матрица квадратная.
Обработка матриц Диагональ, соединяющая верхний левый угол матрицы с ее правым нижним углом, называется главной, а соединяющая правый верхний угол с левым нижним – побочной. На главной диагонали и на параллельных ей диагоналях разность индексов постоянна ( i – j = const ). На побочной диагонали и на параллельных ей диагоналях сумма индексов постоянна ( i + j = const ). Обработка матриц Рассмотрим некоторые свойства матриц: если номер строки элемента совпадает с номером столбца (i = j), то элемент лежит на главной диагонали матрицы; если номер строки превышает номер столбца (i > j), то элемент находится ниже главной диагонали; если номер столбца больше номера строки (i < j), то элемент находится выше главной диагонали; Обработка матриц Соотношение индексов квадратной матрицы Обработка матриц элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i + j + 1 = N; элементу, находящемуся выше побочной диагонали, соответствует неравенство i + j + 1 < N; элементу, находящемуся ниже побочной диагонали, соответствует неравенство i + j + 1 > N, где N – порядок матрицы. Обработка матриц Соотношение индексов квадратной матрицы Обработка матриц Рассмотрим алгоритмы работы с диагональными элементами матриц на примерах. Вывод на экран элементов главной диагонали квадратной матрицы из N строк и N столбцов A[1][1] A[2][2] A[N-1][N-1] A[0][0] #include #include #include #include #include #include using namespace std; main () { setlocale(LC_ALL,"Russian"); const int N = 5; int arr[N][N], i, j; Обработка матриц // заполнение матрицы случайными числами из диапазона [a,b] int a = -50, b = 50; srand(time( NULL )); for (i = 0; i < N; i++) for (j = 0; j < N; j++) arr[i][j] = rand()%(b - a + 1) + a; // вывод матрицы на экран for (i = 0; i < N; i++) { for (j = 0; j < N; j++) cout << setw(5) << arr[i][j] << " |"; cout << endl; } cout << endl; Обработка матриц // вывод на экран элементов главной диагонали for ( i = 0; i < N; i++ ) cout << "элемент [" << i << "][" << i << "] = " << arr[i][i] << endl; _getch(); return 0; } Обработка матриц Обработка матриц Вывод на экран элементов главной диагонали квадратной матрицы из N строк и N столбцов. Результат работы программы: Обработка матриц Вывод на экран элементов побочной диагонали квадратной матрицы из N строк и N столбцов A[N-1][0] A[N-2][1] A[1][N-2] A[0][N-1] … main () { setlocale(LC_ALL,"Russian"); const int N = 5; int arr[N][N], i, j; int a = -10, b = 10; … // заполнение матрицы случайными числами из диапазона [a,b] и вывод ее на экран for ( i = 0; i < N; i++ ) cout << "элемент [" << i << "][" << N – 1 – i << "] = " << arr[i][N – 1 – i] << endl; … } Обработка матриц Обработка матриц Вывод на экран элементов главной диагонали квадратной матрицы из N строк и N столбцов. Результат работы программы: Обработка матриц Вывод на экран элементов побочной диагонали квадратной матрицы из N строк и N столбцов A[N-1][0] A[N-2][1] A[1][N-2] A[0][N-1] … main () { setlocale(LC_ALL,"Russian"); const int N = 5; int arr[N][N], i, j; int a = -10, b = 10; … // заполнение матрицы случайными числами из диапазона [a,b] и вывод ее на экран for ( i = 0; i < N; i++ ) cout << "элемент [" << i << "][" << N – 1 – i << "] = " << arr[i][N – 1 – i] << endl; … } Обработка матриц Обработка матриц Вывод на экран элементов побочной диагонали квадратной матрицы из N строк и N столбцов. Результат работы программы: Обработка матриц Поиск суммы элементов, лежащих на главной диагонали матрицы и ниже ее строка 0: A[0][0] строка 1: A[1][0]+A[1][1] ... строка i: A[i][0]+A[i][2]+...+A[i][i] … main () { setlocale(LC_ALL,"Russian"); const int N = 7; int arr[N][N]; int i, j; int sum = 0; int a = -10, b = 10; … // заполнение матрицы случайными числами из диапазона [a,b] и вывод ее на экран Обработка матриц for ( i = 0; i < N; i++ ) //цикл по всем строкам for (j = 0; j <= i; j++) sum += arr[i][j]; //сложение элементов строки i, удовлетворяющих условию cout << "Сумма элементов, лежащих на главной диагонали и ниже ее = " << sum << endl; … } Результат работы программы Обработка матриц Динамические массивы Динамический массив – массив переменной длины, память под который выделяется в процессе выполнения программы. Динамическими в C++ могут быть как одномерные, так и многомерные массивы. Адрес первого элемента выделенной области памяти хранится в переменной, объявленной как указатель. Ключевым объектом для работы с динамическими массивами являются указатели. Указатели Указатель – переменная, значением которой является адрес ячейки памяти. То есть указатель ссылается на блок данных из области памяти, причем на его начало. Указатели используются для передачи данных по ссылке, что ускоряет процесс обработки этих данных, так как их не надо копировать, как при передаче по значению, то есть, используя имя переменной. Перед использованием указатель необходимо объявить: тип_данных *имя_указателя; Указатели Принцип объявления указателей такой же, как и принцип объявления переменных. Отличие заключается только в том, что перед именем указателя ставится используется префикс *. Инициализация указателя может осуществляться как при его объявлении, так и отдельно: int *ptrvar; // объявление указателя ptrvar = &var; // инициализация указателя или int *ptrvar = &var; // объявлен и инициализирован адресом переменной var указатель ptrvar Указатели Обратите внимание. В программировании принято добавлять к имени указателя приставку ptr. За счет этого получается «осмысленное имя указателя», и достигается его отличие от обычной переменной. Справочно: & – унарная операция взятия адреса. Данная операция извлекает адрес объявленных переменных для того, чтобы присвоить его указателю. Указатели При объявлении указателей компилятор выделяет несколько байт памяти, в зависимости от типа данных, отводимых для хранения некоторой информации в памяти. Чтобы получить значение, записанное в некоторой области, на которое ссылается, указатель нужно воспользоваться операцией разыменования указателя *. Таким образом, для получения доступа к значению указателя необходимо указать префикс * перед именем указателя. Указатели Внимание: когда мы оперируем данными, то используем префикс * когда мы оперируем адресами, то используем префикс &. Динамические массивы 1-й способ работы с динамическими матрицами основан на работе с одинарным указателем. При работе с динамическими матрицами следует помнить, что выделенный участок памяти под матрицу A(N,M) представляет собой участок памяти размером NxM элементов. После описания указателя, необходимо выделить память для хранения NxM элементов (N – число строк, M – число столбцов). Динамические массивы Выделение памяти для хранения массива осуществляется с помощью функций динамического выделения памяти calloc, malloc, унаследованных из языка С, или оператора new языка С++. При динамическом выделении память резервируется не на этапе компиляции, а на этапе выполнения программы. Это позволяет выделять память более эффективно. С динамическим выделением памяти нет необходимости заранее задавать размер массива. Динамические массивы Функция сalloc() – выделяет (резервирует) непрерывный блок ячеек памяти для хранения указанного объекта и возвращает указатель на первую ячейку этого блока при этом все элементы, под которые выделяется память, инициализируются нулями (обнуляются). Синтаксис: void *calloc(num, size); num – количество элементов массива, под который выделяется память. size – размер одного элемента в байтах. Динамические массивы Размер выделенного блока памяти равен величине num*size. Это означает, что функция calloc() выделяет блок памяти для массива размером num элементов, каждый из которых занимает size байт, и инициализирует выделенный блок памяти нулями. Динамические массивы Функция malloc() – memory allocation – выделяет (резервирует) непрерывный блок ячеек памяти для хранения указанного объекта и возвращает указатель на первую ячейку этого блока. Синтаксис: void *malloc(size); size – целое беззнаковое значение, определяющее размер выделяемого участка памяти в байтах. Динамические массивы Если резервирование памяти прошло успешно, то функция возвращает переменную типа |