Differenza date

di il
6 risposte

Differenza date

Ciao a tutti !
Avrei una domanda su questo esercizio , questo è il codice:

#include "Prodotti.h"
class Alimentari : public Prodotti
{
private:
    string scadenza;
public:
    Alimentari(int codice_a_barre,string descrizione,float prezzo,string scadenza):Prodotti(codice_a_barre,descrizione,prezzo)
    {
        this->scadenza=scadenza;
    }
    string Getscadenza(){return scadenza;}
    void Setscadenza(string val){scadenza=val;}
    float applicaSconto()
    {
        prezzo=prezzo*0.8;
        return prezzo;
    }
};
In questa classe "Alimentari" vorrei aggiungere al metodo applicaSconto la condizione che lo sconto va applicato solo se la scadenza è al massimo tra 10 giorni rispetto la data odierna.
Ho pensato di definire la variabile scadenza come int scadenza[3] in modo da scrivere la data come array e poi lavorare con le condizioni direttamente nel metodo , ma se faccio questo cambiamento mi da problemi nella riga this->scadenza=scadenza.
Ci sta come idea o mi consigliate qualcosa di diverso ?

6 Risposte

  • Re: Differenza date

    Ovviamente non puoi eseguire la linea con l'assegnazione di un array in quel modo.

    Prima di scegliere il tipo di dato per la scadenza, hai chiaro come fare la differenza con la data odierna?
  • Re: Differenza date

    Allora ho svolto l'algoritmo in C che mi permette di stabilire se 2 date differiscono l'una dall'altra per al massimo 10 giorni , sembra funzionare
    Questo è il mio codice :
    
    #include <stdio.h>
    main()
    {
        int a[3]={3,7,5},b[3]={5,8,5};
        int confrontoDate(int a[],int b[])
        {
            int punteggio_a=0,punteggio_b=0;
            for(int i=1;i<a[2];i++){
                if((i%100!=0 && i%4==0)||(i%100==0 && i%400==0))
                    punteggio_a+=366;
                else
                    punteggio_a+=365;
            }
            for(int j=1;j<a[1];j++){
            if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
                punteggio_a+=31;
            else if(j==4||j==6||j==9||j==11)
                punteggio_a+=30;
            else if(j==2)
                if((a[2]%100!=0 && a[2]%4==0)||(a[2]%100==0 && a[2]%400==0))
                    punteggio_a+=29;
                else
                    punteggio_a+=28;
            }
            punteggio_a=punteggio_a+a[0];
    
            for(int i=1;i<b[2];i++){
                if((i%100!=0 && i%4==0)||(i%100==0 && i%400==0))
                    punteggio_b+=366;
                else
                    punteggio_b+=365;
            }
            for(int j=1;j<b[1];j++){
            if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
                punteggio_b+=31;
            else if(j==4||j==6||j==9||j==11)
                punteggio_b+=30;
            else if(j==2)
                if((b[2]%100!=0 && b[2]%4==0)||(b[2]%100==0 && b[2]%400==0))
                    punteggio_b+=29;
                else
                    punteggio_b+=28;
            }
            punteggio_b=punteggio_b+b[0];
            int punteggio=punteggio_b-punteggio_a;
    
            return punteggio;
        }
        int k=confrontoDate(a,b);
        if(k<=10)
            return 1;
        else
            return 0;
    }
    
    Ora potrei usare questa funzione come metodo nell'esercizio originario
    Come posso però mettere un array al posto del parametro "string data" facendo funzionare il tutto ?
  • Re: Differenza date

    Passalo per puntatore e copia i 3 elementi in un array locale
  • Re: Differenza date

    Non ho approfondito l'algoritmo che hai implementato, ma già qualcosa del genere renderebbe il tutto più chiaro e meno ridondante:
    #include <stdio.h>
    
    int fun(int v[])
    {
        unsigned int n = 0;
        for(unsigned int i = 1; i < v[2]; ++i)
        {
            n += 365;
            if(i % 100 && !(i % 4) || !(i % 100) && !(i % 400))
            {
                ++n;
            }
        }
        for(unsigned int i = 1; i < v[1]; ++i)
        {
            if(i == 2)
            {
                n += 28;
                if(v[2] % 100 && !(v[2] % 4) || !(v[2] % 100) && !(v[2] % 400))
                {
                    ++n;
                }
            }
            else if(i == 4 || i == 6 || i == 9 || i == 11)
            {
                n += 30;
            }
            else
            {
                n += 31;
            }
        }
        return n + v[0];
    }
    
    int main()
    {
        int a[3] = {3, 7, 5};
        int b[3] = {5, 8, 5};
        printf("%d", fun(b) - fun(a));
        return 0;
    }
    
    In ogni caso credo possano essere fatte ulteriori ottimizzazioni, soprattutto nella differenza di due date.
  • Re: Differenza date

    oregon ha scritto:


    Passalo per puntatore e copia i 3 elementi in un array locale
    Non saprei come fare ,ho modificato cosi ma non credo vada bene
    
    #include "Prodotti.h"
    class Alimentari : public Prodotti
    {
    private:
        int*scadenza;
    public:
        Alimentari(int codice_a_barre,string descrizione,float prezzo,int* scadenza):Prodotti(codice_a_barre,descrizione,prezzo)
        {
            this->scadenza=scadenza;
        }
        int Getscadenza(){return scadenza;}
        void Setscadenza(int val){scadenza=val;}
        float applicaSconto(a[],b[])
        {	
        	if(confrontoDate(a,b))
        	prezzo=prezzo*0.8;
            return prezzo;
        }
    };
    
    Inserendo la funzione controlloDate prima di applicaSconto
  • Re: Differenza date

    Nippolo ha scritto:


    Non ho approfondito l'algoritmo che hai implementato, ma già qualcosa del genere renderebbe il tutto più chiaro e meno ridondante:
    #include <stdio.h>
    
    int fun(int v[])
    {
        unsigned int n = 0;
        for(unsigned int i = 1; i < v[2]; ++i)
        {
            n += 365;
            if(i % 100 && !(i % 4) || !(i % 100) && !(i % 400))
            {
                ++n;
            }
        }
        for(unsigned int i = 1; i < v[1]; ++i)
        {
            if(i == 2)
            {
                n += 28;
                if(v[2] % 100 && !(v[2] % 4) || !(v[2] % 100) && !(v[2] % 400))
                {
                    ++n;
                }
            }
            else if(i == 4 || i == 6 || i == 9 || i == 11)
            {
                n += 30;
            }
            else
            {
                n += 31;
            }
        }
        return n + v[0];
    }
    
    int main()
    {
        int a[3] = {3, 7, 5};
        int b[3] = {5, 8, 5};
        printf("%d", fun(b) - fun(a));
        return 0;
    }
    
    In ogni caso credo possano essere fatte ulteriori ottimizzazioni, soprattutto nella differenza di due date.
    Grazie , molto meglio questa versione
Devi accedere o registrarti per scrivere nel forum
6 risposte