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:

  1. koliko je krugova svaki motor uspeo da napravi sa jednim setom pneumatika,

  2. 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")

  3. 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.

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