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:
Sortirati knjige po ceni u rastućem redosledu pri dodavanju u listu
Izračunati ukupnu zaradu svake knjige korišćenjem cene po komadu i broja prodatih kopija.
Na standardni izlaz (ekran Terminala) ispisati sledeće informacije:
prezime pisca
ime pisca
naslov knjige
ukupna zarada
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}