Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct element
  4.  
  5. {
  6.     int  dane; //przechowuje dane stosu
  7.     struct element *poprzedni; //wskaznik na poprzedni element
  8. };
  9.  
  10.  
  11. void push(struct element **gora, int wartosc) //funkcja dodwania do stsou
  12. {
  13.     struct element *nowy;
  14.     nowy = malloc(sizeof(struct element));
  15.     nowy->dane = wartosc;
  16.     nowy->poprzedni = *gora;
  17.     *gora = nowy;
  18. }
  19.  
  20. void pop(struct element **gora) // funkcja zdejmowania ze stosu
  21. {
  22.     struct element *tymczasowy;
  23.     tymczasowy = (*gora)->poprzedni;
  24.     free(*gora);
  25.     *gora = tymczasowy;
  26. }
  27.  
  28. void full_print(struct element **gora) //drukuje wszystkie elementy stosu
  29. {
  30.     struct element *tymczasowy;
  31.     tymczasowy = *gora;
  32.     while (pusty(&tymczasowy) != 0)
  33.     {
  34.         printf(" %d ", tymczasowy->dane);
  35.         tymczasowy = tymczasowy->poprzedni;
  36.     }
  37. }
  38.  
  39. int pusty(struct element **gora) //sprawdza czy stos jest pusty (funkcja pomocniczna)
  40. {
  41.     if (*gora == NULL)
  42.         return 0;
  43.     else
  44.         return 1;
  45. }
  46.  
  47. void empty(struct element **gora)//Drukuje informacje czy stos nie jest pusty
  48. {
  49.     if (*gora == NULL)
  50.         printf("Stos jest pusty \n");
  51.     else
  52.         printf("stos nie jest pusty \n");
  53. }
  54.  
  55. void dodawanie(struct element **gora) //dodaje dwa elementy stosu do siebie
  56. {//postepowanie takie same jak opisano przy funkcji ilorazu
  57.     int wynik;
  58.     struct element *jedna, *druga;
  59.     jedna=*gora;
  60.     druga=(*gora)->poprzedni;
  61.     wynik=jedna->dane + druga->dane;
  62.     pop(gora);
  63.     pop(gora);
  64.     push(gora, wynik);
  65. }
  66.  
  67. void roznica(struct element **gora) //odejmuje dwa elementy stosu od siebie
  68. {//postepowanie takie same jak opisano przy funkcji ilorazu
  69.     int wynik;
  70.     struct element *jedna, *druga;
  71.     jedna=*gora;
  72.     druga=(*gora)->poprzedni;
  73.     wynik=jedna->dane - druga->dane;
  74.     pop(gora);
  75.     pop(gora);
  76.     push(gora, wynik);
  77. }
  78.  
  79. void iloczyn(struct element **gora) //mnozy dwa elementy stosu przez siebie
  80. {//postepowanie takie same jak opisano przy funkcji ilorazu
  81.     int wynik;
  82.     struct element *jedna, *druga;
  83.     jedna=*gora;
  84.     druga=(*gora)->poprzedni;
  85.     wynik=jedna->dane * druga->dane;
  86.     pop(gora);
  87.     pop(gora);
  88.     push(gora, wynik);
  89. }
  90.  
  91. void iloraz(struct element **gora) // dzieli dwa elementy stosu przez sebie
  92. {
  93.     int wynik; //zmienna przechowujaca wynik
  94.     struct element *jedna, *druga; //struktury pomocnicze przechowujace liczby
  95.     jedna=*gora;
  96.     druga=(*gora)->poprzedni;
  97.     wynik=jedna->dane / druga->dane; //wykonujemy dzialanie
  98.     pop(gora); //usuwamy elementy na ktorych wykonujemy dzialanie
  99.     pop(gora);
  100.     push(gora, wynik); //dodajemy element do stosu przechowujacy wynik opercaji
  101. }
  102.  
  103. void duplikuj(struct element **gora) // duplikuje element ze szczytu
  104. {
  105.     int b;
  106.     b=(*gora)->dane;
  107.     push(gora, b);
  108. }
  109.  
  110. void print(struct element **gora) // drukuje element ze szczytu
  111. {
  112.     int d;
  113.     d=(*gora)->dane;
  114.     printf(" %d ", d);
  115. }
  116.  
  117. int main()
  118. {
  119.     int b;
  120.     char a;
  121.     struct element *gora = NULL;
  122.     printf("\n Podawaj po kolei po spacjach liczby lub znaki dzialan (pierwsze dwa znaki musza byc liczba) \n");
  123.     while ((a = getc(stdin)) != EOF)
  124.     {
  125.         if (a >= '0' && a <= '9')
  126.         {
  127.             ungetc(a,stdin);
  128.             scanf("%d",&b);
  129.             push(&gora, b);
  130.         }
  131.         if  (a == '+') dodawanie(&gora);
  132.         if  (a == '-') roznica(&gora);
  133.         if  (a == '*') iloczyn(&gora);
  134.         if  (a == '/') iloraz(&gora);
  135.     }
  136.     print(&gora);
  137.     printf("\n");
  138. }
  139.  
  140. /*TO DO:
  141.  * - Nie obsluguje liczb ujemnych i dwycyfrowych
  142.  * - Brak obslugi bledow
  143.  *      *Dzielenie przez 0
  144.  *      *Operacja na liczbach mimo ze tylko jeden element jest na stosie
  145.  *      *Działania na pustym stosie (majac gotowa funkcje "pusty" mozna latwo dodac to)
  146.  *      *Wpisanie niedozwolonego znaku
  147.  * - Majac gotowa funkcje "duplikuj" mozna latwo dodac potegowanie
  148.  * - Poinformowanie jeżeli na stosie został więcej niż jeden element (co z założenia programu nie powinno sie zdarzyć)
  149.  * - Zeby można bylo wykonywac obliczenia wiele razy bez koniecznsci ponownego wlaczania programu (trzeba tylko wtedy cały stos
  150.  *   ale mając funkcje "empty" i "pop" zaimplementowanie takiej nie bedzie specjalnie trudne
  151.  * - Podzielić program na moduły
  152.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement