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

Biblioteka time.h , Prośba o pomoc.

Ostatnio zmodyfikowano 2009-11-27 14:22
Autor Wiadomość
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++  ??
P-11543
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:
C/C++
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=141570
http://forum.idg.pl/lofiversion/index.php/t50956.html
P-11544
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 :(
P-11657
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:
C/C++
const int ROZMIAR = 100;

struct sFlota
{
    char imieWlasciciela[ 50 ];
    char nazwiskoWlasciciela[ 50 ];
    char adresWlasciciela[ 100 ];
    // itd.
    char dataWpisu[ 8 ];
    char dataWykupieniaOC[ 8 ];
    char dataWygasnieciaOC[ 8 ];
    char data[ 8 ];
    // ...
};

sFlota sTablicaDanych[ ROZMIAR ];
Potem robisz pętlę i porównujesz:
C/C++
for( int i = 0; i < ILOSC_DANYCH; i++ )
{
    if( roznica_dat( aktualna_data, sTablicaDanych.dataWygasnieciaOC[ i ] ) <= 3 )
         cout << "";
   
}
P-11660
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???
C/C++
#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 ); // Plik daty.txt bedzie zawierał daty przyjęć kierowców
    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 ]; // Data zatrudnienia pracownika.
    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();
}
P-11783
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).
P-11785
malan
» 2009-11-26 16:48:37
Może na początek trochę się doczepie do kodu ;p.
1.
C/C++
#include <iostream.h>
Nie ma już potrzeba dopisywania .h przy dodawaniu tej biblioteki :).

2.
C/C++
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.
C/C++
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.:
C/C++
#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 );
       
        // sscanf - konwersja (zamiana) string na int
        // substr - Artykuły -> [Biblioteka] string ;)
       
        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 ;).
P-11788
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ą.
P-11793
« 1 » 2
  Strona 1 z 2 Następna strona