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


#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream plik("temp.txt");
    ofstream wynik("zad_4.txt");

    // Od 1779 do 2006 roku jest dokładnie 228 lat
    int lata[228];
    double temp[228][12];

    // Wczytywanie danych z pliku
    for (int i = 0; i < 228; i++) {
        plik >> lata[i];
        for (int j = 0; j < 12; j++) {
            plik >> temp[i][j];
        }
    }

    // ==========================================
    // Podpunkt a) i b) - Najniższa i najwyższa średnia roczna
    // ==========================================
    
    double min_srednia = 999999.0;
    int rok_min_srednia = 0;

    double max_srednia = -999999.0;
    int rok_max_srednia = 0;

    for (int i = 0; i < 228; i++) {
        double suma_roku = 0;
        for (int j = 0; j < 12; j++) {
            suma_roku += temp[i][j];
        }
        double srednia_roku = suma_roku / 12.0;

        // Szukanie minimum
        if (srednia_roku < min_srednia) {
            min_srednia = srednia_roku;
            rok_min_srednia = lata[i];
        }

        // Szukanie maksimum
        if (srednia_roku > max_srednia) {
            max_srednia = srednia_roku;
            rok_max_srednia = lata[i];
        }
    }

    // Ręczne formatowanie do 2 miejsc po przecinku bez iomanip
    // (zaokrąglanie: mnożymy przez 100, dodajemy 0.5 dla dodatnich / odejmujemy 0.5 dla ujemnych, rzutujemy na int i dzielimy przez 100.0)
    double min_zaokr = min_srednia;
    if (min_zaokr >= 0) min_zaokr = (int)(min_zaokr * 100.0 + 0.5) / 100.0;
    else min_zaokr = (int)(min_zaokr * 100.0 - 0.5) / 100.0;

    double max_zaokr = max_srednia;
    if (max_zaokr >= 0) max_zaokr = (int)(max_zaokr * 100.0 + 0.5) / 100.0;
    else max_zaokr = (int)(max_zaokr * 100.0 - 0.5) / 100.0;

    wynik << "a) " << min_zaokr << " " << rok_min_srednia << endl;
    wynik << "b) " << max_zaokr << " " << rok_max_srednia << endl;

    // ==========================================
    // Podpunkt c) - Minimalna i maksymalna temperatura dla każdego miesiąca
    // ==========================================
    
    wynik << "c)" << endl;
    for (int m = 0; m < 12; m++) { 
        double min_miesiac = 999999.0;
        double max_miesiac = -999999.0;

        for (int i = 0; i < 228; i++) {
            if (temp[i][m] < min_miesiac) {
                min_miesiac = temp[i][m];
            }
            if (temp[i][m] > max_miesiac) {
                max_miesiac = temp[i][m];
            }
        }
        wynik << "Miesiac " << m + 1 << ": Min = " << min_miesiac << ", Max = " << max_miesiac << endl;
    }

    // ==========================================
    // Podpunkt d) - Najdłuższy malejący ciąg średnich temperatur sierpnia
    // ==========================================
    
    // Indeks 7 odpowiada sierpniowi (styczeń = 0, luty = 1, ..., sierpień = 7)
    int najlepsza_dlugosc = 1;
    int najlepszy_rok_pocz = lata[0];
    int najlepszy_rok_kon = lata[0];

    int biezaca_dlugosc = 1;
    int biezacy_rok_pocz = lata[0];

    for (int i = 1; i < 228; i++) {
        if (temp[i][7] < temp[i-1][7]) {
            biezaca_dlugosc++;
        } else {
            if (biezaca_dlugosc > najlepsza_dlugosc) {
                najlepsza_dlugosc = biezaca_dlugosc;
                najlepszy_rok_pocz = biezacy_rok_pocz;
                najlepszy_rok_kon = lata[i-1];
            }
            biezaca_dlugosc = 1;
            biezacy_rok_pocz = lata[i];
        }
    }

    if (biezaca_dlugosc > najlepsza_dlugosc) {
        najlepsza_dlugosc = biezaca_dlugosc;
        najlepszy_rok_pocz = biezacy_rok_pocz;
        najlepszy_rok_kon = lata[227];
    }

    wynik << "d) Rok poczatkowy: " << najlepszy_rok_pocz 
          << ", Rok koncowy: " << najlepszy_rok_kon 
          << ", Dlugosc: " << najlepsza_dlugosc << endl;

    plik.close();
    wynik.close();

    return 0;
}