Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5.  
  6. typedef struct stos {
  7. int* elementy;
  8. int top;
  9. int max_size;
  10. } stos;
  11.  
  12. void push(stos* s, int n){
  13. s -> top++;
  14. s -> elementy[s->top] = n;
  15. }
  16.  
  17. int pop(stos* s){
  18. s -> top--;
  19. return s -> elementy[s->top+1];
  20. }
  21.  
  22. stos* tworzenie_stosu(int rozmiar){
  23. stos* stack = malloc(sizeof(int*)+2*sizeof(int));
  24. stack -> max_size = rozmiar;
  25. stack -> elementy = malloc(rozmiar*sizeof(int));
  26. stack -> top = -1;
  27. return stack;
  28. }
  29.  
  30. void usuwanie_stosu(stos* s){
  31. free(s -> elementy);
  32. free(s);
  33. }
  34.  
  35. typedef enum entry_type {number, add, subtract, multiply, divide} entry_type;
  36.  
  37. entry_type parse(char* tab){
  38. if (tab[0] == '+') return add;
  39. if (tab[0] == '-') return subtract;
  40. if (tab[0] == '*') return multiply;
  41. if (tab[0] == '/') return divide;
  42. return number;
  43. }
  44.  
  45. int ConvToInt(char* wejscie, int max){
  46.  
  47. int wynik = 0;
  48. int mnoznik = 1;
  49. for(int tmp = 0; tmp < max && wejscie[tmp] != '\0'; tmp++) mnoznik *= 10;
  50.  
  51. mnoznik /= 10;
  52. for(int tmp = 0; tmp < max && wejscie[tmp] != '\0'; tmp++)
  53. {
  54. wynik += (wejscie[tmp] - 48)*mnoznik;
  55. mnoznik /= 10;
  56. }
  57. return wynik;
  58. }
  59.  
  60. void dodaj(stos* s){
  61. int a = pop(s);
  62. int b = pop(s);
  63. push(s, b+a);
  64. }
  65.  
  66. void odejmij(stos* s){
  67. int a = pop(s);
  68. int b = pop(s);
  69. push(s, b-a);
  70. }
  71.  
  72. void pomnoz(stos* s){
  73. int a = pop(s);
  74. int b = pop(s);
  75. push(s, b*a);
  76. }
  77.  
  78. void podziel(stos* s){
  79. int a = pop(s);
  80. int b = pop(s);
  81. push(s, b/a);
  82. }
  83.  
  84. int foo(int ilosc_argumentow, int max) {
  85. stos *arg = tworzenie_stosu(ilosc_argumentow);
  86. char *wejscie = malloc((max + 1) * sizeof(char));
  87.  
  88. while (ilosc_argumentow > 0 || arg->top > 0) {
  89. for (int i = 0; i < max; i++) wejscie[i] = '\0';
  90. scanf("%s", wejscie);
  91.  
  92. if (parse(wejscie) == add) dodaj(arg);
  93. else if (parse(wejscie) == subtract) odejmij(arg);
  94. else if (parse(wejscie) == multiply) pomnoz(arg);
  95. else if (parse(wejscie) == divide) podziel(arg);
  96. else {
  97. push(arg, ConvToInt(wejscie, max));
  98. ilosc_argumentow--;
  99. }
  100. }
  101.  
  102. int wynik = pop(arg);
  103. usuwanie_stosu(arg);
  104. free(wejscie);
  105. return wynik;
  106. }
  107.  
  108. void kalkulator(){
  109. int ilosc_operacji, max;
  110. scanf("%d", &ilosc_operacji);
  111. scanf("%d", &max);
  112. printf("%d\n", foo(ilosc_operacji, max));
  113.  
  114. }
  115.  
  116. void kalkulator_z_pliku(char * c){
  117. FILE *dane;
  118. dane=fopen(c,"r");
  119. if(dane==NULL) printf("W tym katalogu nie ma takiego pliku\n");
  120.  
  121. else{
  122.  
  123. int liczba_argumentow;
  124. int max;
  125. fscanf(dane, "%d", &liczba_argumentow);
  126. fscanf(dane, "%d", &max);
  127.  
  128.  
  129. stos *arg = tworzenie_stosu(liczba_argumentow);
  130. char *wejscie = malloc((max + 1) * sizeof(char));
  131.  
  132. while (liczba_argumentow > 0 || arg->top > 0) {
  133. for (int i = 0; i < max; i++) wejscie[i] = '\0';
  134. fscanf(dane, "%s", wejscie);
  135.  
  136. if (parse(wejscie) == add) dodaj(arg);
  137. else if (parse(wejscie) == subtract) odejmij(arg);
  138. else if (parse(wejscie) == multiply) pomnoz(arg);
  139. else if (parse(wejscie) == divide) podziel(arg);
  140. else {
  141. push(arg, ConvToInt(wejscie, max));
  142. liczba_argumentow--;
  143. }
  144.  
  145. }
  146. int wynik = pop(arg);
  147. usuwanie_stosu(arg);
  148. free(wejscie);
  149. printf("%d", wynik);
  150. return;
  151.  
  152. }
  153. }
  154. /*
  155. * if(feof(dane)){
  156. }
  157. else
  158. */
  159. int main()
  160. {
  161. char * tekst[100];
  162. for(int i =0; i<100; i++)tekst[i]='\0';
  163. scanf("%s", tekst);
  164. kalkulator_z_pliku(tekst);
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement