Correzione esercizio

di Anonimizzato11128 il
16 risposte
Ciao a tutti, volevo sapere se ho svolto questo esercizio in modo corretto, al momento sono arrivato a studiare solamente if,if-else e while.
il programma fa la media dei km che percorre un auto con i lt di benzina inseriti, se vengono inseriti più litri quando venie inserito il valore sentinella -1 fa la media globale.

io ho scritto questo:

/*PROGRAMMA CHE CALCOLA MEDIA DEI KM PERCORSI CON I LITRI EFFETTUATI,ALL'INSERIMENTO DEL VALORE SENTINELLA CALCOLA LA MEDIA TOTALE*/

#include <stdio.h>

/*inizio del programma*/
int main(void){
	
	int km,cont;/*dichiarazione delle variabili intere*/
	float lt,media1,media2,tot;/*dichiarazione delle variabili a virgola mobile*/
	
	lt=0;/*inizializzazione della variabile per il ciclo vhile*/
	cont=0;/*inizializzazione della variabile contatore*/
	
		printf("Inserisci i litri riforniti -1 per terminare: ");/*richiesta di inserimento del dato*/
			scanf("%f",&lt);/*memorizzazione del dato nella variabile lt*/
if(lt==0){
		
		printf("Dato non corretto\n");
		 printf("Inserisci i litri riforniti -1 per terminare: ");
			scanf("%f",&lt);
	}
	
	
	/*inizio ciclo while,fintanto che non verrà inserito il valore sentinella continua a chiedere di inserire i dati*/

	while(lt!=-1){
	
	cont++;	/*incremento della variabile contatore*/
	printf("Inserisci i km percorsi: ");/*richiesta di inserimento dei km*/
		scanf("%d",&km);/*memorizzazione del dato*/
			
	media1=(float)km/lt;/*calcolo della media */
	printf("Con %.2f lt riforniti, la tua auto percorrre mediamente %.03f km\n",lt,media1);/*stampa del risultato*/
	
	media2=media2+media1;/*assegnamento del risultato per la media globale*/
    
    
    printf("Inserisci i litri riforniti -1 per terminare: ");
			scanf("%f",&lt);

	}

/*fine del ciclo while*/


if(lt==-1)
	if(cont>2)
{
		tot=media2/cont;
		printf("Con %d lt di rifornimenti effettuati , la tua auto ha percorso mediamente %.3f km\n",cont,tot);
	
	
}

else
	printf("Hai scelto -1 per terminare il programma");
	
	return 0;
	
}

grazie mille in anticipo

16 Risposte

  • Questo pezzo di codice:
        printf("Inserisci i litri riforniti -1 per terminare: ");
             scanf("%f",&lt);
    
    perchè lo ripeti 3 volte? 2 volte all'inizio e una alla fine del ciclo; inoltre nel primo caso, all'inizio, testi che non venga inserito 0 mentre negli altri 2 casi accetti che venga inserito 0.
    Dovresti impostare il tuo ciclo in maniera tale che tale dato venga richiesto solo in 1 punto, all'inizio del ciclo e in quel punto vengano fatti tutti gli eventuali controlli.
    Infine, in questo caso il valore lo potresti accettare solo se è > 0.1f e uscire in caso contrario.
  • Vediamo se ho capito bene
    
    /*PROGRAMMA CHE CALCOLA MEDIA DEI KM PERCORSI CON I LITRI EFFETTUATI,ALL'INSERIMENTO DEL VALORE SENTINELLA CALCOLA LA MEDIA TOTALE*/
    
    #include <stdio.h>
    
    /*inizio del programma*/
    int main(void){
    	
    	int km,cont;/*dichiarazione delle variabili intere*/
    	float lt,media1,media2,tot;/*dichiarazione delle variabili a virgola mobile*/
    	
    	lt=0.1;/*inizializzazione della variabile per il ciclo vhile*/
    	cont=0;/*inizializzazione della variabile contatore*/
    	
    
    
    	
    	
    	/*inizio ciclo while,fintanto che non verrà inserito il valore sentinella continua a chiedere di inserire i dati*/
    
    	while(lt!=-1){
    	
    		printf("Inserisci i litri riforniti -1 per terminare: ");/*richiesta di inserimento del dato*/
    			scanf("%f",&lt);/*memorizzazione del dato nella variabile lt*/
    if(lt>0.1){
    			
    	printf("Inserisci i km percorsi: ");/*richiesta di inserimento dei km*/
    		scanf("%d",&km);/*memorizzazione del dato*/
    			
    	media1=(float)km/lt;/*calcolo della media */
    	printf("Con %.2f lt riforniti, la tua auto percorrre mediamente %.03f km\n",lt,media1);/*stampa del risultato*/
    	
    	media2=media2+media1;/*assegnamento del risultato per la media globale*/
    	cont++;	/*incremento della variabile contatore*/
    }
    
    else if(lt==0)
    	printf("Dato non corretto\n");
      
      }
    
    /*fine del ciclo while*/
    
    if(lt==-1)
    	if(cont>1)
    		{
    		tot=media2/cont;
    		printf("Con %d rifornimenti effettuati , la tua auto ha percorso mediamente %.3f km\n",cont,tot);
    	
    	
    		}
    
    	return 0;
    	
    }
    
    
    
    così come ti sembra?
  • Ok, ti suggerisco però di indentare bene il codice altrimenti è davvero difficile da leggere!
    Magari potresti uscire dal ciclo se uno inserisce un valore < 0.0f...
    Ora però guarda come calcoli la media (questa è matematica...): se io inserisco 10 lt e percorro 100 km e poi inserisco di nuovo 2 lt e percorro 10 km quale dovrebbe essere la media calcolata, 7,500 km/lt come calcoli tu oppure 9,167 km/lt? (spero di non essermi confuso io con i calcoli )
  • A me da 7,500, quindi l'errore si trova qui
    tot=media2/cont; 
    giusto?

    la media globale dovrebbe essere calcolata con la somma della media dei km per ogni rifonimento diviso con la somma dei rifornimenti effettuati giusto?
  • Anzi no mi sbaglio ancora , è la somma dei km totali diviso la somma dei lt totali, ora los crivo
  • la media globale dovrebbe essere calcolata con la somma della media dei km per ogni rifonimento diviso con la somma dei rifornimenti effettuati giusto?
    Dipende da cosa intendi per media totale:
    - un automobilista ti direbbe che si deve basare sul totale dei km e sul totale dei litri
    - un venditore di auto ti direbbe 7,5 km/l per dimostrarti che consumi troppo e devi cambiare auto
  • Ora sto andando in confusione, la media globale intendo in base alla media dei km e dei lt effettuati quanto globalmente consuma
  • Nota di servizio: evita i confronti con variabili float del tipo UGUALE a qualcosa, o DIVERSO da qualcosa.
    Utilizza MAGGIOREUGUALE a qualcosa (o MINOREUGUALE)
  • Grazie mille a tutti e due per l'aiuto , ho corretto il programma , e adesso come risultato mi da 9.167, alla faccia del venditore ;P

    +m2+ ho cambiato i confronti come da tuo suggerimento , l'unica pecca che quando inserisco il valore sentinella -1 mi stampa dato non corretto e termina il programma , il messaggio dato non corretto lo vorrei solo nel caso in cui inserisco 0 o 0.0, e non quando inserisco -1 per terminare il programma .

    Come posso fare?
    
    /*PROGRAMMA CHE CALCOLA MEDIA DEI KM PERCORSI CON I LITRI EFFETTUATI,ALL'INSERIMENTO DEL VALORE SENTINELLA CALCOLA LA MEDIA TOTALE*/
    
    #include <stdio.h>
    
    /*inizio del programma*/
    int main(void){
    	
    	int km,cont;/*dichiarazione delle variabili intere*/
    	float lt,lt2,media1,media2,tot;/*dichiarazione delle variabili a virgola mobile*/
    	
    	lt=0.1;/*inizializzazione della variabile per il ciclo vhile*/
    	cont=0;/*inizializzazione della variabile contatore*/
    	
    
    
    	
    	
    	/*inizio ciclo while,fintanto che non verrà inserito il valore sentinella continua a chiedere di inserire i dati*/
    
    	while(lt>-1){
    	
    		printf("Inserisci i litri riforniti -1 per terminare: ");/*richiesta di inserimento del dato*/
    			scanf("%f",&lt);/*memorizzazione del dato nella variabile lt*/
    if(lt>0.1){
    			
    	printf("Inserisci i km percorsi: ");/*richiesta di inserimento dei km*/
    		scanf("%d",&km);/*memorizzazione del dato*/
    			
    	media1=(float)km/lt;/*calcolo della media */
    	printf("Con %.2f lt riforniti, la tua auto percorrre mediamente %.03f km/1lt\n",lt,media1);/*stampa del risultato*/
    	
    	media2=media2+km;/*assegnamento del totale dei km effettuati per la media globale*/
    	lt2=lt2+lt;/*assegnamento del totale dei lt effettuati per la media globale*/
    	cont++;	/*incremento della variabile contatore*/
    }
    
    else if(lt<=0)/*se inserisci il numero 0 stampa dato non corretto*/
    		 if(lt<=0.0)/*se inserisci il numero 0.0 stampa dato non corretto*/
    	printf("Dato non corretto\n");/*stampa messaggio di errore*/
      
      }
    
    /*fine del ciclo while*/
    
    if(lt<=-1)/*se inserisci il valore sentinella il programma termina e stampa il messaggio */
    	if(cont>1)/*se sono stati inseriti più rifornimenti calcola la media globale dei consumi*/
    		{
    		tot=media2/lt2;/*calcolo della media globale dei consumi(somma dei km effettuati diviso la somma dei lt rifoniti)*/
    		printf("Con %d rifornimenti effettuati hai iserito un totale %.3f lt di carburante , la tua auto percorre mediamente %.3f km/1lt\n",cont,lt2,tot);/*stampa del risultato*/
    		
    		}
    	printf("Programma terminato");/*stampa messaggio di fine programma*/
    	
    	return 0;/*programma eseguito correttamente*/
    	
    }
    
  • Considerazioni:
    - dovresti indentare il codice (te lo già chiesto prima) altrimenti diventa difficile capire e seguirti
    - dovresti dare dei nomi significativi (es. chi direbbe mai che in media2 c'è una somma?)
    - per il contatore di km potresti usare un int
    - perchè fai due volte la if qui:
    else if(lt<=0)/*se inserisci il numero 0 stampa dato non corretto*/
           if(lt<=0.0)/*se inserisci il numero 0.0 stampa dato non corretto*/
       printf("Dato non corretto\n");/*stampa messaggio di errore*/
    A parte tutte queste cose, perchè non esci da ciclo semplicemente quando ti viene inserito un valore < 0.0?
  • Scusami , ma così non è identato il codice? mi fai un esempio ?
    per il resto correggo il codice cambiando i nomi ed eliminado quell'if inutile

    nel frattempo ti ringrazio dell'aiuto e della pazienza
  • Scusa la franchezza, ma non c'è bisogno di saper programmare per capire che
        while(lt>-1) {
            printf("Inserisci i litri riforniti -1 per terminare: ");/*richiesta di inserimento del dato*/
            scanf("%f",&lt);/*memorizzazione del dato nella variabile lt*/
       
            if(lt>0.1) {
                printf("Inserisci i km percorsi: ");/*richiesta di inserimento dei km*/
                scanf("%d",&km);/*memorizzazione del dato*/
    è meglio di
       while(lt>-1){
       
          printf("Inserisci i litri riforniti -1 per terminare: ");/*richiesta di inserimento del dato*/
             scanf("%f",&lt);/*memorizzazione del dato nella variabile lt*/
    if(lt>0.1){
             
       printf("Inserisci i km percorsi: ");/*richiesta di inserimento dei km*/
          scanf("%d",&km);/*memorizzazione del dato*/
  • Ora ho capito per cosa intendi identare , io avevo capito che dovevo scrivere meglio i commenti
  • "Indentare" (e non "identare") non me lo sono inventato, vedi
Devi accedere o registrarti per scrivere nel forum
16 risposte