1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
| //Консольное приложение
#include <iostream>
#include <iomanip>
#include <cstddef>
#include <cstdlib>
using namespace std;
//Прототип функции для ввода вектора X
double* inputv(int n);
//Прототип функции для вывода вектора на монитор X
void outputv(double * a, int n);
//Прототип функции для ввода матрицы a
double** inputm(int n, int m);
//Прототип функции для вывода матрицы a на монитор
void outputm(double ** a, int n, int m);
//Прототип функции для разности матриц a и b
double ** raznost(double** a, double ** b, int n, int m);
//Прототип функции для умножения матрицы на вектор и их суммирование
double * ymnozh(double** с, int n, int m, double * x);
//Главная функция
void main()
{ //Руссификация
setlocale(LC_ALL, "Russian");
//Объявление указателя на массив указателей и переменных
double ** a, ** b;
double **c;
double * x,* z;
int n, m;
//Ввод количество строк и столбов матрицы
cout << "\n Ввести количество строк и столбцов матрицы: ";
cin >> n >> m;
//Ввод матрицы a
cout << "\n Ввести матрицу a = ";
a = inputm(n, m);
//Вывод матрицы a
cout << "\n Матрица a = ";
outputm(a, n, m);
//Ввод матрицы b
cout << "\n Ввести матрицу b =";
b = inputm(n, m);
//Вывод матрицы b
cout << "\n Матрица b = ";
outputm(b, n, m);
//Ввод размера вектора n
cout << "\n Ввести размер вектoра x = \n";
cin >> n;
//Ввод вектора X
cout << "\n Ввести через пробел n координат вектора x: \n";
x = inputv(n);
//Вывод вектора X
cout << "\n ***Вектор x:*** \n";
outputv(x, n);
//Обращение к функции для умножении матрицы на вектор
z = ymnozh(a, n, m, x);
cout << "\n Произведение матрицы на вектор и их суммирование = \n";
//Вывод полученной матрицы
outputv(z, n);
//Обращение к функции для разности матриц a и b
c = raznost(a, b, n, m);
cout << "\n Разность матриц с = \n";
//Вывод полученной матрицы
outputm(c, n, m);
cout << endl;
}
//Функция для ввода вектора X в оперативную память
double* inputv(int n)
{//Объявление переменной
int i;
//Объявление указателя
double * a;
//Выделение оперативной памяти под вектор
a = new double[n];
if (a == NULL) {
cout << "\n Не хватило оперативной памяти";
exit(1);
}
//Ввод
for (i = 0; i < n; i++)
cin >> a[i];
return a;
}
//Функция для вывода вектора X на монитор
void outputv(double * a, int n)
{//Объявление переменных
int i;
//Вывод
for (i = 0; i<n; i++)
{
if (i % 5 == 0) cout << "\n";
cout << setw(10) << a[i];
}
}
//Функция для ввода матрицы a в оперативную память
double** inputm(int n, int m)
{//Объявление переменной
int i, j;
//Добавление указателя на массив указателей
double ** a;
//Выделение оперативной памяти под указателей на строки
a = new double *[n];
if (a == NULL) {
cout << "\n не хватило оперативной памяти";
exit(1);
}
//Выделяем оперативную память под каждый элемент строки
for (i = 0; i<n; i++)
{
a[i] = new double[m];
if (a[i] == NULL) {
cout << "\n не хватило оперативной памяти";
exit(1);
}
}
//Ввод матрицы a
for (i = 0; i < n; i++)
{
cout << "\n ввести через пробел " << i << "/n";
for (j = 0; j < m; j++)
cin >> a[i][j];
}
return a;
}
//Функция для вывода матрицы на монитор
void outputm(double ** a, int n, int m)
{//Объявление переменных
int i, j;
//Вывод
for (i = 0; i<n; i++)
{
cout << endl;
for (j = 0; j<m; j++)
cout << setw(10) << a[i][j];
}
}
//Функция для для разности матриц
double ** raznost(double** a, double** b, int n, int m)
{ //Объявление переменной
double ** c;
int i, j;
//Выделение озу под указатели на строки матрицы
c = new double*[n];
if (c == NULL) {
cout << "\n не хватило озу";
exit(1);
}
//Выделение ОЗУ под столбцы
for (i = 0; i < m; i++)
c[i] = new double[m];
if (c[i] == NULL) {
cout << "\n не хватило озу";
exit(1);
}
//Вычисление
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
c[i][j] = a[i][j] - b[i][j];
}
return c;
}
//Функция для умножения матрицы на вектор и их суммирование
double * ymnozh(double** с, int n, int m, double * x)
{ //Объявление переменной
double * z;
int i, j;
//Выделение озу под указатели на строки матрицы
z = new double[n];
if (z == NULL) {
cout << "\n не хватило озу";
exit(1);
}
//Вычисление
for (i = 0; i < n; i++)
{
z[i] = 0;
for (j = 0; j < m; j++)
z[i] += z[i] + с[i][j] * x[j];
}
return z;
} |