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 4

Pagine: [ 1 2 3 4 5 6 7 8 9 ] Precedente | Prossimo
Avatar
Joker22 (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/02/2016

Segnala al moderatore
Postato alle 17:59
Giovedì, 11/02/2016
Codice sorgente - presumibilmente C++

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



Ho fatto questo , ma è sbagliato ..
sto da 1 settimana , il primo l'ho finto in 1 giorno ...
non ce la faccio più ...

se potete completare il codice con il procedimento giusto , mi fate un favore ..

Altrimenti , grazie lo stesso per l'aiuto che mi avete dato . Ho apprezzato molto i vostri consigli , ma purtroppo l'impegno l'ho esaurito per la teoria e l'altro progetto :_doubt:

PM
Avatar
Joker22 (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/02/2016

Segnala al moderatore
Postato alle 19:04
Giovedì, 11/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 == 10) {
  66.             printf("Operazioni eseguite: %d", j);
  67.             break;
  68.         }
  69.  
  70.         if (bibita_scelta == 11) {
  71.             int giorno_1, codice_1;
  72.             printf("Il giorno richiesto:\n");
  73.             scanf("%d", &giorno_1);
  74.             printf("Il prodotto richiesto:\n");
  75.             scanf("%d", &codice_1);
  76.             break;
  77.         }
  78.  
  79.         if (bibita_scelta != 10 && bibita_scelta != 11) {
  80.             printf("Hai scelto di prelevare %s", array_bibite[bibita_scelta].nome);
  81.             printf("\n");
  82.             printf("Inserisci delle monete (0.10, 0.20, 0.50, 1.00):\n");
  83.             scanf("%f", &monete_inserite);
  84.             printf("\n");
  85.         }
  86.        
  87.  
  88.         // Controllo se h possibile ricevere la bibita.
  89.         if (monete_inserite == 0.10f || monete_inserite == 0.20f || monete_inserite == 0.50 || monete_inserite == 1.00)
  90.                 {
  91.             if (monete_inserite < array_bibite[bibita_scelta].prezzo)
  92.                         {
  93.                 printf("NON HAI ABBASTANZA CREDITO PER AVERE LA BIBITA SCELTA.\n");
  94.             }
  95.                         if (monete_inserite == array_bibite[bibita_scelta]. prezzo)
  96.                         {
  97.                 printf("STAI PER AVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  98.                 printf("(Nessun resto da dare).");
  99.             }
  100.                         if (monete_inserite > array_bibite[bibita_scelta].prezzo)
  101.                         {
  102.                 printf("STAI PER RICEVERE LA BIBITA SCELTA.\nGRAZIE.\n");
  103.                 resto = monete_inserite - array_bibite[bibita_scelta].prezzo;
  104.                                 printf("(Resto da ricevere: %f).", resto);
  105.  
  106.  
  107.                                 venditaS v;
  108.                                 v.bibita = bibita_scelta;
  109.  
  110.                                 time_t rawtime;
  111.                                 struct tm * timeinfo;
  112.                                 char buffer[80];
  113.  
  114.                                 time(&rawtime);
  115.                                 timeinfo = localtime(&rawtime);
  116.  
  117.                                 strftime(buffer, 80, "Now it's %I:%M%p.", timeinfo);
  118.                                 puts(buffer);
  119.                                
  120.                                 v.giorno = timeinfo->tm_mday;
  121.                                 v.mese = timeinfo->tm_mon;
  122.                                 v.anno = timeinfo->tm_year;
  123.                        
  124.                                 elenco_vendite[numero_vendite] = v;
  125.                                 numero_vendite++;
  126.             }
  127.         }
  128.                 else  
  129.                 {
  130.                         printf("CI DISPIACE, MA LA MACCHINA ACCETTA SOLO MONETE DA 0.10, 0.20, 0.50, 1.00.");
  131.         }
  132.                
  133.     }    
  134.  
  135.     return 0;
  136. }
  137.  
  138.  
  139. int posizione = 0;
  140.  
  141. int trova_vendite(bibita, giorno, mese, anno, contatore, posizione)
  142. {
  143.  
  144.         if (posizione > numero_vendite)
  145.         {
  146.                
  147.                 return contatore;
  148.         }
  149.  
  150.         venditaS v = elenco_vendite[posizione];
  151.  
  152.         if (v.bibita == bibita
  153.                 && v.giorno == giorno
  154.                 && v.mese == mese
  155.                 && v.anno == anno) {
  156.                 contatore++;
  157.         }
  158.         trova_vendite(bibita, giorno, mese, anno, contatore, posizione + 1);
  159.  
  160.         return;
  161. }




Perché non funziona il Resoconto ? :_doubt::_doubt::_doubt:

PM
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 21:50
Giovedì, 11/02/2016
Il codice presenta vari punti migliorabili ed è molto disordinato... per questo ti sei dimenticato di richiamare la funzione di ricerca vendite :rofl:

Ma vediamo i problemi uno alla volta, così capisci bene cosa puoi migliorare del tuo codice:


1 - Tu hai definito, in fondo al file, una funzione trova_vendite, ma all'inizio del file non hai messo il suo prototype: come potrà mai il main() richiamare la tua funzione?


2 - RIGHE 70-77: hai dimenticato di richiamare la succitata funzione trova_vendite per farle cercare le vendite che ti interessano. Inoltre, hai dimenticato di richiedere all'utente anche l'input dell'anno e del mese


3 - RIGA 79: te l'ho già fatto notare prima: se io metto in input al tuo programma il numero - per esempio - 12, che non è effettivamente valido, nessuno me lo farà notare, perchè tu verifichi solo se è diverso da 10 e 11, non se è MINORE DI 10.


4 - RIGHE 89-133: tutto questo codice dovrebbe essere dentro l'if che inizia alla riga 79, perchè riguarda quello specifico caso: che ci fa fuori di lì?


5 - RIGA 139: quella variabile dichiarata come globale in mezzo al file è praticamente inutile: sarebbe dovuta essere nel main(), poco prima della chiamata alla funzione che non hai messo (e he ho evidenziato al punto 2)

6 - RIGA 144: la disuguaglianza non deve essere stretta: il ciclo si deve fermare per posizione >= numero_vendite, altrimenti valuterà una cella del vettore in più rispetto a quelle effettivamente usate.

7 - RIGA 160: la funzione è di tipo int, quindi deve ritornare qualcosa.

8 - OVUNQUE: stai scrivendo in C, non in C++: le variabili si dichiarano all'inizio delle funzioni, non dove capita. Inoltre, ti consiglierei di valutare bene il campo di visibilità dei tuoi dati: alle righe 26-28, per esempio, dichiari due variabili globali che potrebbero tranquillamente essere inserite nel main e passate all'altra funzione solo quando necessario. Nulla ti obbliga a non metterle lì fuori, beninteso... solo, personalmente eviterei le variabili globali quando non necessarie: si prestano a troppi errori e/o modifiche involontarie, soprattutto se gestite da persone poco esperte e poco organizzate :rotfl:


Ultima modifica effettuata da Template il 11/02/2016 alle 21:54
PM
Avatar
Joker22 (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/02/2016

Segnala al moderatore
Postato alle 22:12
Giovedì, 11/02/2016
Solo una cosa ...
la chiamata alla funzione l'ho messa nel file .h
Questo è solo il main ... cambia qualcosa nella tua analisi ?

Per quanto riguarda gli altri errori , credimi , non c'ho capito nulla . Probabilmente pesa il fatto che sto sveglio da ieri mattina alle 10 , e ho lavorato su questo programma e sulla teoria non stop fino a poco fa (tranne 2 ore di sonno oggi pomeriggio) ...
Domani mattina rileggo tutto , e vedo se riesco a capirci qualcosa in più .

Buona notte e di nuovo grazie :k:

PM
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 22:56
Giovedì, 11/02/2016
Dovresti mostrarmelo, questo file .h, almeno per farmi capire com'è organizzato il programma... sicuramente la mia analisi non cambierà di molto (tutto quanto ti ho scritto vale comunque), ma almeno avrò un'idea più precisa di cosa tu stia facendo

Ultima modifica effettuata da Template il 11/02/2016 alle 22:56
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:47
Venerdì, 12/02/2016
La chiamata si fa nel file .c non nel .h. Forse intendevi la dichiarazione.

In ogni caso nel .c manca anche l'include di cui parli e negli argomenti dichiarati nella funzione scrivi +1 evidentemente sbagliando


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 16:48
Venerdì, 12/02/2016
Caro ho riletto tutto ...

Qualcosa sono riuscito ad aggiustare ... ma altro no ...

ad esempio ho trasformato quella riga che dovrebbe leggere i codice da inserire così :

Codice sorgente - presumibilmente C/C++

  1. if (bibita_scelta < 10 && bibita_scelta != 10 && bibita_scelta != 11 )



Naturalmente non va ...

Sarebbe davvero una grande cosa se correggessi questo codice con la tua saggezza ... :k::k::k:

Hai detto bene ... sono un programmatore inesperto ... e anche un po pigro :_doubt:


Magari se non vuoi correggere gli errori .. almeno potresti ordinare il codice ...

Ad esempio , perché nonostante io abbia inserito la procedura per il calcolo della data , non esce ? Nemmeno per inserimento ...

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


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 17:32
Venerdì, 12/02/2016
Non posso postarti il codice corretto, perchè andrei contro i tuoi interessi (se lo faccio io, tu non impari niente)... il massimo che posso fare è prendere ciò che hai scritto e proporti un modo per ordinarlo:


Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.     #include <string.h>
  4.     #include <time.h>
  5.     #define MAX_VENDITE 1000
  6.      
  7.          
  8.          /*Qui definisci i tipi struct*/
  9.     struct vendita {
  10.             int bibita;
  11.             int giorno;
  12.             int mese;
  13.             int anno;
  14.     };
  15.      
  16.     /*..............*/
  17.      
  18.          
  19.          /*Qui dichiari le variabili globali*/
  20.          /*..........*/
  21.      
  22.     int main()
  23.     {
  24.             /*Qui metti tutte le dichiarazioni delle variabili locali*/
  25.         typedef struct bibite Bibite;
  26.         Bibite array_bibite[10] = {{"Sprite", 0, 0.50, 10},
  27.                                   {"Acqua", 1, 0.30, 10},
  28.                                   {"RedBull", 2, 1.00, 10},
  29.                                   {"The-Pesca", 3, 0.50, 10},
  30.                                   {"Fanta", 4, 0.40, 10},
  31.                                   {"PowerRade", 5, 1.00, 10},
  32.                                   {"Energy", 6, 0.50, 10},
  33.                                   {"The-Limone", 7, 0.50, 10},
  34.                                   {"Pepsi", 8, 0.50, 10},
  35.                                   {"Gatorade", 9, 1.00, 10}};
  36.      
  37.        /*....................*/
  38.            
  39.            /*Da qui in poi implementi la procedura di scelta attività*/
  40.         printf("Sono presenti le seguenti bibite:\n");
  41.      
  42.         for (i = 0; i < 10; i++) {
  43.             printf("%d - %s\n", array_bibite[i].codice, array_bibite[i].nome);
  44.         }
  45.         printf("\n");
  46.         printf("(10)Termina la macchina.\n");
  47.         printf("(11)Resoconto.");
  48.        
  49.                 /*.................................*/
  50.          
  51.          
  52.          
  53.         return 0;
  54.     }
  55.      
  56.     int trova_vendite(bibita, giorno, mese, anno, contatore, posizione)
  57.     {
  58.           /*Qui ovviamente metti tutta la funzione trova_vendite*/
  59.     }





Detto questo, provo ancora ad aiutarti a correggere il codice (anche se, onestamente, sto iniziando a pensare che non mi ascolti: ti ho dato tutti i consigli possibili! Ah, a proposito: sto ancora aspettando il codice del famoso .h)...
Vediamo di capirci: il tuo main deve fare queste cose:

- Stampa del menu della macchinetta
- Selezione dell'attività in base alla scelta dell'utente:
  - Scelta = 10: resoconto
     - Lettura della data e della bibita inserite dall'utente
     - Richiamo della funzione di ricerca
     - Stampa del risultato
  - Scelta = 11: uscita
  - Scelta < 10: selezione di una bibita
     - Ricerca della bibita
     - Lettura dell'importo inserito dall'utente
        - Se è minore del costo della bibita, segnalazione
        - Altrimenti, erogazione della bibita
           - Se l'importo inserito è maggiore, erogazione anche del resto
     - Registrazione della transazione


Sei in grado di convertire questo schema in C? Se si, allora ti ho praticamente scritto mezzo programma :k:

Per la funzione ricorsiva, invece, il discorso è un attimo più complesso: di fatto, per implementare una ricorsione "ben formata" occorre definire da subito se la tua funzione deve elaborare una transazione qualsiasi oppure ricercare la prima transazione utile non ancora conteggiata. Poniamo che debba fare la prima cosa, che è più intuitiva da scrivere: in questo caso, la tua funzione deve fare queste cose:

- Verifica se sei ad una posizione superiore o uguale al numero di transazioni (e dunque, se hai già analizzato tutti i dati)
   - Se lo sei, puoi ritornare il risultato
   - Altrimenti:
      - Data la posizione cui sei arrvato:
         - Se in quella posizione nel vettore delle transazioni c'è un dato che ti interessa, incrementa il contatore
         - Ricorri sulla posizione successiva


Ecco tutto. Il tuo programma non deve fare altro: ti basta convertire questo schema semplicissimo in C, per avere ciò che ti serve.

Comunque, sarei curioso di sapere cosa trattate a lezione e come lo trattate: di fatto, tu stai avendo difficoltà a scrivere un codice che (funzione ricorsiva a parte) è oltre il limite del banale... due sono le cose: o il tuo docente vi ha "catapultati" nella programmazione in C senza prima istruirvi adeguatamente circa le basi della programmazione e dello specifico linguaggio, oppure tu stai sbagliando completamente approccio alla materia.
Non lo dico per insultarti o demoralizzarti: visto il tuo ultimo post, ho ritenuto doveroso da parte mia metterti a parte di questa riflessione, per il bene delle tue competenze e, probabilmente, del tuo percorso universitario.

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