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) i

  • ukupno_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:

\[ukupno\_vreme = vreme\_po\_krug \cdot br\_kruga + penali\]

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.

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