Differenza date

di Anonimizzato10178 il
6 risposte
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

  • 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?
  • 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 ?
  • Passalo per puntatore e copia i 3 elementi in un array locale
  • 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.
  • 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
  • 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