Lodówka porównanie dwóch dat do spożycia produktu

Odpowiedz Nowy wątek
2011-07-24 20:25
0

Witam,

Kombinuje program z rzeczywistości wzięty, który nazwałem Lodówka. Ma on sprawdzić, czy produkt
w lodówce nadaje się do spożycia. Oczywiście mam problem z samym ifem. Kombinowałem coś
z dziedziczeniem wielobazowym.

 
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
class DataAktualna
{
private:
    int dzien, miesiac, rok;
public:
    ~DataAktualna()
    {
        cout << "Niszcze date";
    }
 
    void WczytajDate()
    {
        cout << "Podaj dzien";
        cin >> dzien;
        cout << "Podaj miesiac";
        cin >> miesiac;
        cout << "Podaj rok";
        cin >> rok;
        cout << endl;
    }
};
 
class DataProduktu
{
private:
    int dzienProduktu, miesiacProduktu, rokProduktu; 
public:
    ~DataProduktu()
    {
        cout << "Niszcze produkt";
    }
 
    void WczytajDateProduktu()
    {
        cout << "Podaj dzien do spozycia produktu:  ";
        cin >> dzienProduktu;
        cout << "Podaj miesiac do spozycia produktu:    ";
        cin >> miesiacProduktu;
        cout << "Podaj rok do spozycia produktu:    ";
        cin >> rokProduktu;
    }
 
};
 
class ProduktWlodowce : public DataAktualna, public DataProduktu
{
private:
    string nazwa;
    double waga;
    string kolor;
public:
    ~ProduktWlodowce()
    {
        cout << "Niszcze produkt w lodówce";
    }
 
    void CzyDobryProdukt()
    {
        // tutaj oczywiście gwozdz programu ;)
        if (DataAktualna.WczytajDate < DataProduktu.WczytajDateProduktu()) 
            cout << "Produkt dobry";
    }
 
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    DataAktualna dataAktualna;
    DataProduktu dataProduktu;
    ProduktWlodowce produktWLodowce;
 
    dataAktualna.WczytajDate();
    dataProduktu.WczytajDateProduktu();
    produktWLodowce.CzyDobryProdukt();
 
    produktWLodowce.~ProduktWlodowce;    
    dataAktualna.~DataAktualna();
    dataProduktu.~DataProduktu();
    system("pause");
    return 0;
}
 

Pozostało 580 znaków

2011-07-24 21:31
0

Wydaje mi się, że najlepiej byłoby stworzyć jedną klasę Data, w której przeciążysz operatory porównania i wtedy w klasie ProduktWLodowce stworzyć dwa pola typu Data - dataAktualna i dataProduktu a w metodzie czyDobryProdukt po prostu porównać te dwie daty.

Pozostało 580 znaków

2011-07-24 21:33
1
  1. ProduktWlodowce nie powinien dziedziczyć po DataAktualna ani DataProduktu (dziedziczenie oznacza, że jedno jest rodzajem, lub szczególnym przypadkiem drugiego. a produkt w lodówce nie jest rodzajem daty!)
  2. DataAktualna i DataProduktu to dokładnie to samo: data. powinna być jedna klasa do obu.
  3. żeby porównać dwie daty, trzeba przeliczyć dzień-miesiąc-rok na dowolny format ciągły (np. Julian Day albo UNIX Epoch) i porównać dwie otrzymane liczby.
    Jest też niby standardowy nagłówek <ctime> i jego typ time_t:
#include <ctime>
#include <iostream>
using namespace std;
 
class Data
{
  public:
    int dzien, miesiac, rok;
    time_t getEpoch()
    {
       tm data = {};
       data.tm_year = rok-1900;
       data.tm_mon = miesiac-1;
       data.tm_mday = dzien;
       return mktime(&data);
    }
};
 
int main()
{
   setlocale(LC_ALL,"");
   Data dataa = {1,12,2011};
   Data datab = {4,7,2011};
 
   if (dataa.getEpoch() > datab.getEpoch())
     cout<<"data a jest późniejsza"<<endl;
   else
     cout<<"data a nie jest późniejsza"<<endl;
}
  1. porównywanie dat „na pałę”, czyli kolejne warunki porównujące „roki”, miesiące i dni - też będzie działać, ale lepiej od razu stosować właściwe rozwiązania.
edytowany 4x, ostatnio: Azarien, 2011-07-24 21:41

Pozostało 580 znaków

2011-07-28 20:25
0
Azarien napisał(a)
  1. żeby porównać dwie daty, trzeba przeliczyć dzień-miesiąc-rok na dowolny format ciągły (np. Julian Day albo UNIX Epoch) i porównać dwie otrzymane liczby.

Czytałem o algorytmie Data Juliańska w encyklopedii. Nie wiem, czy dobrze zinterpretowałem algorytm.

 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class Data
{
public:
    int rok, miesiac, dzien, godzina, 
        minuta, sekunda;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    Data dataA = {2011, 07, 29, 00, 00, 00};
    Data dataB = {2011, 07, 28, 00, 00, 00};
 
    double JD1 = int(365.2425 * dataA.rok) + int(30.6001 * dataA.miesiac) 
        + dataA.dzien + 1720994.5;
    double T1 = dataA.godzina/24 + dataA.minuta / (60 * 24) 
        + dataA.sekunda/(3600 * 24);
    double P1 = int(int(dataA.rok/100)/4) - int(dataA.rok/100) + 2;
 
    double JD2 = int(365.2425 * dataB.rok) + int(30.6001 * dataB.miesiac) 
        + dataB.dzien + 1720994.5;
    double T2 = dataB.godzina/24 + dataB.minuta / (60 * 24) 
        + dataB.sekunda/(3600 * 24);
    double P2 = int(int(dataB.rok/100)/4) - int(dataB.rok/100) + 2;
 
    JD1 = JD1 + P1 + T1;
    JD2 = JD2 + P2 + T2;
 
    if (JD1 > JD2)
        cout << "data pierwsza jest pozniejsza" << endl;
    else
        cout << "data druga jest pozniejsza" << endl;
 
    system("pause");
    return 0;
}
Azarien napisał(a)
  1. porównywanie dat „na pałę”, czyli kolejne warunki porównujące „roki”, miesiące i dni - też będzie działać, ale lepiej od razu stosować właściwe rozwiązania.

Nawet się tego nie podejmowałem, zawiesiłem się po warunku z rokami.

edytowany 1x, ostatnio: TAXIarz, 2011-07-28 20:26

Pozostało 580 znaków

2011-07-28 20:52
0

Nawet się tego nie podejmowałem, zawiesiłem się po warunku z rokami.

/* zwraca 0 jeśli daty są równe. liczbę dodatnią, jeśli data 2 jest późniejsza. liczbę ujemną, jeśli data 1 jest późniejsza. */
int porownaj_daty(int rok1, int miesiac1, int dzien1, int rok2, int miesiac2, int dzien2)
{
  if (rok1!=rok2)
    return rok2-rok1;
  if (miesiac1!=miesiac2)
    return miesiac2-miesiac1;
  return dzien2-dzien1;
}

nie sprawdzane.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0