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.
./a.out 4-3-3 < fudbaleri-stdinout.txt
Primer ulazne datoteke fudbaleri-stdinout.txt
:
15
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
Ispis programa na standardnom izlazu:
Unesite broj fudbalera: 1. fudbaler: 2. fudbaler: 3. fudbaler: 4. fudbaler: 5. fudbaler: 6. fudbaler: 7. fudbaler: 8. fudbaler: 9. fudbaler: 10. fudbaler: 11. fudbaler: 12. fudbaler: 13. fudbaler: 14. fudbaler: 15. fudbaler:
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}
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{
16 char ime[MAX_IME];
17 char prezime[MAX_PREZIME];
18 int broj_dresa;
19 char pozicija[MAX_POZICIJA];
20} FUDBALER;
21
22void ucitaj_fudbalere(FUDBALER *, int *);
23void ispisi_postavu(FUDBALER *, int, int, int, int);
24void analiziraj_formaciju(char *, int *, int *, int *);
25
26int main(int argc, char **argv)
27{
28 FUDBALER fudbaleri[MAX_FUDBALERA];
29 int n;
30
31 if (argc != 2)
32 {
33 printf("Primer poziva programa: %s 4-3-3 < fudbaleri-stdinout.txt\n", argv[0]);
34 exit(1);
35 }
36
37 ucitaj_fudbalere(fudbaleri, &n);
38
39 int odbrana, sredina, napad;
40 analiziraj_formaciju(argv[1], &odbrana, &sredina, &napad);
41
42 printf("\n\n");
43 ispisi_postavu(fudbaleri, n, odbrana, sredina, napad);
44
45 return 0;
46}
47
48void ucitaj_fudbalere(FUDBALER *fudbaleri, int *pn)
49{
50 int i;
51
52 do
53 {
54 printf("Unesite broj fudbalera: ");
55 scanf("%d", pn);
56 } while (*pn <= 0 || *pn > MAX_FUDBALERA);
57
58 for (i = 0; i < *pn; i++)
59 {
60 printf("%d. fudbaler: ", i + 1);
61 scanf("%s %s %d %s",
62 fudbaleri[i].ime,
63 fudbaleri[i].prezime,
64 &fudbaleri[i].broj_dresa,
65 fudbaleri[i].pozicija);
66 }
67}
68
69void ispisi_postavu(FUDBALER *fudbaleri, int n, int odbrana, int sredina, int napad)
70{
71 int i, br_odbrana = 0, br_sredina = 0, br_napad = 0;
72
73 for (i = 0; i < n; i++)
74 {
75 if (br_odbrana == odbrana && strcmp(fudbaleri[i].pozicija, "odbrana") == 0)
76 {
77 continue;
78 }
79 else if (br_sredina == sredina && strcmp(fudbaleri[i].pozicija, "sredina") == 0)
80 {
81 continue;
82 }
83 else if (br_napad == napad && strcmp(fudbaleri[i].pozicija, "napad") == 0)
84 {
85 continue;
86 }
87
88 printf("%2d %s %c.\n",
89 fudbaleri[i].broj_dresa,
90 fudbaleri[i].prezime,
91 fudbaleri[i].ime[0]);
92
93 if (strcmp(fudbaleri[i].pozicija, "odbrana") == 0)
94 {
95 br_odbrana++;
96 }
97 else if (strcmp(fudbaleri[i].pozicija, "sredina") == 0)
98 {
99 br_sredina++;
100 }
101 else if (strcmp(fudbaleri[i].pozicija, "napad") == 0)
102 {
103 br_napad++;
104 }
105 }
106}
107
108void analiziraj_formaciju(char *formacija, int *podbrana, int *psredina, int *pnapad)
109{
110 if (strlen(formacija) != MAX_POSTAVA - 1 || formacija[1] != '-' || formacija[3] != '-')
111 {
112 printf("Los format formacije, primer dobrog formata: 4-3-3\n");
113 exit(2);
114 }
115
116 *podbrana = formacija[0] - '0';
117 *psredina = formacija[2] - '0';
118 *pnapad = formacija[4] - '0';
119
120 if (*podbrana > 5 || *psredina > 5 || *pnapad > 5)
121 {
122 printf("Broj igraca na odredjenoj poziciji ne sme premasiti 5!\n");
123 exit(3);
124 }
125}