Žanrovi 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)

  • zanr (jedna reč, do 20 karaktera)

  • cena (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. Na standardni izlaz (ekran Terminala) ispisati sledeće informacije:

    • prezime pisca

    • ime pisca

    • cena

    • naslov knjige

  3. Pronaći sve knjige za žanr koji je prosleđen kao argument komandne linije, sabrati cene tih knjiga i ispisati na standardni izlaz (ekran Terminala)

Primer poziva:

./knjige knjige.txt triler

sa zadatim ulazom u datoteci knjige.txt:

Edgar-Alan Po Gavran poezija 1230
Agata Kristi Satovi triler 1190
Dz.K. Rouling Hari-Poter-1 fantastika 1500
Edgar-Alan Po Sabrane-price 1480
Agata Kristi Nemezis triler 1210
Dz.K. Rouling Hari-Poter-3 fantastika 1550

i očekivanim izlazom na terminalu:

Kristi Agata 1190 Satovi
Kristi Agata 1210 Nemezis
Po Edgar-Alan 1230 Gavran
Po Edgar-Alan 1500 Sabrane-price
Rouling Dz.K. 1500 Hari-Poter-1
Rouling Dz.K. 1550 Hari-Poter-3
Knjige zanra triler kostaju ukupno 2400 din.

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    char zanr[MAX_IME];
 13    int cena;
 14    struct cvor_st* sledeci;
 15}CVOR;
 16
 17FILE* open_file(char* ime, char* mode) {
 18
 19    FILE* fp = fopen(ime, mode);
 20    if(fp==NULL) 
 21    {
 22        printf("Greska pri otvaranju datoteke %s", ime);
 23        exit(42);
 24    }
 25    return fp;
 26}
 27
 28void init(CVOR** glava) {
 29    *glava = NULL;
 30}
 31
 32CVOR* create_node(char* ime, char* prezime, char* naslov, char* zanr, 
 33int cena) {
 34    CVOR* tmp = malloc(sizeof(CVOR));
 35    if(tmp==NULL)
 36    {
 37        printf("Ne moze se zauzeti memorija");
 38        exit(123);
 39    }
 40    strcpy(tmp->ime, ime);
 41    strcpy(tmp->prezime, prezime);
 42    strcpy(tmp->naslov, naslov);
 43    strcpy(tmp->zanr, zanr);
 44    tmp->cena = cena;
 45    tmp->sledeci = NULL;
 46    return tmp; 
 47}
 48
 49void add_sorted(CVOR** glava, CVOR* novi) {
 50
 51   CVOR* trenutni;
 52    if(*glava==NULL || (*glava)->cena >= novi->cena) 
 53    {
 54        novi->sledeci = *glava;
 55        *glava = novi;
 56    } else 
 57    {
 58        trenutni = *glava;
 59        while(trenutni->sledeci!=NULL && trenutni->sledeci->cena < novi->cena)
 60        {
 61            trenutni = trenutni->sledeci;
 62        }
 63        novi->sledeci = trenutni->sledeci;
 64        trenutni->sledeci = novi;
 65    }
 66}
 67
 68void read(FILE* in, CVOR** glava) {
 69    char ime[MAX_IME];
 70    char prezime [MAX_IME];
 71    char naslov[MAX_NASLOV];
 72    int cena;
 73    char zanr[MAX_IME];
 74    while(fscanf(in, "%s %s %s %s %d", ime, prezime, naslov, zanr, &cena)!=EOF)
 75    {
 76        CVOR* new = create_node(ime, prezime, naslov, zanr, cena);
 77        add_sorted(glava, new);
 78    }
 79}
 80
 81void write(FILE* out, CVOR* glava) {
 82    while(glava != NULL) 
 83    {
 84        fprintf(out, "%s %s %d %s\n", glava->prezime, glava->ime, glava->cena,
 85         glava->naslov);
 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
100int pronadji_zanr(CVOR* glava, char* zanr) {
101    if(glava == NULL) 
102    {
103        return;
104    }
105    int s = 0;
106    
107    while(glava != NULL) 
108    {
109        if(strcmp(glava->zanr, zanr) == 0) 
110        {
111            s += glava->cena;
112        }
113        glava = glava->sledeci;
114    }
115    return s;
116}
117
118int main(int brArg, char* args[]) {
119    
120    if(brArg!=3) 
121    {
122        printf("Program nije dobro pozvan");
123        exit(42);
124    }
125    
126    FILE* in = open_file(args[1], "r");
127    CVOR* glava;
128    init(&glava);
129    read(in, &glava);
130    write(stdout, glava);
131    int suma = pronadji_zanr(glava, args[2]);
132    if(suma != 0) 
133    {
134        fprintf(stdout, "Knjige zanra %s kostaju ukupno %d din.\n",
135        args[2], suma);
136    } else 
137    {
138        fprintf(stdout, "Ne postoje knjige zanra %s.\n", args[2]);
139    }
140    fclose(in);
141    clear(&glava);
142    return 0;
143}