Ž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:
Sortirati knjige po ceni u rastućem redosledu pri dodavanju u listu
Na standardni izlaz (ekran Terminala) ispisati sledeće informacije:
prezime pisca
ime pisca
cena
naslov knjige
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}