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:

  1. 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).

  2. 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}