Pers.narod.ru. Алгоритмы. Обработка матриц функциями, работающими с параметром - одномерным массивом |
В этих примерах в учебных целях для работы с матрицами используются подпрограммы, обрабатывающие параметр-вектор. Так матрица хранится в памяти построчно, столбец матрицы при этом приходится сначала переписывать в служебный вектор.
Существует как минимум два более "умных" способа обращения с двумерными динамическими матрицами -
описать и инициализировать указатель на массив указателей на строки матрицы,
а затем выделить память под каждую строку (здесь, п. 8.5), либо интерпретировать матрицу как вектор
(здесь
приводится этот способ для Паскаля, для Си, в котором элементы массивов всегда нумеруются с нуля, обращение
к элементу матрицы a[i][j]
размерностью n x m
, где n
- число строк, m
- столбцов,
можно заменить на обращение к элементу a[i*m+j]
вектора размерностью n*m
).
/* В заданной матрице a[n][m] найти: максимальные элементы строк; минимальные элементы столбцов. Использовать функции, работающие с параметром - одномерным массивом Матрицу заполнить случайными целыми числами */ #include <iostream.h> #include <stdlib.h> int max (int n,int a[]) { int m=a[0]; for (int i=1; i<n; i++) { if (a[i]>m) m=a[i]; } return m; } int min (int n,int a[]) { int m=a[0]; for (int i=1; i<n; i++) { if (a[i]<m) m=a[i]; } return m; } void main () { const int n=4; const int m=3; int a[n][m]; randomize (); cout << "Матрица"; for (int i=0; i<n; i++) { cout << endl; for (int j=0; j<m; j++) { a[i][j]=random (100); cout << a[i][j] << " "; } } cout << endl << "Максимумы в строках" << endl; for (i=0; i<n; i++) cout << "Строка " << i << ":" << max(m,a[i]) << endl; cout << "Минимумы в строках" << endl; for (int j=0; j<m; j++) { int b[n]; for (int i=0; i<n; i++) b[i]=a[i][j]; cout << "Столбец " << j << ":" << min(n,b) << endl; } } /* В заданной матрице a[n][m] найти: среднее арифметическое элементов строк с чётными номерами; произведение элементов, значения которых больше 2, в строках с нечётными номерами; количество элементов, крастных 3, в столбцах с нечётными номерами. Использовать функции, работающие с параметром - одномерным массивом. Матрицу заполнить случайными вещественными числами */ #include <iostream.h> #include <stdlib.h> float average (int n, float a[]) { float s=0; for (int i=0; i<n; i++) s+=a[i]; return (s/n); } float proizv2 (int n, float a[]) { float pr=1; for (int i=0; i<n; i++) if (a[i]>2) pr*=a[i]; return pr; } int count3 (int n, int a[]) { int k=0; for (int i=0; i<n; i++) if (a[i]%3==0) k++; return k; } void main () { const int n=50; const int m=100; float a[n][m]; randomize (); cout << "Матрица"; for (int i=0; i<n; i++) { cout << endl; for (int j=0; j<m; j++) { a[i][j]=random(100)/25.; cout << a[i][j] << " "; } } for (i=0; i<n; i+=2) { float av=average(m,a[i]); float pr=proizv2(m,a[i+1]); cout << endl << "Среднее стр." << i << "=" << av << " Произведение стр." << (i+1) << "=" << pr; } cout << endl << "Кол-во эл-тов, кратных 3" << endl; for (int j=1; j<m; j+=2) { int b[n]; for (int i=0; i<n; i++) b[i]=a[i][j]; //Дробные части отбросили! cout << "Столбец " << j << ":" << count3(n,b) << " "; } }
гостевая; E-mail |