Trka za MVP nagradu

Autor zadatka: Mihajlo Marjanski <marjanski.mihajlo@uns.ac.rs>

Napisati program koji pronalazi i označava favorita za MVP nagradu (na osnovu efikasnosti igrača), a i označava one igrače koji zbog tehnikalija to ne mogu biti. Podaci su zadati u ulaznoj datoteci u sledećem formatu:

  • ime (jedna reč, do 15 karaktera)

  • broj_poena (celobrojna vrednost)

  • broj_skokova (celobrojna vrednost)

  • broj_asistencija (celobrojna vrednost)

  • broj_odigranih_utakmica (celobrojna vrednost)

Igrače učitati u statički niz, zatim na osnovu dobijenih podataka odrediti efikasnost svakog igrača po sledećoj formuli:

\[efikasnost = \frac{broj\_poena + broj\_skokova + broj\_asistencija}{broj\_odigranih\_utakmica}\]

Niz sortirati na osnovu efikasnosti igrača i to silazno. Takodje sračunati prosečnu efikasnost svih igrača.

Koristeći zadatu granicu, koja se unosi kao argument komandne linije i koja označava na koliko je utakmica igrač morao igrati da bi uopšte bio kvalifikovan da dobije MVP nagradu, na kraj imena igrača koji nisu zadovoljili kriterijum dodati sledeći niz karaktera:

(-)

A na kraj imena igrača sa najvećim koeficijentom efikasnosti i koji pritom zadovoljava kriterijum odigranih utakmica dodati sledeći niz karatktera:

(*)

Ispisati na standardni izlaz sortirani niz igrača sa preradjenim imenima, poene, skokove, asistencije, broj odigranih utakmica, efikasnost.

Ispis igrača formatirati na sledeći način:

%12s %10d %10d %10d %10d %10.2lf

A na sam kraj ispisati koja je prosečna efikasnost svih igrača.

U slučaju nedovoljnog ili suvišnog broja argumenata komandne linije, izaći iz programa sa status kodom 1 (EXIT_FAILURE).

Primer poziva:

./a.out igraci_input_data.txt igraci_output_data.txt 72

Primer ulazne datoteke igraci_input_data.txt:

Jokic 	2085 	976 	708 	79
Curry 	1956 	330 	379 	74
LeBron	1822 	518 	589 	71
Embiid	1353 	430 	219 	39
Durant	2032 	495 	378 	75
Doncic	2370 	647 	686 	70

Primer izlazne datoteke igraci_output_data.txt:

   Doncic(-)       2370        647        686         70      52.90
   Embiid(-)       1353        430        219         39      51.33
    Jokic(*)       2085        976        708         79      47.71
   LeBron(-)       1822        518        589         71      41.25
      Durant       2032        495        378         75      38.73
       Curry       1956        330        379         74      36.01

i očekivanim izlazom na terminalu:

Prosecna efikasnost igraca je: 44.66

Primer rešenja

  1#include <stdio.h>
  2#include <math.h>
  3#include <string.h>
  4#include <stdlib.h>
  5#include <stdbool.h>
  6
  7#define MAX_IME 16
  8
  9#define MAX_IGRACA 20
 10
 11typedef struct igrac_st
 12{
 13    char ime[MAX_IME];
 14    int poena;
 15    int skokova;
 16    int asistencija;
 17    int utakmica;
 18    double efikasnost;
 19} IGRAC;
 20
 21void ispisi_igrace(FILE *, IGRAC *, int, double);
 22void sracunaj_efikasnosti(IGRAC *, int);
 23void sortiraj_igrace(IGRAC *, int);
 24void obradi_imena(IGRAC *, int, int);
 25double sracunaj_prosek(IGRAC *, int);
 26
 27
 28FILE* otvori(char *ime, char *mode)
 29{
 30  FILE* fp = fopen(ime, mode);
 31  
 32  if(fp==NULL) 
 33  {
 34    printf("Doslo je do greske prilikom otvaranja datoteke %s", ime);
 35    exit(EXIT_FAILURE);
 36  }
 37  return fp;
 38
 39}
 40
 41int ucitaj(FILE* in, IGRAC* igraci)
 42{
 43  int i = 0;
 44  
 45  while(fscanf(in, "%s %d %d %d %d", igraci[i].ime, &igraci[i].poena, &igraci[i].skokova, &igraci[i].asistencija, &igraci[i].utakmica)!=EOF) 
 46  {
 47    i++;
 48  }
 49  return i;
 50
 51}
 52
 53int main(int argc, char **argv)
 54{
 55    IGRAC igraci[MAX_IGRACA];
 56    int n;
 57
 58    if(argc != 4)
 59    {
 60        printf("Primer poziva programa: %s igraci_input_data.txt igraci_output_data.txt 50\n", argv[0]);
 61        exit(1);
 62    }
 63    FILE *in = otvori(argv[1], "r");
 64    FILE *out = otvori(argv[2], "w");
 65    n = ucitaj(in, igraci);
 66    sracunaj_efikasnosti(igraci, n);
 67    double prosek_efikasnosti = sracunaj_prosek(igraci, n);
 68    int min_broj_utakmica = atoi(argv[3]);
 69    sortiraj_igrace(igraci,n);
 70    obradi_imena(igraci,n, min_broj_utakmica);
 71    ispisi_igrace(out, igraci, n, prosek_efikasnosti);
 72    printf("Prosecna efikasnost igraca je: %.2lf\n", prosek_efikasnosti);
 73    fclose(in);
 74    fclose(out);
 75    return 0;
 76}
 77
 78void obradi_imena(IGRAC *igraci,int n, int min_broj_utakmica)
 79{
 80    int i;
 81    bool najbolji_dodeljen = false;
 82    for (i = 0;i < n;i++)
 83    {   
 84        if(igraci[i].utakmica < min_broj_utakmica)
 85        {
 86            strcat(igraci[i].ime, "(-)");
 87        }
 88        else
 89        {
 90            if(!najbolji_dodeljen)
 91            {
 92                strcat(igraci[i].ime, "(*)");
 93                najbolji_dodeljen = true;
 94            }
 95        }
 96    }
 97}
 98
 99void sortiraj_igrace(IGRAC *igraci,int n)
100{
101    IGRAC tmp;
102    int i, j, min_idx;
103    for(i = 0;i < n - 1;i++)
104    {
105        min_idx = i;
106        for(j = i + 1;j < n;j++)
107        {
108            if(igraci[min_idx].efikasnost < igraci[j].efikasnost)
109            {
110                min_idx = j;
111            }
112        }
113        if(min_idx != i)
114        {
115            tmp = igraci[i];
116            igraci[i] = igraci[min_idx];
117            igraci[min_idx] = tmp;
118        }
119    }
120}
121
122void sracunaj_efikasnosti(IGRAC *igraci,int n)
123{
124    int i;
125    for (i = 0;i < n;i++)
126    {   
127        igraci[i].efikasnost = (igraci[i].poena+igraci[i].skokova+igraci[i].asistencija)/(double)igraci[i].utakmica;
128    }
129}
130
131double sracunaj_prosek(IGRAC *igraci, int n)
132{
133    int i;
134    double suma = 0;
135    for (i = 0;i < n;i++)
136    {
137        suma += igraci[i].efikasnost;
138    }
139    
140    return suma/n;
141}
142
143void ispisi_igrace(FILE *izlazna, IGRAC *igraci, int n, double prosek)
144{
145    int i;
146    for(i = 0;i < n;i++)
147    {
148        fprintf(izlazna ,"%12s %10d %10d %10d %10d %10.2lf\n",
149        igraci[i].ime,
150        igraci[i].poena,
151        igraci[i].skokova,
152        igraci[i].asistencija,
153        igraci[i].utakmica,
154        igraci[i].efikasnost);
155    }
156}
157