///////////////////////////////////////////////////////////////////////
// ITS – Visoka Škola Strukovnih Studija Za Informacione Tehnologije
//
https://www.its.edu.rs/
// Predmet: Osnove Programiranja – Programski jezik C
// Program na koji iz datoteke igraci.txt čita podatke o igračima
// na
svetskom prvenstvu u fudbalu, pronalazi igrača sa najvećim brojem
//
ostvarenih poena, na standardnom izlazu ispisuje ime tog igrača
// i broj ostvarenih poena.
// Smatra se da datoteka igraci.txt postoji.
////////////////////////////////////////////////////////////////////

 

#include <stdio.h>

 

//Definisanje simbolickih konstanti
#define MAX_IME 50
#define MAX_IGRACA 1000

 

//Definisanje strukture koja sadrzi podatke o igracu
typedef struct igrac{
char imePrezime[MAX_IME];
       float visina;
       float tezina;
       int minuta;
       int golova;
       int asistencija;
       int autogolova;
       int zutih;
       int crvenih;
}Igrac;

 

 

//Deklarisanje globalnih promenljivih
Igrac najboljiIgrac;
int maxBodova;

 

//Prototipovi funkcija
int ucitajIgrace(FILE *f, Igrac *x);
int brojBodova(Igrac x);

 

 

main()
{
   
//Definisanje promenljivih
   
// fajl 
   FILE *f; 
   
// niz igraca
   Igrac nizIgraca[MAX_IGRACA]; 

   int i, brojIgraca=0;   

 

   //Otvaranje fajla za citanje, sa proverom postojanja 
   if((f=fopen("igraci.txt", "r"))==NULL)
   {
        printf(" *** Greska prilikom otvaranja fajla <igraci.txt>!
");
        return;
   }

 

   // Petlja koja ucitava podatke iz fajla i broji njihov ukupan broj 
   while (ucitajIgrace(f, &nizIgraca[brojIgraca]))
        brojIgraca++;

 

   //Ispis zaglavlja 

   printf("
+———————+——-+——-+—–+—-+—-+—-+—-+—-+—-+");
   printf("
|        Ime i prezime|    V  |    T  |   M |  G | AS | AG |  Z | C  | UB |");
   printf("
+———————+——-+——-+—–+—-+—-+—-+—-+—-+—-+");

 

   //Petlja koja tabelarno ispisuje podatke o igracu 
   for(i=0; i<brojIgraca; i++)
   {
         printf("
|%20s | %5.1f | %5.1f | %3d |%3d |%3d |%3d |%3d |%3d |%3d |", nizIgraca[i].imePrezime, nizIgraca[i].visina, nizIgraca[i].tezina,
nizIgraca[i].minuta, nizIgraca[i].golova, nizIgraca[i].asistencija, nizIgraca[i].autogolova, nizIgraca[i].zutih, nizIgraca[i].crvenih, brojBodova(nizIgraca[i]));
   }

 

   //Ispis najboljeg igraca turnira

   printf("
+———————+——-+——-+—–+—-+—-+—-+—-+—-+—-+");
   printf("
| Najbolji igrac turnira je:                                              |");
   printf("
| %20s, sa osvojenih %3d bodova                           |",najboljiIgrac.imePrezime, brojBodova(najboljiIgrac));
   printf("
+————————————————————————-+");
   printf("
| Legenda:                                                                |");
   printf("
|                                                                         |");
   printf("
| V – visina igraca        T – tezina igraca        M – odigranih minuta  |");
   printf("
| G – broj datih golova   AS – broj asistencija    AG – broj autogolova   |");
   printf("
| Z – zutih kartona        C – crvenih kartona     UB – ukupno bodova     |");
   printf("
+————————————————————————-+");
   printf("

");

}

 

 

// Funkcija koja ucitava podatke o jednom igracu iz date datoteke. Vraca da li su podaci uspesno procitani
 
int ucitajIgrace(FILE *f, Igrac *x)
{
  
//Ucitavanje podataka za igraca iz fajla
   fscanf(f, "%s%f%f%d%d%d%d%d%d", x->imePrezime, &(x->visina), &(x->tezina), &(x->minuta), &(x->golova), &(x->asistencija), &(x->autogolova), &(x->zutih), &(x->crvenih));

 

   //Funkcija vraca <false> kada stigne do kraj fajla
   if(feof(f))
             return 0;
       return 1;
}

 

 

//funkcija za izracunavanje broja bodova 
int brojBodova(Igrac x)
{
     
//Izracunavanje bodova na osnovu odigrane minutaze
      // igrac svakako dobije bod 
      int bodovi=1;

 

      if(x.minuta>200)
      {
          // igrac dobija dodatni bod ako je igrao preko 200 min
          bodovi++;

     

          if(x.minuta>400)
          {

                // igrac dobija drugi dodatni bod ako je igrao preko 400 min
                bodovi++;
          }
      }

 

      //Izracunavanje bodova na osnovu ostalih podataka
      bodovi+=(x.golova*5);
      bodovi+=(x.asistencija*3);
      bodovi-=(x.autogolova*2);
      bodovi-=(x.zutih);
      bodovi-=(x.crvenih*3);

 

      //Provera da li je trenutni igrac najbolji da sada
      if(maxBodova<bodovi)
      {

            // Najbolji igrac je trenutni
            najboljiIgrac=x;

            // azuriranje maksimalnog broja bodova
            maxBodova=bodovi; 
      }

      //Funkcija vraca izracunati broj bodova
      return bodovi;
}