Pretraživači¶
Autor zadatka: Relja Mihić <relja.mihic@uns.ac.rs>
Imena ulazne i izlazne datoteke učitati argumentom komandne linije. Ulazna datoteka sadrži podatke o pretraživačima:
naziv
(jedna reč, do 20 karaktera)procenat_pretraga_2010
(realan broj, predstavlja % svih pretraga)procenat_pretraga_2015
(realan broj, predstavlja % svih pretraga)procenat_pretraga_2020
(realan broj, predstavlja % svih pretraga)
Učitati podatke u jednostruko spregnutu listu dodavanjem novih elemenata na kraj liste. U izlaznu datoteku ispisati imena i ukupni broj pretraga sa pretraživača (u bilionima) tokom te 3 godine, ako je:
2010 godine bilo 1.2 biliona pretraga
2015 godine bilo 2.3 biliona pretraga
2020 godine bilo 3.4 biliona pretraga
Ispis zaokružiti na dve decimale. Na standardni izlaz ispisati za svaku od navedenih godina pretraživač sa najviše pretraga.
U slučaju uspešnog izvršavanja programa, izaći sa status kodom 0
(EXIT_SUCCESS
).
Ukoliko program ne može da se izvrši do kraja usled sledećih nedostataka, izaći iz programa sa sledećim status kodovima:
U slučaju nedovoljnog ili suvišnog broj argumenata komandne linije, izaći iz programa status kodom
1
(EXIT_FAILURE
)Ako nije uspešno otvorena ulazna datoteka, izaći iz programa sa status kodom
2
Ako nije uspešno otvorena izlazna datoteka, izaći iz programa sa status kodom
3
Ako nije uspešno alocirana memorija za elemente, izaći iz programa sa status kodom
4
Primer poziva programa:
./a.out pretrazivaci.txt out.txt
Primer ulazne datoteke pretrazivaci.txt
:
Chrome 6.04 51.72 68.91
Internet_Explorer 55.25 21.16 4.45
Firefox 31.64 18.7 9.25
Safari 3.76 4.94 8.68
Opera 3.31 3.48 4.2
Edge 0 0 4.51
Ispis programa na standardnom izlazu:
Najposeceniji pretrazivac
2010: Internet_Explorer
2015: Chrome
2020: Chrome
Primer izlazne datoteke out.txt
:
Chrome 3.60
Internet_Explorer 1.30
Firefox 1.12
Safari 0.45
Opera 0.26
Edge 0.15
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_NAZIV 21
6
7typedef struct cvor_st {
8 char naziv[MAX_NAZIV];
9 float pr2010;
10 float pr2015;
11 float pr2020;
12 struct cvor_st *sledeci;
13} CVOR;
14
15FILE *safe_fopen(char *ime, char *rezim, int kod_greske);
16void inicijalizacija(CVOR **glava);
17void ucitavanje(CVOR **glava, FILE *pf);
18CVOR *napravi_cvor(char *ime, float p10, float p15, float p20);
19void dodaj_na_kraj(CVOR **glava, CVOR *novi);
20void ispis_pretraga(FILE *pf, CVOR *glava);
21void ispis_najposecenijeg(CVOR *glava);
22void obrisi_listu(CVOR **glava);
23
24int main(int argc, char **argv) {
25
26 if (argc != 3) {
27 printf("Primer poziva programa: %s pretrazivaci.txt out.txt\n", argv[0]);
28 exit(1);
29 }
30
31 CVOR *glava;
32 FILE *ulazna, *izlazna;
33
34 inicijalizacija(&glava);
35 ulazna = safe_fopen(argv[1], "r", 2);
36 ucitavanje(&glava, ulazna);
37 fclose(ulazna);
38
39 izlazna = safe_fopen(argv[2], "w", 3);
40 ispis_pretraga(izlazna, glava);
41 fclose(izlazna);
42
43 ispis_najposecenijeg(glava);
44 obrisi_listu(&glava);
45
46 return 0;
47}
48
49FILE *safe_fopen(char *ime, char *rezim, int kod_greske) {
50 FILE *pf = fopen(ime, rezim);
51
52 if (pf == NULL) {
53 printf("Nije otvoren %s", ime);
54 exit(kod_greske);
55 }
56
57 return pf;
58}
59
60void inicijalizacija(CVOR **glava) {
61 *glava = NULL;
62}
63
64void ucitavanje(CVOR **glava, FILE *pf) {
65 char ime[MAX_NAZIV];
66 float p10, p15, p20;
67
68 while(fscanf(pf, "%s %f %f %f", ime, &p10, &p15, &p20) != EOF) {
69 CVOR *novi = napravi_cvor(ime, p10, p15, p20);
70 dodaj_na_kraj(glava, novi);
71 }
72}
73
74CVOR *napravi_cvor(char *ime, float p10, float p15, float p20) {
75 CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
76
77 if (novi == NULL) {
78 printf("Nema dovoljno memorije!\n");
79 exit(4);
80 }
81
82 strcpy(novi->naziv, ime);
83 novi->pr2010 = p10;
84 novi->pr2015 = p15;
85 novi->pr2020 = p20;
86 novi->sledeci = NULL;
87
88 return novi;
89}
90
91void dodaj_na_kraj(CVOR **glava, CVOR *novi) {
92 if (*glava == NULL) {
93 *glava = novi;
94 } else {
95 CVOR *trenutni = *glava;
96 while(trenutni->sledeci != NULL) {
97 trenutni = trenutni->sledeci;
98 }
99 trenutni->sledeci = novi;
100 }
101}
102
103void obrisi_listu(CVOR **glava) {
104 while(*glava != NULL) {
105 CVOR *trenutni = *glava;
106 *glava = trenutni->sledeci;
107 trenutni->sledeci = NULL;
108 free(trenutni);
109 }
110}
111
112void ispis_pretraga(FILE *pf, CVOR *glava) {
113 CVOR *tr = glava;
114 while(tr != NULL) {
115 fprintf(pf, "%s %.2f\n", tr->naziv, tr->pr2010 * 1.2 / 100 + tr->pr2015 * 2.3 / 100 + tr->pr2020 * 3.4 / 100);
116 tr = tr->sledeci;
117 }
118}
119
120void ispis_najposecenijeg(CVOR *glava) {
121 CVOR *trenutni = glava;
122 CVOR *max2010 = glava;
123 CVOR *max2015 = glava;
124 CVOR *max2020 = glava;
125 while(trenutni != NULL) {
126 if (trenutni->pr2010 > max2010->pr2010) {
127 max2010 = trenutni;
128 }
129 if (trenutni->pr2015 > max2015->pr2015) {
130 max2015 = trenutni;
131 }
132 if (trenutni->pr2020 > max2020->pr2020) {
133 max2020 = trenutni;
134 }
135 trenutni = trenutni->sledeci;
136 }
137 printf("Najposeceniji pretrazivac\n");
138 printf("2010: %s\n2015: %s\n2020: %s\n", max2010->naziv, max2015->naziv, max2020->naziv);
139}