Nickolay.info. Алгоритмы. Обработка матриц функциями, работающими с параметром - одномерным массивом

В этих примерах в учебных целях для работы с матрицами используются подпрограммы, обрабатывающие параметр-вектор. Так матрица хранится в памяти построчно, столбец матрицы при этом приходится сначала переписывать в служебный вектор.

Существует как минимум два более "умных" способа обращения с двумерными динамическими матрицами - описать и инициализировать указатель на массив указателей на строки матрицы, а затем выделить память под каждую строку (здесь, п. 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) << " ";
 }
 
}

Рейтинг@Mail.ru

вверх гостевая; E-mail