/***************************************************************** * Ovo delo zaštićeno je licencom Creative Commons CC BY-NC-ND 4.0 * (Attribution-NonCommercial-NoDerivatives 4.0 International License). * Za detalje pogledati LICENSE.TXT * Autori: Milena Vujosevic Janicic, Jovana Kovacevic, * Danijela Simic, Andjelka Zecevic, Aleksandra Kocic ******************************************************************/ #include <stdio.h> #include <stdlib.h> #define MAKS 1000 /* Struktura koja opisuje izraz. */ typedef struct { char o; int x; int y; } Izraz; /* Funkcija proverava da li je izraz ispravno zadat. */ int korektan_izraz(const Izraz *izraz) { if (izraz->o != '+' && izraz->o != '-' && izraz->o != '*' && izraz->o != '/') { printf("Greska: neispravna operacija.\n"); return 0; } if (izraz->o == '/' && izraz->y == 0) { printf("Greska: deljenje nulom.\n"); return 0; } return 1; } /* Funkcija ucitava n izraza sa standardnog ulaza. */ void ucitaj(Izraz izrazi[], int n) { int i; printf("Unesite izraze u prefiksnoj notaciji:\n"); for (i = 0; i < n; i++) { scanf("%c%d%d", &izrazi[i].o, &izrazi[i].x, &izrazi[i].y); /* Preskace se novi red koji se nalazi nakon izraza, kako bi naredni izraz bio ispravno ucitan. */ getchar(); /* Provera ispravnosti ucitanog izraza. */ if (!korektan_izraz(&izrazi[i])) { printf("Greska: neispravan unos.\n"); exit(EXIT_FAILURE); } } } /* Funkcija racuna vrednost izraza. */ int vrednost(const Izraz *izraz) { switch (izraz->o) { case '+': return izraz->x + izraz->y; case '-': return izraz->x - izraz->y; case '*': return izraz->x * izraz->y; case '/': return izraz->x / izraz->y; default: printf("Greska: neispravna operacija.\n"); exit(EXIT_FAILURE); } } /* Funkcija racuna najvecu vrednost izraza. */ int najveca_vrednost(Izraz izrazi[], int n) { int i, maks_vrednost, trenutna_vrednost; maks_vrednost = vrednost(&izrazi[0]); for (i = 1; i < n; i++) { trenutna_vrednost = vrednost(&izrazi[i]); if (trenutna_vrednost > maks_vrednost) maks_vrednost = trenutna_vrednost; } return maks_vrednost; } int main() { /* Deklaracije potrebnih promenljivih. */ int i, n; Izraz izrazi[MAKS]; int maks, trenutna_vrednost; float polovina; /* Ucitavanje broja izraza i provera ispravnosti ulaza. */ printf("Unesite broj izraza: "); scanf("%d", &n); if (n < 0 || n > MAKS) { printf("Greska: neispravan unos.\n"); exit(EXIT_FAILURE); } /* Preskace se belina koja se unosi nakon broja izraza. Ovaj korak je neophodan jer se izraz zadaje u formatu: <operacija> <operand> <operand> Kako je <operacija> tipa char, izostavljanjem ovog koraka, ta belina bi bila ucitana kao <operacija> za prvi izraz. */ getchar(); ucitaj(izrazi, n); /* Pronalazak polovine maksimalne vrednosti. */ maks = najveca_vrednost(izrazi, n); printf("Maksimalna vrednost izraza: %d\n", maks); polovina = maks / 2.0; /* Ispis rezultata. */ printf("Izrazi cija je vrednost manja od polovine maksimalne " "vrednosti:\n"); for (i = 0; i < n; i++) { trenutna_vrednost = vrednost(&izrazi[i]); if (trenutna_vrednost < polovina) { printf("%d %c %d = %d\n", izrazi[i].x, izrazi[i].o, izrazi[i].y, trenutna_vrednost); } } exit(EXIT_SUCCESS); }