Knjige

Autor zadatka: Sanja Špica <sanjaspica@uns.ac.rs>

Iz zadate ulazne datoteke učitati statički niz struktura, pri čemu se struktura knjiga_st sastoji od sledećih polja:

  • naziv knjige (jedna reč, do 20 karaktera)

  • izdavač (jedna reč, do 20 karaktera)

  • broj strana knjige (pozitivan ceo broj)

Na osnovu broja strana koje osoba može da pročita za sat vremena br_strana (pozitivan realan broj) formirati novi statički niz struktura i upisati ga u zadatu izlaznu datoteku, pri čemu se struktura duzina_citanja_st sastoji od sledećih polja:

  • broj dana koji je potreban da se knjiga pročita ako osoba čita 24 sata dnevno (realan broj, zaokružen na 2 decimale, koristiti "%.2f" format specifikator)

  • naziv knjige (koristiti funkciju strcpy prilikom kopiranja iz strukture knjiga_st)

Primer poziva:

./knjige 11.5 knjige.txt duzina_citanja.txt

sa br_strana=11.5 i zadatim ulazom u datoteci knjige.txt:

Hiljadu_brodova Delfi 231
Gorila Laguna 223
U_prolece Vulkan 281
Petlja Laguna 165
Povratak Delfi 314
Deca_zla Vulkan 141

i očekivanim izlazom u datoteci duzina_citanja.txt:

0.84 Hiljadu_brodova
0.81 Gorila
1.02 U_prolece
0.60 Petlja
1.14 Povratak
0.51 Deca_zla

Primer rešenja

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include <string.h>
 4
 5#define MAX_NAZIV 20+1
 6#define MAX_NIZ 30
 7
 8typedef struct knjiga_st {
 9    char naziv[MAX_NAZIV];
10    char izdavac[MAX_NAZIV];
11    unsigned br_str;
12}KNJIGA;
13
14typedef struct duzina_citanja_st {
15    double br_dana;
16    char naziv[MAX_NAZIV];
17}CITANJE;
18
19
20FILE *safe_fopen(char filename[], char mode[], int error_code);
21void ucitaj(FILE *in, KNJIGA knjige[], int *n);
22void transform(KNJIGA knjige[], CITANJE duzine_citanja[], int n,
23double br_strana);
24void snimi(FILE *out, CITANJE duzine_citanja[], int n);
25
26
27int main(int arg_num, char **args) {
28    if (arg_num != 4) {
29        printf("USAGE: %s BR_STR IN_FILENAME OUT_FILENAME\n", args[0]);
30        exit(42);
31    }
32
33    double br_strana = atof(args[1]);
34    char *in_filename = args[2];
35    char *out_filename = args[3];
36
37    FILE *in  = safe_fopen(in_filename,  "r", 1);
38    FILE *out = safe_fopen(out_filename, "w", 2);
39
40    KNJIGA knjige[MAX_NIZ];
41    CITANJE duzine_citanja[MAX_NIZ];
42    int n;
43
44    ucitaj(in, knjige, &n);
45    transform(knjige, duzine_citanja, n, br_strana);
46    snimi(out, duzine_citanja, n);
47
48    fclose(in);
49    fclose(out);
50
51    return 0;
52}
53
54FILE *safe_fopen(char filename[], char mode[], int error_code) {
55    FILE *fp = fopen(filename, mode);
56    if(fp == NULL) {
57        printf("Can't open '%s'!\n", filename);
58        exit(error_code);
59    }
60    return fp;
61}
62
63void ucitaj(FILE *in, KNJIGA knjige[], int *n) {
64    *n = 0;
65    while(fscanf(
66        in, "%s %s %u",
67        knjige[*n].naziv,
68        knjige[*n].izdavac,
69        &knjige[*n].br_str
70    ) != EOF) {
71        (*n)++;
72    }
73}
74
75void transform(KNJIGA knjige[], CITANJE duzine_citanja[], int n,
76double br_strana) {
77    int i;
78    for(i=0; i<n; i++) {
79        strcpy(duzine_citanja[i].naziv, knjige[i].naziv);
80
81        duzine_citanja[i].br_dana = knjige[i].br_str / br_strana / 24;
82    }
83}
84
85void snimi(FILE *out, CITANJE duzine_citanja[], int n) {
86    int i;
87    for(i=0; i<n; i++) {
88        fprintf(
89            out, "%.2f %s\n",
90            duzine_citanja[i].br_dana,
91            duzine_citanja[i].naziv
92        );
93    }
94}