066
05.01.2004, 12:56 Uhr
Pablo
Supertux (Operator)
|
Ja, also, mein Source Code: (hab wieder eine Kleinigkeit verändert und ich benutze schon memcpy, ich includiere string.h dafür)
C++: |
#include <stdio.h> #include <malloc.h> #include <string.h>
void MatrInv(double *m, int Rang) { int i, j, k; double h; double *mat; mat = (double*)malloc (Rang*Rang*sizeof(double)); if (mat==NULL) { // nicht vergessen fprintf(stderr, "Kein Speicher mehr\n"); exit(1); }
for(j = 0; j<Rang; j++) for(i = 0; i<Rang; i++) mat[i+j*Rang] = i != j ? 0:1;
for(j = 0; j<Rang; j++) { h = m[j*Rang+j];
for(k = 0; k<Rang; k++) { m[k+j*Rang] /= h; mat[k+j*Rang] /= h; }
for(i = 0; i<Rang; i++) if(i != j && m[i*Rang+j] != 0) { h = -m[i*Rang+j]; for(k=0; k<Rang; k++) { m[k+i*Rang] += h * m[k+j*Rang]; mat[k+i*Rang] += h * mat[k+j*Rang]; } } } memcpy(m, mat, Rang*Rang*sizeof(double)); /* for(j=0; j<Rang*Rang; ++j) m[j] = mat[j]; free(mat); */
}
double Det(double *matrix, int Rang) { double *h; double r = matrix[0] * matrix[3] - matrix[1] * matrix[2]; int i, j, k, x = Rang-1, b = 1; if(Rang-2) { r = 0; for(i = -1; ++i<Rang; b = -b) { h = (double*)malloc(x*x*sizeof(double)); if (h==NULL) { // nicht vergessen fprintf(stderr, "Kein Speicher mehr\n"); exit(1); } for(j = 0; j<x; j++) for(k=0;k<x;k++) h[k+j * Rang-j] = matrix[(k<i?0:1) + Rang + k + j*Rang]; r+= b * matrix[ i ] * Det(h,x); free(h); } } return r; }
void EingabeDerMatrix(double* matrix, int Rang) { int Spalte, Zeile; int n=0;
for (Zeile = 0; Zeile < Rang; Zeile++) for (Spalte = 0; Spalte < Rang; Spalte++) { printf("%d. Zeile, %d. Spalte: ", Zeile+1, Spalte+1); scanf("%lf", &matrix[n]); n++; } } void printMat(const double*, int); int main() { int i, n; double* matrix; printf("Wir betrachten nur Quadartische Matrizen.\n"); printf("Geben Sie die Anzahl der Zeilen an: "); scanf("%d", &n); matrix = (double*) malloc(n*n*sizeof(double)); if (matrix==NULL) { fprintf(stderr, "Kein Speicher mehr!\n"); return 1; } EingabeDerMatrix(matrix, n); printMat(matrix, n); printf("\nDet=%f\n", Det(matrix, n)); MatrInv(matrix, n); printMat(matrix, n); printf("\nDet Inv=%f\n", Det(matrix,n)); free(matrix); return 0; }
void printMat(const double* matrix, int Rang) { int i; for(i=0; i<Rang*Rang; ++i) { if (!(i% Rang)) printf("\n"); printf("%0.2f ", matrix[i]); } printf("\n"); }
|
-- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! |