Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Biblioteki
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include<locale.h>
- #include<conio.h>
- #include<ctype.h>
- //Prototypy Funkcji
- struct stos *Pop(struct stos *gora,int *suma,struct zespolone *);
- struct stos *Push(struct stos* gora,int*,struct zespolone );
- void wypisz(struct stos*,int);
- struct stos *usun(struct stos*,int*);
- struct stos *wczytaj(double,double);
- struct stos * dzialanie(struct stos *gora,char* ,int*);
- //Stos
- struct zespolone
- {
- double Re;
- double Im;
- };
- struct stos
- {
- struct zespolone dane;
- struct stos *poprzedni;
- };
- struct stos *Push(struct stos* gora,int*suma,struct zespolone liczba)
- {
- struct stos *nowy;
- nowy=(struct stos *)malloc(sizeof(struct stos));
- gora=(struct stos*)realloc(gora,(*suma+1)*sizeof(struct stos));
- nowy->dane=liczba;
- nowy->poprzedni=gora;
- gora=nowy;
- nowy=NULL;
- free(nowy);
- *suma++;
- return gora;
- }
- struct stos *Pop(struct stos *gora,int *suma,struct zespolone *bufor)
- {
- struct stos *nowy=(struct stos*)malloc(sizeof(struct stos));
- *bufor=gora->dane;
- nowy=gora->poprzedni;
- gora=NULL;
- free(gora);
- gora=(struct stos*)realloc(gora,(*suma-1)*sizeof(struct stos));
- gora=nowy;
- nowy=NULL;
- free(nowy);
- *suma--;
- return gora;
- }
- void wypisz(struct stos *gora,int suma)
- {
- if(suma==0)
- {
- printf("Nie ma czego wyswietlic.\n");
- _getch();
- }
- while(suma>0)
- {
- printf("%d.Liczba zespolona:%lf i%lf \n",suma,gora->dane.Re,gora->dane.Im);
- gora=gora->poprzedni;
- suma--;
- }
- }
- struct stos* usun(struct stos* pointer,int *suma)
- {
- pointer=NULL;
- free(pointer);
- *suma=0;
- return pointer;
- }
- main()
- {
- struct zespolone liczba;
- int Ile_stosu=0;
- int bufor=0;
- char czy_sp;
- char tab[100]={0};
- struct stos*gora;
- gora=(struct stos*)malloc(sizeof(struct stos));
- while(1)
- {
- tu:
- system("cls");
- printf(" >>>>>>KALKULATOR LICZB ZESPOLONYCH<<<<<<\nDostepne opcje:\n 1.Dzialania na kalkulatorze)\n 2.'Usun'-sciaga liczbe ze stosu\n 3.'Wyswietl'-wyswietla wszystkie wyniki\n 4.'Koniec'-konczy dzialanie kalkulatora\n");
- printf("Jezeli chcesz obliczac,wpisuj po prostu liczby Re i Im oddzielone spacja.\n");
- if(Ile_stosu!=0)
- wypisz(gora,Ile_stosu);
- gets(tab);
- //Opcje dodatkowe-poza obliczaniem
- if(strstr(tab,"Koniec")){
- printf("Koniec programu");
- _getch();
- break;
- }
- if(strstr(tab,"Usun")&&Ile_stosu>0)// sprawdz czy uzytkownik chce opcje nr.2
- {
- printf("Usuniete zostana te liczby zespolone:\n");
- wypisz(gora,Ile_stosu);
- _getch();
- usun(gora,&Ile_stosu);
- }
- else if(strstr(tab,"Usun")&&Ile_stosu==0)
- {
- printf("Nic się nie znajduje na stosie\n");
- getchar();
- }
- if(strstr(tab,"Wyswietl"))
- {
- wypisz(gora,Ile_stosu);
- }
- //Operacje na liczbach
- if(*tab=='+' || *tab=='-' || *tab=='*' ||*tab=='/')
- {
- if(Ile_stosu==0)
- {
- printf("Najpierw wrzuc liczby na stos\n");
- }
- if(Ile_stosu==1)
- {
- printf("Muszą być conajmniej dwie liczby\n");
- }
- else
- {
- gora=dzialanie(gora,tab,&Ile_stosu);
- }
- }
- if(czy_sp=strchr(tab,32)!=NULL)
- {
- sscanf(tab,"%lf %lf",&liczba.Re,&liczba.Im);
- gora=Push(gora,&Ile_stosu,liczba);
- Ile_stosu++;
- }
- if(czy_sp=strchr(tab,32)==NULL && (!strstr(tab,"Usun") && !strstr(tab,"Wyswietl"))) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TU SIE JEBIE A NIE POWINNO!!!!!!
- {
- sscanf(tab,"%lf",&liczba.Re);
- liczba.Re=atof(tab);
- liczba.Im=0;
- gora=Push(gora,&Ile_stosu,liczba);
- Ile_stosu++;
- }
- }
- return 0;
- }
- //funkcje arytmetyczne
- struct stos* dzialanie(struct stos*gora,char tab[],int*sumar)
- {
- struct zespolone wynik,*pierwsza_liczba=0,*druga_liczba=0;
- pierwsza_liczba=(struct zespolone*)malloc(sizeof(struct zespolone));
- druga_liczba=(struct zespolone*)malloc(sizeof(struct zespolone));
- gora=Pop(gora,sumar,pierwsza_liczba);
- gora=Pop(gora,sumar,druga_liczba);
- //gora=NULL;
- if(*tab=='+')
- {
- wynik.Re=pierwsza_liczba->Re+druga_liczba->Re;
- wynik.Im=pierwsza_liczba->Im+druga_liczba->Im;
- }
- else if(*tab=='-')
- {
- wynik.Re=pierwsza_liczba->Re-druga_liczba->Re;
- wynik.Im=pierwsza_liczba->Im-druga_liczba->Im;
- }
- else if(*tab=='/')
- {
- if(druga_liczba==0)printf("Ni da sie dzielic przez zirol\n");
- }else
- {
- wynik.Re=pierwsza_liczba->Re/druga_liczba->Re;
- wynik.Im=pierwsza_liczba->Im/druga_liczba->Im;
- }
- if(*tab=='*')
- {
- wynik.Re=pierwsza_liczba->Re*druga_liczba->Re;
- wynik.Im=pierwsza_liczba->Im*druga_liczba->Im;
- }
- gora=Push(gora,sumar,wynik);
- (*sumar)++;
- pierwsza_liczba=NULL;
- druga_liczba=NULL;
- free(pierwsza_liczba);
- free(druga_liczba);
- return gora;
- }
- void czy_pusty(int suma_stosu){
- if(suma_stosu==0)
- printf("Stos jest pusty\n");
- else
- printf("Stos nie jest pusty\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement