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. */
}