Moto GP¶
Autor zadatka: Aleksandar Vasiljević <alexva02@uns.ac.rs>
Iz zadate ulazne datoteke motori.txt
učitati statički niz struktura, pri čemu se struktura motor_st
sastoji od sledećih polja:
marka (jedna reč, maksimalno 7 karaktera),
snaga (realan broj, izražen u kW),
vreme_po_krugu (realan broj),
procenat_trosenja (ceo broj),
tip_gume (jedna reč, maksimalno 5 karaktera) i
broj_stajanja (ceo broj)
Na osnovu parametra br_kruga
koji se prihvata kao argument komandne linije, izračunati koliko
minimalno puta svaki motor mora obaviti zamenu pneumatika (pretpostaviti da se oba pneumatika
troše istovremeno).
Na osnovu parametra tip
koji se prihvata kao argument komandne linije, izračunati koliko je ukupno potrošeno pneumatika prosleđenog tipa u toku trke.
Koristiti sledeće formule za konverziju:
iz kW u KS: \(nova\_snaga = snaga * 1.36\)
potrosnju guma: \(100\% / procenat\_trosenja\%\)
U izlaznu datoteku statistika.txt
ispisati sledeće informacije:
koliko je krugova svaki motor uspeo da napravi sa jednim setom pneumatika,
koliko puta treba da promeni pneumatike da bi izvezao trku (da bi ispis bio formatiran kao što je traženo u tekstu zadatka neophodno je koristiti
"%s\t%.1lfks\t\t%.2lfs\t\t\t%d\n"
i"%s\t\t%.1lfks\t\t%.2lfs\t\t\t%d\n"
)koliko je ukupno potrošeno pneumatika prosleđenog tipa u trci
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 motori.txt statistika.txt 25 Medium
Primer ulazne datoteke motori.txt
:
Ducati 100 62.2 12 Soft
Honda 102 66.1 9 Medium
Suzuki 100 61.3 5 Hard
Aprilia 99 66.2 4 Hard
Yamaha 98 60.5 6 Hard
KTM 95 68.9 10 Soft
BMW 99 71.2 8 Medium
Triumph 105 63.1 7 Soft
Primer izlazne datoteke statistika.txt
:
Sa jednim setom guma motori mogu preci:
Ducati moze preci 8 krugova.
Honda moze preci 11 krugova.
Suzuki moze preci 20 krugova.
Aprilia moze preci 25 krugova.
Yamaha moze preci 16 krugova.
KTM moze preci 10 krugova.
BMW moze preci 12 krugova.
Triumph moze preci 14 krugova.
Rezultati nakon trke su:
Naziv Snaga Vreme_po_krugu Broj_stajanja
Ducati 136.0ks 62.20s 3
Honda 138.7ks 66.10s 2
Suzuki 136.0ks 61.30s 1
Aprilia 134.6ks 66.20s 1
Yamaha 133.3ks 60.50s 1
KTM 129.2ks 68.90s 2
BMW 134.6ks 71.20s 2
Triumph 142.8ks 63.10s 1
Ukupno je potroseno 8 guma tipa Medium.
./a.out 25 Medium < motori-stdout.txt
Primer ulazne datoteke motori-stdinout.txt
:
8
Ducati 100 62.2 12 Soft
Honda 102 66.1 9 Medium
Suzuki 100 61.3 5 Hard
Aprilia 99 66.2 4 Hard
Yamaha 98 60.5 6 Hard
KTM 95 68.9 10 Soft
BMW 99 71.2 8 Medium
Triumph 105 63.1 7 Soft
Ispis programa na standardnom izlazu:
Unesite broj motora: 1. motor: 2. motor: 3. motor: 4. motor: 5. motor: 6. motor: 7. motor: 8. motor:
Sa jednim setom guma motori mogu preci:
Ducati moze preci 8 krugova.
Honda moze preci 11 krugova.
Suzuki moze preci 20 krugova.
Aprilia moze preci 25 krugova.
Yamaha moze preci 16 krugova.
KTM moze preci 10 krugova.
BMW moze preci 12 krugova.
Triumph moze preci 14 krugova.
Rezultati nakon trke su:
Naziv Snaga Vreme_po_krugu Broj_stajanja
Ducati 136.0ks 62.20s 3
Honda 138.7ks 66.10s 2
Suzuki 136.0ks 61.30s 1
Aprilia 134.6ks 66.20s 1
Yamaha 133.3ks 60.50s 1
KTM 129.2ks 68.90s 2
BMW 134.6ks 71.20s 2
Triumph 142.8ks 63.10s 1
Ukupno je potroseno 8 guma tipa Medium.
Primer rešenja¶
1#include<stdio.h>
2#include<stdlib.h>
3#include<string.h>
4
5#define MAX_MARKA 7+1
6#define MAX_TIP_GUME 5+1
7#define MAX_NIZ 8
8
9typedef struct motor_st
10{
11 char marka[MAX_MARKA];
12 double snaga;
13 double vreme_po_krugu;
14 int procenat_trosenja;
15 char tip_gume[MAX_TIP_GUME];
16 int broj_stajanja;
17}Motor;
18
19FILE *otvori(char *name,char *mode)
20{
21 FILE *f = fopen(name,mode);
22
23 if(f == NULL)
24 {
25 printf("Problem prilikom otvaranja %s datoteke.",name);
26 exit(2);
27 }
28
29 return f;
30}
31
32void ucitavanje(FILE *in, Motor *m, int *n)
33{
34 *n=0;
35 while(fscanf(in,"%s %lf %lf %d %s",m[*n].marka, &m[*n].snaga, &m[*n].vreme_po_krugu, &m[*n].procenat_trosenja, m[*n].tip_gume) != EOF)
36 {
37 m[*n].snaga = m[*n].snaga * 1.36;
38 (*n)++;
39 }
40}
41
42void sa_jednim_setom(FILE *out, Motor *m,int n)
43{
44 int i,krugovi=0;
45 fprintf(out,"Sa jednim setom guma motori mogu preci:\n");
46 for(i=0;i<n;i++)
47 {
48 fprintf(out,"%s moze preci %d krugova.\n",m[i].marka,100/m[i].procenat_trosenja);
49 }
50}
51
52void promena_guma(FILE *out, Motor *m, int n, int br_kruga)
53{
54 int i,broj_stajanja=0;
55 fprintf(out,"\nRezultati nakon trke su:\n");
56 fprintf(out,"\nNaziv\tSnaga\tVreme_po_krugu\tBroj_stajanja\n");
57 for(i=0;i<n;i++)
58 {
59 m[i].broj_stajanja = br_kruga / (100/m[i].procenat_trosenja);
60 if(strlen(m[i].marka) > 3)
61 fprintf(out,"%s\t%.1lfks\t\t%.2lfs\t\t\t%d\n",m[i].marka,m[i].snaga,m[i].vreme_po_krugu,m[i].broj_stajanja);
62 else
63 fprintf(out,"%s\t\t%.1lfks\t\t%.2lfs\t\t\t%d\n",m[i].marka,m[i].snaga,m[i].vreme_po_krugu,m[i].broj_stajanja);
64 }
65}
66
67void ukupno_potroseno_guma(FILE *out, Motor *m, int n, char *tip)
68{
69 int i,suma=0;
70 for(i=0;i<n;i++)
71 {
72 if(strcmp(m[i].tip_gume, tip) == 0)
73 {
74 suma+=m[i].broj_stajanja*2;
75 }
76 }
77 fprintf(out,"\nUkupno je potroseno %d guma tipa %s.\n",suma,tip);
78}
79
80//primer poziva ./a.out motori.txt statistika.txt 25 Medium
81int main(int brojArgum, char **argumenti)
82{
83 Motor m[MAX_NIZ];
84 FILE *in,*out;
85 int n;
86
87 if(brojArgum != 5)
88 {
89 printf("Pogresan broj unetih argumenata!");
90 exit(1);
91 }
92
93 in = otvori(argumenti[1],"r");
94 out = otvori(argumenti[2],"w");
95
96 ucitavanje(in,m,&n);
97 sa_jednim_setom(out,m,n);
98 promena_guma(out,m,n,atoi(argumenti[3]));
99
100 ukupno_potroseno_guma(out,m,n,argumenti[4]);
101
102 fclose(in);
103 fclose(out);
104
105 return 0;
106}
107
1#include<stdio.h>
2#include<stdlib.h>
3#include<string.h>
4
5#define MAX_MARKA 7+1
6#define MAX_TIP_GUME 5+1
7#define MAX_NIZ 8
8
9typedef struct motor_st
10{
11 char marka[MAX_MARKA];
12 double snaga;
13 double vreme_po_krugu;
14 int procenat_trosenja;
15 char tip_gume[MAX_TIP_GUME];
16 int broj_stajanja;
17} Motor;
18
19void ucitavanje(Motor *m, int *n)
20{
21 int i;
22
23 do
24 {
25 printf("Unesite broj motora: ");
26 scanf("%d", n);
27 } while (*n <= 0 || *n > MAX_NIZ);
28
29 for(i = 0;i < *n;i++)
30 {
31 printf("%d. motor: ", i + 1);
32 scanf("%s %lf %lf %d %s",
33 m[i].marka,
34 &m[i].snaga,
35 &m[i].vreme_po_krugu,
36 &m[i].procenat_trosenja,
37 m[i].tip_gume);
38 m[i].snaga = m[i].snaga * 1.36;
39 }
40}
41
42void sa_jednim_setom(Motor *m,int n)
43{
44 int i,krugovi=0;
45 printf("Sa jednim setom guma motori mogu preci:\n");
46 for(i=0;i<n;i++)
47 {
48 printf("%s moze preci %d krugova.\n",m[i].marka,100/m[i].procenat_trosenja);
49 }
50}
51
52void promena_guma(Motor *m, int n, int br_kruga)
53{
54 int i,broj_stajanja=0;
55 printf("\nRezultati nakon trke su:\n");
56 printf("\nNaziv\tSnaga\tVreme_po_krugu\tBroj_stajanja\n");
57 for(i=0;i<n;i++)
58 {
59 m[i].broj_stajanja = br_kruga / (100/m[i].procenat_trosenja);
60 if(strlen(m[i].marka) > 3)
61 printf("%s\t%.1lfks\t\t%.2lfs\t\t\t%d\n",m[i].marka,m[i].snaga,m[i].vreme_po_krugu,m[i].broj_stajanja);
62 else
63 printf("%s\t\t%.1lfks\t\t%.2lfs\t\t\t%d\n",m[i].marka,m[i].snaga,m[i].vreme_po_krugu,m[i].broj_stajanja);
64 }
65}
66
67void ukupno_potroseno_guma(Motor *m, int n, char *tip)
68{
69 int i,suma=0;
70 for(i=0;i<n;i++)
71 {
72 if(strcmp(m[i].tip_gume, tip) == 0)
73 {
74 suma+=m[i].broj_stajanja*2;
75 }
76 }
77 printf("\nUkupno je potroseno %d guma tipa %s.\n",suma,tip);
78}
79
80//primer poziva ./a.out 25 Medium < motori-stdinout.txt
81int main(int brojArgum, char **argumenti)
82{
83 Motor m[MAX_NIZ];
84 int n;
85
86 if(brojArgum != 3)
87 {
88 printf("Pogresan broj unetih argumenata!");
89 exit(1);
90 }
91
92 ucitavanje(m,&n);
93 printf("\n\n");
94 sa_jednim_setom(m,n);
95 promena_guma(m,n,atoi(argumenti[1]));
96
97 ukupno_potroseno_guma(m,n,argumenti[2]);
98
99 return 0;
100}
101