Загрузка данных


#include <iostream>
#include <fstream>
#include <vector>
#include <cstdio> // Biblioteka do obsługi fprintf

// Struktura przechowująca dane z jednego roku
struct DaneRoku {
    int rok;
    double temperatury[12];
    double srednia_roczna;
};

int main() {
    // Szybkie operacje wejścia/wyjścia
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    std::ifstream plik_wej("temp.txt");
    
    // Otwieramy plik wyjściowy za pomocą standardowego C-style I/O dla łatwiejszego formatowania
    FILE* plik_wyj = fopen("zad_4.txt", "w");

    if (!plik_wej.is_open() || plik_wyj == nullptr) {
        std::cerr << "Blad podczas otwierania plikow!\n";
        return 1;
    }

    std::vector<DaneRoku> wszystkie_lata;
    int rok;
    
    // Wczytywanie danych z pliku
    while (plik_wej >> rok) {
        DaneRoku dr;
        dr.rok = rok;
        double suma = 0;
        
        for (int i = 0; i < 12; ++i) {
            plik_wej >> dr.temperatury[i];
            suma += dr.temperatury[i];
        }
        dr.srednia_roczna = suma / 12.0;
        wszystkie_lata.push_back(dr);
    }

    // =========================================================================
    // PODPUNKT A i B: Najniższa i najwyższa średnia roczna temperatura
    // =========================================================================
    DaneRoku najnizsza_rok = wszystkie_lata[0];
    DaneRoku najwyzsza_rok = wszystkie_lata[0];

    for (const auto& dr : wszystkie_lata) {
        if (dr.srednia_roczna < najnizsza_rok.srednia_roczna) {
            najnizsza_rok = dr;
        }
        if (dr.srednia_roczna > najwyzsza_rok.srednia_roczna) {
            najwyzsza_rok = dr;
        }
    }

    // %.2f automatycznie zaokrągla i wyświetla dokładnie 2 miejsca po przecinku
    fprintf(plik_wyj, "a) Najnizsza srednia roczna: %.2f (Rok: %d)\n", najnizsza_rok.srednia_roczna, najnizsza_rok.rok);
    fprintf(plik_wyj, "b) Najwyzsza srednia roczna: %.2f (Rok: %d)\n\n", najwyzsza_rok.srednia_roczna, najwyzsza_rok.rok);

    // =========================================================================
    // PODPUNKT C: Min i Max dla każdego z 12 miesięcy we wszystkich latach
    // =========================================================================
    fprintf(plik_wyj, "c) Zestawienie minimalnych i maksymalnych temperatur dla miesiecy:\n");
    fprintf(plik_wyj, "Miesiac\tMin Temp\tMax Temp\n");
    fprintf(plik_wyj, "---------------------------------\n");

    for (int m = 0; m < 12; ++m) {
        double min_m = wszystkie_lata[0].temperatury[m];
        double max_m = wszystkie_lata[0].temperatury[m];

        for (const auto& dr : wszystkie_lata) {
            if (dr.temperatury[m] < min_m) min_m = dr.temperatury[m];
            if (dr.temperatury[m] > max_m) max_m = dr.temperatury[m];
        }
        // Używamy \t (tabulacji), aby kolumny były równo od siebie odsunięte
        fprintf(plik_wyj, "%d\t%.2f\t\t%.2f\n", m + 1, min_m, max_m);
    }
    fprintf(plik_wyj, "\n");

    // =========================================================================
    // PODPUNKT D: Najdłuższy malejący ciąg średnich temperatur sierpnia (indeks 7)
    // =========================================================================
    int max_dlugosc = 1;
    int akt_dlugosc = 1;
    
    int naj_rok_start = wszystkie_lata[0].rok;
    int naj_rok_koniec = wszystkie_lata[0].rok;
    int akt_rok_start = wszystkie_lata[0].rok;

    for (size_t i = 1; i < wszystkie_lata.size(); ++i) {
        if (wszystkie_lata[i].temperatury[7] < wszystkie_lata[i-1].temperatury[7]) {
            akt_dlugosc++;
        } else {
            if (akt_dlugosc > max_dlugosc) {
                max_dlugosc = akt_dlugosc;
                naj_rok_start = akt_rok_start;
                naj_rok_koniec = wszystkie_lata[i-1].rok;
            }
            akt_dlugosc = 1;
            akt_rok_start = wszystkie_lata[i].rok;
        }
    }
    
    if (akt_dlugosc > max_dlugosc) {
        max_dlugosc = akt_dlugosc;
        naj_rok_start = akt_rok_start;
        naj_rok_koniec = wszystkie_lata.back().rok;
    }

    fprintf(plik_wyj, "d) Najdluzszy malejacy ciag temperatur sierpnia:\n");
    fprintf(plik_wyj, "   Dlugosc: %d\n", max_dlugosc);
    fprintf(plik_wyj, "   Rok poczatkowy: %d\n", naj_rok_start);
    fprintf(plik_wyj, "   Rok koncowy: %d\n", naj_rok_koniec);

    plik_wej.close();
    fclose(plik_wyj); // Zamknięcie pliku C-style
    
    std::cout << "Obliczenia zakonczone sukcesem! Wyniki zapisano w pliku zad_4.txt\n";
    return 0;
}