/* matrix1.c -- Speicherung einer Matrix mit Indexberechnung */

#include <stdio.h>		/* printf */
#include <stdlib.h>		/* malloc, abort */
#include <assert.h>

double *read_matrix(int *num_rows_p, int *num_columns_p)
{
  int num_rows;
  int num_columns;
  double *matrix_elements;
  
  printf("Anzahl Zeilen:  ");
  scanf("%d", &num_rows);
  printf("Anzahl Spalten: ");
  scanf("%d", &num_columns);

  matrix_elements = malloc(sizeof(double) * num_rows * num_columns);
  if (matrix_elements == NULL) {
    fprintf(stderr, "Allocation of memory failed\n");
    abort();
  }

  {
    int i, j;
    for (i = 0; i<num_rows; i++) {
      printf("Zeile %d: ", i);
      for (j = 0; j<num_columns; j++)
	scanf("%lf", matrix_elements + i * num_columns + j);
    }
  }
  *num_rows_p = num_rows;
  *num_columns_p = num_columns;
  return matrix_elements;
}

void print_matrix(int num_rows, int num_columns, double *matrix_elements)
{
  int i, j;
  for (i = 0; i<num_rows; i++) {
    for (j = 0; j<num_columns; j++)
      printf("%g ", *(matrix_elements + i * num_columns + j));
    printf("\n");
  }
}

double *matrix_sum(int num_rows_A, int num_columns_A, double *matrix_elements_A,
		   int num_rows_B, int num_columns_B, double *matrix_elements_B,
		   int *num_rows_p, int *num_columns_p)
{
  double *matrix_elements;
  int num_rows;
  int num_columns;
  /* Dimensionen ueberpruefen */
  assert(num_rows_A == num_rows_B && num_columns_A == num_columns_B);
  num_rows = num_rows_A;
  num_columns = num_columns_A;
  /* Speicher bereitstellen */
  matrix_elements = malloc(sizeof(double) * num_rows * num_columns);
  if (matrix_elements == NULL) {
    fprintf(stderr, "Allocation of memory failed\n");
    abort();
  }
  /* Summe berechnen */
  {
    int i, j;
    for (i = 0; i<num_rows; i++)
      for (j = 0; j<num_columns; j++)
	*(matrix_elements + i * num_columns + j)
	  = *(matrix_elements_A + i * num_columns_A + j)
	  + *(matrix_elements_B + i * num_columns_B + j);
  }
  /* Werte zurueckgeben */
  *num_rows_p = num_rows;
  *num_columns_p = num_columns;
  return matrix_elements;
}

int main()
{
  int num_rows_A;
  int num_columns_A;
  double *matrix_elements_A;
  int num_rows_B;
  int num_columns_B;
  double *matrix_elements_B;
  int num_rows;
  int num_columns;
  double *matrix_elements;
  
  printf("Matrix A:\n");
  matrix_elements_A = read_matrix(&num_rows_A, &num_columns_A);
  printf("Matrix B:\n");
  matrix_elements_B = read_matrix(&num_rows_B, &num_columns_B);

  matrix_elements = matrix_sum(num_rows_A, num_columns_A, matrix_elements_A,
			       num_rows_B, num_columns_B, matrix_elements_B,
			       &num_rows, &num_columns);
  printf("Matrix A + B:\n");
  print_matrix(num_rows, num_columns, matrix_elements);
  
  return 0;
}
