C Helpdesk
Chciałbym umieścić kod programu, który niedawno napisałem . "Matrix.c" wykonuje proste operacje na macierzach takie jak dodawanie, odejmowanie, mnożenie macierzy; mnożenie macierzy przez liczbę; obliczanie wyznaczników macierzy stopnia 2-go i 3-go.
W dużej mierze pomogła mi ta publikacja: http://www.ki.uni.lodz.pl/~cbolek/c/C-mat(2).pdf.
Chętnych zapraszam do poszerzania funkcjonalności programu.
Oto kod:
matrix.c
/********************************************************************************* * matrix.c - jest to maly programik sluzacy do wykonywania prostych operacji * * na macierzach. * ********************************************************************************** * Autor: mieczyk * * Przy pisaniu, bardzo pomocna okazala sie nastepujaca publikacja: * * http://www.ki.uni.lodz.pl/~cbolek/c/C-mat(2).pdf * ********************************************************************************** * Przy kompilacji na systemie Linux nalezy pozbyc sie wpisu: #define WINDOWS * **********************************************************************************/ #include <stdio.h> #include <stdlib.h> #define WINDOWS struct matrix { int x,y; double **tab; }; void clear() { #ifdef WINDOWS system("cls"); #else system("clear"); #endif } /* Rezerwacja pamieci dla nowej macierzy */ struct matrix NewMatrix(int x, int y) { struct matrix mat; int nx; double *idx; mat.tab = (double**)malloc(x*sizeof(double*)); idx = (double*)malloc((mat.x=x)*(mat.y=y)*sizeof(double)); for(nx=0; nx<x; nx++) { mat.tab[nx]=idx; idx+=y; } return mat; } /* Zwolnienie pamieci */ void FreeMatrix(struct matrix mat) { free(mat.tab[0]); free(mat.tab); } /* Wyswietlanie macierzy */ void ShowMatrix(struct matrix mat) { int i,j; for(i=0; i<mat.x; i++) { for(j=0; j<mat.y; j++) printf("%.2lf ", mat.tab[i][j]); printf("\n"); } } /* Dodawanie macierzy */ struct matrix AddMatrix(struct matrix mat1, struct matrix mat2) { struct matrix mat; int i,j; mat.tab = NULL; if(mat1.x==mat2.x && mat1.y==mat2.y) { mat = NewMatrix(mat1.x, mat2.y); for(i=0; i<mat.x; i++) for(j=0; j<mat.y; j++) mat.tab[i][j] = mat1.tab[i][j] + mat2.tab[i][j]; } return mat; } /* Odejmowanie macierzy */ struct matrix SubtractMatrix(struct matrix mat1, struct matrix mat2) { struct matrix mat; int i,j; mat.tab = NULL; if(mat1.x == mat2.x && mat1.y == mat2.y) { mat = NewMatrix(mat1.x, mat2.y); for(i=0; i<mat.x; i++) for(j=0; j<mat.y; j++) mat.tab[i][j] = mat1.tab[i][j] - mat2.tab[i][j]; } return mat; } /* Mnozenie macierzy przez liczbe */ struct matrix MultiplyMatrixNumber(struct matrix mat1, double z) { struct matrix mat; int i,j; mat.tab = NULL; mat = NewMatrix(mat1.x, mat1.y); for(i=0; i<mat.x; i++) for(j=0; j<mat.y; j++) mat.tab[i][j] = mat1.tab[i][j] * z; return mat; } /* Mnozenie macierzy */ struct matrix MultiplyMatrix(struct matrix mat1, struct matrix mat2) { struct matrix mat; int a,i,j; mat.tab = NULL; if(mat1.y == mat2.x) { mat = NewMatrix(mat1.x, mat2.y); for(i=0; i<mat.x; i++) for(j=0; j<mat.y; j++) { mat.tab[i][j] = 0; for(a=0; a<mat1.y; a++) mat.tab[i][j] += mat1.tab[i][a] * mat2.tab[a][j]; } } return mat; } int main() { printf("\n*****************************************************************\n"); printf("* Matrix - program wykonuje podstawowe operacje na macierzach *\n"); printf("*****************************************************************\n\n\n"); printf("1. Dodaj macierze.\n"); printf("2. Odejmij macierze.\n"); printf("3. Pomnoz macierz przez liczbe\n"); printf("4. Pomnoz macierze.\n"); printf("5. Oblicz wyznacznik macierzy stopnia 2-go.\n"); printf("6. Oblicz wyznacznik macierzy stopnia 3-go.\n\n\n"); printf("Wybierz opcje:\t"); int opt; int x,y; int i,j; int k; struct matrix mat1, mat2, mat3; double z, w; scanf("%d", &opt); switch(opt) { case 1: clear(); printf("Podaj wymiar dodawanych macierzy:\n\n"); printf("m = "); scanf("%d", &x); printf("n = "); scanf("%d", &y); printf("\n"); mat1 = NewMatrix(x,y); mat2 = NewMatrix(x,y); printf("Macierz A:\n\n"); for(i=0; i<x; i++) for(j=0; j<y; j++) { printf("A[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat1.tab)[i][j]); } printf("\nMacierz B:\n\n"); for(i=0; i<x; i++) for(j=0; j<y; j++) { printf("B[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat2.tab)[i][j]); } mat3 = AddMatrix(mat1, mat2); clear(); ShowMatrix(mat1); printf("\n\n+\n\n"); ShowMatrix(mat2); printf("\n\n=\n\n"); ShowMatrix(mat3); FreeMatrix(mat1); FreeMatrix(mat2); FreeMatrix(mat3); break; case 2: clear(); printf("Podaj wymiar dodawanych macierzy:\n\n"); printf("m = "); scanf("%d", &x); printf("n = "); scanf("%d", &y); printf("\n"); mat1 = NewMatrix(x,y); mat2 = NewMatrix(x,y); printf("Macierz A:\n\n"); for(i=0; i<x; i++) for(j=0; j<y; j++) { printf("A[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat1.tab)[i][j]); } printf("\nMacierz B:\n\n"); for(i=0; i<x; i++) for(j=0; j<y; j++) { printf("B[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat2.tab)[i][j]); } mat3 = SubtractMatrix(mat1, mat2); clear(); ShowMatrix(mat1); printf("\n\n-\n\n"); ShowMatrix(mat2); printf("\n\n=\n\n"); ShowMatrix(mat3); FreeMatrix(mat1); FreeMatrix(mat2); FreeMatrix(mat3); break; case 3: clear(); printf("Podaj wymiar macierzy:\n\n"); printf("m = "); scanf("%d", &x); printf("n = "); scanf("%d", &y); printf("\n"); mat1 = NewMatrix(x,y); printf("Macierz A:\n\n"); for(i=0; i<x; i++) for(j=0; j<y; j++) { printf("A[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat1.tab)[i][j]); } printf("\nPodaj liczbe, przez jaka ma byc mnozona macierz A: "); scanf("%lf", &z); mat3 = MultiplyMatrixNumber(mat1, z); clear(); ShowMatrix(mat1); printf("\n\n*\n\n"); printf("%.2lf", z); printf("\n\n=\n\n"); ShowMatrix(mat3); FreeMatrix(mat1); FreeMatrix(mat3); break; case 4: clear(); printf("Podaj wymiar macierzy A:\n\n"); printf("m = "); scanf("%d", &x); printf("n = "); scanf("%d", &y); printf("\n"); printf("Podaj liczbe kolumn macierzy B:\n\n"); printf("k = "); scanf("%d", &k); printf("\n"); mat1 = NewMatrix(x,y); mat2 = NewMatrix(y,k); printf("Macierz A:\n\n"); for(i=0; i<x; i++) for(j=0; j<y; j++) { printf("A[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat1.tab)[i][j]); } printf("\nMacierz B:\n\n"); for(i=0; i<y; i++) for(j=0; j<k; j++) { printf("B[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat2.tab)[i][j]); } mat3 = MultiplyMatrix(mat1, mat2); clear(); ShowMatrix(mat1); printf("\n\n*\n\n"); ShowMatrix(mat2); printf("\n\n=\n\n"); ShowMatrix(mat3); FreeMatrix(mat1); FreeMatrix(mat2); FreeMatrix(mat3); break; case 5: clear(); mat1 = NewMatrix(2,2); for(i=0; i<2; i++) for(j=0; j<2; j++) { printf("A[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat1.tab)[i][j]); } clear(); w = mat1.tab[0][0] * mat1.tab[1][1] - mat1.tab[0][1] * mat1.tab[1][0]; ShowMatrix(mat1); printf("\n\nWyznacznik podanej macierzy wynosi: w = %.2lf\n", w); FreeMatrix(mat1); break; case 6: clear(); mat1 = NewMatrix(3,3); for(i=0; i<3; i++) for(j=0; j<3; j++) { printf("A[%d][%d]= ", i+1, j+1); scanf("%lf", &(mat1.tab)[i][j]); } clear(); w = (mat1.tab[0][0] * mat1.tab[1][1] * mat1.tab[2][2] + mat1.tab[0][1] * mat1.tab[1][2] * mat1.tab[2][0] + mat1.tab[0][2] * mat1.tab[1][0] * mat1.tab[2][1]) - (mat1.tab[0][2] * mat1.tab[1][1] * mat1.tab[2][0] + mat1.tab[0][0] * mat1.tab[1][2] * mat1.tab[2][1] + mat1.tab[0][1] * mat1.tab[1][0] * mat1.tab[2][2]); ShowMatrix(mat1); printf("\n\nWyznacznik podanej macierzy wynosi: w = %.2lf\n", w); FreeMatrix(mat1); break; default: break; } getchar(); getchar(); return 0; }
Ostatnio edytowany przez mieczyk (10-13-2007 22:03:03)
Offline