[C++] Piszemy aplikację pogodową, część 4
Czwarta część z cyklu Aplikacja pogodowa w C++.
W tym wpisie stworzymy funkcjonalność odpowiadającą za wyświetlanie danych pogodowych w terminalu. W tym celu do obsługi tekstu zostanie użyta biblioteka ncurses. Uwaga! Dla wsparcia polskich znaków konieczne jest użycie ncursesw - nakładki, która wspiera UTF-8.
Plik output.hpp
Zacznijmy od utworzenia pliku output.hpp i zadeklarowania w nim funkcji display_weather:
#ifndef OUTPUT_HPP
#define OUTPUT_HPP
bool display_weather(char* location);
#endif
Plik output.cpp
Teraz pora na plik output.cpp. Plik ten będzie zawierał najwięcej kodu - logikę funkcji display_weather. Funkcja ta przyjmuje jeden argument - char* location (lokalizacja):
#include "data.hpp"
#include "output.hpp"
#include <ncursesw/ncurses.h>
int previous_temperature = 100;
int previous_pressure = 0;
int previous_humidity = -1;
int previous_wind_speed = -1;
string temperature_trend = " ";
string pressure_trend = " ";
string humidity_trend = " ";
string wind_speed_trend = " ";
bool display_weather(char* location) {
time_t now = time(0);
tm *ltm = localtime(&now);
int hour = ltm->tm_hour;
int minute = ltm->tm_min;
Data data;
Weather weather_data;
weather_data = data.set(location);
clear();
if(weather_data.error == "") {
if(previous_temperature == 100) {
previous_temperature = weather_data.temperature;
}
else {
previous_temperature = previous_temperature;
}
if(weather_data.temperature > previous_temperature) {
temperature_trend = "↑";
previous_temperature = weather_data.temperature;
}
if(weather_data.temperature < previous_temperature) {
temperature_trend = "↓";
previous_temperature = weather_data.temperature;
}
if(previous_pressure == 0) {
previous_pressure = weather_data.pressure;
}
else {
previous_pressure = previous_pressure;
}
if(weather_data.pressure > previous_pressure) {
pressure_trend = "↑";
previous_pressure = weather_data.pressure;
}
if(weather_data.pressure < previous_pressure) {
pressure_trend = "↓";
previous_pressure = weather_data.pressure;
}
if(previous_wind_speed == -1) {
previous_wind_speed = weather_data.wind_speed;
}
else {
previous_wind_speed = previous_wind_speed;
}
if(weather_data.wind_speed > previous_wind_speed) {
wind_speed_trend = "↑";
previous_wind_speed = weather_data.wind_speed;
}
if(weather_data.wind_speed < previous_wind_speed) {
wind_speed_trend = "↓";
previous_wind_speed = weather_data.wind_speed;
}
if(previous_humidity == -1) {
previous_humidity = weather_data.humidity;
}
else {
previous_humidity = previous_humidity;
}
if(weather_data.humidity > previous_humidity) {
humidity_trend = "↑";
previous_humidity = weather_data.humidity;
}
if(weather_data.humidity < previous_humidity) {
humidity_trend = "↓";
previous_humidity = weather_data.humidity;
}
start_color();
init_pair(1, COLOR_BLUE, COLOR_BLACK);
init_pair(2, COLOR_YELLOW, COLOR_BLACK);
printw("\n");
attron(COLOR_PAIR(1));
printw(" POGODA %s", weather_data.location.c_str());
printw(" > %s", weather_data.conditions.c_str());
attroff(COLOR_PAIR(1));
printw("\n");
printw(" --------------------------------------------------------------------------------------\n");
printw("| Temperatura: ");
attron(COLOR_PAIR(2));
printw("%s", temperature_trend.c_str());
printw("%d", weather_data.temperature);
printw(" °C ");
attroff(COLOR_PAIR(2));
printw("| Ciśnienie: ");
attron(COLOR_PAIR(2));
printw("%s", pressure_trend.c_str());
printw("%d", weather_data.pressure);
printw(" hPa ");
attroff(COLOR_PAIR(2));
printw("| Wiatr: ");
attron(COLOR_PAIR(2));
printw("(");
printw("%s", weather_data.wind_direction);
printw(") ");
printw("%s", wind_speed_trend.c_str());
printw("%d", weather_data.wind_speed);
printw(" km/h ");
attroff(COLOR_PAIR(2));
printw("| Wilgotność: ");
attron(COLOR_PAIR(2));
printw("%s", humidity_trend.c_str());
if(weather_data.humidity < 100) {
printw(" %d", weather_data.humidity);
}
else {
printw("%d", weather_data.humidity);
}
printw("%% ");
attroff(COLOR_PAIR(2));
printw("|\n");
printw(" --------------------------------------------------------------------------------------\n");
printw(" -------------------------------------------------------- Zaktualizowano o ");
printw("%02d", hour);
printw(":");
printw("%02d", minute);
printw(" --\n");
printw(" -------------------------------------------------------- Pobrano %d", weather_data.memory);
printw(" B --\n");
refresh();
return 0;
}
else {
printw("Błąd:\n\n%s", weather_data.error.c_str());
return 1;
}
}
Jak widać plik output.hpp to jedna tylko rozbudowana funkcja obsługująca wyświetlanie danych pogodowych. W tym pliku będziemy korzystać z pobranych danych, a więc musimy dołączyć wcześniej utworzony plik data.hpp z deklaracjami struktury Weather i klasy Data. Dołączyć musimy także bibliotekę ncurses do obsługi tekstu w konsoli.
Jeśli coś jest niejasne, można zawsze dopytać w komentarzach.
Komentarze
Prześlij komentarz
Dzięki za komentarz!