Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #include <string.h>
- typedef struct stos {
- int* elementy;
- int top;
- int max_size;
- } stos;
- void push(stos* s, int n){
- s -> top++;
- s -> elementy[s->top] = n;
- }
- int pop(stos* s){
- s -> top--;
- return s -> elementy[s->top+1];
- }
- stos* tworzenie_stosu(int rozmiar){
- stos* stack = malloc(sizeof(int*)+2*sizeof(int));
- stack -> max_size = rozmiar;
- stack -> elementy = malloc(rozmiar*sizeof(int));
- stack -> top = -1;
- return stack;
- }
- void usuwanie_stosu(stos* s){
- free(s -> elementy);
- free(s);
- }
- typedef enum entry_type {number, add, subtract, multiply, divide} entry_type;
- entry_type parse(char* tab){
- if (tab[0] == '+') return add;
- if (tab[0] == '-') return subtract;
- if (tab[0] == '*') return multiply;
- if (tab[0] == '/') return divide;
- return number;
- }
- int ConvToInt(char* wejscie, int max){
- int wynik = 0;
- int mnoznik = 1;
- for(int tmp = 0; tmp < max && wejscie[tmp] != '\0'; tmp++) mnoznik *= 10;
- mnoznik /= 10;
- for(int tmp = 0; tmp < max && wejscie[tmp] != '\0'; tmp++)
- {
- wynik += (wejscie[tmp] - 48)*mnoznik;
- mnoznik /= 10;
- }
- return wynik;
- }
- void dodaj(stos* s){
- int a = pop(s);
- int b = pop(s);
- push(s, b+a);
- }
- void odejmij(stos* s){
- int a = pop(s);
- int b = pop(s);
- push(s, b-a);
- }
- void pomnoz(stos* s){
- int a = pop(s);
- int b = pop(s);
- push(s, b*a);
- }
- void podziel(stos* s){
- int a = pop(s);
- int b = pop(s);
- push(s, b/a);
- }
- int foo(int ilosc_argumentow, int max) {
- stos *arg = tworzenie_stosu(ilosc_argumentow);
- char *wejscie = malloc((max + 1) * sizeof(char));
- while (ilosc_argumentow > 0 || arg->top > 0) {
- for (int i = 0; i < max; i++) wejscie[i] = '\0';
- scanf("%s", wejscie);
- if (parse(wejscie) == add) dodaj(arg);
- else if (parse(wejscie) == subtract) odejmij(arg);
- else if (parse(wejscie) == multiply) pomnoz(arg);
- else if (parse(wejscie) == divide) podziel(arg);
- else {
- push(arg, ConvToInt(wejscie, max));
- ilosc_argumentow--;
- }
- }
- int wynik = pop(arg);
- usuwanie_stosu(arg);
- free(wejscie);
- return wynik;
- }
- void kalkulator(){
- int ilosc_operacji, max;
- scanf("%d", &ilosc_operacji);
- scanf("%d", &max);
- printf("%d\n", foo(ilosc_operacji, max));
- }
- void kalkulator_z_pliku(char * c){
- FILE *dane;
- dane=fopen(c,"r");
- if(dane==NULL) printf("W tym katalogu nie ma takiego pliku\n");
- else{
- int liczba_argumentow;
- int max;
- fscanf(dane, "%d", &liczba_argumentow);
- fscanf(dane, "%d", &max);
- stos *arg = tworzenie_stosu(liczba_argumentow);
- char *wejscie = malloc((max + 1) * sizeof(char));
- while (liczba_argumentow > 0 || arg->top > 0) {
- for (int i = 0; i < max; i++) wejscie[i] = '\0';
- fscanf(dane, "%s", wejscie);
- if (parse(wejscie) == add) dodaj(arg);
- else if (parse(wejscie) == subtract) odejmij(arg);
- else if (parse(wejscie) == multiply) pomnoz(arg);
- else if (parse(wejscie) == divide) podziel(arg);
- else {
- push(arg, ConvToInt(wejscie, max));
- liczba_argumentow--;
- }
- }
- int wynik = pop(arg);
- usuwanie_stosu(arg);
- free(wejscie);
- printf("%d", wynik);
- return;
- }
- }
- /*
- * if(feof(dane)){
- }
- else
- */
- int main()
- {
- char * tekst[100];
- for(int i =0; i<100; i++)tekst[i]='\0';
- scanf("%s", tekst);
- kalkulator_z_pliku(tekst);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement