[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

Popular

[HTML] Jak wstawić obrazek?

[C++] Jak obliczyć pole i obwód trapezu?

[PHP] Jak pobrać adres strony?