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 struktureknjiga_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}