Correzione esercizio

di il
16 risposte

Correzione esercizio

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

  • Re: Correzione esercizio

    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.
  • Re: Correzione esercizio

    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?
  • Re: Correzione esercizio

    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 )
  • Re: Correzione esercizio

    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?
  • Re: Correzione esercizio

    Anzi no mi sbaglio ancora , è la somma dei km totali diviso la somma dei lt totali, ora los crivo
  • Re: Correzione esercizio

    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
  • Re: Correzione esercizio

    Ora sto andando in confusione, la media globale intendo in base alla media dei km e dei lt effettuati quanto globalmente consuma
  • Re: Correzione esercizio

    Nota di servizio: evita i confronti con variabili float del tipo UGUALE a qualcosa, o DIVERSO da qualcosa.
    Utilizza MAGGIOREUGUALE a qualcosa (o MINOREUGUALE)
  • Re: Correzione esercizio

    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*/
    	
    }
    
  • Re: Correzione esercizio

    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?
  • Re: Correzione esercizio

    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
  • Re: Correzione esercizio

    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*/
  • Re: Correzione esercizio

    Ora ho capito per cosa intendi identare , io avevo capito che dovevo scrivere meglio i commenti
  • Re: Correzione esercizio

    "Indentare" (e non "identare") non me lo sono inventato, vedi
Devi accedere o registrarti per scrivere nel forum
16 risposte