Najuspešnija knjiga

Autor zadatka: Milena Počuča <milenapocuca@uns.ac.rs>

Iz zadate ulazne datoteke učitati podatke u jednostruko spregnutu listu, gde struktura knjiga_st sadrži sledeća polja:

  • ime pisca (jedna reč, do 20 karaktera)

  • prezime pisca (jedna reč, do 20 karaktera)

  • naslov knjige (jedna reč, do 30 karaktera)

  • cena po komadu (pozitivan broj)

  • broj prodatih kopija (pozitivan broj)

Naravno, struktura knjiga_st sadrži i polja potrebna za pravilno formiranje jednostruko spregnute liste.

Učitati knjige u jednostruko spregnutu listu i uraditi sledeće:

  1. Sortirati knjige po ceni u rastućem redosledu pri dodavanju u listu

  2. Izračunati ukupnu zaradu svake knjige korišćenjem cene po komadu i broja prodatih kopija.

  3. Na standardni izlaz (ekran Terminala) ispisati sledeće informacije:

    • prezime pisca

    • ime pisca

    • naslov knjige

    • ukupna zarada

  4. Pronaći knjigu koja je zaradila najviše novca i ispisati njene podatke na standardni izlaz (ekran Terminala)

Primer poziva:

./knjige knjige.txt

sa zadatim ulazom u datoteci knjige.txt:

Edgar-Alan Po Gavran 1230 150
Agata Kristi Satovi 1190 123
Dz.K. Rouling Hari-Poter-1 1500 197
Edgar-Alan Po Sabrane-price 1480 114
Agata Kristi Nemezis 1210 126
Dz.K. Rouling Hari-Poter-3 1550 200

i očekivanim izlazom na terminalu:

Kristi Agata Satovi 146370
Kristi Agata Nemezis 152460
Po Edgar-Alan Gavran 184500
Po Edgar-Alan Sabrane-price 168720
Rouling Dz.K. Hari-Poter-1 295500
Rouling Dz.K. Hari-Poter-3 310000
Knjiga koja je zaradila najvise novca je Dz.K. Rouling Hari-Poter-3 1550 200.

Primer rešenja

  1#include <stdio.h>
  2#include <stdlib.h>
  3#include <string.h>
  4
  5#define MAX_IME 21
  6#define MAX_NASLOV 31
  7
  8typedef struct cvor_st{
  9    char ime[MAX_IME];
 10    char prezime[MAX_IME];
 11    char naslov[MAX_NASLOV];
 12    int cena;
 13    int kopije;
 14    int zarada;
 15    struct cvor_st* sledeci;
 16}CVOR;
 17
 18FILE* open_file(char* ime, char* mode) {
 19
 20    FILE* fp = fopen(ime, mode);
 21    if(fp==NULL) 
 22    {
 23        printf("Greska pri otvaranju datoteke %s", ime);
 24        exit(42);
 25    }
 26    return fp;
 27}
 28
 29void init(CVOR** glava) {
 30    *glava = NULL;
 31}
 32
 33CVOR* create_node(char* ime, char* prezime, char* naslov, int cena,
 34int kopije) {
 35    CVOR* tmp = malloc(sizeof(CVOR));
 36    if(tmp==NULL)
 37    {
 38        printf("Ne moze se zauzeti memorija");
 39        exit(123);
 40    }
 41    strcpy(tmp->ime, ime);
 42    strcpy(tmp->prezime, prezime);
 43    strcpy(tmp->naslov, naslov);
 44    tmp->cena = cena;
 45    tmp->kopije = kopije;
 46    tmp->sledeci = NULL;
 47    return tmp; 
 48}
 49
 50void add_sorted(CVOR** glava, CVOR* novi) {
 51
 52   CVOR* trenutni;
 53    if(*glava==NULL || (*glava)->cena >= novi->cena) 
 54    {
 55        novi->sledeci = *glava;
 56        *glava = novi;
 57    } else 
 58    {
 59        trenutni = *glava;
 60        while(trenutni->sledeci!=NULL && trenutni->sledeci->cena < novi->cena)
 61        {
 62            trenutni = trenutni->sledeci;
 63        }
 64        novi->sledeci = trenutni->sledeci;
 65        trenutni->sledeci = novi;
 66    }
 67}
 68
 69void read(FILE* in, CVOR** glava) {
 70    char ime[MAX_IME], prezime[MAX_IME], naslov[MAX_NASLOV];
 71    int cena, kopije;
 72    while(fscanf(in, "%s %s %s %d %d", ime, prezime, naslov, &cena, &kopije)
 73    !=EOF)
 74    {
 75        CVOR* new = create_node(ime, prezime, naslov, cena, kopije);
 76        add_sorted(glava, new);
 77    }
 78}
 79
 80void write(FILE* out, CVOR* glava) {
 81    while(glava != NULL) 
 82    {
 83        glava->zarada = glava->cena * glava->kopije;
 84        fprintf(out, "%s %s %s %d\n", glava->prezime, glava->ime,
 85            glava->naslov, glava->zarada);
 86        glava = glava->sledeci;
 87    }
 88}
 89
 90void clear(CVOR** glava) {
 91    if(*glava == NULL) 
 92    {
 93        return;
 94    }
 95    clear(&((*glava)->sledeci));
 96    free(*glava);
 97    *glava = NULL;
 98}
 99
100CVOR* find_best_seller(CVOR* glava) {
101    CVOR* best = NULL;
102    
103    while(glava != NULL) 
104    {
105        if(best == NULL) 
106        {
107            best = glava;
108        } else if(glava->zarada > best->zarada) 
109        {
110            best = glava;
111        }
112        glava = glava->sledeci;
113    }
114    return best;
115}
116
117int main(int brArg, char* args[]) {
118    
119    if(brArg!=2) 
120    {
121        printf("Program nije dobro pozvan");
122        exit(42);
123    }
124    
125    FILE* in = open_file(args[1], "r");
126    CVOR* glava;
127    init(&glava);
128    read(in, &glava);
129    write(stdout, glava);
130    CVOR* best = find_best_seller(glava);
131    if(best != NULL) 
132    {
133        fprintf(stdout, "Knjiga koja je zaradila najvise novca je "
134            +"%s %s %s %d %d.\n", best->ime, best->prezime, best->naslov,
135            best->cena, best->kopije);
136    } else 
137    {
138        fprintf(stdout, "Ne postoji knjiga koja je zaradila najvise novca.\n");
139    }
140    fclose(in);
141    clear(&glava);
142    return 0;
143}