Rezultat društvene igre

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

Napraviti program za vođenje evidencije bodova za društvene igre. Igrači su predstavljeni na sledeći način:

  • ime (jedna reč, maksimalno 20 karaktera)

  • bodovi (celobrojna vrednost)

Na osnovu vrednosti argumenata komandne linije učitati pomoću tastature imena određenog broja igrača i postaviti im broj bodova na 0, zatim uraditi sledeće:

  1. Za svaku partiju dodavati igračima osvojene bodove. Broj partija se unosi kao argument komandne linije.

  2. Ispisati rezultate igre u izlazni fajl pod imenom bodovi.txt.

Primer poziva programa (2 predstavlja broj igrača, a 3 broj odigranih partija):

./bodovi 2 3

Primer rada programa:

Igrac 1: Laza
Igrac 2: Mika

Partija 1
Igrac Laza: 3
Igrac Mika: 5

Partija 2
Igrac Laza: 7
Igrac Mika: 4

Partija 3
Igrac Laza: 2
Igrac Mika: 5

Primer izlazne datoteke:

Laza 12
Mika 14

Primer rešenja

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include <string.h>
 4
 5#define MAX_SIZE 10
 6#define MAX_STRING 21
 7
 8typedef struct igraci_st {
 9    char ime[MAX_STRING];
10    int bodovi;
11} IGRACI;
12
13FILE *safe_fopen(char *, char *);
14void ucitaj_igrace(IGRACI *, int);
15void dodaj_bodove(IGRACI *, int, int);
16void ispis_bodova(FILE *, IGRACI *, int);
17
18int main(int argc, char *argv[]) {
19  IGRACI igraci[MAX_SIZE];
20
21  if(argc != 3) {
22      printf("Primer poziva programa: ./%s 2 3\n", argv[0]);
23      exit(1);
24  }
25
26  int broj_igraca = atoi(argv[1]);
27  int broj_partija = atoi(argv[2]);
28  FILE *out = safe_fopen("bodovi.txt", "w");
29
30  ucitaj_igrace(igraci, broj_igraca);
31  dodaj_bodove(igraci, broj_igraca, broj_partija);
32  ispis_bodova(out, igraci, broj_igraca);
33
34  fclose(out);
35
36  return 0;
37}
38
39FILE *safe_fopen(char *filename, char *mode) {
40    FILE *fp = fopen(filename, mode);
41
42    if(fp == NULL) {
43        printf("Datoteka %s nije uspesno otvorena!\n", filename);
44        exit(1);
45    }
46
47    return fp;
48}
49
50void ucitaj_igrace(IGRACI *igraci, int broj_igraca) {
51    int i;
52
53    for(i = 0;i < broj_igraca;i++) {
54        printf("Igrac %d: ", i + 1);
55        fgets(igraci[i].ime, MAX_STRING, stdin);           // Moze ili gets(igraci[i].ime); ili scanf("%s", igraci[i].ime);
56        igraci[i].ime[strlen(igraci[i].ime) - 1] = '\0';   // Eliminisanje trailing newline-a (ne treba kad se koristi gets ili scanf)
57        igraci[i].bodovi = 0;
58    }
59
60}
61
62void dodaj_bodove(IGRACI *igraci, int broj_igraca, int broj_partija) {
63    int i, j, bodovi;
64
65    for(j = 0;j < broj_partija;j++) {
66        printf("\nPartija %d\n", j + 1);
67        for(i = 0;i < broj_igraca;i++) {
68            printf("Igrac %s: ", igraci[i].ime);
69            scanf("%d", &bodovi);
70            igraci[i].bodovi += bodovi;
71        }
72    }
73}
74
75void ispis_bodova(FILE *out, IGRACI *igraci, int broj_igraca) {
76    int i;
77
78    for(i = 0;i < broj_igraca;i++) {
79        fprintf(out, "%s %d\n", igraci[i].ime, igraci[i].bodovi);
80    }
81}