fatman76 Temat założony przez niniejszego użytkownika |
Biblioteka time.h , Prośba o pomoc. » 2009-11-13 11:10:31 Witam
Po kilku tygodniach experymentowania i wałkowania kursu postanowiłem w końcu zabrac się za jakiś "poważny projekt" :). Bedzie to programik do zarządzania firmą transportową czyli w skrócie taka ewidencja floty samochodowej. Wszystko już mam wstępnie poukładane w głowie co i jak ale niestety nie bardzo wiem jak rozwiązać problem z datami. Chodzi mi o to jak wykorzystując biblioteke time.h zrobic aby program przypominał np. że za tydzień kończy się OC w aucie nr.123. Czyli np. "if (dziś jest 13.11.2009) cout << "Za 3 dni kończy sie OC w aucie 123"; Przyznam się szczerze, że nie bardzo pojmuję wszystko z kursu i dlatego proszę o pomoc. Z innej beczki, kiedyś znalazłem w necie prościutką funkcję do zmiany rozmiaru okna konsoli. Niestety przez pomyłke nadpisałem ją czymś innym :( i funkcję wcieło. Czy może ktoś z Was wie jak w prosty sposób modyfikować rozmiar okna konsoli ?? I jeszcze tylko pytanko czy ma ktoś namiar na jakiś fajny tutek PL na temat drukowania w C++ ??
|
|
malan |
» 2009-11-13 14:45:48 Przykładowe rozwiązanie: 1. Musisz mieć zapisaną datę kiedy kończy się OC danego samochodu (np. w pliku): Opel ... 21.12.2009 Maluch ... 22.01.2010 BMW ... 23.11.2011 Ford ... 1.01.2012
2.Podczas uruchomienia programu odczytujesz aktualną datę i zapisujesz ją do dowolnej zmiennej. 3. Pobierasz dane (w tym daty) z pliku. 4. Obliczasz różnicę pomiędzy datami zapisanymi w pliku, a dzisiejszą i sprawdzasz warunek: if( roznica_dat( aktualna_data, data_pobrana_z_pliku ) <= 3 ) cout << "Pozostało ... ";
Jeśli chodzi o funkcje to: http://forum.4programmers.net/viewtopic.php?id=141570http://forum.idg.pl/lofiversion/index.php/t50956.html |
|
fatman76 Temat założony przez niniejszego użytkownika |
» 2009-11-18 17:26:56 Ok, dzięki! ale jak/z jakiej funkcji skorzystać żeby podstawić czas w formie np. 17.11.2009 do zmiennej np. aktualna_data?? Myślę że wiem jak rozwiązać cały ten problem od strony algorytmu ale niestety od strony kodu to już lipa. Chcę to zrobić właśnie tak jak piszesz ale zupełnie nie wiem jak podstawiać daty do konkretnej zmiennej w celu porównania. Pomocy proszę bo mój projekt utknął już na samym początku :( |
|
malan |
» 2009-11-18 18:05:19 z jakiej funkcji skorzystać żeby podstawić czas w formie np. 17.11.2009 do zmiennej np. aktualna_data?? http://kursy.ddt.pl/?LessonId=109 (strftime)nie wiem jak podstawiać daty do konkretnej zmiennej w celu porównania. Ogólnie rzecz biorąc to mógłbyś stworzyć jakąś strukturę danych, potem tablicę i zapisywać do niej dane. Coś w tym stylu: const int ROZMIAR = 100;
struct sFlota { char imieWlasciciela[ 50 ]; char nazwiskoWlasciciela[ 50 ]; char adresWlasciciela[ 100 ]; char dataWpisu[ 8 ]; char dataWykupieniaOC[ 8 ]; char dataWygasnieciaOC[ 8 ]; char data[ 8 ]; };
sFlota sTablicaDanych[ ROZMIAR ];
Potem robisz pętlę i porównujesz: for( int i = 0; i < ILOSC_DANYCH; i++ ) { if( roznica_dat( aktualna_data, sTablicaDanych.dataWygasnieciaOC[ i ] ) <= 3 ) cout << ""; }
|
|
fatman76 Temat założony przez niniejszego użytkownika |
» 2009-11-26 11:11:16 Ok!, wymyśliłem coś takiego. Programik zapisuje aktualną datę przyjęcia pracownika do pracy w pliku tekstowym np: 26 11 2009 itd.. Teraz kombinuje jak to odczytać w trybie binarnym aby można to było podstawić pod zmienne np: int data_dzien_przyjecia_pracownika int data_miesiac_przyjecia_pracownika itp. może ma ktoś jakieś wskazówki jak w najprostszy sposób to odczytac aby można było podstawić pod zmienne ale nie w trybie tekstowym??? #include <time.h> #include <conio.h> #include <iostream.h> #include <fstream>
using namespace std;
fstream plik_daty;
int main() { plik_daty.open( "daty.txt", ios::in | ios::out ); if( plik_daty.good() == true ) cout << "Zapisuje date do pliku!" << endl; else cout << "Blad zapisu !!!" << endl; time_t czas; struct tm * data; char dataZat[ 15 ]; time( & czas ); data = localtime( & czas ); strftime( dataZat, 15, "%d %m %Y \n", data ); cout << dataZat; plik_daty << dataZat; cout << "\nOK. Data zapisana do pliku!"; getch(); } |
|
DejaVu |
» 2009-11-26 14:39:25 malan widze, ze juz sie zajal sprawa, wiec nie czytam tematu na razie. Po przeczytaniu pierwszego posta chcialbym jednak pouczyc nowego uzytkownika o naszej zasadzie tj. jeden problem = 1 temat. Starajmy sie trzymac porzadek jakis - pozniej latwiej jest cokolwiek znalezc.
PS. Sorry za brak polskich znaczkow - taka konfiguracja klawiatury na uczelni (a nie chce mi sie tego dzisiaj przestawiac). |
|
malan |
» 2009-11-26 16:48:37 Może na początek trochę się doczepie do kodu ;p. 1. Nie ma już potrzeba dopisywania .h przy dodawaniu tej biblioteki :). 2. plik_daty.open( "daty.txt", ios::in | ios::out );
Nie otwieraj pliku jednocześnie do odczytu i do zapisu. Jeśli zapisujesz dane otwórz go tylko do zapisu, poza tym jeśli będziesz chciał dopisywać daty (tzn. będziesz chciał mieć ich w pliku kilka) musisz dodać ios::app. W przeciwnym wypadku (jak w Twoim programie) zawartość pliku podczas otwierania jest kasowana. 3. if( plik_daty.good() == true ) cout << "Zapisuje date do pliku!" << endl; else cout << "Blad zapisu !!!" << endl;
Zauważ, że tak napisany warunek nie spełni swojego zadania, tzn. oczywiście sprawdzi, czy plik został poprawnie otwarty, ale w przypadku jakiegokolwiek błędu wypisze tylko komunikat i program będzie się wykonywał dalej, czego skutkiem będzie zapisanie danych do nieistniejącego pliku ;). 4. Zapomniałeś też chyba zamknąć pliku ;p. może ma ktoś jakieś wskazówki jak w najprostszy sposób to odczytac aby można było podstawić pod zmienne ale nie w trybie tekstowym??? Opcji jest kilka: 1. Wiemy, że format daty będzie zawsze taki: DD MM RRRR. Możemy więc napisać funkcje, która pobierze jedną linię z pliku i "rozdzieli" dane do zmiennych, np.: #include <cstdio>
bool fPobierzDane( void ) { string data; int dzien, miesiac, rok; plik_daty.open( "daty.txt", ios::in ); if( plik_daty.good() ) { getline( plik_daty, data ); sscanf(( data.substr( 0, 2 ) ).c_str(), "%d", & dzien ); sscanf(( data.substr( 3, 2 ) ).c_str(), "%d", & miesiac ); sscanf(( data.substr( 6, 4 ) ).c_str(), "%d", & rok ); plik_daty.close(); cout << "Pobrana data: " << dzien << " " << miesiac << " " << rok; } else { return false; } }; Ta funkcja nie jest doskonała ;p, wystarczy usunąć trochę danych z pliku u już buum ;p. Jednak dodając dodatkowy warunek można ją trochę "zabezpieczyć". 2. Możesz również to zrobić za pomocą funkcji fscanf. Wydaje mi się, że to wygodniejsze rozwiązanie ;). |
|
Elaine |
» 2009-11-26 17:45:52 4. Zapomniałeś też chyba zamknąć pliku |
Tylko jeśli używa kompilatora, który albo nie obsługuje destruktorów, albo jest zabugowany. Strumienie iostreamowe same się zamykają. |
|
« 1 » 2 |