Projekt nr 4 Renata Wojtaszek
Temat : Kalkulator macierzowy.
Obsługa programu.
Program ten przeznaczony jest do obliczania działań na macierzach. Operuje on na macierzach maks. 3x3. Dostępne są litery a, b, c, d , którym można przypisać konkretne macierze. Posiada on następujące opcje:
a) Wprowadzanie macierzy
Składnia:
litera'='
b) Wyświetlanie macierzy
Składnia:
litera
c) Wyznacznik macierzy
Składnia:
'w 'litera
d) Dodawanie, odejmowanie, mnożenia dwóch macierzy
Składnia:
litera('+' lub '-' lub '*')litera
e) Mnożenie przez stała
Składnia:
cyfra '*' litera
f) Transponowanie macierzy
Składnia:
litera'^'
g) Dopełnienie algebraiczne
Składnia:
litera'!'
h) Macierz odwrotna
Składnia:
litera'~'
Wyjście z programu - q
Pomoc podręczna - p
Opis zmiennych i struktur występujących w programie:
a) Definicja typu struktury na której będziemy operować:
struct Macierz {
float el[MAXN][MAXN];
int wier;
int kol;
};
b) Alokacja pięciu struktur(cztery z nich dostępne dla użytkownika):
struct Macierz A,B,C,D,E;
Tablica typu char dla wyrażenia wpisanego przez użytkownika:
char wyrazenie[20];
3. Funkcje użyte w programie:
float Wyznacznik( struct Macierz *A )
Funkcja ta liczy wyznacznik macierzy wskazywanej przez A. Aby można było policzyć ten wyznacznik macierz musi być kwadratowa. Jeśli nie jest program wyświetli odpowiedni komunikat.
void Pomoc(void)
Ta funkcja umożliwia wyświetlenie pomocy podręcznej informującej o poleceniach programu.
int Chartoint(char *s,int st,int end)
Funkcja Chartoint konwertuje liczby zapisane w tablicy znakowej (początek - st, koniec - end) na odpowiadającą im wartość całkowitą.
void Wyswietl( struct Macierz *A )
Funkcja drukująca macierz wskazywaną przez A na ekran.
void Zeruj(struct Macierz*A)
Funkcja ta wstawia zera do każdego elementu tablicy macierzowej.
void Konwertuj(char *s)
Ta funkcja odpowiada za konwersję małych liter na duże.
void WczytajMacierz( struct Macierz *A )
Po wywołaniu funkcja ta prosi o podanie wymiarów macierzy, a następnie przypisuje każdemu elementowi macierzy wartość podaną przez użytkownika.
void Stala_x_mac(float c,struct Macierz *A)
Funkcja odpowiada za mnożenie macierzy przez stałą.
void Mac_x_mac(struct Macierz *A,struct Macierz *B,struct Macierz *C)
Ta funkcja odpowiada za mnożenie dwóch macierzy.
void Mac_plus_mac(struct Macierz *A,struct Macierz *B,struct Macierz *C,int m)
Ta funkcja wykonuje dodawanie lub odejmowanie macierzy.
void Transponuj(struct Macierz *A)
Funkcja ta transponuje macierz wskazywaną przez A.
void Dopelnienie(struct Macierz *A)
Ta funkcja liczy dopełnienie algebraiczne macierzy.
void Mac_odwrotna(struct Macierz *A)
Funkcja ta odpowiada za wygenerowanie macierzy odwrotnej do wskazywanej przez A.
int main( void )
Funkcja główna main odpowiada za analizę wyrażenia wprowadzonego przez użytkownika (wywołuje odpowiednie funkcje). W razie niepoprawnego wyrażenia wyświetla odpowiedni komunikat.
LISTING
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXN 3
struct Macierz {
float el[MAXN][MAXN];
int wier;
int kol;
};
/*-----------------------------------------------*/
float Wyznacznik( struct Macierz *A )
{
float w;
if (A->wier==5)
{
printf("\nMacierz pusta.\n");
return 0;
}
if (A->wier!=A->kol)
{
printf("\nMacierz musi byc kwadratowa!.\n");
return 0;
}
if (A->wier==2)
{
w=A->el[0][0]*A->el[1][1]-(A->el[1][0]*A->el[0][1]);
printf("\nWyznacznik = %f\n",w);
}
if (A->wier==3)
{
w=A->el[0][0]*A->el[1][1]*A->el[2][2]+A->el[0][1]*A->el[1][2]*A->el[2][0];
w=w+A->el[0][2]*A->el[1][0]*A->el[2][1]-A->el[0][2]*A->el[1][1]*A->el[2][0];
w=w-A->el[0][0]*A->el[1][2]*A->el[2][1]-A->el[0][1]*A->el[1][0]*A->el[2][2];
printf("\nWyznacznik = %f\n",w);
}
if (A->wier==1)
{
printf("\nNie umiem obliczyc wyznacznika tak ogromnej macierzy.\n");
w=0;
}
return w;
}
/*-----------------------------------------------*/
void Pomoc(void)
{
int i,j;
char tab[36][80]={" Program ten udostepnia nastepujace opcje: ",
" ",
"1. Wprowadzanie macierzy. ",
" Dostepne sa cztery litery a,b,c,d , ktorym mozna przypisac konkretne ",
" macierze. Macierz przypisujemy w nastepujacy sposob: ",
"litera'=' ",
" Program poprosi o podanie liczby kolumn i wierszy maciezy a nastepnie ",
" nalezy wprowadzic poszczegolne elementy macierzy. ",
" ",
"2. Wyswietlanie macierzy. ",
" Skladnia jest nastepujaca: ",
"litera ",
" ",
"3. Wyznacznik macierzy. ",
" Skladnia wyrazenia: ",
"'w 'litera ",
" ",
"4. Dodawanie, odejmowanie, mnozenia dwoch maciezy. ",
" Skladnia jest nastepujaca: ",
"litera('+'lub'-'lub'*')litera ",
" ",
"5. Mnozenie przez stala. ",
" Skladnia: ",
"cyfra'*'litera ",
" ",
"6. Transponowanie macierzy. ",
" Skladnia: ",
"litera'^' ",
" ",
"7. Dopelnienie algebraiczne. ",
" Skladnia: ",
"litera'!' ",
" ",
"8. Macierz odwrotna. ",
" Skladnia: ",
"litera'~' "};
for (i=0;i<22;i++)
printf("%s\n",tab[i]);
fflush(stdin);
printf("\n\t\tNacisnij ENTER ...\n");
i=getchar();
for (i=22;i<36;i++)
printf("%s\n",tab[i]);
return;
}
/*-----------------------------------------------*/
int Chartoint(char *s,int st,int end)
{ int n=0,i;
for (i=st;i<end;i++)
n=10*n+s[i]-'0';
return n;
}
/*-----------------------------------------------*/
void Wyswietl( struct Macierz *A )
{ int i, j;
printf("\n");
if (A->wier==5)
{
printf("Macierz pusta.");
return;
}
for (i = 0; i < A->wier; i++)
{ for (j = 0; j < A->kol; j++)
printf("% 8.3f ", A->el[i][j]);
printf("\n");
}
}
/*-----------------------------------------------*/
void Zeruj(struct Macierz*A)
{ int i,j;
for (i=0;i<3;i++)
for (j=0;j<3;j++)
A->el[i][j]=0;
return;
}
/*-----------------------------------------------*/
void Konwertuj(char *s)
{
while (*s!='\0')
{
if (islower(*s)) *s=toupper(*s);
s++;
}
}
/*-----------------------------------------------*/
void WczytajMacierz( struct Macierz *A )
{ int i,a,j;
float f;
a=0;
do
{
if (a==1)
printf("Niewlasciwe dane.\n");
printf("\nPodaj ilosc wierszy macierzy (od 1 do 3) : W = ");
scanf("%d", &A->wier);
printf("Podaj ilosc kolumn macierzy (od 1 do 3) : K = ");
scanf("%d", &A->kol);
printf("\n");
a=1;
}
while (A->wier<1 || A->wier>MAXN || A->kol<1 || A->kol>MAXN);
printf("\nPodaj elementy macierzy:\n");
for(i = 0; i < A->wier; i++)
for(j = 0; j < A->kol; j++)
{ printf( "a[%d,%d] = ", j+1, i+1 );
scanf( "%f", &f );
A->el[i][j] = f;
}
return;
}
/*-----------------------------------------------*/
void Stala_x_mac(float c,struct Macierz *A)
{ int i,j;
if (A->wier==5)
return;
for (i = 0; i < A->wier; i++)
for (j = 0; j < A->kol; j++)
A->el[i][j]=c*A->el[i][j];
return;
}
/*-----------------------------------------------*/
void Mac_x_mac(struct Macierz *A,struct Macierz *B,struct Macierz *C)
{
int i,j,k;
if ((A->wier==5) || (B->wier==5))
{
C->wier=5;
return;
}
if (A->kol!=B->wier)
{
printf("\nIloczyn tych macierzy nieokreslony\n");
C->wier=0;
return;
}
Zeruj(C);
for (i = 0; i < A->kol; i++)
for (j = 0; j < B->wier; j++)
for (k = 0; k < A->kol; k++)
C->el[i][j] += A->el[i][k] * B->el[k][j];
C->wier=A->wier;
C->kol=B->kol;
return;
}
/*-----------------------------------------------*/
void Mac_plus_mac(struct Macierz *A,struct Macierz *B,struct Macierz *C,int m)
{
int i,j,k;
if ((A->wier==5) || (B->wier==5))
{
C->wier=5;
return;
}
if ((A->kol!=B->kol) || (A->wier!=B->wier))
{
if (m==1) printf("\nNie mozna odjac tych macierzy.\n");
else printf("\nNie mozna dodac tych macierzy.\n");
C->wier=0;
return;
}
Zeruj(C);
for (i = 0; i < A->kol; i++)
for (j = 0; j < A->wier; j++)
if (m==0) C->el[i][j] = A->el[i][j] + B->el[i][j];
else C->el[i][j] = A->el[i][j] - B->el[i][j];
C->wier=A->wier;
C->kol=B->kol;
return;
}
/*-----------------------------------------------*/
void Transponuj(struct Macierz *A)
{
float temp;
temp=A->el[0][1];
A->el[0][1]=A->el[1][0];
A->el[1][0]=temp;
temp=A->el[0][2];
A->el[0][2]=A->el[2][0];
A->el[2][0]=temp;
temp=A->el[1][2];
A->el[1][2]=A->el[2][1];
A->el[2][1]=temp;
temp=A->wier;
A->wier=A->kol;
A->kol=temp;
return;
}
/*-----------------------------------------------*/
void Dopelnienie(struct Macierz *A)
{
float tab[3][3],temp;
int i,j;
if (A->wier!=A->kol)
{
printf("\nMacierz musi byc kwadratowa\n");
return;
}
if (A->wier==5)
return;
if (A->wier==2)
{
temp=A->el[0][0];
A->el[0][0]=A->el[1][1];
A->el[1][1]=temp;
temp=A->el[1][0];
A->el[1][0]=-A->el[0][1];
A->el[0][1]=-temp;
}
if (A->wier==3)
{
tab[0][0]=A->el[1][1]*A->el[2][2]-A->el[2][1]*A->el[1][2];
tab[0][1]=-(A->el[1][0]*A->el[2][2]-A->el[2][0]*A->el[1][2]);
tab[0][2]=A->el[1][0]*A->el[2][1]-A->el[2][0]*A->el[1][1];
tab[1][0]=-(A->el[0][1]*A->el[2][2]-A->el[2][1]*A->el[0][2]);
tab[1][1]=A->el[0][0]*A->el[2][2]-A->el[0][2]*A->el[2][0];
tab[1][2]=-(A->el[0][0]*A->el[2][1]-A->el[2][0]*A->el[0][1]);
tab[2][0]=A->el[0][1]*A->el[1][2]-A->el[1][1]*A->el[0][2];
tab[2][1]=-(A->el[0][0]*A->el[1][2]-A->el[1][0]*A->el[0][2]);
tab[2][2]=A->el[1][1]*A->el[0][0]-A->el[0][1]*A->el[1][0];
for (i=0;i<3;i++)
for (j=0;j<3;j++)
A->el[i][j]=tab[i][j];
}
return;
}
/*-----------------------------------------------*/
void Mac_odwrotna(struct Macierz *A)
{
float w,temp,tab[3][3];
int i,j;
w=Wyznacznik(A);
if ((A->wier==5) || (A->wier!=A->kol))
return;
if (A->wier==1)
{
printf("\nNie umiem takze obliczyc macierzy odwrotnej tak ogromnej macierzy.\n");
return;
}
if (w==0)
{
printf("\nNie mozna wyznaczyc macierzy odwrotnej.\n");
return;
}
Transponuj(A);
Dopelnienie(A);
for (i=0;i<A->wier;i++)
for (j=0;j<A->kol;j++)
A->el[i][j]=A->el[i][j]/w;
}
/*-----------------------------------------------*/
int main( void )
{
struct Macierz A,B,C,D,E;
int a,b,c,d,min = 0,quit = 0;
char wyrazenie[20];
A.wier=5;
B.wier=5;
C.wier=5;
D.wier=5;
A.kol=5;
B.kol=5;
C.kol=5;
D.kol=5;
system("clear");
printf("\n\n\tProjekt nr 4 : Kalkulator do operacji na macierzach");
printf("\n\tautor : Renata Wojtaszek\n\n");
printf("Na poczatek sprobuj p - pomoc\n");
while (!quit)
{
a=0;
d=0;
min=0;
printf("\n >>");
gets(wyrazenie);
Konwertuj(wyrazenie);
if (wyrazenie[0]=='\0')
a=1;
if (wyrazenie[0]=='Q')
if (wyrazenie[1]=='\0')
{
quit=1;
a=1;
}
if (wyrazenie[1]=='^')
if (wyrazenie[2]=='\0')
switch (wyrazenie[0])
{
case 'A': a=1; Transponuj(&A); Wyswietl(&A); break;
case 'B': a=1; Transponuj(&B); Wyswietl(&B); break;
case 'C': a=1; Transponuj(&C); Wyswietl(&C); break;
case 'D': a=1; Transponuj(&D); Wyswietl(&D); break;
}
if (wyrazenie[1]=='!')
if (wyrazenie[2]=='\0')
switch (wyrazenie[0])
{
case 'A': a=1; Dopelnienie(&A); Wyswietl(&A); break;
case 'B': a=1; Dopelnienie(&B); Wyswietl(&B); break;
case 'C': a=1; Dopelnienie(&C); Wyswietl(&C); break;
case 'D': a=1; Dopelnienie(&D); Wyswietl(&D); break;
}
if (wyrazenie[1]=='~')
if (wyrazenie[2]=='\0')
switch (wyrazenie[0])
{
case 'A': a=1; Mac_odwrotna(&A); Wyswietl(&A); break;
case 'B': a=1; Mac_odwrotna(&B); Wyswietl(&B); break;
case 'C': a=1; Mac_odwrotna(&C); Wyswietl(&C); break;
case 'D': a=1; Mac_odwrotna(&D); Wyswietl(&D); break;
}
if (wyrazenie[1]=='*')
if (wyrazenie[3]=='\0')
{
if (wyrazenie[0]=='A')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_x_mac(&A,&A,&E); Wyswietl(&E); break;
case 'B': a=1; Mac_x_mac(&A,&B,&E); Wyswietl(&E); break;
case 'C': a=1; Mac_x_mac(&A,&C,&E); Wyswietl(&E); break;
case 'D': a=1; Mac_x_mac(&A,&D,&E); Wyswietl(&E); break;
}
if (wyrazenie[0]=='B')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_x_mac(&B,&A,&E); Wyswietl(&E); break;
case 'B': a=1; Mac_x_mac(&B,&B,&E); Wyswietl(&E); break;
case 'C': a=1; Mac_x_mac(&B,&C,&E); Wyswietl(&E); break;
case 'D': a=1; Mac_x_mac(&B,&D,&E); Wyswietl(&E); break;
}
if (wyrazenie[0]=='C')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_x_mac(&C,&A,&E); Wyswietl(&E); break;
case 'B': a=1; Mac_x_mac(&C,&B,&E); Wyswietl(&E); break;
case 'C': a=1; Mac_x_mac(&C,&C,&E); Wyswietl(&E); break;
case 'D': a=1; Mac_x_mac(&C,&D,&E); Wyswietl(&E); break;
}
if (wyrazenie[0]=='D')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_x_mac(&D,&A,&E); Wyswietl(&E); break;
case 'B': a=1; Mac_x_mac(&D,&B,&E); Wyswietl(&E); break;
case 'C': a=1; Mac_x_mac(&D,&C,&E); Wyswietl(&E); break;
case 'D': a=1; Mac_x_mac(&D,&D,&E); Wyswietl(&E); break;
}
}
if ((wyrazenie[1]=='+') || (wyrazenie[1]=='-'))
if (wyrazenie[3]=='\0')
{
if (wyrazenie[1]=='-') min=1;
if (wyrazenie[0]=='A')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_plus_mac(&A,&A,&E,min); Wyswietl(&E); break;
case 'B': a=1; Mac_plus_mac(&A,&B,&E,min); Wyswietl(&E); break;
case 'C': a=1; Mac_plus_mac(&A,&C,&E,min); Wyswietl(&E); break;
case 'D': a=1; Mac_plus_mac(&A,&D,&E,min); Wyswietl(&E); break;
}
if (wyrazenie[0]=='B')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_plus_mac(&B,&A,&E,min); Wyswietl(&E); break;
case 'B': a=1; Mac_plus_mac(&B,&B,&E,min); Wyswietl(&E); break;
case 'C': a=1; Mac_plus_mac(&B,&C,&E,min); Wyswietl(&E); break;
case 'D': a=1; Mac_plus_mac(&B,&D,&E,min); Wyswietl(&E); break;
}
if (wyrazenie[0]=='C')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_plus_mac(&C,&A,&E,min); Wyswietl(&E); break;
case 'B': a=1; Mac_plus_mac(&C,&B,&E,min); Wyswietl(&E); break;
case 'C': a=1; Mac_plus_mac(&C,&C,&E,min); Wyswietl(&E); break;
case 'D': a=1; Mac_plus_mac(&C,&D,&E,min); Wyswietl(&E); break;
}
if (wyrazenie[0]=='D')
switch (wyrazenie[2])
{
case 'A': a=1; Mac_plus_mac(&D,&A,&E,min); Wyswietl(&E); break;
case 'B': a=1; Mac_plus_mac(&D,&B,&E,min); Wyswietl(&E); break;
case 'C': a=1; Mac_plus_mac(&D,&C,&E,min); Wyswietl(&E); break;
case 'D': a=1; Mac_plus_mac(&D,&D,&E,min); Wyswietl(&E); break;
}
min=0;
}
if (wyrazenie[0]>='0' && wyrazenie[0]<='9')
{
for (b=1;wyrazenie[b]!='*' || b<6;b++)
if (wyrazenie[b]<'0' || wyrazenie[b]>'9' || b==5)
d=1;
if (d!=1)
{
c=Chartoint(wyrazenie,0,b);
if (wyrazenie[b+2]=='\0')
switch (wyrazenie[b+1])
{
case 'A': a=1; Stala_x_mac(c,&A); Wyswietl(&A); break;
case 'B': a=1; Stala_x_mac(c,&B); Wyswietl(&B); break;
case 'C': a=1; Stala_x_mac(c,&C); Wyswietl(&C); break;
case 'D': a=1; Stala_x_mac(c,&D); Wyswietl(&D); break;
}
}
}
if (wyrazenie[0]=='P')
if (wyrazenie[1]=='\0')
{
a=1;
Pomoc();
}
if (wyrazenie[0]=='W')
if (wyrazenie[3]=='\0')
if (wyrazenie[1]==' ')
switch (wyrazenie[2])
{
case 'A' : a=1; Wyznacznik(&A); break;
case 'B' : a=1; Wyznacznik(&B); break;
case 'C' : a=1; Wyznacznik(&C); break;
case 'D' : a=1; Wyznacznik(&D); break;
}
if (wyrazenie[1]=='=')
if (wyrazenie[2]=='\0')
switch (wyrazenie[0])
{
case 'A' : a=1; WczytajMacierz(&A); break;
case 'B' : a=1; WczytajMacierz(&B); break;
case 'C' : a=1; WczytajMacierz(&C); break;
case 'D' : a=1; WczytajMacierz(&D); break;
}
if (wyrazenie[1]=='\0')
switch (wyrazenie[0])
{
case 'A' : a=1; Wyswietl(&A); break;
case 'B' : a=1; Wyswietl(&B); break;
case 'C' : a=1; Wyswietl(&C); break;
case 'D' : a=1; Wyswietl(&D); break;
}
if (a==0) printf("Zle wyrazenie.");
fflush(stdin);
}
return 0;
}