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
2Ako je broj igrača na određenoj poziciji veći od 5, izaći sa status kodom
3Ako program ne može da otvori ulaznu datoteku, izaći sa status kodom
4Ako 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}