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}