Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Napisati program koji iz datoteke cita postfiks izraz i zatim korištenjem stoga racuna
- rezultat. Stog je potrebno realizirati preko vezane liste.*/
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h>
- #include<errno.h>
- #include<string.h>
- #include<stdlib.h>
- #include<ctype.h>
- typedef struct Stack;
- typedef struct Stack* Position;
- struct Stack
- {
- float number;
- Position Next;
- };
- void newStackElement(Position *);
- void push(Position, float);
- float pop(Position);
- int main()
- {
- //stog
- struct Stack H;
- H.Next = NULL;
- printf("Racunanje postfix izaza iz datoteke");
- //ime_datoteke - ime otvorene datoteke
- char ime_datoteke[20];
- printf("Unesite ime datoteke koju zelite otvoriti:\n");
- scanf(" %s", ime_datoteke);
- //otvaranje datoteke
- FILE *fb=NULL;
- fb = fopen(ime_datoteke, "r");
- //fb = fopen("postfix.txt", "r");
- if (fb == NULL)
- printf("Greska prilikom otvaranja datoteke, ERROR: %d", errno);
- //Loop za ic po fileu
- char *sample = NULL;
- float o1, o2, num;
- int n = 0;
- sample = (char*)malloc(sizeof(char) * 1024);
- if (sample == NULL)
- printf("Greska prilikom alokacije memorije, ERROR: %d", errno);
- memset(sample, '\0', 1024);
- while (!feof(fb))
- {
- memset(sample, 0, 1024);
- fscanf(fb, " %s", sample);
- //if (strlen(sample) == 0)continue;
- //uvjeti i to
- /*
- int n = sscanf("string", "%s ", word1);
- The return value in n tells you how many assignments were made successfully.
- */
- n=sscanf(sample, " %f", &num);
- //ovde dolazi if i provjera uvjeta i racunanje
- if (n != 1)
- {
- o2 = pop(&H);
- o1 = pop(&H);
- // ---------------------------------
- if (strcmp(sample, "+") == 0)
- num = o1 + o2;
- else if (strcmp(sample, "-") == 0)
- num = o1 - o2;
- else if (strcmp(sample, "*") == 0)
- num = o1 * o2;
- else if (strcmp(sample, " / ") == 0)
- num = o1 / o2;
- }
- //Do ove tocke dolaze 2 stvari number ko broj operanda, ili iz ifa kad se izracuna rezultat broj
- push(&H, num);
- /*
- if (isdigit(*sample))
- {
- //ako je ovaj uvjet ispunjen onda je string broj, ako je broj onda ga mozemo
- x = atof(sample);
- push(&H,x);
- continue;
- }
- else if ((!isdigit(sample[0]))&&(isdigit(sample[1])))
- {
- //ako prvi nije broj, a drugi je broj onda je to negativni broj, odnosno
- x = atof(sample);
- push(&H, x);
- continue;
- }
- //e sad ako nije ni jedna od ovih gore 2 uvjeta znaci da nije broj, nego je operator; (dobro tehnicki moze bit bilo sta osim 0-9);
- switch (sample[0])
- {
- case'+':
- o2 = pop(&H);
- o1 = pop(&H);
- x = o1 + o2;
- push(&H, x);
- break;
- case'-':
- o2 = pop(&H);
- o1 = pop(&H);
- x = o1 - o2;
- push(&H, x);
- break;
- case'*':
- o2 = pop(&H);
- o1 = pop(&H);
- x = o1 * o2;
- push(&H, x);
- break;
- case'/':
- o2 = pop(&H);
- o1 = pop(&H);
- x = o1 / o2;
- push(&H, x);
- break;
- default:
- printf("Unesen je nevazeci znak");
- getchar();
- break;
- }
- */
- }
- printf("Rezultat je: %f", H.Next->number);
- return 0;
- }
- void newStackElement(Position *A)
- {
- Stack* q = NULL;
- *A = (Position)malloc(sizeof(struct Stack));
- if (*A == NULL)
- {
- printf("Greska prilikom alociranja memorije novog clana stoga, ERROR: %d", errno);
- }
- q = *A;
- q->Next = NULL;
- }
- void push(Position P, float x)
- {
- Stack* q = NULL;
- newStackElement(&q);
- q->number = x;
- q->Next = P->Next;
- P->Next = q;
- }
- float pop(Position P)
- {
- //y-pointer, x-float vrijednost koju izvlaci iz stacka
- Stack* y = NULL;
- float x;
- y = P->Next;
- P->Next = y->Next;
- x = y->number;
- free(y);
- return x;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement