- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- struct liczbaZ{ float reZ, imZ; };
- struct element { struct liczbaZ liczba; struct element *poprzedni; };
- int Pobierz_Dane(struct liczbaZ *liZ, char *zn);
- struct element* Poloz_na_stosie(struct element *gora, struct liczbaZ *liZ);
- struct element* Zdejmij_ze_stosu(struct element *gora, struct liczbaZ *liZ);
- void Pokaz_stos(struct element *gora);
- struct liczbaZ Dodaj(struct liczbaZ LZ1, struct liczbaZ LZ2);
- struct liczbaZ Odejmij(struct liczbaZ LZ1, struct liczbaZ LZ2);
- struct liczbaZ Pomnoz(struct liczbaZ LZ1, struct liczbaZ LZ2);
- int main()
- { struct liczbaZ lZ, LZ1, LZ2;
- char znak; //znak dzialania
- int er; //Kod bledu analizy ciagu znakow
- struct element *gora = 0; //wskaznik na gorny elekment stosu
- while (1)
- {
- printf("Podaj liczbe lub znak\n");
- er = Pobierz_Dane(&lZ, &znak);
- if (er > 0) { gora = Poloz_na_stosie(gora, &lZ); Pokaz_stos(gora); }
- else { switch (znak){ case '+': if (gora->poprzedni != 0) { gora = Zdejmij_ze_stosu(gora, &LZ1); gora = Zdejmij_ze_stosu(gora, &LZ2); lZ = Dodaj(LZ1, LZ2); gora = Poloz_na_stosie(gora, &lZ); } Pokaz_stos(gora); break;case '-': if (gora->poprzedni != 0) { gora = Zdejmij_ze_stosu(gora, &LZ1); gora = Zdejmij_ze_stosu(gora, &LZ2); lZ = Odejmij(LZ1, LZ2); gora = Poloz_na_stosie(gora, &lZ); } Pokaz_stos(gora); break;
- case '*': if (gora->poprzedni != 0) { gora = Zdejmij_ze_stosu(gora, &LZ1); gora = Zdejmij_ze_stosu(gora, &LZ2); lZ = Pomnoz(LZ1, LZ2); gora = Poloz_na_stosie(gora, &lZ); } Pokaz_stos(gora); break;
- default: printf("Czy zakonczyc program?\n"); return 0; break; } }
- //printf("reZ = %f, imZ = %f, znak = %c\n", lZ.reZ, lZ.imZ, znak);
- } system("pause"); return 0;
- }
- int Pobierz_Dane(struct liczbaZ *liZ, char *zn) { char tab[100]; //tablica tymczasowa
- int err; //Kod bledu analizy ciagu znakow
- //Pobierz ciag znakow
- gets(tab);
- //analiza ciagu znakow
- err = sscanf(tab, "%f %f", &liZ->reZ, &liZ->imZ);
- if (err == -1 || err == 0) { *zn = tab[0]; } else if (err == 1) {
- liZ->imZ = 0; } return err; }
- struct element* Poloz_na_stosie(struct element *gora, struct liczbaZ *liZ) { struct element *nowy = malloc(sizeof(struct element)); //alokacja pamiecia na nowy element
- nowy->liczba.reZ = liZ->reZ; nowy->liczba.imZ = liZ->imZ; nowy->poprzedni = gora; return nowy; }
- struct element* Zdejmij_ze_stosu(struct element *gora, struct liczbaZ *liZ) { liZ->reZ = gora->liczba.reZ; liZ->imZ = gora->liczba.imZ; struct element *tymczasowy = gora->poprzedni; free(gora); return tymczasowy; }
- void Pokaz_stos(struct element *gora) { struct element *tymczasowy; tymczasowy = gora; system("cls"); while (tymczasowy != 0) { printf("%f +i*%f\n", tymczasowy->liczba.reZ, tymczasowy->liczba.imZ); tymczasowy = tymczasowy->poprzedni; } printf("\n"); }
- struct liczbaZ Dodaj(struct liczbaZ LZ1, struct liczbaZ LZ2) { struct liczbaZ LZ; LZ.reZ = LZ1.reZ + LZ2.reZ; LZ.imZ = LZ1.imZ + LZ2.imZ; return LZ; }
- struct liczbaZ Odejmij(struct liczbaZ LZ1, struct liczbaZ LZ2) { struct liczbaZ LZ; LZ.reZ = LZ1.reZ - LZ2.reZ; LZ.imZ = LZ1.imZ - LZ2.imZ; return LZ; }
- struct liczbaZ Pomnoz(struct liczbaZ LZ1, struct liczbaZ LZ2)
- { struct liczbaZ LZ;
- LZ.reZ = LZ1.reZ * LZ2.reZ - LZ1.imZ * LZ2.imZ;
- LZ.imZ = LZ1.reZ * LZ2.imZ + LZ1.imZ * LZ2.reZ;
- return LZ; }
- struct liczbaZ Podziel(struct liczbaZ LZ1, struct liczbaZ LZ2)
- { struct liczbaZ LZ;
- LZ.reZ = (LZ1.reZ * LZ2.reZ + LZ1.imZ * LZ2.imZ)/(LZ1.imZ*LZ1.imZ+LZ2.imZ*LZ2.imZ);
- LZ.imZ = (LZ1.reZ * LZ2.imZ - LZ1.imZ * LZ2.reZ)/(LZ1.imZ*LZ1.imZ+LZ2.imZ*LZ2.imZ);
- return LZ; }