c++ Baza danych Odejmowanie czasu
Ostatnio zmodyfikowano 2014-01-08 14:49
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 #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; 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; 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 ... |
|
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. |
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 |
|
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] |
|
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. |
|
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 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) |
|
pekfos |
» 2014-01-05 19:11:31 Dodaj <cmath>. |
|
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 template < class klasa > klasa porownaj( klasa liczba1, klasa liczba2, string user1, string user2 ) { klasa czyzgodne, x , 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 ; }; } 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 ; }; } 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 { }; };
|
|
pekfos |
» 2014-01-05 20:29:01 Nie prościej składając h i m w jedną wartość, jak wyżej pokazałem? |
|
« 1 » 2 |