Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Progetto Distributore in C
Forum - C/C++ - Progetto Distributore in C - Pagina 6

Pagine: [ 1 2 3 4 5 6 7 8 9 ] Precedente | Prossimo
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 19:43
Venerdì, 12/02/2016
Testo quotato

Postato originariamente da Joker22:
Però con quello che mi hai scritto , il problema mi sembra più chiaro .



Quello che ti ho scritto è, di fatto, l'esempio di una cosa che dovresti tenere sempre a mente: per scrivere un programma, occorre anzitutto sapere COSA il programma dovrà fare e COME (in senso meramente algoritmico, indipendentemente dallo specifico linguaggio di programmazione che userai) dovrà farlo.
Detto questo, sfrutta quello schemino che ti ho fatto per sistemare il programma, applicando magari i consigli che io e Nessuno ti abbiamo a più riprese fornito ;) E, possibilmente, non farlo in un futuro troppo lontano: va bene la pigrizia, ma noi qui i consigli mica te li diamo tanto per scrivere ;)



Testo quotato

Postato originariamente da Joker22:
non riesco a scrivere la funzione ricorsiva ...



Chi sa perchè, me lo aspettavo  :rofl:

C'è un motivo per cui ti ho posto la domanda indiretta (alla quale, a proposito, mi piacerebbe avere una risposta se non ti dispiace):

Testo quotato

Postato originariamente da Template:

sarei curioso di sapere cosa trattate a lezione e come lo trattate




Ed è il seguente: la ricorsione, è estremamente più facile da apprendere se correttamente illustrata ed attentamente studiata. Bene, io ho la sensazione che almeno una di queste due componenti sia, nel tuo caso, venuta a mancare... nell'attesa di avere la tua risposta e capire quale, comunque, mi unisco alla preghiera di Nessuno: METTI 'STA CACCHIO DI CHIAMATA ALLA FUNZIONE RICORSIVA NEL PUNTO OPPORTUNO DEL MAIN, che senza quella non vai da nessuna parte in ogni caso.:rofl:

Ultima modifica effettuata da Template il 12/02/2016 alle 19:44
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:56
Venerdì, 12/02/2016
Testo quotato

Postato originariamente da Template:
mi unisco alla preghiera di Nessuno: METTI 'STA CACCHIO DI CHIAMATA ALLA FUNZIONE RICORSIVA NEL PUNTO OPPORTUNO DEL MAIN, che senza quella non vai da nessuna parte in ogni caso.:rofl:



Attento a non essere estremamente sgarbato ... :asd:


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM
Avatar
Joker22 (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/02/2016

Segnala al moderatore
Postato alle 2:33
Sabato, 13/02/2016
Raga chiedo umilmente scusa ad entrambi .
A Nessuno per come l'ho trattato , ad entrambi perchè vi sto facendo perdere un sacco di tempo e , penso , vi sto facendo anche incazzare :_doubt:
sti ultimi giorni si stati complicati ...

Comunque adesso sto ultimando veramente il progetto .. ho inserito la chiamata a funzione , e ho risolto il problema dell'inserimento dei numeri >11 .. in più il codice è più ordinato .

Domani mattina ve lo mando completo .

:k:

PM
Avatar
Joker22 (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/02/2016

Segnala al moderatore
Postato alle 4:11
Sabato, 13/02/2016
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6.  
  7. #define MAX_VENDITE 1000
  8.  
  9. struct vendita {
  10.         int bibita;
  11.         int giorno;
  12.         int mese;
  13.         int anno;
  14. };
  15.  
  16. // Struct Bibite
  17. struct bibite {
  18.     char nome[100];
  19.     int codice;
  20.     float prezzo;
  21.     int disponibilita;
  22. };
  23.  
  24. typedef struct vendita venditaS;
  25.  
  26. venditaS elenco_vendite[MAX_VENDITE];
  27.  
  28. int numero_vendite = 0;
  29.  
  30. int main()
  31. {
  32.     // Distributore.
  33.     typedef struct bibite Bibite;
  34.     Bibite array_bibite[10] = {{"Sprite", 0, 0.50, 10},
  35.                               {"Acqua", 1, 0.30, 10},
  36.                               {"RedBull", 2, 1.00, 10},
  37.                               {"The-Pesca", 3, 0.50, 10},
  38.                               {"Fanta", 4, 0.40, 10},
  39.                               {"PowerRade", 5, 1.00, 10},
  40.                               {"Energy", 6, 0.50, 10},
  41.                               {"The-Limone", 7, 0.50, 10},
  42.                               {"Pepsi", 8, 0.50, 10},
  43.                               {"Gatorade", 9, 1.00, 10}};
  44.  
  45.  
  46.     printf("Sono presenti le seguenti bibite:\n");
  47.  
  48.     // Dichiaro variabili.
  49.     float monete_inserite, resto;
  50.     int i, bibita_scelta;
  51.     int j = 0;
  52.  
  53.     for (i = 0; i < 10; i++) {
  54.         printf("%d - %s\n", array_bibite[i].codice, array_bibite[i].nome);
  55.     }
  56.     printf("\n");
  57.     printf("(10)Termina la macchina.\n");
  58.     printf("(11)Resoconto.");
  59.  
  60.     while (1) {
  61.         printf("\n");
  62.         printf("Scegli una bibita (INSERISCI IL CODICE CORRISPONDENTE):\n");
  63.         scanf("%d", &bibita_scelta);
  64.  
  65.         if (bibita_scelta > 11) {
  66.         printf("Non hai inserito un codice corrispondente ad una bibita. \n");
  67.         break;
  68.     }
  69.  
  70.  
  71.         if (bibita_scelta == 10) {
  72.             printf("Operazioni eseguite: %d", j);
  73.             break;
  74.         }
  75.  
  76.         if (bibita_scelta == 11) {
  77.             int giorno_1, codice_1;
  78.             printf("Il giorno richiesto:\n");
  79.             scanf("%d", &giorno_1);
  80.             printf("Il prodotto richiesto:\n");
  81.             scanf("%d", &codice_1);
  82.             trova_vendita(trova_vendite(bibita, giorno, mese, anno, contatore, posizione)
  83.             break;
  84.         }
  85.  
  86.  
  87.             if (bibita_scelta < 10) {
  88.             printf("Hai scelto di prelevare %s", array_bibite[bibita_scelta].nome);
  89.             printf("\n");
  90.             printf("Inserisci delle monete (0.10, 0.20, 0.50, 1.00):\n");
  91.             scanf("%f", &monete_inserite);
  92.             printf("\n");
  93.         }
  94.  
  95.           // Controllo se h possibile ricevere la bibita.
  96.         if (monete_inserite == 0.10f || monete_inserite == 0.20f || monete_inserite == 0.50 || monete_inserite == 1.00)
  97.                 {
  98.             if (monete_inserite < array_bibite[bibita_scelta].prezzo)
  99.                         {
  100.                 printf("NON HAI ABBASTANZA CREDITO PER AVERE LA BIBITA SCELTA.\n");
  101.             }
  102.                         if (monete_inserite == array_bibite[bibita_scelta]. prezzo)
  103.                         {
  104.                 printf("STAI PER AVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  105.                 printf("(Nessun resto da dare).");
  106.             }
  107.                         if (monete_inserite > array_bibite[bibita_scelta].prezzo)
  108.                         {
  109.                 printf("STAI PER RICEVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  110.                 resto = monete_inserite - array_bibite[bibita_scelta].prezzo;
  111.                                 printf("(Resto da ricevere: %f).", resto);
  112.  
  113.  
  114.                                 venditaS v;
  115.                                 v.bibita = bibita_scelta;
  116.  
  117.                                 time_t rawtime;
  118.                                 struct tm * timeinfo;
  119.                                 char buffer[80];
  120.  
  121.                                 time(&rawtime);
  122.                                 timeinfo = localtime(&rawtime);
  123.  
  124.                                 strftime(buffer, 80, "Now it's %I:%M%p.", timeinfo);
  125.                                 puts(buffer);
  126.  
  127.                                 v.giorno = timeinfo->tm_mday;
  128.                                 v.mese = timeinfo->tm_mon;
  129.                                 v.anno = timeinfo->tm_year;
  130.  
  131.                                 elenco_vendite[numero_vendite] = v;
  132.                                 numero_vendite++;
  133.             }
  134.         }
  135.                 if (monete_inserite != 0.10f && monete_inserite != 0.20f && monete_inserite != 0.50 && monete_inserite != 1.00)
  136.                 {
  137.                         printf("CI DISPIACE, MA LA MACCHINA ACCETTA SOLO MONETE DA 0.10, 0.20, 0.50, 1.00.");
  138.         }
  139.  
  140.     }
  141.  
  142.     return 0;
  143. }



Questo è il Main .

La Function la metto in un file a parte , che ancora devo ultimare .

Penso che in questo non ci siano più problemi ... forse è ancora un po troppo disordinato ?

Comunque adesso che mi sono applicato seriamente , ho capito una cosa...
non è tanto la difficoltà nel creare la funzione ricorsiva ... il mio reale problema è che non ho capito cosa deve fare questa funzione ricorsiva ... e non ho capito nemmeno il comando "Resoconto" che deve fare ...
Penso che senza capire queste due cose , sarà sempre difficile ultimare questo progetto .

Miei cari , se riuscite a farmi ultimare sto progetto  ... quando vi trovate a passare per Napoli , vi porto a mangiare una grande pizza :k:




Ultima modifica effettuata da Joker22 il 13/02/2016 alle 12:19
PM
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 10:27
Sabato, 13/02/2016
Il codice non è ancora perfetto, ma già  è molto meglio :k:

Intanto, hai dimenticato di mettere le istruzioni per registrare la transazione nel caso in cui non ci sia resto da dare... avresti dovustro scrivere così:

Codice sorgente - presumibilmente C/C++

  1. if (monete_inserite == array_bibite[bibita_scelta]. prezzo)
  2.                         {
  3.                 printf("STAI PER AVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  4.                 printf("(Nessun resto da dare).");
  5. venditaS v;
  6.                                 v.bibita = bibita_scelta;
  7.  
  8.                                 time_t rawtime;
  9.                                 struct tm * timeinfo;
  10.                                 char buffer[80];
  11.  
  12.                                 time(&rawtime);
  13.                                 timeinfo = localtime(&rawtime);
  14.  
  15.                                 strftime(buffer, 80, "Now it's %I:%M%p.", timeinfo);
  16.                                 puts(buffer);
  17.  
  18.                                 v.giorno = timeinfo->tm_mday;
  19.                                 v.mese = timeinfo->tm_mon;
  20.                                 v.anno = timeinfo->tm_year;
  21.  
  22.                                 elenco_vendite[numero_vendite] = v;
  23.                                 numero_vendite++;
  24.             }
  25.                         if (monete_inserite > array_bibite[bibita_scelta].prezzo)
  26.                         {
  27.                 printf("STAI PER RICEVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  28.                 resto = monete_inserite - array_bibite[bibita_scelta].prezzo;
  29.                                 printf("(Resto da ricevere: %f).", resto);
  30.  
  31.  
  32.                                 venditaS v;
  33.                                 v.bibita = bibita_scelta;
  34.  
  35.                                 time_t rawtime;
  36.                                 struct tm * timeinfo;
  37.                                 char buffer[80];
  38.  
  39.                                 time(&rawtime);
  40.                                 timeinfo = localtime(&rawtime);
  41.  
  42.                                 strftime(buffer, 80, "Now it's %I:%M%p.", timeinfo);
  43.                                 puts(buffer);
  44.  
  45.                                 v.giorno = timeinfo->tm_mday;
  46.                                 v.mese = timeinfo->tm_mon;
  47.                                 v.anno = timeinfo->tm_year;
  48.  
  49.                                 elenco_vendite[numero_vendite] = v;
  50.                                 numero_vendite++;
  51.             }
  52.         }
  53.     }
  54.  
  55.         }



Altrimenti, il tuo programma registrerà solo le transazioni nell'ambito delle quali ha dovuto rilasciare il resto.

Inoltre, ti ribadisco un dettaglio importante: stai scrivendo codice C, quindi LE VARIABILI VANNO DICHIARATE TUTTE AD INIZIO FUNZIONE. Variabili dichiarate in mezzo alla funzione (ce n'è una pure nel pezzo di codice qui sopra) non sono ammissibili in C (e tra l'altro rendono disordinato il codice).





Ora, andiamo alla funzione ricorsiva:

Testo quotato


La Function la metto in un file a parte , che ancora devo ultimare .



Per il momento, lascia stare la suddivisione del programma su più files, che ti fa solo perdere tempo: devi scrivere DUE funzioni, non venti, quindi puoi tranquillamente metterle nello stesso file.

Per quanto riguarda i principi alla base della progettazione della funzione, ci sono alcuni aspetti "base" da considerare (che il vostro professore dovrebbe avervi fatto almeno intendere... tra parentesi, ma dove studi?):

Definire cosa fa la funzione: una funzione ricorsiva può fare sostanzialmente due cose, nell'ambito della costruzione incrementale di una soluzione: selezionare un dato (aggiungendolo alla soluzione) o definire il ruolo di un dato. Mi spiego meglio: la tua funzione può, ad esempio, fare una di queste due cose:

- Scorrere l'array delle vendite fino a trovarne una valida, dunque aggiornare il contatore ed infine effettuare la chiamata ricorsiva
- Assegnata una posizione, definire se il dato in quella posizione è valido (e se lo è, aggiornare il contatore) e dopo effettuare la chiamata ricorsiva


Definire dove sono i suoi dati: la funzione ricorsiva avrà bisogno di alcuni dati comuni a tutte le istanze: il vettore delle vendite, il contatore... bene, occorre definire il campo di visibilità di questi dati:

- Puoi porli come dati globali, in modo che siano visibili a tutte le istanze della funzione
- Puoi inserirli dentro la funzione main(), come dati locali, e passarli alla funzione ricorsiva insieme ai parametri

In generale, si preferisce la seconda via (anche se nessuno vieta di usare la prima).


Vagliati questi punti fondamentali, sei di fatto pronto per costruire la tua funzione. ;)

Ora, mi pare chiaro che il vostro professore non vi abbia mai mostrato una funzione ricorsiva sviluppata decentemente (altrimenti, non saremmo qui a discutere di queste cose), quindi ti propongo io una soluzione... è una cosa che non mi piace affatto, perchè c'è il rischio che tu la prenda per buona senza capirci nulla, ma se proprio non hai mai visto una funzione ricorsiva mi sa che non ci sono molte alternative...

Allora, poniamo di voler scrivere una funzione che implementi la "seconda scelta" per entrambi gli aspetti precedentemente visti. Ecco cosa faremo:

- Definiremo il prototype della funzione come (lo scrivo in maniera "discorsiva": i tipi di dato poi ce li metti tu):
Codice sorgente - presumibilmente C/C++

  1. void trova_vendite(data, bibita, elenco_vendite, numero_vendite, *contatore, posizione);



- All'inizio del main definiremo (INSIEME A TUTTE LE ALTRE, perchè non ci devono essere dichiarazioni in mezzo alla funzione) le variabili:

Codice sorgente - presumibilmente C/C++

  1. venditaS elenco_vendite[MAX_VENDITE];
  2. int numero_vendite = 0;
  3. int contatore = 0;



- Richiameremo la funzione dal main() così:

Codice sorgente - presumibilmente Plain Text

  1. trova_vendite(data, bibita, elenco_vendite, numero_vendite, &contatore, 0);




- E la funzione sarà implementata così:

Codice sorgente - presumibilmente C/C++

  1. void trova_vendite (data, bibita, elenco_vendite, numero_vendite, *contatore, posizione)
  2. {
  3. void trova()
  4. {
  5.         if(posizione >= numero_vendite)
  6.                 return;
  7.                
  8.         if(elenco_vendite[posizione].data == data && elenco_vendite[posizione].bibita == bibita)
  9.                 (*contatore)++;
  10.        
  11.         trova_vendite(data, bibita, elenco_vendite, numero_vendite, *contatore, posizione + 1);
  12.         return;
  13. }




Ok, ora analizziamo 'sta funzione:
- Il primo if è la condizione di terminazione: analizzato tutto il vettore, non abbiamo più elementi da considerare e quindi possiamo tornare indietro.
- Il secondo if è il lavoro "vero e proprio" della funzione: assegnata la posizione, verifica se il dato è valido, e se lo è aggiorna il contatore.
- Le righe successive sono di fatto la chiamata ricorsiva e il return.


Bene, ma come lavora?
Cerco di fartelo capire con uno schema:

PASSO1 (posizione = 0): funzione richiamata dal main, analizza il dato in posizione 0 e poi effettua la chiamata ricorsiva incrementando nel frattempo la posizione -> PASSO 2 (posizione = 1): analizza il dato in posizione 1 e poi effettua la chiamata ricorsiva incrementando nel frattempo la posizione -> PASSO 3 (posizione = 2): analizza il dato in posizione 2 e poi effettua la chiamata ricorsiva incrementando nel frattempo la posizione ->...->PASSO NUMERO_VENDITE + 1 (posizione = numero_vendite): essendo vera la condizione del primo if, la funzione si chiude subito, tornando a quella che l'aveva chiamata -> PASSO NUMERO_VENDITE + 2 (posizione = numero_vendite - 1): dopo la chiamata ricorsiva (che è stata completata), c'è solo l'istruzione di return, dunque ritorna alla sua chiamante->PASSO NUMERO_VENDITE + 3 (posizione = numero_vedite - 2): idem come sopra->...->ULTIMO PASSO: siamo tornati alla prima istanza della funzione ricorsiva, e anche qui rimane da eseguire solo l'istruzione di return, e dunque torniamo nel main().

Tutto chiaro? ;)
Lo so che non è molto intuitivo, se non ci si è abituati... ma meglio di così non posso proprio fare :D

Tra parentesi, ritengo che possa esserti utile l'acquisto del testo "Ricorsione e problem solving" di Cabodi-Camurati-Pasini-Patti-Vendraminetto. Si tratta di un libriccino (meno di 200 pagine al costo di circa 16-17€) molto interessante, che spiega benissimo i concetti base della ricorsione ed è ricco di esempi molto utili.

Ultima modifica effettuata da Template il 13/02/2016 alle 10:33
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:14
Sabato, 13/02/2016
Togli il numero di telefono dal forum pubblico...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM
Avatar
Joker22 (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/02/2016

Segnala al moderatore
Postato alle 15:50
Sabato, 13/02/2016
E questo era ?? :_doubt:

Mi sono incartato su una scemità lo sapevo ...

Quindi adesso devo solo inserire le variabili che ho usato io ..
poi dovrebbe funzionare giusto ?
Per vedere se il Resoconto funziona , devo simulare delle vendite di un prodotto , poi scelgo il codice 11 , inserisco la data di oggi , e dovrebbe dirmi quante ne sono state vendute ... è corretto ?


Comunque non come ringraziarti davvero !!! :k::k:

PM
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 16:49
Sabato, 13/02/2016
Testo quotato

Postato originariamente da Joker22:

E questo era ?? :_doubt:

Mi sono incartato su una scemità lo sapevo ...



Lo so, sono cose banali... dopo che qualcuno ti mostra la soluzione :rotfl:


Testo quotato

Postato originariamente da Joker22:
Quindi adesso devo solo inserire le variabili che ho usato io ..
poi dovrebbe funzionare giusto ?



La risposta è si, ma non è questo il punto... ciò che conta è che tu capisca i punti essenziali di quello che ti ho spiegato. :_doubt:
Scrivendoti la soluzione (cosa che - guarda gli altri topics in questa sezione se non ci credi - io cerco di fare il meno possibile), ti ho dato fiducia: ora non deludermi e studia bene ciò che devi ;)


Testo quotato

Postato originariamente da Joker22:
Per vedere se il Resoconto funziona , devo simulare delle vendite di un prodotto , poi scelgo il codice 11 , inserisco la data di oggi , e dovrebbe dirmi quante ne sono state vendute ... è corretto ?  



Il programma è tuo, quindi se non lo sai tu... :om:
Così come hai scritto dovrebbe (OVVIAMENTE) funzionare.


Ah, quasi dimenticavo: ovviamente, mi aspetto di vedere quanto prima tutto il codice FUNZIONANTE E SCRITTO BENE (quindi, privo di tutti quegli errori che ti abbiamo segnalato in oltre sei pagine di topic) ;)

Ultima modifica effettuata da Template il 13/02/2016 alle 16:52
PM
Pagine: [ 1 2 3 4 5 6 7 8 9 ] Precedente | Prossimo