Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Progetto distributore automatico in C
Forum - C/C++ - Progetto distributore automatico in C

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 15:05
Martedì, 17/02/2015
Questo topic è stato chiuso dal moderatore

Premettendo che non pretendo che qualcuno faccia il programma al posto mio, anche perchè non ci capirei nulla, vorrei almeno una base sulla quale costruire tutto il codice, perchè io non so come partire. Avevo pensato di creare una struct e un array di struct di 10 elementi, con le rispettive informazioni. In seguito, sviluppare una funzione che consenta all'utente di inserire un importo, attraverso quindi uno switch, controllare l'importo e in seguito la disponibilità della bibita, e se tutto va bene, prendi la bibita, decrementando il contatore relativo a quella stessa bibita.
In particolare non ho capito l'ultima parte del progetto, cioè quella di calcolare la quantità venduta in un giorno con un algoritmo ricorsivo. Grazie in anticipo a tutti per l'aiuto. :)
PS: Se a breve riuscirò a combinare qualcosa, posto il codice.

Si vuole simulare la gestione annuale di un distributore automatico di bibite. Si suppone
di avere 10 prodotti identificati da un nome, da un codice identificativo e da un prezzo.
Permettere allÂ’utente di:
• Di inserire dei soldi (10, 20, 50 centesimi, 1 euro) e scegliere un prodotto
o In base al costo verificare se è possibile prendere il prodotto
o Verificare se cÂ’è bisogno di dare del resto
• Data una data e un prodotto calcolare la quantità venduta nel giorno di
riferimento (usare un algoritmo incrementale ricorsivo)
Implementazione lÂ’algoritmo per la simulazione del distributore (e.g, struttura
matriciale) ed effettuare almeno un test per ognuna delle opzioni richieste dallÂ’utente.

Ultima modifica effettuata da WildBlood il 17/02/2015 alle 15:05
PM
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 3:32
Giovedì, 19/02/2015
Immagino siamo in ambito accademico...
Penso che una volta chiaro il concetto di ricorsività, ammesso e concesso che non necessiti, proprio perché in ambito accademico, di salvare su file o archiviare, quindi hai un array in memoria, le cose da fare siano abbastanza chiare.
Array prodotti, multidimensionale
Array vendite, multidimensionale
Funzione ricorsiva

come sei a c?
Medicina indigesta o lo mangi col pane la mattina?

PM
Avatar
AldoBaldo (Member)
Expert


Messaggi: 347
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 7:40
Giovedì, 19/02/2015
Ora non posso perché sto andando al lavoro, ma mi piacerebbe partecipare. Che tempi hai per lo svolgimento?


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 11:18
Giovedì, 19/02/2015
Testo quotato

Postato originariamente da AldoBaldo:

Ora non posso perché sto andando al lavoro, ma mi piacerebbe partecipare. Che tempi hai per lo svolgimento?



Fino a domani, dovrei farlo vedere al mio prof prima.

PM
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 11:24
Giovedì, 19/02/2015
Testo quotato

Postato originariamente da darioza:

Immagino siamo in ambito accademico...
Penso che una volta chiaro il concetto di ricorsività, ammesso e concesso che non necessiti, proprio perché in ambito accademico, di salvare su file o archiviare, quindi hai un array in memoria, le cose da fare siano abbastanza chiare.
Array prodotti, multidimensionale
Array vendite, multidimensionale
Funzione ricorsiva

come sei a c?
Medicina indigesta o lo mangi col pane la mattina?



In pratica noi non abbaimo mai salvato file etc.. quindi suppongo non si debba salvare niente, visto che ma i lo abbiamo fatto. Questo è il punto, non so simulare la gestione annuale.

Questo è il codice che sono riuscito a creare:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // Prototipi di funzioni.
  6. void decrementa_disponibilita_1(int disponibilita);
  7.  
  8. // Creazione delle STRUCT.
  9. struct bibite {
  10.     char nome[100];
  11.     int codice;
  12.     float prezzo;
  13.     int disponibilita;
  14. };
  15.  
  16. struct data {
  17.     int mese;
  18.     int giorno;
  19. };
  20.  
  21. int main()
  22. {
  23.     // Creazione del distributore.
  24.     typedef struct bibite Bibite;
  25.     Bibite array_bibite[10] = {{"Coca-Cola", 0, 0.60, 10},
  26.                               {"Sprite", 1, 0.50, 10},
  27.                               {"RedBull", 2, 1.00, 10},
  28.                               {"Burn", 3, 1.00, 10},
  29.                               {"Fanta", 4, 0.20, 10},
  30.                               {"PowerRade", 5, 1.00, 10},
  31.                               {"Energy", 6, 0.50, 10},
  32.                               {"San Pellegrino", 7, 1.00, 10},
  33.                               {"Pepsi", 8, 0.50, 10},
  34.                               {"Gatorade", 9, 1.00, 10}};
  35.  
  36.     // Scelta di una bibita da parte dell'utente.
  37.     printf("Sono presenti le seguenti bibite:\n");
  38.     int i, bibita_scelta, disponibilita;
  39.     float monete_inserite, resto;
  40.     for (i = 0; i < 10; i++) {
  41.         printf("%d - %s\n", array_bibite[i].codice, array_bibite[i].nome);
  42.     }
  43.     printf("(10)Termina la macchina.");
  44.  
  45.     while (1) {
  46.         printf("\n");
  47.         printf("Scegli una bibita (INSERISCI IL CODICE CORRISPONDENTE):\n");
  48.         scanf("%d", &bibita_scelta);
  49.  
  50.         if (bibita_scelta == 10) {
  51.             break;
  52.         }
  53.  
  54.         printf("Hai scelto di prelevare %s", array_bibite[bibita_scelta].nome);
  55.         printf("\n");
  56.         printf("Inserisci delle monete (0.10, 0.20, 0.50, 1.00):\n");
  57.         scanf("%f", &monete_inserite);
  58.         printf("\n");
  59.  
  60.         // Controllo se è possibile ricevere la bibita.
  61.         if (monete_inserite == 0.10 || monete_inserite == 0.20 || monete_inserite == 0.50 || monete_inserite == 1.00) {
  62.             if (monete_inserite < array_bibite[bibita_scelta].prezzo) {
  63.                 printf("NON HAI ABBASTANZA CREDITO PER AVERE LA BIBITA SCELTA.\n");
  64.             } else if (monete_inserite == array_bibite[bibita_scelta]. prezzo) {
  65.                 printf("STAI PER AVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  66.                 printf("(Nessun resto da dare).");
  67.             } else if (monete_inserite > array_bibite[bibita_scelta].prezzo) {
  68.                 printf("STAI PER RICEVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  69.                 resto = monete_inserite - array_bibite[bibita_scelta].prezzo;
  70.                 printf("(Resto da ricevere: %f).", resto);
  71.             }
  72.         } else {
  73.             printf("CI DISPIACE, MA LA MACCHINA ACCETTA SOLO MONETE DA 0.10, 0.20, 0.50, 1.00.");
  74.         }
  75.     }
  76.  
  77.     return 0;
  78. }
  79.  
  80. void decrementa_disponibilita_1 (int disponibilita) {
  81.     if (disponibilita == 10) {
  82.         return 1;
  83.     } else {
  84.     }
  85. }



Non saprei come continuare il programma.

Ultima modifica effettuata da WildBlood il 19/02/2015 alle 11:32
PM
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 12:12
Giovedì, 19/02/2015
ogni volta che "esce" una bibita, inserisci in un array multidimensionale (l'array della struct per capirci è dell'ala stessa cosa alla fine) data e prodotto scelto.
Se non ho capito male devi poter stampare quante bibite sono state vendute nel tale giorno, giusto?
Prevedi che scrivendo "resoconto" si attivi, al posto della procedura di rilascio della bibita, una funzione ricorsiva, la quale scorre l'array ed estrae i dati che ti servono.
Se non ricordo male vuoi sapere quanti prodotti venduti nella giornata, giusto?
Allora la funzione scorre l'array, ogni volta che incontra una vendita nella data odierna, incrementi un contatore e poi lo mandi alla console.
Era tardi ieri sera, spero di non aver tralasciato nulla.

Edit.
Chiede data e tale prodotto, quindi non basta scrivere "resoconto", bisogna che segua una read che chiede data e codice prodotto

Edit edit
Tranquillo, in ambito accademico non si fa mai grande uso di log testuali, ci si ferma a leggere e inserire qualche riga, quindi nessuna complicazione da lettura e strutturazione log

Ps
Il compito vuole una funzione ricorsiva, mi raccomando...
Non cadiamo in tentazione nell'usare cicli...

Ultima modifica effettuata da darioza il 19/02/2015 alle 12:17
PM
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 12:29
Giovedì, 19/02/2015
Testo quotato

Postato originariamente da darioza:

ogni volta che "esce" una bibita, inserisci in un array multidimensionale (l'array della struct per capirci è dell'ala stessa cosa alla fine) data e prodotto scelto.
Se non ho capito male devi poter stampare quante bibite sono state vendute nel tale giorno, giusto?
Prevedi che scrivendo "resoconto" si attivi, al posto della procedura di rilascio della bibita, una funzione ricorsiva, la quale scorre l'array ed estrae i dati che ti servono.
Se non ricordo male vuoi sapere quanti prodotti venduti nella giornata, giusto?
Allora la funzione scorre l'array, ogni volta che incontra una vendita nella data odierna, incrementi un contatore e poi lo mandi alla console.
Era tardi ieri sera, spero di non aver tralasciato nulla.

Edit.
Chiede data e tale prodotto, quindi non basta scrivere "resoconto", bisogna che segua una read che chiede data e codice prodotto

Edit edit
Tranquillo, in ambito accademico non si fa mai grande uso di log testuali, ci si ferma a leggere e inserire qualche riga, quindi nessuna complicazione da lettura e strutturazione log

Ps
Il compito vuole una funzione ricorsiva, mi raccomando...
Non cadiamo in tentazione nell'usare cicli...



Come faccio a scorrere l'array con una funzione ricorsiva ?! T.T

PM
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 13:26
Giovedì, 19/02/2015
Questo è l'intero codice che sono riuscito a creare.. Andrebbe bene ?! E poi, come faccio a creare la funzione ricorsiva che socrra l'array di struct e calcoli quante bibite sono state vendute ?!
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. // Creazione delle STRUCT.
  7. struct bibite {
  8.     char nome[100];
  9.     int codice;
  10.     float prezzo;
  11.     int disponibilita;
  12. };
  13.  
  14. struct data {
  15.     int mese;
  16.     int giorno;
  17.     int codice_prodotto;
  18. };
  19.  
  20. int main()
  21. {
  22.     // Creazione del distributore.
  23.     typedef struct bibite Bibite;
  24.     Bibite array_bibite[10] = {{"Coca-Cola", 0, 0.60, 10},
  25.                               {"Sprite", 1, 0.50, 10},
  26.                               {"RedBull", 2, 1.00, 10},
  27.                               {"Burn", 3, 1.00, 10},
  28.                               {"Fanta", 4, 0.20, 10},
  29.                               {"PowerRade", 5, 1.00, 10},
  30.                               {"Energy", 6, 0.50, 10},
  31.                               {"San Pellegrino", 7, 1.00, 10},
  32.                               {"Pepsi", 8, 0.50, 10},
  33.                               {"Gatorade", 9, 1.00, 10}};
  34.  
  35.     // Array di struct per la Data.
  36.     typedef struct data Data;
  37.     Data array_data[365];
  38.  
  39.     // Scelta di una bibita da parte dell'utente.
  40.     printf("Sono presenti le seguenti bibite:\n");
  41.  
  42.     // Dichiarazione delle variabili.
  43.     int i, bibita_scelta;
  44.     int j = 0;
  45.     float monete_inserite, resto;
  46.  
  47.     for (i = 0; i < 10; i++) {
  48.         printf("%d - %s\n", array_bibite[i].codice, array_bibite[i].nome);
  49.     }
  50.     printf("\n");
  51.     printf("(10)Termina la macchina.\n");
  52.     printf("(11)Resoconto.");
  53.  
  54.     // Trova la data di oggi.
  55.     time_t t = time(NULL);
  56.     struct tm *time;
  57.     time = localtime(&t);
  58.  
  59.     // Giorno e mese. NB: Notazione a puntatori.
  60.     int giorno = time->tm_mday;
  61.     int mese = time->tm_mon + 1;
  62.  
  63.     while (1) {
  64.         printf("\n");
  65.         printf("Scegli una bibita (INSERISCI IL CODICE CORRISPONDENTE):\n");
  66.         scanf("%d", &bibita_scelta);
  67.  
  68.         if (bibita_scelta == 10) {
  69.             break;
  70.         }
  71.  
  72.         if (bibita_scelta == 11) {
  73.             int g, m, c_p;
  74.             printf("Il giorno richiesto:\n");
  75.             scanf("%d", &g);
  76.             printf("Il mese richiesto:\n");
  77.             scanf("%d", &m);
  78.             printf("Il prodotto richiesto:\n");
  79.             scanf("%d", &c_p);
  80.             break;
  81.         }
  82.  
  83.         if (bibita_scelta != 10 && bibita_scelta != 11) {
  84.             printf("Hai scelto di prelevare %s", array_bibite[bibita_scelta].nome);
  85.             printf("\n");
  86.             printf("Inserisci delle monete (0.10, 0.20, 0.50, 1.00):\n");
  87.             scanf("%f", &monete_inserite);
  88.             printf("\n");
  89.  
  90.             // FUNZIONE RICORSIVA...
  91.         }
  92.  
  93.         // Controllo se è possibile ricevere la bibita.
  94.         if (monete_inserite == 0.10 || monete_inserite == 0.20 || monete_inserite == 0.50 || monete_inserite == 1.00) {
  95.             if (monete_inserite < array_bibite[bibita_scelta].prezzo) {
  96.                 printf("NON HAI ABBASTANZA CREDITO PER AVERE LA BIBITA SCELTA.\n");
  97.             } else if (monete_inserite == array_bibite[bibita_scelta]. prezzo) {
  98.                 printf("STAI PER AVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  99.                 printf("(Nessun resto da dare).");
  100.  
  101.                 // Inserisci la data di oggi nell'array di struct.
  102.                 array_data[j].giorno = giorno;
  103.                 array_data[j].mese = mese;
  104.                 array_data[j].codice_prodotto = bibita_scelta;
  105.                 j++;
  106.  
  107.             } else if (monete_inserite > array_bibite[bibita_scelta].prezzo) {
  108.                 printf("STAI PER RICEVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  109.                 resto = monete_inserite - array_bibite[bibita_scelta].prezzo;
  110.                 printf("(Resto da ricevere: %f).", resto);
  111.  
  112.                 // Inserisci la data di oggi nell'array di struct.
  113.                 array_data[j].giorno = giorno;
  114.                 array_data[j].mese = mese;
  115.                 array_data[j].codice_prodotto = bibita_scelta;
  116.                 j++;
  117.  
  118.             }
  119.         } else {
  120.             printf("CI DISPIACE, MA LA MACCHINA ACCETTA SOLO MONETE DA 0.10, 0.20, 0.50, 1.00.");
  121.         }
  122.     }
  123.  
  124.     return 0;
  125. }


PM
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 19:11
Giovedì, 19/02/2015
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)

PM
Pagine: [ 1 2 3 ] Precedente | Prossimo