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) << " ";
}
}
|
|