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

c++ Baza danych Odejmowanie czasu

Ostatnio zmodyfikowano 2014-01-08 14:49
Autor Wiadomość
colorgreen19
Temat założony przez niniejszego użytkownika
c++ Baza danych Odejmowanie czasu
» 2014-01-05 16:58:28
witam,
napisalem program, do ktorego uzytkownik wpisuje swoj nick i czas kursu autobusu ktorym wraca w dany dzien. Potem wlaczajac opcje szukania polaczen(3) podaje dla ktorego uzytkownika polaczenie ma byc wyszukane, po czym program szuka polaczan autobusowych dla wszystkich uzytkownikow w jednym dniu i wyswietle te, ktore roznia sie 10 minutami. Godziny sa zapisane jako float z precyzja do dwoch miejsc po przecinku. I tu sie pojawia problem, poniewaz czas (dokladniej minuty) to system gdzie max jest do 59 a normalne float to jest to .99. W sensie ze 15 w czasie to tak jakby 14:60, a we float 15 to 14:100. Wiec pytanie mam jak przerobic ten kod zeby dzialal poprawnie. Prosze o albo caly kod, albo wskazowki, albo chociaz pseudo-kod. Nie prosze zebyscie dawali linki do bibliotek <ctime> czy <time.h> bo ja czytam i nie rozumiem albo nie wiem jak wykorzystac np. strukture tm.

Oto kod programu
C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <conio.h>
#include <vector>
#include <iomanip>
#include <cstring>
#include <cstdio>

using namespace std;

struct Baza {
    float godzina1;
    float godzina2;
    float godzina3;
    float godzina4;
    float godzina5;
    string nick;
};
int i = 0, g = i;
Baza baza[ 20 ];

void rozruch() {
    ifstream plik( "Baza.txt", ios::app );
    do {
        plik >> baza[ g ].godzina1;
        plik >> baza[ g ].godzina2;
        plik >> baza[ g ].godzina3;
        plik >> baza[ g ].godzina4;
        plik >> baza[ g ].godzina5;
        plik >> baza[ g ].nick;
        g++;
    }
    while( !plik.eof() );
   
}


void otworz() {
    int j;
   
    /*   14.44  |  13.23   |  14.44   |   34.55  |   34.23  |  Kornel */
    cout << "  " << "   Pon.    Wtorek     Sroda    Czwartek   Piatek     Nick" << endl
    << "  " << " --------+---------+---------+---------+---------+---------" << endl;
    do {
        cout << fixed << setprecision( 2 )
        << j + 1 << "   " << baza[ j ].godzina1
        << "  |  " << baza[ j ].godzina2
        << "  |  " << baza[ j ].godzina3
        << "  |  " << baza[ j ].godzina4
        << "  |  " << baza[ j ].godzina5
        << "  |  " << baza[ j ].nick
        << endl;
        j++;
    }
    while( j != g );
   
    getch();
    system( "cls" );
}

void dodaj() {
    string nick;
   
   
    cout << "Podaj nick" << endl;
   
    ofstream plik( "Baza.txt", ios::app );
   
    cin >> baza[ g ].nick;
    cout << "\nGodzine o ktorej konczysz w poniedzialek  (Daty zapisuj gg.mm np. 14.55)" << endl;
    cin >> baza[ g ].godzina1;
    cout << "\nGodzine o ktorej konczysz w wtorek" << endl;
    cin >> baza[ g ].godzina2;
    cout << "\nGodzine o ktorej konczysz w srode" << endl;
    cin >> baza[ g ].godzina3;
    cout << "\nGodzine o ktorej konczysz w czwartek" << endl;
    cin >> baza[ g ].godzina4;
    cout << "\nGodzine o ktorej konczysz w piatek" << endl;
    cin >> baza[ g ].godzina5;
   
    plik <<
    endl << baza[ g ].godzina1 <<
    endl << baza[ g ].godzina2 <<
    endl << baza[ g ].godzina3 <<
    endl << baza[ g ].godzina4 <<
    endl << baza[ g ].godzina5 <<
    endl << baza[ g ].nick;
   
    cout << "Zapisano";
    g++;
    getch();
    system( "cls" );
   
}


template < class klasa > klasa porownaj( klasa liczba1, klasa liczba2, string user1, string user2 ) {
   
    klasa czyzgodne, x, y,
    orgliczba1 = liczba1,
    orgliczba2 = liczba2;
    string user, out;
   
    liczba1 = liczba1 * 10;
    liczba2 = liczba2 * 10;
   
    if( liczba1 > liczba2 ) {
        /*czyzgodne=liczba1-liczba2;*/
        /*        14:55  - 14:30*/
        /*        15:00  - 14:40  = 0:60*/
        /*        14:100 - 14:40*/
        /*        (14:100- 0:40)-14:40*/
        /*         (14:71-x)=14:60*/
       
        czyzgodne = liczba1 - liczba2;
        user = user1;
    }
    if( liczba1 < liczba2 ) {
        czyzgodne = liczba2 - liczba1;
        user = user1;
    }
    if( liczba1 == liczba2 ) {
        czyzgodne = liczba1;
       
    };
    if( czyzgodne == liczba1 ) {
        out = "Wracasz tym samym autobusem z " + user1;
        cout << out << endl <<
        "-----------------------------------" << endl;
       
    }
    if( czyzgodne <= 10 ) {
        cout << user1 << " wraca kursem o " << fixed << setprecision( 2 ) << orgliczba1 << endl;
        cout << "Musisz poczekac " << fixed << setprecision( 0 ) << czyzgodne * 10 << " minut na " << user << endl;
        cout << "-----------------------------------" << endl;
        return czyzgodne;
    }
    else { };
   
};

void wspolna() {
   
    int czas, m =- 1, n = 0;
    string nick;
   
    cout << "Podaj nick dla ktorego chcesz wyszukac wspolne polaczenia" << endl;
    cin >> nick;
   
    while( n < 19 ) {
        if( nick == baza[ n ].nick ) {
            break;
        };
        n++;
    };
   
    do {
        m++;
        if( m == n ) {
            continue;
        }
        czas = porownaj < double >( baza[ m ].godzina1, baza[ n ].godzina1, baza[ m ].nick, baza[ n ].nick );
        cout << czas;
       
    }
    while( m <= g );
   
    getch();
    system( "cls" );
}


int main()
{
    rozruch();
   
    int wybor;
   
    do {
        cout << "1-Dodaj\n2-Otworz\n3=Szukaj polaczen\n0-Exit" << endl;
        cin >> wybor;
       
        switch( wybor ) {
        case 1:
            dodaj();
            break;
        case 2:
            otworz();
            break;
        case 3:
            wspolna();
            break;
        }
    }
    while( wybor != 0 );
   
    return 0;
}

A to jak sie w pliku zapisuje:

12.00   <--godzina1
12.55   <--godzina2
12.00   <--godzina3
13.50   <--godzina4
14.45   <--godzina5
Kuba    <--nick
14.45
15.15
12.30
15.35
16.00
Michal
14.55
14.55
13.15
12.25
14.55
Mikolaj
14.50
12.25
12.15
13.25
15.25
Natalia
...
P-101252
pekfos
» 2014-01-05 17:09:51
I tu sie pojawia problem, poniewaz czas (dokladniej minuty) to system gdzie max jest do 59 a normalne float to jest to .99.
C/C++
double czas = 14.52;
int h = floor( czas );
int m = static_cast < int >( czas * 100 ) % 100;

std::cout << h << ':' << m << std::endl;
std::cout << "float: " << h + m / 60.0;
14:52
float: 14.8667
P-101254
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-01-05 17:21:09
To teraz jak to wrzucic do mojego programu?
Musze stworzyc rownolegla tablice w rozruch() do ktorej bedzie zapizywany rekord baza[x].godzina1 jako 'double czas' co potem w void porownaj() bedzie rozbijane na h i m i osobno porownywane?
[/i]
P-101256
pekfos
» 2014-01-05 17:24:24
potem w void porownaj() bedzie rozbijane na h i m i osobno porownywane?
Nie osobno. Patrz na drugą linię outputu. W takiej formie możesz porównywać. Będzie prościej niż osobno.
P-101258
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-01-05 17:42:43
Zaczolem pisac ale juz na poczatku nie moze mi zkompilowac programu. Problem jest z  int h = floor(czas)  czy musze cos zaimportowac czy ta wartosc zmiennej czas musi byc juz wczensiej wiadoma?

Pojawia sie  error: there are no arguments to 'floor' that depend on a template parameter, so declaration of 'floor' must be avaliable [-fpermissive]

zaczolem kombionwac w ten sposob ale szczerze mowiac nie mam bladego pojecia jak to zrobic
C/C++
template < class klasa > klasa porownaj( klasa liczba1, klasa liczba2, string user1, string user2 ) {
   
    klasa czyzgodne, x, y,
    orgliczba1 = liczba1,
    orgliczba2 = liczba2;
    string user, out;
    double czas1 = liczba1, czas2 = liczba2;
   
    int h1 = floor( czas1 );
    int m1 = static_cast < int >( czas1 * 100 ) % 100;
    int h2 = floor( czas2 );
    int m2 = static_cast < int >( czas2 * 100 ) % 100;

szczegolnie jesli przekroczymy godzine ( porowanie np. 14:50 a 15:05)
P-101264
pekfos
» 2014-01-05 19:11:31
Dodaj <cmath>.
P-101285
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-01-05 20:23:05
Napisalem warunki i wszystko sprawnie dziala natomiast wyskakuja mi jakies poboczne cyfry przy wypisywaniu wspolnych polaczan.
Wiem ze to jest chyba z tych rekordow ktore niekwalifikuja sie na zaden warunek, ale nie mam pojecia jak to usunac bo nie moge tego template porownaj zrobic jako void.
Prosze jeszcze o pomoc w tej kwestii

kod samego template bo reszta jest tak samo
C/C++
template < class klasa > klasa porownaj( klasa liczba1, klasa liczba2, string user1, string user2 ) {
   
    klasa czyzgodne,
    x /* ilosc "nad"godzin */,
    orgliczba1 = liczba1,
    orgliczba2 = liczba2;
    string user, out;
    double czas1 = liczba1, czas2 = liczba2;
   
    int h1 = floor( czas1 );
    int m1 = static_cast < int >( czas1 * 100 ) % 100;
    int h2 = floor( czas2 );
    int m2 = static_cast < int >( czas2 * 100 ) % 100;
   
    if( h1 > h2 ) {
        x = h1 - h2;
       
        if( m1 > m2 ) {
            czyzgodne = m1 - m2;
            czyzgodne = czyzgodne +( x * 60 );
            user = user1;
        }
        if( m1 < m2 ) {
            czyzgodne = 60 -( m2 - m1 );
            czyzgodne = czyzgodne +( x * 60 );
            user = user1;
        }
        if( m1 == m2 ) {
            czyzgodne = x * 60 /*minut*/;
           
        };
    }
    if( h1 < h2 ) {
        x = h2 - h1;
       
        if( m1 > m2 ) {
            czyzgodne = 60 -( m1 - m2 );
            czyzgodne = czyzgodne +( x * 60 );
            user = user1;
        }
        if( m1 < m2 ) {
            czyzgodne = m2 - m1;
            czyzgodne = czyzgodne +( x * 60 );
            user = user1;
        }
        if( m1 == m2 ) {
            czyzgodne = x * 60 /*minut*/;
           
        };
    }
    if( h1 == h2 ) {
        if( m1 > m2 ) {
           
            czyzgodne = m1 - m2;
            user = user1;
        }
        if( m1 < m2 ) {
            czyzgodne = m2 - m1;
            user = user1;
        }
        if( m1 == m2 ) {
            czyzgodne = 0;
           
        };
    };
    if( czyzgodne == 0 ) {
        out = "Wracasz tym samym autobusem z " + user1;
        cout << out << endl <<
        "-----------------------------------" << endl;
       
    }
    else if( czyzgodne <= 11 ) {
        cout << user1 << " wraca kursem o " << fixed << setprecision( 2 ) << orgliczba1 << endl;
        cout << "Musisz poczekac " << fixed << setprecision( 0 ) << czyzgodne << " minut na " << user << endl;
        cout << "-----------------------------------" << endl;
        return czyzgodne;
    }
    else { };
   
};
P-101293
pekfos
» 2014-01-05 20:29:01
Nie prościej składając h i m w jedną wartość, jak wyżej pokazałem?
P-101294
« 1 » 2
  Strona 1 z 2 Następna strona