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:
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 poziva:
./a.out 72 < igraci_input_data.txt
Primer ulazne datoteke igraci_input_data.txt
:
6
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
i očekivanim izlazom na terminalu:
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
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
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 ucitaj_igrace(IGRAC *, int *);
22void ispisi_igrace(IGRAC *, int, double);
23void sracunaj_efikasnosti(IGRAC *, int);
24void sortiraj_igrace(IGRAC *, int);
25void obradi_imena(IGRAC *, int, int);
26double sracunaj_prosek(IGRAC *, int);
27
28int main(int argc, char **argv)
29{
30 IGRAC igraci[MAX_IGRACA];
31 int n;
32
33 if(argc != 2)
34 {
35 printf("Primer poziva programa: %s 50\n", argv[0]);
36 exit(1);
37 }
38
39 ucitaj_igrace(igraci, &n);
40 sracunaj_efikasnosti(igraci, n);
41 double prosek_efikasnosti = sracunaj_prosek(igraci, n);
42 int min_broj_utakmica = atoi(argv[1]);
43 sortiraj_igrace(igraci,n);
44 obradi_imena(igraci,n, min_broj_utakmica);
45 ispisi_igrace(igraci, n, prosek_efikasnosti);
46 printf("\nProsecna efikasnost igraca je: %.2lf\n", prosek_efikasnosti);
47 return 0;
48}
49
50void obradi_imena(IGRAC *igraci,int n, int min_broj_utakmica)
51{
52 int i;
53 bool najbolji_dodeljen = false;
54 for (i = 0;i < n;i++)
55 {
56 if(igraci[i].utakmica < min_broj_utakmica)
57 {
58 strcat(igraci[i].ime, "(-)");
59 }
60 else
61 {
62 if(!najbolji_dodeljen)
63 {
64 strcat(igraci[i].ime, "(*)");
65 najbolji_dodeljen = true;
66 }
67 }
68 }
69}
70
71void sortiraj_igrace(IGRAC *igraci,int n)
72{
73 IGRAC tmp;
74 int i, j, min_idx;
75 for(i = 0;i < n - 1;i++)
76 {
77 min_idx = i;
78 for(j = i + 1;j < n;j++)
79 {
80 if(igraci[min_idx].efikasnost < igraci[j].efikasnost)
81 {
82 min_idx = j;
83 }
84 }
85 if(min_idx != i)
86 {
87 tmp = igraci[i];
88 igraci[i] = igraci[min_idx];
89 igraci[min_idx] = tmp;
90 }
91 }
92}
93
94void sracunaj_efikasnosti(IGRAC *igraci,int n)
95{
96 int i;
97 for (i = 0;i < n;i++)
98 {
99 igraci[i].efikasnost = (igraci[i].poena+igraci[i].skokova+igraci[i].asistencija)/(double)igraci[i].utakmica;
100 }
101}
102
103double sracunaj_prosek(IGRAC *igraci, int n)
104{
105 int i;
106 double suma = 0;
107 for (i = 0;i < n;i++)
108 {
109 suma += igraci[i].efikasnost;
110 }
111
112 return suma/n;
113}
114
115void ucitaj_igrace(IGRAC *igraci, int *pn)
116{
117 int i;
118
119 do
120 {
121 scanf("%d", pn);
122 } while (*pn <= 0 || *pn > MAX_IGRACA);
123
124 for (i = 0;i < *pn;i++)
125 {
126 scanf("%s %d %d %d %d",
127 igraci[i].ime,
128 &igraci[i].poena,
129 &igraci[i].skokova,
130 &igraci[i].asistencija,
131 &igraci[i].utakmica);
132 }
133}
134
135void ispisi_igrace(IGRAC *igraci, int n, double prosek)
136{
137 int i;
138 for(i = 0;i < n;i++)
139 {
140 printf("%12s %10d %10d %10d %10d %10.2lf",
141 igraci[i].ime,
142 igraci[i].poena,
143 igraci[i].skokova,
144 igraci[i].asistencija,
145 igraci[i].utakmica,
146 igraci[i].efikasnost);
147 printf("\n");
148 }
149}
150