• Index
  •  » Programy
  •  » Matrix.c - programik do wykonywania prostych operacji na macierzach.

#1 03-11-2007 19:28:45

mieczyk

Member

3375619
Zarejestrowany: 03-08-2007
Posty: 24
Punktów :   
WWW

Matrix.c - programik do wykonywania prostych operacji na macierzach.

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

Kod:

/*********************************************************************************
* 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-14-2007 00:03:03)

Offline

 
  • Index
  •  » Programy
  •  » Matrix.c - programik do wykonywania prostych operacji na macierzach.

Stopka forum

RSS
Powered by PunBB 1.2.23
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
GotLink.plnoclegi w Pucku transport międzynarodowy Poznań Stylowy ogród na który Cię stać