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++ - Errore nella logica del programma?
Forum - C/C++ - Errore nella logica del programma?

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:06
Lunedì, 04/01/2010
Ciao. Dovrei svolgere il seguente esercizio:

Ho la temperatura media e la temperatura del giorno per ogni mese dell'anno. Devo stampare a video il numero di giorni che hanno temperatura maggiore della temperatura media del relativo mese.

Io ho creato una struttura con due campi: tempmedia (che contiene la temperatura media del mese) e tempgiorno[31] (un vettore che contiene le temperature di ogni singolo giorno del mese, supponendo che ogni mese sia di 31 giorni, per semplicità). A questo punto una volta istanziata la struttura, creo un vettore della struttura: temperatura tempmese[12]. Inserisco i dati con due cicli for annidati e calcolo la temperatura media... in seguito cerco di leggere i dati contenuti nel vettore e se la temperatura del giorno è maggiore della temperatura media, allora incremento un contatore... ma sembra che il contatore non conti poi così bene... che errore ho commesso? Grazie in anticipo.

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. #define DAYS 31
  5. #define MONTHS 12
  6.  
  7. typedef struct {
  8.     float tempmedia;
  9.     float tempgiorno[DAYS];
  10. }temperatura;
  11.  
  12. main()
  13. {
  14.     temperatura tempmese[MONTHS];
  15.     int i, j, w=0;
  16.     float temptot=0;
  17.  
  18.     for(i=0; i<MONTHS; i++)
  19.     {
  20.         for(j=0; j<DAYS; j++)
  21.         {
  22.             printf("Inserire la temperatura del giorno %d del mese %d: ", j, i);
  23.             scanf("%f", &tempmese[i].tempgiorno[j]);
  24.             temptot+=tempmese[i].tempgiorno[j];
  25.         }
  26.         tempmese[i].tempmedia=temptot/DAYS;
  27.     }
  28.    
  29.     for(i=0; i<MONTHS; i++)
  30.     {
  31.         for(j=0; j<DAYS; j++)
  32.         {
  33.             if(tempmese[i].tempgiorno[j]>tempmese[i].tempmedia)
  34.                 w++;
  35.         }
  36.         printf("\nI giorni con temperatura maggiore rispetto alla media del mese sono: %d\n", w);
  37.     }
  38.  
  39.     printf("\n");
  40.    
  41.     system("pause");
  42.     return 0;
  43. }



Per far delle prove ho assegnato a DAYS il valore 4 e a mese il valore 2...

Ultima modifica effettuata da Astaroth il 04/01/2010 alle 23:44
PM Quote
Avatar
Zonzo (Ex-Member)
Rookie


Messaggi: 34
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 0:03
Martedì, 05/01/2010
Codice efficiente e devo dire corretto e leggibile.
Però ti sei scordato una piccola formalità che ti ha causato grossi problemi, e devo dire che capita con una certa frequenza durante la prima fase di sviluppo di molti programmi   (a volte anche i miei :D).
Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. #define DAYS 31
  5. #define MONTHS 12
  6.  
  7. typedef struct {
  8.     float tempmedia;
  9.     float tempgiorno[DAYS];
  10. }temperatura;
  11.  
  12. main()
  13. {
  14.     temperatura tempmese[MONTHS];
  15.     int i, j, w;
  16.     float temptot;
  17.  
  18.     for(i=0; i<MONTHS; i++)
  19.     {  
  20.         temptot=0; //Azzera il contatore prima di effettuare il ciclo nidificato
  21.         for(j=0; j<DAYS; j++)
  22.         {
  23.             printf("Inserire la temperatura del giorno %d del mese %d: ", j+1, i+1);
  24.             scanf("%f", &tempmese[i].tempgiorno[j]);
  25.             temptot+=tempmese[i].tempgiorno[j];
  26.         }
  27.         tempmese[i].tempmedia=temptot/DAYS;
  28.     }
  29.      
  30.     for(i=0; i<MONTHS; i++)
  31.     {  
  32.         w=0; //Azzera il contatore prima di effettuare il ciclo nidificato
  33.         for(j=0; j<DAYS; j++)
  34.         {
  35.             if(tempmese[i].tempgiorno[j]>tempmese[i].tempmedia)
  36.                 w++;
  37.         }
  38.         printf("\nI giorni con temperatura maggiore rispetto alla media del mese sono: %d\n", w);
  39.     }
  40.  
  41.     printf("\n");
  42.      
  43.     system("pause");
  44.     return 0;
  45. }



Basta azzerare i contatori che utilizzi nei tuoi sotto-cicli.
Altrimenti la media non sarà calcolata per i soli valori del mese specifico, ma sarà una somma di tutti i mesi, vale lo stesso discorso anche per il conteggio dei giorni con temperatura maggiore alla media mensile.

Ultima modifica effettuata da Zonzo il 05/01/2010 alle 0:07
PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:57
Martedì, 05/01/2010
Uh che sbadato! :-| Grazie mille! :k: Non avendo per il momento la possibilità di eseguire il debug ho pensato che il problema fosse un altro e mi sono incaponito sul vettore di struttura... :rofl:

Ma se al posto dei numeri dei mesi volessi scrivere i nomi "Gennaio", "Febbraio", ecc., c'è un modo per sostituire un numero con una determinata stringa?

Ultima modifica effettuata da Astaroth il 05/01/2010 alle 11:07
PM Quote
Avatar
riccardobucco (Ex-Member)
Newbie


Messaggi: 15
Iscritto: 29/12/2009

Segnala al moderatore
Postato alle 11:38
Martedì, 05/01/2010
Testo quotato

Postato originariamente da Astaroth:
Ma se al posto dei numeri dei mesi volessi scrivere i nomi "Gennaio", "Febbraio", ecc., c'è un modo per sostituire un numero con una determinata stringa?



beh, fatti una funzione che, dato in input un numero che vada da 1 a 12 (x), restitutisca il nome del mese corrispondente (y) no?

Molto banalmente (forse sbagliando, del C conosco molto poco anche le basi):

Codice sorgente - presumibilmente VB.NET

  1. if(x==1) char y[]= "gennaio" else
  2.   if (x==2) then char y[]= "febbraio" else
  3.     if (x==3) then char y[]= "marzo" else
  4.       ...
  5.         ...
  6.           ...


PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:58
Martedì, 05/01/2010
Sì, hai ragione, grazie. Forse con uno switch?

Ultima modifica effettuata da Astaroth il 05/01/2010 alle 12:09
PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:32
Martedì, 05/01/2010
Questa volta devo scrivere una funzione che visualizzi le vocali comprese tra due caratteri inseriti dall'utente e il loro numero. Se i caratteri non sono inseriti nell'ordine corretto (ad esempio se 'z' è inserito prima di 'a'), la funzione restituisce il valore -1. Se dovessi inserire due caratteri separati da uno spazio, come dovrei modificare il codice?

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int Vocali(char c1, char c2);
  5.  
  6. main()
  7. {
  8.     char car1, car2;
  9.     int voc;
  10.    
  11.     printf("Inserire due caratteri separati da spazio: ");
  12.     scanf("%c%c", &car1, &car2);
  13.    
  14.     voc=Vocali(car1, car2);
  15.    
  16.     printf("\nIl numero di vocali tra i due caratteri e': %d", voc);
  17.    
  18.     printf("\n");
  19.    
  20.     system("pause");
  21.     return 0;  
  22. }
  23.  
  24. int Vocali(char c1, char c2)
  25. {
  26.     int dif=c2-c1;
  27.     int i;
  28.     int v=0;
  29.    
  30.     if(dif>0)
  31.     {
  32.         for(i=0; i<dif; i++)
  33.         {
  34.             if(c1=='a' || c1=='e' || c1=='i' || c1=='o' || c1=='u' || c1=='A' || c1=='E' || c1=='I' || c1=='O' || c1=='U')
  35.             {
  36.                 printf("%c", c1);
  37.                
  38.                 v++;
  39.             }c1++;
  40.                
  41.         }
  42.         return v;
  43.     }
  44.     else
  45.         return -1;
  46. }


Ultima modifica effettuata da Astaroth il 05/01/2010 alle 13:05
PM Quote
Avatar
Zonzo (Ex-Member)
Rookie


Messaggi: 34
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 12:33
Martedì, 05/01/2010
Secondo me invece di uno switch o una cascata di if, sarebbe più corretto e più veloce dichiararsi un vettore di stringhe con i nomi dei mesi.

Così:

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. #define DAYS 31
  5. #define MONTHS 12
  6.  
  7. typedef struct {
  8.     float tempmedia;
  9.     float tempgiorno[DAYS];
  10. }temperatura;
  11.  
  12. main()
  13. {
  14.     temperatura tempmese[MONTHS];
  15.     int i, j, w;
  16.     float temptot;
  17.     char *Mesi[] = {"Gennaio\0",
  18.                     "Febbraio\0",
  19.                     "Marzo\0",
  20.                     "Aprile\0"
  21.                     "Maggio\0"
  22.                     "Giugno\0"
  23.                     "Luglio\0"
  24.                     "Agosto\0"
  25.                     "Settembre\0"
  26.                     "Ottobre\0"
  27.                     "Novembre\0"
  28.                     "Dicembre\0"};
  29.  
  30.     for(i=0; i<MONTHS; i++)
  31.     {  
  32.         temptot=0;
  33.         for(j=0; j<DAYS; j++)
  34.         {
  35.             printf("Inserire la temperatura del %d %s: ", j+1, Mesi[i]);
  36.             scanf("%f", &tempmese[i].tempgiorno[j]);
  37.             temptot+=tempmese[i].tempgiorno[j];
  38.         }
  39.         tempmese[i].tempmedia=temptot/DAYS;
  40.     }
  41.    
  42.     for(i=0; i<MONTHS; i++)
  43.     {  
  44.         w=0;
  45.         for(j=0; j<DAYS; j++)
  46.         {
  47.             if(tempmese[i].tempgiorno[j]>tempmese[i].tempmedia)
  48.                 w++;
  49.         }
  50.         printf("\nI giorni con temperatura maggiore rispetto alla media del mese sono: %d\n", w);
  51.     }
  52.  
  53.     printf("\n");
  54.    
  55.     system("pause");
  56.     return 0;
  57. }


PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:35
Martedì, 05/01/2010
Testo quotato

Postato originariamente da Zonzo:

Secondo me invece di uno switch o una cascata di if, sarebbe più corretto e più veloce dichiararsi un vettore di stringhe con i nomi dei mesi.



Grazie mille! :D

Nel post precedente ho inserito un altro quesito... ho scoperto proprio pochi istanti fa che il codice è corretto. Scusa se approfitto della tua disponibilità, ma lo spazio è considerato come un carattere... se volessi inserire i due caratteri separati da uno spazio, come dovrei modificare la funzione? Grazie ancora!

Ultima modifica effettuata da Astaroth il 05/01/2010 alle 13:03
PM Quote
Avatar
riccardobucco (Ex-Member)
Newbie


Messaggi: 15
Iscritto: 29/12/2009

Segnala al moderatore
Postato alle 13:51
Martedì, 05/01/2010
Testo quotato

Postato originariamente da Astaroth:

Questa volta devo scrivere una funzione che visualizzi le vocali comprese tra due caratteri inseriti dall'utente e il loro numero. Se i caratteri non sono inseriti nell'ordine corretto (ad esempio se 'z' è inserito prima di 'a'), la funzione restituisce il valore -1. Se dovessi inserire due caratteri separati da uno spazio, come dovrei modificare il codice?

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int Vocali(char c1, char c2);
  5.  
  6. main()
  7. {
  8.     char car1, car2;
  9.     int voc;
  10.    
  11.     printf("Inserire due caratteri separati da spazio: ");
  12.     scanf("%c%c", &car1, &car2);
  13.    
  14.     voc=Vocali(car1, car2);
  15.    
  16.     printf("\nIl numero di vocali tra i due caratteri e': %d", voc);
  17.    
  18.     printf("\n");
  19.    
  20.     system("pause");
  21.     return 0;  
  22. }
  23.  
  24. int Vocali(char c1, char c2)
  25. {
  26.     int dif=c2-c1;
  27.     int i;
  28.     int v=0;
  29.    
  30.     if(dif>0)
  31.     {
  32.         for(i=0; i<dif; i++)
  33.         {
  34.             if(c1=='a' || c1=='e' || c1=='i' || c1=='o' || c1=='u' || c1=='A' || c1=='E' || c1=='I' || c1=='O' || c1=='U')
  35.             {
  36.                 printf("%c", c1);
  37.                
  38.                 v++;
  39.             }c1++;
  40.                
  41.         }
  42.         return v;
  43.     }
  44.     else
  45.         return -1;
  46. }




allora, il tuo programma dovrebbe funzionare correttamente solo se i caratteri che tu inserisci in input non sono separati da uno spazio (giusto, no?).
ad es:
input "bf"
output "1" (corretto)

input "b f"
output "-1" (errato)

quindi o ti adegui a scrivere i due caratteri senza separarli dallo spazio altrimenti, invece di leggere in input due caratteri come hai fatto tu
Codice sorgente - presumibilmente Plain Text

  1. printf("Inserire due caratteri separati da spazio: ");
  2. scanf("%c%c", &car1, &car2);


ne leggi tre (il secondo, quello intermedio, è lo spazio). quindi:
Codice sorgente - presumibilmente Plain Text

  1. printf("Inserire due caratteri separati da spazio: ");
  2. scanf("%c%c%c", &car1, &car2, &car3);



il programma risulterà quindi questo (basta sostituire car3 a car2):
Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int Vocali(char c1, char c2);
  5.  
  6. main()
  7. {
  8.     char car1, car2, car3;
  9.     int voc;
  10.    
  11.     printf("Inserire due caratteri separati da spazio: ");
  12.     scanf("%c%c%c", &car1, &car2, &car3);
  13.    
  14.     voc=Vocali(car1, car3);
  15.    
  16.     printf("\nIl numero di vocali tra i due caratteri e': %d", voc);
  17.    
  18.     printf("\n");
  19.    
  20.     system("pause");
  21.     return 0;  
  22. }
  23.  
  24. int Vocali(char c1, char c2)
  25. {
  26.     int dif=c2-c1;
  27.     int i;
  28.     int v=0;
  29.    
  30.     if(dif>0)
  31.     {
  32.         for(i=0; i<dif; i++)
  33.         {
  34.             if(c1=='a' || c1=='e' || c1=='i' || c1=='o' || c1=='u' || c1=='A' || c1=='E' || c1=='I' || c1=='O' || c1=='U')
  35.             {
  36.                 printf("%c", c1);
  37.                
  38.                 v++;
  39.             }c1++;
  40.                
  41.         }
  42.         return v;
  43.     }
  44.     else
  45.         return -1;
  46. }



PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo