Pomozi selektoru

Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>

Napisati program koji pomaže selektoru reprezentacije da sastavi tim za predstojeću utakmicu. Raspoloživi igrači su zadati u ulaznoj datoteci u sledećem formatu:

  • ime (jedna reč, do 20 karaktera)

  • prezime (jedna reč, do 30 karaktera)

  • broj_dresa (celobrojna vrednost)

  • pozicija (jedna reč, do 10 karaktera)

Učitati fudbalere u statički niz, zatim na osnovu zadate formacije odabrati igrače na osnovu zadatih brojeva unutar formacije. Fudbalere je potrebno ispisati u izlaznu datoteku u sledećem formatu "%2d %s %c.", gde celobrojna vrednost broj dresa koji igrač nosi, string predstavlja prezime igrača, a karakter početno slovo imena igrača. Imena ulazne i izlazne datoteke zadaju se kao argumenti komandne linije. Pored njih, kao argument komandne linije zadaje se i željena formacija.

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 formacija nije napisana u traženom formatu (cifra, crta, cifra, crta, cifra), izaći sa status kodom 2

  • Ako je broj igrača na određenoj poziciji veći od 5, izaći sa status kodom 3

  • Ako program ne može da otvori ulaznu datoteku, izaći sa status kodom 4

  • Ako program ne može da otvori izlaznu datoteku, izaći sa status kodom 5

Primer poziva programa:

./a.out fudbaleri.txt postava.txt 4-3-3

Primer ulazne datoteke fudbaleri.txt:

Nikola Milenkovic 4 odbrana
Stefan Mitrovic 13 odbrana
Strahinja Pavlovic 2 odbrana
Milos Veljkovic 5 odbrana
Strahinja Erakovic 3 odbrana
Sergej Milinkovic-Savic 20 sredina
Filip Kostic 17 sredina
Nemanja Gudelj 8 sredina
Andrija Zivkovic 14 sredina
Marko Grujic 26 sredina
Aleksandar Mitrovic 9 napad
Dusan Vlahovic 18 napad
Luka Jovic 11 napad
Nemanja Radonjic 7 napad
Filip Djuricic 21 napad

Primer izlazne datoteke postava.txt:

 4 Milenkovic N.
13 Mitrovic S.
 2 Pavlovic S.
 5 Veljkovic M.
20 Milinkovic-Savic S.
17 Kostic F.
 8 Gudelj N.
 9 Mitrovic A.
18 Vlahovic D.
11 Jovic L.

Primer rešenja

  1#include <stdio.h>
  2#include <math.h>
  3#include <string.h>
  4#include <stdlib.h>
  5
  6#define MAX_IME 21
  7#define MAX_PREZIME 31
  8#define MAX_POZICIJA 11
  9
 10#define MAX_POSTAVA 6
 11
 12#define MAX_FUDBALERA 20
 13
 14typedef struct fudbaler_st {
 15    char ime[MAX_IME];
 16    char prezime[MAX_PREZIME];
 17    int broj_dresa;
 18    char pozicija[MAX_POZICIJA];
 19} FUDBALER;
 20
 21FILE *safe_fopen(char *, char *, int);
 22void ucitaj_fudbalere(FILE *, FUDBALER *, int *);
 23void ispisi_postavu(FILE *, FUDBALER *, int, int, int, int);
 24void analiziraj_formaciju(char *, int *, int *, int *);
 25
 26int main(int argc, char **argv) {
 27    FUDBALER fudbaleri[MAX_FUDBALERA];
 28    int n;
 29
 30    if(argc != 4) {
 31        printf("Primer poziva programa: %s fudbaleri.txt postava.txt 4-3-3\n", argv[0]);
 32        exit(1);
 33    }
 34
 35    FILE *pulazna = safe_fopen(argv[1], "r", 4);
 36    ucitaj_fudbalere(pulazna, fudbaleri, &n);
 37    fclose(pulazna);
 38
 39    int odbrana, sredina, napad;
 40    analiziraj_formaciju(argv[3], &odbrana, &sredina, &napad);
 41    
 42    FILE *pizlazna = safe_fopen(argv[2], "w", 5);
 43    ispisi_postavu(pizlazna, fudbaleri, n, odbrana, sredina, napad);
 44    fclose(pizlazna);
 45
 46    return 0;
 47}
 48
 49FILE *safe_fopen(char *ime, char *rezim, int kod_greske) {
 50    FILE *fp = fopen(ime, rezim);
 51
 52    if(fp == NULL) {
 53        printf("Greska prilikom otvaranja %s datoteke!\n", ime);
 54        exit(kod_greske);
 55    }
 56
 57    return fp;
 58}
 59
 60void ucitaj_fudbalere(FILE *pulazna, FUDBALER *fudbaleri, int *pn) {
 61    int i = 0;
 62
 63    while(fscanf(pulazna, "%s %s %d %s",
 64                 fudbaleri[i].ime,
 65                 fudbaleri[i].prezime,
 66                 &fudbaleri[i].broj_dresa,
 67                 fudbaleri[i].pozicija) != EOF) {
 68        i++;
 69    }
 70
 71    *pn = i;
 72}
 73
 74void ispisi_postavu(FILE *pizlazna, FUDBALER *fudbaleri, int n, int odbrana, int sredina, int napad) {
 75    int i, br_odbrana = 0, br_sredina = 0, br_napad = 0;
 76
 77    for(i = 0;i < n;i++) {
 78        if(br_odbrana == odbrana && strcmp(fudbaleri[i].pozicija, "odbrana") == 0) {
 79            continue;
 80        } else if(br_sredina == sredina && strcmp(fudbaleri[i].pozicija, "sredina") == 0) {
 81            continue;
 82        } else if(br_napad == napad && strcmp(fudbaleri[i].pozicija, "napad") == 0) {
 83            continue;
 84        }
 85
 86        fprintf(pizlazna, "%2d %s %c.\n",
 87                fudbaleri[i].broj_dresa,
 88                fudbaleri[i].prezime,
 89                fudbaleri[i].ime[0]);
 90
 91        if(strcmp(fudbaleri[i].pozicija, "odbrana") == 0) {
 92            br_odbrana++;
 93        } else if(strcmp(fudbaleri[i].pozicija, "sredina") == 0) {
 94            br_sredina++;
 95        } else if(strcmp(fudbaleri[i].pozicija, "napad") == 0) {
 96            br_napad++;
 97        }
 98    }
 99}
100
101void analiziraj_formaciju(char *formacija, int *podbrana, int *psredina, int *pnapad) {
102    if(strlen(formacija) != MAX_POSTAVA - 1 || formacija[1] != '-' || formacija[3] != '-') {
103        printf("Los format formacije, primer dobrog formata: 4-3-3\n");
104        exit(2);
105    }
106
107    *podbrana = formacija[0] - '0';
108    *psredina = formacija[2] - '0';
109    *pnapad = formacija[4] - '0';
110
111    if(*podbrana > 5 || *psredina > 5 || *pnapad > 5) {
112        printf("Broj igraca na odredjenoj poziciji ne sme premasiti 5!\n");
113        exit(3);
114    }
115}