Temperatura u zgradi¶
Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>
Temperatura u zgradi merena je na više različitih mesta ujutru, u podne i uveče.
U ulaznom fajlu merenja.txt
redom su navedeni deo zgrade i tri merenja sprovedena tokom jednog dana.
Merenja su predstavljena na sledeći način:
deo zgrade (jedna reč, maksimalno 20 karaktera)
jutarnja temperatura (realna vrednost)
podnevna temperatura (realna vrednost)
večernja temperatura (realna vrednost)
Učitati merenja iz ulazne datoteke i uraditi sledeće:
Pronaći vrednost prosečne temperature za svaki deo zgrade. Ime dela zgrade i prosečnu temperaturu zaokruženu na jednu decimalu ispisati na standardni izlaz (ekran).
Pronaći deo zgrade sa maksimalnom vrednošću prosečne temperature i ispisati je zaokruženu na jednu decimalu na standardni izlaz (ekran).
Primer ulazne datoteke:
Ulaz -1.3 7.8 3.2
Hodnik 1.0 10.3 4.5
Kotlarnica 40.3 35.3 38.7
Prostorija 20.5 24.5 21.3
Ostava 15.3 19.1 16.7
Primer ispisa programa:
Ulaz 3.2
Hodnik 5.3
Kotlarnica 38.1
Prostorija 22.1
Ostava 17.0
Najveca prosecna temperatura u zgradi je 38.1 stepeni.
Primer poziva programa:
./temperatura merenja.txt
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5#define MAX_SIZE 30
6#define MAX_NAME 21
7
8typedef struct merenje {
9 char deo_zgrade[MAX_NAME];
10 double temp_ujutru;
11 double temp_podne;
12 double temp_uvece;
13} MERENJE;
14
15typedef struct prosecna_temp {
16 char deo_zgrade[MAX_NAME];
17 double prosecna_temp;
18} PROSECNA_TEMP;
19
20FILE *safe_fopen(char *, char *);
21void ucitaj_merenja(FILE *, MERENJE[], int *);
22double izr_pros_temp(double, double, double);
23void izracunaj_prosecne_temperature(MERENJE [], PROSECNA_TEMP [], int);
24void ispisi_prosecne_temperature(PROSECNA_TEMP [], int);
25double nadji_maks_prosecnu_temp(PROSECNA_TEMP [], int);
26
27int main(int argc, char **args) {
28 MERENJE merenja[MAX_SIZE];
29 PROSECNA_TEMP prosecne_temp[MAX_SIZE];
30 int n;
31
32 if(argc != 2) {
33 printf("Primer poziva programa: ./merenja merenja.txt\n");
34 exit(EXIT_FAILURE);
35 }
36
37 FILE *in = safe_fopen(args[1], "r");
38
39 ucitaj_merenja(in, merenja, &n);
40 izracunaj_prosecne_temperature(merenja, prosecne_temp, n);
41 ispisi_prosecne_temperature(prosecne_temp, n);
42 double maks_prosecna_temp = nadji_maks_prosecnu_temp(prosecne_temp, n);
43 printf("Najveca prosecna temperatura u zgradi je %.1lf stepeni.\n",
44 maks_prosecna_temp);
45
46 fclose(in);
47 return EXIT_SUCCESS;
48}
49
50FILE *safe_fopen(char *filename, char *mode) {
51 FILE *f = fopen(filename, mode);
52
53 if(f == NULL) {
54 printf("Greska prilikom otvaranja datoteke %s!\n", filename);
55 exit(EXIT_FAILURE);
56 }
57
58 return f;
59}
60
61void ucitaj_merenja(FILE *in, MERENJE merenja[], int *pn) {
62 int i = 0;
63
64 while(fscanf(in, "%s %lf %lf %lf",
65 merenja[i].deo_zgrade,
66 &merenja[i].temp_ujutru,
67 &merenja[i].temp_podne,
68 &merenja[i].temp_uvece
69 ) != EOF) {
70 i++;
71 }
72
73 *pn = i;
74}
75
76double izr_pros_temp(
77 double temp_ujutru,
78 double temp_podne,
79 double temp_uvece
80) {
81 return (temp_ujutru + temp_podne + temp_uvece) / 3;
82}
83
84void izracunaj_prosecne_temperature(
85 MERENJE merenja[],
86 PROSECNA_TEMP prosecne_temp[],
87 int n
88) {
89 int i;
90
91 for(i = 0;i < n;i++) {
92 strcpy(prosecne_temp[i].deo_zgrade, merenja[i].deo_zgrade);
93 prosecne_temp[i].prosecna_temp = izr_pros_temp(merenja[i].temp_ujutru,
94 merenja[i].temp_podne,
95 merenja[i].temp_uvece
96 );
97 }
98}
99
100void ispisi_prosecne_temperature(PROSECNA_TEMP prosecne_temperature[], int n) {
101 int i;
102
103 for(i = 0;i < n;i++) {
104 printf("%s %.1lf\n",
105 prosecne_temperature[i].deo_zgrade,
106 prosecne_temperature[i].prosecna_temp
107 );
108 }
109
110 printf("\n");
111}
112
113double nadji_maks_prosecnu_temp(PROSECNA_TEMP prosecne_temperature[], int n) {
114 int i;
115
116 double maks_prosecna_temp = prosecne_temperature[0].prosecna_temp;
117 for(i = 1;i < n;i++) {
118 if(prosecne_temperature[i].prosecna_temp > maks_prosecna_temp) {
119 maks_prosecna_temp = prosecne_temperature[i].prosecna_temp;
120 }
121 }
122
123 return maks_prosecna_temp;
124}