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

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;
}


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.

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.
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.

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.

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