13. Условие:
В каждой из матриц A (4×3), B (5×4) поменять местами две строки: в A вторую и третью строки, в B — первую и третью.
1) Функциональная
#include "pch.h"
#include <conio.h>
#include <iostream>
using namespace std;
void matrin(float a[][4], int n, int m, char c);
void matrout(float a[][4], int n, int m, char c);
void swap(float a[][4], int n1, int m1, int n, int m, char c);
void main()
{
setlocale(LC_ALL, "Russian");
float A[4][4], B[5][4];
// ввод матрицы
matrin(A, 4, 3, 'A');
matrin(B, 5, 4, 'B');
// вывод
matrout(A, 4, 3, 'A');
matrout(B, 5, 4, 'B');
// поменять местами строки
swap(A, 2, 3, 4, 3, 'A');
swap(B, 1, 3, 5, 4, 'B');
// вывод
matrout(A, 4, 3, 'A');
matrout(B, 5, 4, 'B');
_getch();
}
void matrin(float a[][4], int n, int m, char c)
{
int i, j;
cout << "Введите матрицу " << c << endl;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
cin >> a[i][j];
cout << endl;
}
void matrout(float a[][4], int n, int m, char c)
{
int i, j;
cout << "Матрица " << c << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << a[i][j] << "\t";
cout << endl;
}
}
void swap(float a[][4], int n1, int m1, int n, int m, char c) {
|
|
int i, j, tmp;
for (int j = 0; j < m; j++) {
tmp = a[n1-1][j];
a[n1-1][j] = a[m1-1][j];
a[m1-1][j] = tmp;
}
}
2) Объектно-ориентированная
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
class matr {
protected:
float **a;
int n, m, x, y;
char c;
public:
matr(int n1, int m1, char c1, int x1, int y1);
~matr();
void vvod();
void vivod();
void swap();
};
matr::matr(int n1, int m1, char c1, int x1, int y1) {
n = n1; m = m1; c = c1; x = x1; y = y1;
a = new float*[n];
int i, j;
for (i = 0; i < n; i++) {
a[i] = new float[m];
for (j = 0; j < m; j++)
a[i][j] = 0;
}
}
matr::~matr() {
int i;
for (i = 0; i < n; i++) { delete[] a[i]; }
delete[] a;
cout << "ends!" << endl;
}
void matr::vvod() {
int i, j;
cout << "Введите матрицу " << c << " размером " << n << "*" << m << endl;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
cin >> a[i][j];
}
}
void matr::vivod() {
int i, j;
cout << "Матрица " << c << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << a[i][j] << "\t";
cout << endl;
}
}
void matr::swap() {
int j, tmp;
for (int j = 0; j < m; j++) {
tmp = a[x - 1][j];
a[x - 1][j] = a[y - 1][j];
a[y - 1][j] = tmp;
}
};
// наследование
class matr_nasl: public matr {
private:
public:
matr_nasl(int n1, int m1, char c1, int x1, int y1);
~matr_nasl();
};
matr_nasl::matr_nasl(int n1, int m1, char c1, int x1, int y1): matr(n1, m1, c1, x1, y1) {}
matr_nasl::~matr_nasl() { cout << "ends!" << endl; }
void main() {
setlocale(LC_ALL, "Russian");
matr *a; matr_nasl *b;
a = new matr(4, 3, 'A', 2, 3);
b = new matr_nasl(5, 4, 'B', 1, 3);
a->vvod();
b->vvod();
a->vivod();
b->vivod();
a->swap();
b->swap();
a->vivod();
b->vivod();
a->~matr();
b->~matr_nasl();
_getch();
}
14. Условие:
Даны матрицы A (5×4), B (5×5), C (3×7). Найти значение выражения PA + 2PB – PC, где PA (PB, PC) — произведение положительных элементов матрицы A (B, C), не лежащих на главной диагонали.
|
|
1) Функциональная
#include <iostream>
using namespace std;
void FILLMATR(float matrix[][10], int k, int l) //функция заполнения матрицы
{
cout << "Введите значения матрицы:\n";
for (int i = 0; i < k; i++)
{
for (int j = 0; j<l; j++)
{
cin >> matrix[i][j];//ввод элементов матрицы
}
}
}
float CHECK(float matrix[][10], int k, int l) //функция обработки матрицы (проверка на главную диагональ и положительные элементы)
{
float pr = 0;
for (int i = 0; i < k; i++) //Цикл пробегается по всем элементам матрицы (кроме диагонали)
//проверяет, есть ли среди них хотя бы 1 положительное значение. Если есть,
//то присваивает переменной pr значение 1, чтобы можно было умножать на него без последствий получить 0
//или отрицательное число
{
for (int c = 0; c < l; c++)
{
if (i!= c && matrix[i][c] > 0)
{
pr = 1;
}
}
}
if (pr!= 0) //Если элементов, удовлетворяющих условию, нет, то произведение будет равно нулю
//Цикл for не запустится, а сразу вернётся произведение = 0
{
for (int i = 0; i < k; i++) //цикл произведения элементов
{
for (int j = 0; j < l; j++)
{
if (i!= j && matrix[i][j] > 0)
{
pr *= matrix[i][j]; //произведение элементов
}
}
}
return pr;
}
Else
{
return pr;
}
}
void main()
{
setlocale(LC_ALL, "Russian");
float A[10][10], B[10][10], C[10][10];
cout << "Матрица A\n";
FILLMATR(A, 5, 4); //вызов функции заполнения А
cout << "\nМатрица B\n";
FILLMATR(B, 5, 5);
cout << "\nМатрица C\n";
FILLMATR(C, 3, 7);
float prA = CHECK(A, 5, 4);//присваиваем произведению А значение возврата функции
float prB = CHECK(B, 5, 5);
float prC = CHECK(C, 3, 7);
cout << "\nПроизведение А: " << prA;
cout << "\nПроизведение B: " << prB;
cout << "\nПроизведение C: " << prC;
cout << "\nРезультат вычисления по формуле: " << prA + 2 * prB + prC<<endl;
system("pause");
}
2) Объектно-ориентированная
#include <iostream>
using namespace std;
class MAT
{
private:
float pr;
protected:
int k, l;
float** matrix;
public:
MAT(int k, int l):k(k), l(l) {};
void fillM()
{
matrix = new float* [k];
for (int i = 0; i < k; i++)
{
matrix[i] = new float[l];
for (int j = 0; j < l; j++)
{
cin >> matrix[i][j];
}
}
}
virtual float pM()
{
float pr = 0;
for (int i = 0; i < k; i++) //Цикл пробегается по всем элементам матрицы (кроме диагонали)
//проверяет, есть ли среди них хотя бы 1 положительное значение. Если есть,
//то присваивает переменной pr значение 1, чтобы можно было умножать на него без последствий получить 0
//или отрицательное число
{
for (int c = 0; c < l; c++)
{
if (i!= c && matrix[i][c] > 0)
{
pr = 1;
}
}
}
if (pr!= 0) //Если элементов, удовлетворяющих условию, нет, то произведение будет равно нулю
//Цикл for не запустится, а сразу вернётся произведение = 0
{
for (int i = 0; i < k; i++) //цикл произведения элементов
{
for (int j = 0; j < l; j++)
{
if (i!= j && matrix[i][j] > 0)
{
pr *= matrix[i][j]; //произведение элементов
|
|
}
}
}
return pr;
}
else
{
return pr;
}
}
};
void task()
{
MAT* A;
MAT* B;
MAT* C;
A = new MAT(5, 4);
B = new MAT(5, 5);
C = new MAT(3, 7);
cout << "Матрица А1 5x4:\n";
A->fillM();
cout << "\nМатрица B1 5x5:\n";
B->fillM();
cout << "\nМатрица C1 3x7:\n";
C->fillM();
float prA = A->pM();
float prB = B->pM();
float prC = C->pM();
cout << "\nПроизведение А: " << prA;
cout << "\nПроизведение B: " << prB;
cout << "\nПроизведение C: " << prC;
cout << "\nРезультат вычисления по формуле: " << prA + 2 * prB + prC << endl;
}
class MAT_2:public MAT //класс-наследник ищет среднее арифметическое положительных элементов
{
private:
float aver;
int num = 0;
public:
MAT_2(int k, int l):MAT(k, l) {};
void fillM()
{
matrix = new float* [k];
for (int i = 0; i < k; i++)
{
matrix[i] = new float[l];
for (int j = 0; j < l; j++)
{
cin >> matrix[i][j];
}
}
}
void averM()
{
float sum = 0;
for (int i = 0; i < k; i++)
{
for (int j = 0; j < l; j++)
{
if (matrix[i][j] > 0)
{
num++;
sum += matrix[i][j];
}
|
|
}
}
aver = sum / num;
}
void out()
{
cout <<endl<< "Количество элементов больших нуля: "<<num;
cout << endl << "Среднее значение: "<<aver;
}
};
void task2()
{
MAT_2* A1;
MAT_2* B1;
MAT_2* C1;
A1 = new MAT_2(5, 4);
B1 = new MAT_2(5, 5);
C1 = new MAT_2(3, 7);
cout << "Матрица А1 5x4:\n";
A1->fillM();
cout << "\nМатрица B1 5x5:\n";
B1->fillM();
cout << "\nМатрица C1 3x7:\n";
C1->fillM();
A1->averM();
B1->averM();
C1->averM();
cout << "\nA1: ";
A1->out();
cout << "\nB1: ";
B1->out();
cout << "\nC1: ";
C1->out();
}
int main()
{
setlocale(LC_ALL, "Russian");
task();
task2();
return 0;
}