Загрузка данных
#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;
}