Formula 1¶
Autor zadatka: Aleksandar Vasiljević <alexva02@uns.ac.rs>
Iz zadate ulazne datoteke timovi.txt
učitati statički niz struktura, pri čemu se struktura formula_st
sastoji
od sledećih polja:
naziv_tima
(jedna reč, maksimalno 15 karaktera),naziv_vozaca
(jedna reč, maksimalno 10 karaktera),vreme_po_krugu
(pozitivan ceo broj),penali
(realan broj) iukupno_vreme
(realan broj)
Na osnovu parametara br_kruga
koji se prihvata preko argumenata komandne linije, izračunati ukupno
vreme za svakog vozača. Za izračunavanje ukupnog vremena koristiti formulu:
U izlaznu datoteku statistika.txt
ispisati informacije o ukupnom ostvarenom vremenu za svaki tim
(vrednost polja ukupno_vreme zaokružiti na jednu decimalu), kao i podatke o vozaču koji je ostvario
najbolje vreme.
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 sa status kodom
1
(EXIT_FAILURE
)Ako program ne može da otvori ulaznu ili izlaznu datoteku, izaći sa status kodom
2
Primer poziva programa:
./a.out 60 statistika.txt timovi.txt
sa zadatim ulazom u datoteci timovi.txt
:
Ferrari Lecler 95 0.0
Red_Bull_Racing Verstappen 99 1.5
Red_Bull_Racing Perez 98 0.2
Mercedes Russell 101 5.5
Ferrari Sainz 99 0.2
Mercedes Hamilton 94 0.1
McLaren Norris 105 0.0
Alpine Ocon 97 0.0
McLaren Ricciardo 99 0.5
Alpine Alonso 102 2.3
Očekivani izlaz u izlaznoj datoteci statistika.txt
je sledeći:
Ukupna vremena timova su:
Ferrari: 11640.2
Red_Bull_Racing: 11821.7
Mercedes: 11705.6
McLaren: 12240.5
Alpine: 11942.3
Najbolji vozac je:
Hamilton iz tima Mercedes sa ukupnim vremenom 5640.1 sekundi.
./a.out 60 < timovi-stdout.txt
Primer ulazne datoteke timovi-stdinout.txt
:
10
Ferrari Lecler 95 0.0
Red_Bull_Racing Verstappen 99 1.5
Red_Bull_Racing Perez 98 0.2
Mercedes Russell 101 5.5
Ferrari Sainz 99 0.2
Mercedes Hamilton 94 0.1
McLaren Norris 105 0.0
Alpine Ocon 97 0.0
McLaren Ricciardo 99 0.5
Alpine Alonso 102 2.3
Ispis programa na standardnom izlazu:
Unesite broj timova: 1. tim: 2. tim: 3. tim: 4. tim: 5. tim: 6. tim: 7. tim: 8. tim: 9. tim: 10. tim:
Ukupna vremena timova su:
Ferrari: 11640.2
Red_Bull_Racing: 11821.7
Mercedes: 11705.6
McLaren: 12240.5
Alpine: 11942.3
Najbolji vozac je:
Hamilton iz tima Mercedes sa ukupnim vremenom 5640.1 sekundi.
Primer rešenja¶
1#include<stdio.h>
2#include<stdlib.h>
3#include<string.h>
4
5#define MAX_NAZIV_TIMA 15+1
6#define MAX_NAZIV_VOZACA 10+1
7#define MAX_NIZ 11
8
9typedef struct formula_st
10{
11 char naziv_tima[MAX_NAZIV_TIMA];
12 char naziv_vozaca[MAX_NAZIV_VOZACA];
13 unsigned int vreme_po_krugu;
14 double penali;
15 double ukupno_vreme;
16}Formula;
17
18FILE *otvori(char *name,char *mode)
19{
20 FILE *f = fopen(name,mode);
21
22 if(f == NULL)
23 {
24 printf("Problem prilikom otvaranja %s datoteke.",name);
25 exit(2);
26 }
27
28 return f;
29}
30
31void ucitavanje(FILE *in, Formula *f, int *n, int br_krugova)
32{
33 *n=0;
34 while(fscanf(in,"%s %s %u %lf",f[*n].naziv_tima,f[*n].naziv_vozaca,&f[*n].vreme_po_krugu,&f[*n].penali) != EOF)
35 {
36 f[*n].ukupno_vreme = f[*n].vreme_po_krugu * br_krugova + f[*n].penali;
37 (*n)++;
38 }
39}
40
41void ukupna_vremena_timova(FILE *out, Formula *f,int n)
42{
43 int i;
44 double sumaF=0.0,sumaR=0.0,sumaMerc=0.0,sumaMcLaren=0.0,sumaA=0.0;
45 fprintf(out,"Ukupna vremena timova su:\n");
46 for(i=0;i<n;i++)
47 {
48 if(strcmp(f[i].naziv_tima,"Ferrari") == 0)
49 {
50 sumaF+=f[i].ukupno_vreme;
51 }else if(strcmp(f[i].naziv_tima,"Red_Bull_Racing") == 0)
52 {
53 sumaR+=f[i].ukupno_vreme;
54 }else if(strcmp(f[i].naziv_tima,"Mercedes") == 0)
55 {
56 sumaMerc+=f[i].ukupno_vreme;
57 }else if(strcmp(f[i].naziv_tima,"McLaren") == 0)
58 {
59 sumaMcLaren+=f[i].ukupno_vreme;
60 }else if(strcmp(f[i].naziv_tima,"Alpine") == 0)
61 {
62 sumaA+=f[i].ukupno_vreme;
63 }
64 }
65
66 fprintf(out,"Ferrari: %.1lf\n",sumaF);
67 fprintf(out,"Red_Bull_Racing: %.1lf\n",sumaR);
68 fprintf(out,"Mercedes: %.1lf\n",sumaMerc);
69 fprintf(out,"McLaren: %.1lf\n",sumaMcLaren);
70 fprintf(out,"Alpine: %.1lf\n",sumaA);
71
72}
73
74void najbolji_vozac(FILE *out, Formula *f,int n)
75{
76 int i,index;
77 Formula min=f[0];
78
79 fprintf(out,"\nNajbolji vozac je:\n");
80 for(i=1;i<n;i++)
81 {
82 if(min.ukupno_vreme > f[i].ukupno_vreme)
83 min=f[i];
84 }
85
86 fprintf(out,"%s iz tima %s sa ukupnim vremenom %.1lf sekundi.\n",min.naziv_vozaca,min.naziv_tima,min.ukupno_vreme);
87
88}
89
90//primer poziva ./a.out 60 statistika.txt timovi.txt
91int main(int brojArgum, char **argumenti)
92{
93 Formula f[MAX_NIZ];
94 FILE *in,*out;
95 int n;
96
97 if(brojArgum != 4)
98 {
99 printf("Pogresan broj unetih argumenata!");
100 exit(1);
101 }
102
103 in = otvori(argumenti[3],"r");
104 out = otvori(argumenti[2],"w");
105
106 ucitavanje(in,f,&n,atoi(argumenti[1]));
107 ukupna_vremena_timova(out,f,n);
108 najbolji_vozac(out,f,n);
109
110 fclose(in);
111 fclose(out);
112
113 return 0;
114}
115
1#include<stdio.h>
2#include<stdlib.h>
3#include<string.h>
4
5#define MAX_NAZIV_TIMA 15+1
6#define MAX_NAZIV_VOZACA 10+1
7#define MAX_NIZ 11
8
9typedef struct formula_st
10{
11 char naziv_tima[MAX_NAZIV_TIMA];
12 char naziv_vozaca[MAX_NAZIV_VOZACA];
13 unsigned int vreme_po_krugu;
14 double penali;
15 double ukupno_vreme;
16} Formula;
17
18void ucitavanje(Formula *f, int *n, int br_krugova)
19{
20 int i;
21
22 do
23 {
24 printf("Unesite broj timova: ");
25 scanf("%d", n);
26 } while (*n <= 0 || *n > MAX_NIZ);
27
28 for(i = 0;i < *n;i++)
29 {
30 printf("%d. tim: ", i + 1);
31 scanf("%s %s %u %lf",
32 f[i].naziv_tima,
33 f[i].naziv_vozaca,
34 &f[i].vreme_po_krugu,
35 &f[i].penali);
36 f[i].ukupno_vreme = f[i].vreme_po_krugu * br_krugova + f[i].penali;
37 }
38}
39
40void ukupna_vremena_timova(Formula *f,int n)
41{
42 int i;
43 double sumaF=0.0,sumaR=0.0,sumaMerc=0.0,sumaMcLaren=0.0,sumaA=0.0;
44 printf("Ukupna vremena timova su:\n");
45 for(i=0;i<n;i++)
46 {
47 if(strcmp(f[i].naziv_tima,"Ferrari") == 0)
48 {
49 sumaF+=f[i].ukupno_vreme;
50 }else if(strcmp(f[i].naziv_tima,"Red_Bull_Racing") == 0)
51 {
52 sumaR+=f[i].ukupno_vreme;
53 }else if(strcmp(f[i].naziv_tima,"Mercedes") == 0)
54 {
55 sumaMerc+=f[i].ukupno_vreme;
56 }else if(strcmp(f[i].naziv_tima,"McLaren") == 0)
57 {
58 sumaMcLaren+=f[i].ukupno_vreme;
59 }else if(strcmp(f[i].naziv_tima,"Alpine") == 0)
60 {
61 sumaA+=f[i].ukupno_vreme;
62 }
63 }
64
65 printf("Ferrari: %.1lf\n",sumaF);
66 printf("Red_Bull_Racing: %.1lf\n",sumaR);
67 printf("Mercedes: %.1lf\n",sumaMerc);
68 printf("McLaren: %.1lf\n",sumaMcLaren);
69 printf("Alpine: %.1lf\n",sumaA);
70
71}
72
73void najbolji_vozac(Formula *f,int n)
74{
75 int i,index;
76 Formula min=f[0];
77
78 printf("\nNajbolji vozac je:\n");
79 for(i=1;i<n;i++)
80 {
81 if(min.ukupno_vreme > f[i].ukupno_vreme)
82 min=f[i];
83 }
84
85 printf("%s iz tima %s sa ukupnim vremenom %.1lf sekundi.\n",min.naziv_vozaca,min.naziv_tima,min.ukupno_vreme);
86
87}
88
89//primer poziva ./a.out 60 < timovi-stdinout.txt
90int main(int brojArgum, char **argumenti)
91{
92 Formula f[MAX_NIZ];
93 int n;
94
95 if(brojArgum != 2)
96 {
97 printf("Pogresan broj unetih argumenata!");
98 exit(1);
99 }
100
101 ucitavanje(f,&n,atoi(argumenti[1]));
102 printf("\n\n");
103 ukupna_vremena_timova(f,n);
104 najbolji_vozac(f,n);
105
106 return 0;
107}
108