Xaroun Temat założony przez niniejszego użytkownika |
[C++] Wyszukiwanie podobnej godziny » 2014-01-24 00:01:15 Witam! Mam pewien problem odnośnie C++. Otóż piszę rozkład jazdy i stanąłem w miejscu na parę dni. Chodzi o wyszukiwanie najbliższego odjazdu z wybranego przystanku. W skrócie wybieram linie (otwiera się plik z przystankami tej linii i wyświetla je), wybieram numer przystanku (otwiera się plik z odjazdami z konkretnego przystanku, na razie tylko w jedną stronę i tylko dni robocze), wszystkie godziny spisuje do tablicy stringów i teraz brakuje mi na pomysł co wrzucić do IFa aby wyświetlił mi najbliższe odjazdy z tego przystanku wg godziny systemowej. Mam tu taki fragment, który odpowiada po części za to, ale nie działa w każdym przypadku: if( rozklad.is_open() ) { for( int i = 0; i < 200; i++ ) { rozklad >> godziny[ i ]; } for( int i = 0; i < 200; i++ ) { int h = atoi( godziny[ i ].substr( 0, 2 ).c_str() ); if( godziny[ i ] == search || h == hour || h == hour + 1 ) { cout << "Najblizsze odjazdy: " << endl; cout << godziny[ i ] << endl << godziny[ i + 1 ] << endl << godziny[ i + 2 ] << endl; break; } } }
godziny to tablica stringów, hour to godziny systemowa w int, minute to minuty systemowe w int, search to godzina systemowa w formacie 00:00 typu string.
Liczę na waszą pomoc, pomysł bo próbowałem już chyba wszystkiego, a muszę to zrobić jak najszybciej. |
|
stryku |
» 2014-01-24 01:54:02 A jak w pliku masz zapisane godziny i minuty odjazdów? Sprawdzałeś w debuggerze czy masz dobrze pobrane godziny systemowe? |
|
Xaroun Temat założony przez niniejszego użytkownika |
» 2014-01-24 02:25:25 Godziny zapisane są przykładowo tak:
06:50 07:02 07:20 07:40 itd..
Co do godzin systemowych - w debuggerze nie sprawdzałem, ale wystarczy, że po prostu wypiszę to na ekran to widzę, że są dobrze pobrane. Mój warunek działa jeżeli w pliku znajdzie godzinę identyczną z godziną systemową (no może pokazuje w miare najbliższe ale jest dużo wyjątków przez co nie jest to do końca skuteczne rozwiązanie), a chodzi mi, żeby pokazywał mi nie identyczną godzinę, a najbliższą, wg przykładu:
Mamy w/w godziny:
06:50 07:02 07:20 07:40
Godzina systemowa to 07:15
To chciałbym, żeby program wyświetlił mi:
Najbliższe odjazdy: 07:20 07:40
Albo nawet jedną godzinę też wystarczy. Więc jeśli ktoś ma pomysł to byłbym wdzięczny za pokazanie go. :) |
|
alixir |
» 2014-01-24 07:56:06 Może to ci pomoże: time_t obecny_czas = time( NULL ); struct tm data;
data.tm_hour = 7; data.tm_min = 55; data.tm_sec = 0;
data.tm_mday = 24; data.tm_mon = 0; data.tm_year = 2014 - 1900;
double seconds = difftime( obecny_czas, mktime( & data ) );
cout << "Od 24.01.2014 7:55 minelo: " << seconds << " sekund" << endl; Mógłbyś wyświetlić połączenia które zawierają się w przedziale powiedzmy 3600 sekund. |
|
Xaroun Temat założony przez niniejszego użytkownika |
» 2014-01-24 16:41:30 Nie do końca wyobrażam sobie jak by to miało wyglądać. |
|
alixir |
» 2014-01-24 18:58:15 Tu taki mały przykładzik. Pewnie jest jakaś lepsza metoda, ale tylko takie coś wymyśliłem. Dla przykładu użyłem tablicy string z podanymi godzinami. #include <iostream> #include <sstream> #include <string> #include <time.h>
int main() { std::string tCzasy[] = { "0:45", "1:25", "02:10", "02:50", "03:20", "04:33", "5:18", "6:02", "07:15", "07:35", "08:20", "09:30", "10:10", "11:25", "12:00", "12:40", "13:45", "14:20" "15:15", "16:05", "17:12", "18:38", "19:20", "20:00", "21:05", "21:46", "22:08", "22:56", "23:14", "23:58", }; std::stringstream ss; time_t obecny_czas = time( NULL ); struct tm * now = localtime( & obecny_czas ); struct tm data; double seconds; int godzina, minuta; char znak; std::cout << "Polaczenia w ciagu najblizszych 2 godzin:\n"; for( int i = 0; i <( sizeof( tCzasy ) / sizeof( std::string ) ); i++ ) { ss << tCzasy[ i ]; ss >> godzina >> znak >> minuta; ss.str( std::string() ); ss.clear(); data.tm_hour = godzina; data.tm_min = minuta; data.tm_sec = 0; data.tm_mday = now->tm_mday; data.tm_mon = now->tm_mon; data.tm_year = now->tm_year; seconds = difftime( obecny_czas, mktime( & data ) ); if( seconds < 0 && seconds > - 7200 ) std::cout << "Godzina: " << godzina << ":" << minuta << std::endl; } return EXIT_SUCCESS; } |
|
Xaroun Temat założony przez niniejszego użytkownika |
» 2014-01-24 21:00:13 Hmm ciekawe rozwiązanie, postaram się je przełożyć na mój projekt.
@up
Pomogło, dzięki wielkie! |
|
« 1 » |