Oppure

Loading
19/02/15 18:11
darioza
allora...
innanzi tutto ti rispolvero la teoria, perchè mi sa che ti sono ostiche le ricorsive (non preoccuparti, dopo tanto tempo anche a me sono rimaste sulle scatole, ma per altri motivi...)

Una funzione ricorsiva è una funzione che richiama sé stessa (ricorsione diretta) o richiama una funzione che a sua volta la richiama (ricorsione indiretta). avendo il processo fine prima o poi è necessario che la catena si interrompa e che quindi si verifichino 2 "proprietà" (speriamo non mi legga nessuno troppo sensibile alla teoria 8-|)
1) Debbono esistere dei valori per cui la funzione non attivi la ricorsione
2) Ogni volta che la funzione lavora, i valori di cui al punto 1, devono essere piu vicini


ti posto un esempio che ho trovato in giro, per capirci:

int calcFatt(int numero){
int f;
if (!numero)    /*3*/
f=1;
else
f=numero*calcFatt(numero-1);    /*4*/
return f;
}

Detto cio, a me sono sempre state sulle balle le ricorsioni.
quello che devi fare te è come nell'esempio, appoggiarti ad una variabile incrementale, e richiamare la funzione su la nuova variabile incrementata, che corrisponde all'indice dell'array_data che hai creato.
in ogni "giro" della ricorsiva, controlli che prodotto è in quell'indice, e se corrisponde a quello richiesto, aggiungi +1 ad una seconda variabile d'appoggio.
Quando arrivi all'ubound dell'array, interrompi la ricorsione e stampi il numero d'appoggio (il secondo che abbiamo creato)
Tutto chiaro?
(Ho mal di testa stasera, spero non aver dimenticato nulla ed essere stato chiaro)
aaa
19/02/15 19:36
WildBlood
In realtà non ho capito :/
aaa
19/02/15 19:38
darioza
tranquillo...
allora....
al momento, stai memorizzando ogni acquisto in una array con giorno, anno e bibita, vero?
ogni inserimento aggiunge un elemento all'array, confermi?
aaa
19/02/15 19:43
WildBlood
Allora, si, ogni volta che si effettua un acquisto memorizzo questo acquisto, cioè, il giorno, il mese e il codice del prodotto in un array di struct.
aaa
19/02/15 19:55
darioza
allora....
scriviamola insieme, se no non serve a nulla...
(quanto vorrei anche io un maestro come me quando mi areno...:D)
cerca di seguire il ragionamento

questa è l'array che ti si crea dopo che hai testato il programma e comprato 4 prodotti per esempio

Array_acquisti
index___giorno____anno____prodotto
0_______1_______2015_____1
1_______1_______2015_____2
2_______1_______2015_____2
3_______1_______2015_____1


ora scrivi, per esempio "verifica acquisti"....
e un read si aspetta che tu inserisca data e prodotto
(e fino a qui dovremmo esserci, giusto?)
una volta che sai data (giorno e anno) e prodotto, avvi la funzione ricorsiva, cosi strutturata:
[è pseudo-codice, a te tradurlo, se poi serve una mano anche li, lo facciamo dopo, prima capisci cosa va fatto però]


prima scelta, incrementale può essere il massimo valore della tua array acquisti, oppure il valore 0
per comodità, ammetterò che sia il valore massimo

funzione ricorsiva(int incrementale, int prodotto){

finche incrementale non è 0
se array_acquisti contiene codice prodotto
variabile di supporto incrementata +1
richiamo la ricorsiva con incrementale-1
se incrementale = 0

variabile di supporto incrementata +1
ritorno il valore della variabile di supporto

}



Cosa non quadra?

(non riesco ad allinearlo bene, accontentati...;))
Ultima modifica effettuata da darioza 19/02/15 19:56
aaa
19/02/15 20:04
WildBlood
Ma poi dovrei passare come parametro della funzione anche l'array_acquisti, giusto ?!
In ogni caso, ho organizzato l'array_acquisti come una struct e un'array struct:
in questo modo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// Creazione delle STRUCT.
struct bibite {
    char nome[100];
    int codice;
    float prezzo;
    int disponibilita;
};

struct data {
    int giorno;
    int mese;
    int codice;
};

int main()
{
    // Creazione del distributore.
    typedef struct bibite Bibite;
    Bibite array_bibite[10] = {{"Coca-Cola", 0, 0.60, 10},
                              {"Sprite", 1, 0.50, 10},
                              {"RedBull", 2, 1.00, 10},
                              {"Burn", 3, 1.00, 10},
                              {"Fanta", 4, 0.20, 10},
                              {"PowerRade", 5, 1.00, 10},
                              {"Energy", 6, 0.50, 10},
                              {"San Pellegrino", 7, 1.00, 10},
                              {"Pepsi", 8, 0.50, 10},
                              {"Gatorade", 9, 1.00, 10}};

    typedef struct data Data;
    Data array_data[365];

    // Scelta di una bibita da parte dell'utente.
    printf("Sono presenti le seguenti bibite:\n");

    // Dichiarazione delle variabili.
    float monete_inserite, resto;
    int i, bibita_scelta;
    int j = 0;

    for (i = 0; i < 10; i++) {
        printf("%d - %s\n", array_bibite[i].codice, array_bibite[i].nome);
    }
    printf("\n");
    printf("(10)Termina la macchina.\n");
    printf("(11)Resoconto.");

    // Trova la data di oggi.
    time_t t = time(NULL);
    struct tm *time;
    time = localtime(&t);
    int giorno = time->tm_mday;
    int mese = time->tm_mon;

    while (1) {
        printf("\n");
        printf("Scegli una bibita (INSERISCI IL CODICE CORRISPONDENTE):\n");
        scanf("%d", &bibita_scelta);

        if (bibita_scelta == 10) {
            printf("Operazioni eseguite: %d", j);
            break;
        }

        if (bibita_scelta == 11) {
            int giorno_1, codice_1;
            printf("Il giorno richiesto:\n");
            scanf("%d", &giorno_1);
            printf("Il prodotto richiesto:\n");
            scanf("%d", &codice_1);
            break;
        }

        if (bibita_scelta != 10 && bibita_scelta != 11) {
            printf("Hai scelto di prelevare %s", array_bibite[bibita_scelta].nome);
            printf("\n");
            printf("Inserisci delle monete (0.10, 0.20, 0.50, 1.00):\n");
            scanf("%f", &monete_inserite);
            printf("\n");
        }

        // Controllo se è possibile ricevere la bibita.
        if (monete_inserite == 0.10 || monete_inserite == 0.20 || monete_inserite == 0.50 || monete_inserite == 1.00) {
            if (monete_inserite < array_bibite[bibita_scelta].prezzo) {
                printf("NON HAI ABBASTANZA CREDITO PER AVERE LA BIBITA SCELTA.\n");
            } else if (monete_inserite == array_bibite[bibita_scelta]. prezzo) {
                printf("STAI PER AVERE LA BIBITA SCELTA.\nGRAZIE.\n");
                printf("(Nessun resto da dare).");

                // Inserisci la data di oggi nell'array di struct.
                j++;
                array_data[j].giorno = giorno;
                array_data[j].mese = mese;
                array_data[j].codice = bibita_scelta;
            } else if (monete_inserite > array_bibite[bibita_scelta].prezzo) {
                printf("STAI PER RICEVERE LA BIBITA SCELTA.\nGRAZIE.\n");
                resto = monete_inserite - array_bibite[bibita_scelta].prezzo;
                printf("(Resto da ricevere: %f).", resto);

                // Inserisci la data di oggi nell'array di struct.
                j++;
                array_data[j].giorno = giorno;
                array_data[j].mese = mese;
                array_data[j].codice = bibita_scelta;
            }
        } else {
            printf("CI DISPIACE, MA LA MACCHINA ACCETTA SOLO MONETE DA 0.10, 0.20, 0.50, 1.00.");
        }
    }
    return 0;
}

aaa
19/02/15 20:08
darioza
si si, l'array degli acquisti la avevo vista già prima no?
cambiato nulla?
mi sembrava andasse bene.

certo, devi passare l'array alla funzione, o meglio, visto che è c, il puntatore, ovvero l'indirizzo
(hai esperienze con altri linguaggi?)
aaa
19/02/15 20:13
WildBlood
Purtroppo non ho esperienza con altri linguaggi.. XD
Sono a programmazione I.

ma per incrementale, cioè il parametro, cosa intendi ?! Quale, guardando il mio codice, dovrei passare ?!
aaa