#define _CRT_SECURE_NO_WARNINGS #include #include 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; }