#include <stdio.h>
#include <iostream>
void main() {
setlocale(LC_ALL, "Russian");
//создание массива размерностью n
int n, m, a, b, i;
printf("Введите кол-во строк первой матрицы n: ");
scanf_s("%d", &n);
printf("Введите кол-во столбцов первой матрицы m: ");
scanf_s("%d", &m);
printf("Введите кол-во строк второй матрицы a: ");
scanf_s("%d", &a);
printf("Введите кол-во столбцов второй матрицы b: ");
scanf_s("%d", &b);
if (m <= n && n <= 0 && a <= 0 && b <= 0) {
printf("Введите положительные значения размерностей для размерности матриц!\n");
return;
}
if (n != a || m != b) {
printf("Строки и столбцы матриц должны быть равны!\n");
return;
}
int** A;
int** B;
int** C;
A = new int* [n];
B = new int* [a];
C = new int* [n];//результирующая матрица
if (A == NULL || B == NULL || C == NULL)
printf("Недостаточно памяти!");
for (int x = 0; x < n; x++) {
A[x] = new int[m];
if (A[x] == NULL) {
printf("Недостаточно памяти!");
for (int i = 0; i < x; i++)
delete[] A[i];
delete[] A;
}
}
for (int x = 0; x < a; x++) {
B[x] = new int[b];
if (B[x] == NULL) {
printf("Недостаточно памяти!");
for (int i = 0; i < x; i++)
delete[] B[i];
for (i = 0; i < n; i++)
delete[] A[i];
delete[] A;
delete[] B;
}
}
for (int x = 0; x < n; x++) {
C[x] = new int[m];
if (C[x] == NULL) {
printf("Недостаточно памяти!");
for (int i = 0; i < x; i++)
delete[] C[i];
for (int i = 0; i < n; i++)
delete[] A[i];
delete[] A;
for (int i = 0; i < a; i++)
delete[] B[i];
delete[] B;
delete[] C;
}
}
printf("Введите матрицу А:");
for (int x = 0; x < n; x++)
for (int j = 0; j < m; j++)
scanf_s("%d", &A[x][j]);
printf("Введите матрицу B:");
for (int x = 0; x < a; x++)
for (int j = 0; j < b; j++)
scanf_s("%d", &B[x][j]);
//summa
for (int x = 0; x < n; x++)
for (int j = 0; j < b; j++) {
int s = 0;
for (int r = 0; r < m; r++)
s = s + A[x][r] + B[r][j];
C[x][j]=s;
}
printf("Результирующая матрица:");
for (int x = 0; x < n; x++) {
for (int j = 0; j < b; j++)
printf("%d\b", C[x][j]);
printf("\n");
}
for (int x = 0; x < n; x++)
delete[] A[x];
for (int x = 0; x < m; x++)
delete[] B[x];
for (int x = 0; x < n; x++)
delete[] C[x];
delete[] A;
delete[] B;
delete[] C;
system("pause");
}
В цикле
for (int r = 0; r < m; r++)
s = s + A[x][r] + B[r][j];
содержится доступ к B[r][j]
для r
в диапазоне [0, m)
. Но матрица B
имеет размер [a][b]
. Если a
меньше, чем m
, то вы получите вылет за пределы массива со всеми вытекающими последствиями.
Проверки на это у вас в коде нет. Вы требуете равенства n == a
и m == b
, но никаких ограничений на относительные величины m
и a
не накладываете.
P.S. int main()
, а не void main()
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите, какой, по вашему мнению, можно выбрать порт для планируемой системы автоматического православного IT-исповеданияСуть разработки...
Допустим в Классе есть указатель, тогда каким образом можно его проверить на nullptrПри попытке использовать простой if( a == nullptr) выдаёт ошибку...
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение