kalkulator KUOUOMKYCKBBZFEO7EB27I6IS4V37AR3Z3Y6ZIA


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:

    1. float Wyznacznik( struct Macierz *A )

    2. 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.

    3. void Pomoc(void)

    4. Ta funkcja umożliwia wyświetlenie pomocy podręcznej informującej o poleceniach programu.

    5. int Chartoint(char *s,int st,int end)

    6. Funkcja Chartoint konwertuje liczby zapisane w tablicy znakowej (początek - st, koniec - end) na odpowiadającą im wartość całkowitą.

    7. void Wyswietl( struct Macierz *A )

    8. Funkcja drukująca macierz wskazywaną przez A na ekran.

    9. void Zeruj(struct Macierz*A)

    10. Funkcja ta wstawia zera do każdego elementu tablicy macierzowej.

    11. void Konwertuj(char *s)

    12. Ta funkcja odpowiada za konwersję małych liter na duże.

    13. void WczytajMacierz( struct Macierz *A )

    14. Po wywołaniu funkcja ta prosi o podanie wymiarów macierzy, a następnie przypisuje każdemu elementowi macierzy wartość podaną przez użytkownika.

    15. void Stala_x_mac(float c,struct Macierz *A)

    16. Funkcja odpowiada za mnożenie macierzy przez stałą.

    17. void Mac_x_mac(struct Macierz *A,struct Macierz *B,struct Macierz *C)

    18. Ta funkcja odpowiada za mnożenie dwóch macierzy.

    19. void Mac_plus_mac(struct Macierz *A,struct Macierz *B,struct Macierz *C,int m)

    20. Ta funkcja wykonuje dodawanie lub odejmowanie macierzy.

    21. void Transponuj(struct Macierz *A)

    22. Funkcja ta transponuje macierz wskazywaną przez A.

    23. void Dopelnienie(struct Macierz *A)

    24. Ta funkcja liczy dopełnienie algebraiczne macierzy.

    25. void Mac_odwrotna(struct Macierz *A)

    26. Funkcja ta odpowiada za wygenerowanie macierzy odwrotnej do wskazywanej przez A.

    27. 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;

}



Wyszukiwarka

Podobne podstrony:
KALKULACYJNY RACHUNEK KOSZTÓW
arkusz kalkulacyjny 4
25 Kalkulowanie cen potraw i napojów
kalkulator budowlany Xella XELLA2
referat kalkulacja kosztow, Rachunkowosc zarzadcza
Kalkulacje polityczne w RUE, KE, PE
koszty rodzjowe i kalkulacyjne
Mikroklimat kalkulatory
arkusz kalkulacyjny 1
arkusz kalkulacyjny 3 wzorzec
KALKULACJE FINANSOWE
Mat na inf arkusz kalk, Powtórka arkusze kalkulacyjne
arkusz kalkulacyjny 2 wzorzec
ECDL Advanced Syllabus do Modułu AM4 Arkusze kalkulacyjne, poziom zaawansowany
kalkulacja
Arkusz Kalkulacyjny
arkusz kalkulacny technilogia V sem, do uczenia, materialy do nauczania, rok2009 2010, 03.01.10
RACHUNKOWOŚĆ WSZIB KRAKÓW SEMESTR II - Układ kalkulacyjny kosztów, Dokumenty(1)
cw 7 Kalkulator

więcej podobnych podstron