Schreiben Sie darüberhinaus jeweils eine Funktion zum
Die Dimension soll jeweils vom Typ unsigned int sein.
Schreiben Sie dazu folgendes Hauptprogramm (die Parameter der einzelnen Funktionen gehen hieraus hervor):
#include <stdio.h>
/* ... */
int main(void)
{
  unsigned int rows, cols;
  MATRIX m1, m2, m3;
  printf("Zeilen, Spalten: "); scanf("%u,%u", &rows, &cols );
  mInit( &m1, rows, cols ); mInit( &m2, rows, cols ); mInit( &m3, rows, cols );
  mRand( &m1 ); mRead( &m2, stdin );
  mMul( &m3, &m1, &m2 ); /* m3 = m1 * m2 */
  mAdd( &m3, &m3, &m2 ); /* m3 = m3 + m2 */
  mWrite( &m3, stdout ); mFree( &m3 ); mFree( &m2 ); mFree( &m1 );
  return 0;
}
#include <stdio.h>
/* Die Struktur der MATRIX */
struct MATRIX
{
  unsigned int nRows;
  unsigned int nCols;
  double *pElmts;
};
/*--------------------------------------------------------------------------*/
void mInit(struct MATRIX *matrix, unsigned int rows, unsigned int cols)
{
  if (!matrix) /* Ist der übergebene MATRIX-Pointer gleich NULL, */
    return;    /* dann die Funktion mInit() beenden.             */
  /* Speicher fuer die Elemente reservieren */
  matrix->pElmts = (double *)malloc(rows * cols * sizeof(double));
  if (!matrix->pElmts) /* wurde Speicher reserviert? */
  {
    printf("Es konnte nicht genug Speicher reserviert werden!\n");
    exit(1); /* Programm abbrechen */
  }
  matrix->nRows = rows; /* Rows in die Matrix-Struktur schreiben */
  matrix->nCols = cols; /* Cols in die Matrix-Struktur schreiben */
}
/*--------------------------------------------------------------------------*/
void mFree(struct MATRIX *matrix)
{
  if (matrix && matrix->pElmts) /* Ist die Matrix und der Elmts-Pointer der Matrix ungleich NULL? */
  {
    free(matrix->pElmts); /* Speicher freigeben */
    matrix->pElmts = NULL;
  }
}
/*--------------------------------------------------------------------------*/
void mResize(struct MATRIX *matrix, unsigned int rows, unsigned int cols)
{
  mFree(matrix); /* Funktion mFree() aufrufen */
  mInit(matrix, rows, cols); /* Funktion mInit() aufrufen */
}
/*--------------------------------------------------------------------------*/
void mRand(struct MATRIX *matrix)
{
  unsigned int rows,cols;
  if (!matrix && !matrix->pElmts) /* Ist die Matrix und der Elmts-Pointer der Matrix ungleich NULL? */
    return;                       /* sonst die Funktion mRand() beenden */
  for (rows = 0; rows < matrix->nRows; rows++) /* alle Zeilen durchgehen */
  {
    for (cols = 0; cols < matrix->nCols; cols++) /* Spalten der aktuellen Zeile durchgehen */
    {
      matrix->pElmts[(rows * matrix->nCols) + cols] = rand(); /* Random-Zahl ins aktuelle Element schreiben */
    }
  }
}
/*--------------------------------------------------------------------------*/
void mRead(struct MATRIX *matrix, FILE *file)
{
  unsigned int rows,cols;
  double dummy;
  if (!matrix) /* Ist der übergebene MATRIX-Pointer gleich NULL, */
    return;    /* dann die Funktion mRead() beenden.             */
  for (rows = 0; rows < matrix->nRows; rows++) /* alle Zeilen durchgehen */
  {
    for (cols = 0; cols < matrix->nCols; cols++) /* Spalten der aktuellen Zeile durchgehen */
    {
      printf("Zeile: %u, Spalte: %u = ", rows + 1, cols + 1);
      fscanf(file, "%lf", &dummy);                           /* Zahl in einen Dummy schreiben */
      matrix->pElmts[(rows * matrix->nCols) + cols] = dummy; /* dummy jetzt in das aktuelle Element schreiben */
    }
  }
}
/*--------------------------------------------------------------------------*/
void mWrite(struct MATRIX *matrix, FILE *file)
{
  unsigned int rows,cols;
  if (!matrix) /* Ist der übergebene MATRIX-Pointer gleich NULL, */
    return;    /* dann die Funktion mWrite() beenden.            */
  for (rows = 0; rows < matrix->nRows; rows++) /* alle Zeilen durchgehen */
  {
    for (cols = 0; cols < matrix->nCols; cols++) /* Spalten der aktuellen Zeile durchgehen */
    {
      if (matrix->nCols < 6)
        fprintf(file, "%12e  ", matrix->pElmts[(rows * matrix->nCols) + cols]); /* ausgeben vom aktuellen Element */
      else
        fprintf(file, "Zeile: %u, Spalte: %u = %12e\n", rows, cols, matrix->pElmts[(rows * matrix->nCols) + cols]); /* ausgeben vom aktuellen Element */
    }
    fprintf(file,"\n");
  }
}
/*--------------------------------------------------------------------------*/
void mAdd(struct MATRIX *dest, struct MATRIX *source1, struct MATRIX *source2)
{
  unsigned int rows,cols;
  if (!source1 || !source2 || !dest) /* Ist einer der übergebenen MATRIX-Pointer gleich NULL? */
    return;                          /* dann Funktion mAdd() beenden                          */
  for (rows = 0; rows < source1->nRows; rows++) /* alle Zeilen durchgehen */
  {
    for (cols = 0; cols < source1->nCols; cols++) /* Spalten der aktuellen Zeile durchgehen */
    {
      dest->pElmts[(rows * source1->nCols) + cols] = source1->pElmts[(rows * source1->nCols) + cols] + source2->pElmts[(rows * source1->nCols) + cols];
    }
  }
  dest->nRows = source1->nRows; /* nRows bei der Ziel-Matrix setzen */
  dest->nCols = source1->nCols; /* nCols bei ber Ziel-Matrix setzen */
}
/*--------------------------------------------------------------------------*/
void mMul(struct MATRIX *dest, struct MATRIX *source1, struct MATRIX *source2)
{
  unsigned int i,j,k;
  if (!source1 || !source2 || !dest) /* Ist einer der übergebenen MATRIX-Pointer gleich NULL? */
    return;                          /* dann Funktion mMul() beenden                          */
  mResize(dest, source1->nRows, source2->nCols); /* neue Größe der Ziel-Matrix festlegen */
  /* eigentliche Routine zur Berechnung des Matrizenprodukts */
  for (k = 0; k < source1->nCols; k++)
  {
    for (i = 0; i < source1->nRows; i++)
    {
      for (j = 0; j < source2->nCols; j++)
      {
        if (k == 0)
          dest->pElmts[(i * dest->nCols) + j] = source1->pElmts[(i * source1->nCols) + k] * source2->pElmts[(k * source2->nCols) + j];
        else
          dest->pElmts[(i * dest->nCols) + j] += source1->pElmts[(i * source1->nCols) + k] * source2->pElmts[(k * source2->nCols) + j];
      }
    }
  }
}
/*--------------------------------------------------------------------------*/
int main(void)
{
  unsigned int rows,cols;
  struct MATRIX m1,m2,m3;
  printf("\nMatrix-Berechnungen\ncopyright 2000 Olaf Gramkow\n\n");
  printf("Bitte eine quadratische Matrix eingeben.\n");
  printf("Zeilen, Spalten: ");
  scanf("%u, %u", &rows, &cols); /* Anzahl der Zeilen und Spalten einlesen */
  if ((rows < 1) || (cols < 1)) /* min. Zeilen, Spalten gleich 1 ? */
  {
    printf("Es müssen min. eine Zeile und eine Spalte vorhanden sein!\n");
    exit(1); /* Programm beenden */
  }
  if (rows != cols) /* ist es eine quadratische Matrix? */
  {
    printf("Die Anzahl der Zeilen und Spalten ist unterschiedlich!\n");
    exit(1); /* Programm beenden */
  }
  mInit(&m1, rows, cols); /* Allokieren der Matrix m1 */
  mInit(&m2, rows, cols); /* Allokieren der Matrix m2 */
  mInit(&m3, rows, cols); /* Allokieren der Matrix m3 */
  mRand(&m1); /* Random-Zahlen in Matrix m1 schreiben */
  mRead(&m2, stdin); /* Matrix m2 einlesen */
  mMul(&m3, &m1, &m2); /* m3 = m1 * m2 */
  mAdd(&m3, &m3, &m2); /* m3 = m3 + m2 */
  printf("\nErgebnis:\n");
  mWrite(&m3, stdout); /* Matrix m3 schreiben (ausgeben) */
  mFree(&m3); /* Freigeben der Matrix m3 */
  mFree(&m2); /* Freigeben der Matrix m2 */
  mFree(&m1); /* Freigeben der Matrix m1 */
  return(0); /* Das Hauptprogramm gibt am Ende 0 zurück, da kein Fehler aufgetreten ist. */
}