Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wyszukiwanie podobnej godziny

Ostatnio zmodyfikowano 2014-01-24 21:00
Autor Wiadomość
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:

C/C++
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() ); // pierwszy argument to indeks 1szego znaku, a drugi to ile wyłuskać tych znaków
        if( godziny[ i ] == search || h == hour || h == hour + 1 ) // Biorę 2 pierwsze znaki z godziny[i], konwertuję na inta i porównuję z akt. godz. systemową
        {
            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.
P-103019
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?
P-103022
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. :)
P-103024
alixir
» 2014-01-24 07:56:06
Może to ci pomoże:

C/C++
time_t obecny_czas = time( NULL );
struct tm data;

data.tm_hour = 7; // godzina od 0 do 23
data.tm_min = 55; // minuta od 0 do 59
data.tm_sec = 0; // sekunda od 0 do 59

data.tm_mday = 24; // dzien od 1 do 31
data.tm_mon = 0; // miesiac od 0 do 11
data.tm_year = 2014 - 1900; // rok liczony od 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.
P-103025
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ć.
P-103043
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.

C/C++
#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;
        // czyscimy strumien
        ss.str( std::string() );
        ss.clear();
        // zapisujemy dane do struktury
        data.tm_hour = godzina; // godzina od 0 do 23
        data.tm_min = minuta; // minuta od 0 do 59
        data.tm_sec = 0; // sekunda od 0 do 59
        data.tm_mday = now->tm_mday; // dzien od 1 do 31
        data.tm_mon = now->tm_mon; // miesiac od 0 do 11
        data.tm_year = now->tm_year; // rok liczony od 1900
        // obliczamy roznice w sekundach pomiedzy czasem obecnym a wczytanym
        seconds = difftime( obecny_czas, mktime( & data ) );
        if( seconds < 0 && seconds > - 7200 )
             std::cout << "Godzina: " << godzina << ":" << minuta << std::endl;
       
    }
   
    return EXIT_SUCCESS;
}
P-103092
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!
P-103110
« 1 »
  Strona 1 z 1