Не работает сложение матриц - C (СИ)
Формулировка задачи:
Доброго времени суток.
Написала программу для сложения 2х матриц на С. Проблема такая: внутри циклов все работает нормально, но на выходе из цикла почему-то все строчки массива приравниваются последней его строчке.
Подскажите, где здесь ошибка? Почему так получается?
#include <stdio.h>
#include <conio.h>
#include <math.h>
main () {
int i=0,j=0, m=0, n=0;
float a[m][n], b[m][n], f[m][n];
printf("vvedite dliny strok i stolbtsov matrits m i n sootvetstvenno:\n");
scanf("%i%i", &m, &n);
printf("m=%i, n=%i\n", m, n);
printf("vvedite elementy matritsi A postrochno\n");//ввод элементов матрицы А
for(i=0;i<m;i++){
printf("vvedite %i stroku\n",i+1);
for(j=0;j<n;j++){
printf("a[%i][%i]=", i, j);
scanf("%f",&a[i][j]);}}
printf("matritsa A:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("a[%i][%i]=%f ",i, j, a[i][j]);
if (j%n==n-1) printf("\n");}}//переход на след.строку матрицы
printf("vvedite elementy matritsi B postrochno\n");//ввод элементов матрицы B
for(i=0;i<m;i++){
printf("vvedite %i stroku\n",i+1);
for(j=0;j<n;j++){
printf("b[%i][%i]=", i, j);
scanf("%f",&b[i][j]);}
}
printf("matritsa B:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("b[%i][%i]=%i ",i, j, b[i][j]);
if (j%n==n-1) printf("\n");}}
for(i=0;i<m;i++){//сумма матриц
for (j=0;j<n;j++)
f[i][j]=a[i][j]+b[i][j];}
printf("summa matrits A+B\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%f ", f[i][j]);
if (j%n==n-1) printf("\n");}
}
getch();
}Решение задачи: «Не работает сложение матриц»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
void allocate(double*** matrix, size_t n, size_t m)
{
size_t i;
*matrix = malloc(n * sizeof(double*));
for(i = 0; i < n; ++i)
(*matrix)[i] = malloc(m * sizeof(double));
}
void input(const char* p, double** matrix, size_t n, size_t m)
{
size_t i, j;
for(i = 0; i < n; ++i)
for(j = 0; j < m; ++j)
printf("%s[%u][%u] > ", p, i, j), scanf("%lf", &matrix[i][j]);
}
void sum(double** m1, double** m2, double** res, size_t n, size_t m)
{
size_t i, j;
for(i = 0; i < n; ++i)
for(j = 0; j < m; ++j)
res[i][j] = m1[i][j] + m2[i][j];
}
void display(double** matrix, size_t n, size_t m)
{
size_t i, j;
for(i = 0; i < n; ++i, putchar('\n'))
for(j = 0; j < m; ++j)
printf("%-6.2f", matrix[i][j]);
}
void deallocate(double*** matrix, size_t n)
{
size_t i;
for(i = 0; i < n; ++i)
free((*matrix)[i]);
free(*matrix);
}
int main()
{
size_t n, m;
double **m1, **m2, **result;
puts("Input dimensions of matrices:");
scanf("%u %u", &n, &m);
allocate(&m1, n, m);
allocate(&m2, n, m);
allocate(&result, n, m);
puts("Input matrix m1:");
input("m1", m1, n, m);
puts("Input matrix m2:");
input("m2", m2, n, m);
sum(m1, m2, result, n, m);
puts("Sum of matrices m1 and m2:");
display(result, n, m);
deallocate(&m1, n);
deallocate(&m2, n);
deallocate(&result, n);
exit(0);
}
Объяснение кода листинга программы
- Объявление функций и переменных:
void allocate(double*** matrix, size_t n, size_t m)void input(const char* p, double** matrix, size_t n, size_t m)void sum(double** m1, double** m2, double** res, size_t n, size_t m)void display(double** matrix, size_t n, size_t m)void deallocate(double*** matrix, size_t n)int main()size_t n, m;double **m1, **m2, **result;
- Ввод размеров матриц и выделение памяти под матрицы:
puts(Input dimensions of matrices:);scanf(%u %u, &n, &m);allocate(&m1, n, m);allocate(&m2, n, m);allocate(&result, n, m);
- Ввод данных для первой матрицы:
puts(Input matrix m1:);input(m1, m1, n, m);
- Ввод данных для второй матрицы:
puts(Input matrix m2:);input(m2, m2, n, m);
- Сложение матриц:
sum(m1, m2, result, n, m);
- Вывод суммы матриц:
puts(Sum of matrices m1 and m2:);display(result, n, m);
- Освобождение памяти:
deallocate(&m1, n);deallocate(&m2, n);deallocate(&result, n);
- Завершение программы:
exit(0);