DUBBIO SU ESERCIZIO SVOLTO

di il
26 risposte

DUBBIO SU ESERCIZIO SVOLTO

Ciao a tutti,
ho scritto questo programma

/* es:3.17 pag 83 
Programma in C che stabilisce quanto chilometri riesce a fare con un auto con 1 litro di benzina,
nel caso ci siano più valori esegue la media dei km */

#include <stdio.h>

/*inizio programma */

int main(void){
	
	float km,lt,lk,md; /*dichiaro le variabili in float */
	
	int counter=0,totlt=0,totkm=0; /*dichiaro e inizializzo le variabili contatore */
	
		
/*inizio ciclo ,fintanto che non viene inserito il valore sentinella -1 richiede di inserire i dati*/

while(lt!=-1){
		
	printf("Enter the gallons(-1 to end): ");/*richiesta di inserimento dei litri -1 per terminare*/
		scanf("%f",&lt);/*memorizzazione del valore inserito */
	
	printf("Enter the miles: ");/*richiesta di inserimento dei km percorsi */
		scanf("%f",&km);/*memorizzazione del valore inserito */
	
		totlt +=(float)lt;/*somma i litri inseriti */
		
		totkm +=(float)km;/*somma i km percorsi */
		
		counter++;/*incrementa la variabile contatore */
		
		lk=km/lt; /*divisione dei km percorsi con il pieno fatto per trovare quanti km fa con un litro di benzina */
		
	printf("The car runs %.2f km on 1 liter of gasoline\n\n",lk);/*stampa del risultato */
	}
	
	
/*fine ciclo */	

if(lt==-1){
	
	md=totkm/totlt; /*esegue la media del totale km percorsi cpn il totale dei pieni eseguiti */
	
}

printf("The your car runs on everage %.2f km on 1 liter of gasoline\n",md);/* stampa della media */



return 0;/*programma eseguito correttamente */
}

 /*fine programma */
l'esercizio chiedeva espressamente di usare un ciclo while , il programma funziona , però ho un dubbio
counter++;/*incrementa la variabile contatore */
questa variabile è realmente necessaria dato che ho già totl e totkm come contatore?

26 Risposte

  • Re: DUBBIO SU ESERCIZIO SVOLTO

    La variabile counter non viene usata da nessuna parte, quindi è assolutamente inutile.

    Inoltre

    - la variabile lt deve essere inizializzata prima di essere usata (lt=0)
    - se inserisci -1 il programma continua a chiedere dati invece di terminare
    - la media dovrebbe essere calcolata solo "nel caso ci siano più valori" ...
    - come mai le stringhe sono in inglese e si riferiscono a miglia invece che chilometri come nella richiesta (copia-incolla da altro codice?)
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Inoltre... che cos'è questo cast?
    totlt +=(float)lt;/*somma i litri inseriti */

    E poi il ciclo while non puoi usarlo con un confronto tra un float e un numero (cioè niente if float X=1 then...)

    cosa succede se inserisco sempre 0 nei kilometri percorsi?

    e cosa accade se inserisco numeri in generale negativi?
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    No oregon assolutamente nessun copia incolla , le scrivo in inglese perchè sto provando a fare pratica con questa lingua
    Immaginavo che la variabile counter non mi serviva a nulla dato che ci sono già le due variabili contatore totlt e totkm, però non ho capito perchè devo inizializzare la variabile lt a 0
    Infatti quando inserisco -1 mi chiede ancora i km (miles) forse perchè dovevo mettere le due richieste ed il calcolo anche prima del ciclo while?
    per quanto rigurda il controllo if mi serve nel caso in cui inserisco -1 calcola tutti i dati inseriti, solo che lo fa sempre e comunque e non solo se sono più dati, quindi l'errore si trova nella condizione if(lt==-1)?


    +m2+
    totlt +=(float)lt;/*somma i litri inseriti */ ----------> sarebbe questo totlt=(float)totlt+lt ,l'ho scritto così perche la variabile totlt e di tipo int mentre lt e di tipo float , e da come ho capito mi serve per asseganre un dato in float in una variabile di tipo int

    per quanto rigurada i km 0 e i numeri negativi fa sempre il calcolo , a questo non avevo pensato

    quindi alla fine il programma è tutto sbagliato?
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Gigio80 ha scritto:


    +m2+
    totlt +=(float)lt;/*somma i litri inseriti */ ----------> sarebbe questo totlt=(float)totlt+lt ,l'ho scritto così perche la variabile totlt e di tipo int mentre lt e di tipo float , e da come ho capito mi serve per asseganre un dato in float in una variabile di tipo int

    per quanto rigurada i km 0 e i numeri negativi fa sempre il calcolo , a questo non avevo pensato

    quindi alla fine il programma è tutto sbagliato?
    lt è una variabile float, è totl che è intera, quindi il cast è privo di senso.

    magari volevi usare floor, ceil o qualcosa del genere?
    e, soprattutto, perchè (cioè perchè vuoi mantenere il totale intero, invece che float)?
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    .. è si... il programma è "tutto sbagliato", ma tranquillo, capita a tutti quando si è principianti
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Totlt è una variabile contatore , l'idea era quella fintanto che non viene digitato -1 assegna a totlt la somma di tutti gli lt inseriti, pensavo dato che è una variabile contatore doveva essere int non poteva contenere un valore float, ma ora che me lo hai fatto notare non serve , come non mi serve avere una variabile contatore giusto?

    Quindi come faccio a dire al programma di fare la somma solo quando ci sono più dati il controllo if mi serve giusto? Ho capito che devo aggiungere anche altri controlli nel caso in cui si inseriscano valori negati o 0, per quanto riguarda se inserisco 0 so come fare a dirgli dato errato, ma per quanto riguarda che non deve inserire nessun valore negativo come faccio a dargli questa condizione?
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Gigio80 ha scritto:


    No oregon assolutamente nessun copia incolla , le scrivo in inglese perchè sto provando a fare pratica con questa lingua
    Avresti dovuto usare kilometres e non miles dato che non sono cose uguali in inglese ...

    Te l'ho chiesto perché il codice che hai proposto, modificato, ma compreso di "counter" è in questa discussione

    http://www.techimo.com/forum/webmastering-programming/59112-there-any-mistake-my-programme.html

    e mi sembrava "molto" strano che tu l'avessi scritto esattamente come quello ...
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Caspita che "tanata"
    per inciso il counter viene utilizzato per discriminare i casi in cui non viene inserito alcun dato.
    ad ogni modo anche il programma originale del 2003 è pessimo
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Guarda le stringe le ho scritte come nell'esempio dell'output dell'esercizio
    Allegati:
    21657_28314ae4a57378a5018fae82827d0980.jpg
    21657_28314ae4a57378a5018fae82827d0980.jpg
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Vabbè dai ma counter non c'azzecca, hai cercato su google ed hai trovato proprio il programmelo da cui il tizio ha preso ispirazione
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Non è così , mi sono basato su quello che spiega sul ciclo while e dal suo esempio
    Cattura.JPG
    Cattura.JPG

    ho riscritto il codice , questa volta con le stringhe in italiano magari faccio meno confusione così, e non capisco perchè se gli dico di controllare che non vengano inseriti i valori negati e gli 0 perchè non mi stampa i messaggi che gli ho inserito nelle istruzioni qando metto sia lo 0 che un valore negativo?

    perchè quando inserisco -1 mi chiede ancora di inserire i km e poi si interrompe il programma?
    perchè mi calcola e stampa sempre e comunque l'ultimo if?
    
    * es:3.17 pag 83 
    Programma in C che stabilisci quanto un auto chilometri riesce a fare con un litro di benzina,
    nel caso ci siano più valori esegue la media */
    
    #include <stdio.h>
    
    /*inizio programma */
    
    int main(void){
    	
    
    float lt,km,totlt,totkm,ris,md;/*dichiaro le variabili in float */
    
    printf("Inserisci i litri(-1 per terminare): ");/*richiedo all'utente di inserire il dato richiesto */
    	scanf("%f",&lt);/*memorizzo il dato nella variabile lt */
    	
    printf("Inserisci i chilometri: ");/*richiedo all'utente di inserire il dato richiesto */
    	scanf("%f",&km);/*memorizzo il dato nella variabile km*/
    	
    ris=km/lt;/*assegno alla variabile ris il risultato della divisione */
    	printf("La tua auto percorre %.2f Km con 1 litro di benzina\n\n",ris);/*stampo il risultato */
    	
    if(lt==0){
    	/*controllo che non venga inserito lo 0 comne valore nella variabile lt */
    	printf("Il dato inserito per i litri non puo' essere 0\n");
    	
    	printf("Inserisci i litri(-1 per terminare): ");/*richiedo all'utente di reinserire il dato richiesto */
    		scanf("%f",&lt);/*memorizzo il dato nella variabile lt */
    		
    }
    
    else if(km==0){
    	
    	/*controllo che non vemga inserito lo 0 nella variabile km*/
    	printf("Il dato inserito per i Km non puo' essere 0\n");
    	
    	printf("Inserisci i chilometri: ");/*richiedo all'utente di reinserire il dato richiesto */
    		scanf("%f",&km);/*memorizzo il dato nella variabile km*/
    }
    
    else if(lt==-lt){
    	/*controllo che non venga inserito un valore negativo comne valore nella variabile lt */
    	printf("Il dato inserito per i litri non puo' essere negativo\n");
    	
    	printf("Inserisci i litri(-1 per terminare): ");/*richiedo all'utente di reinserire il dato richiesto */
    		scanf("%f",&lt);/*memorizzo il dato nella variabile lt */
    }
    
    else if(km==-km){
    	
    	/*controllo che non vemga inserito un valore negativo nella variabile km*/
    	printf("Il dato inserito per i Km non puo' essere negativo\n");
    	
    	printf("Inserisci i chilometri: ");/*richiedo all'utente di reinserire il dato richiesto */
    		scanf("%f",&km);/*memorizzo il dato nella variabile km*/
    }
    
    	lt=0;/*inizializzo la variabile lt a 0 per il ciclo while*/
    	
    /*inizio ciclo while*/
    
    while(lt!=-1){/*fintanto che non verrà inserito il valore sentinella -1 continua a richiedere i dati */
    	
    printf("Inserisci i litri(-1 per terminare): ");
    	scanf("%f",&lt);
    
    printf("Inserisci i chilometri: ");
    	scanf("%f",&km);
    
    	
    ris=km/lt;
    
    	printf("La tua auto percorre %.2f Km con 1 litro di benzina\n",ris);
    	
    	totlt +=lt;/*assegno alla variabile totlt la somma dei litri inseriti */
    	totkm +=km;/*assegno alla variabile totkm la somma dei km inseriti */
    	
    	
    }
    
    
    if(lt==-1){
    	/*se l'utente ha inserito il valore sentinella */
    	md=totkm/totlt;/*assegno alla variabile md la somma dei lt inseriti e la somma dei km per trovare la media */
    			printf("In base al totale dei pieni eseguiti ed il totale dei km percorsi,");
    			printf("mediamente la tua auto percorre %.2f km con 1 litro di benzina",md);/*stampo la media */	
    }
    
    return 0;/*programma eseguito correttamente*/
    
    
    }
    
     /*fine programma */
     
    
    
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Perché non dovrebbe andare avanti? Quando controlla il -1 secondo te?
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    A livello didattico
    
    #include <stdio.h>
    
    
    int main(void)
    {
    	float lt,km,totlt,totkm;
    	unsigned int quanti;
    	
    	totlt=0;
    	totkm=0;
    	quanti=0;
       
    	while(1)
    	{
    		quanti++;
    		printf("Rifornimento nr. %.03d Inserisci i litri(-1 per terminare): ",quanti);
    		scanf("%f",&lt);
    		if (lt<0)
    		{
    			break;
    		}
    		
    		printf("Rifornimento nr. %.03d Inserisci i chilometri (-1 termina): ",quanti);
    		scanf("%f",&km);
    		if (km<0)
    		{
    			break;
    		}
    
    		if (km>0)
    		{
    			printf("La tua auto percorre %.2f Km con 1 litro di benzina\n\n",km/lt);
       			totlt +=lt;
    			totkm +=km;
    		}
    	}
    	if (totlt>0)
    	{
    			printf("In %d rifornimenti hai consumanto %.2f litri percorrendo %.2f km,\n",quanti,totlt,totkm);
    			printf("mediamente la tua auto percorre %.2f km con 1 litro di benzina",totkm/totlt); 
    			return 0;
    	}
    	else
    			return 1;
    }
    
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Adesso ci sarebbe da discutere su cosa succede se inserisci "pippo" invece che una distanza, ma è un'altra storia
Devi accedere o registrarti per scrivere nel forum
26 risposte