DUBBIO SU ESERCIZIO SVOLTO

di il
26 risposte

26 Risposte - Pagina 2

  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Ciao +m2+ grazie mille per l'aiuto e scusami se ti rispondo solo ora

    alcune cose che hai insertito non le conosco(unsigned int quanti,break), non avevo capito che potevo inserire un controllo if nel ciclo while, comunque ho riscritto nuovamente il codice , fa tutto quello che deve fare correttamente , però mi stampa sempre e comunque la media
    
    /* es 3.17 pag 83 programma che calcola i chilometri che riesce a fare un auto con 1 litro di benzina, se sono inseriti più valori ne calcola la media */
    
    #include <stdio.h>
    
    /*inizio del programma */
    
    int main(void){
    	
    	float lt,km,ris,totlt,totkm,md;/*dichiaro le variabili*/
    	int counter;/*dichiaro una variabile contatore*/
    	
    	totlt=0;/*inizializzo la variabile a */
    	totkm=0;/*inizializzo la variabile a */
    	counter=0;/*inizializzo la variabile a */
    	
    	/*fintanto che la variabile lt sarà diversa da -1 richiedi di inserire i dati*/
    	while(lt!=-1){
    		
    		counter++;/*incremento la variabile counter che mi servirà nel caso in cui vengano inseriti più dati*/
    			printf("Inserisci il nr. %d di rifornimento: ",counter);/*richiesta di inserimento lt*/
    				scanf("%f",&lt);/*memorizzazione del valore inserito nella variabile lt*/
    				
         if(lt<=0) /*controllo che il valore inserito nella variabile lt non sia  uguale o minore di 0*/
    		printf("Errore il dato per il rifornimento inserito non e' corretto\n\n");/*stampa messaggio di errore*/
    		
    
    		else if(lt!=-1){/*controllo che non sia stato inserito il valore sentinella per l'interruzione del programma*/
    		
    		printf("Inserisci i chilometri: ");/*se il controllo risulta vero proseguo con richiedere i dati dei chilometri percorsi*/
    			scanf("%f",&km);/*memorizzo il valore nella variabile km*/
    		
    	 if(km<=0)/*controllo che non vengano inseriti valori negativi o ugulia 0 pnella variabile km*/
    		printf("Errore il dato per i chilometri inserito non e' corretto\n\n");/*se risulta vero stampa messaggio di errore*/
    	
    		ris=km/lt;/*calcolo ed assegno alla variabile ris il risultato della divisione dei dui valori*/
    			printf("La tua auto percorre %.2f km con 1 litro di benzina \n",ris);/*stampo il risultato*/
    		
    		totlt+=lt;/*sommo ed assegno alla variabile totolt i valori inseriti per il rifornimento*/
    		totkm+=km;/*sommo ed assegno alla variabile totkm i valori inseriti per i chilometri percorsi*/
    	}
    	
    	
    	
    	}
    	/*fine ciclo while */
    	
    	if(counter>0){/*controllo che la variabile counter sia maggiore di 0 , se risulta vero vuol dire che sono stati messi più valori */
    		
    		md=totkm/totlt;/*calcolo ed assegno alla variabile md il risultato della media dei km e dei lt */
    			printf("La tua automobile percorre mediamente %.2f km con 1 litro di benzina\n",md);/*stampo il risultato*/
    
    	}
    	
    	
    	return 0;	/*programma eseguito correttamente*/
    	
    	
    }
    
    /*fine programma*/
    
    
    il motivo l'ho capito che si trova nel controllo if(counter>0), ma non so come risolverlo
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Dovresti controllare quando diventa >1

    if(counter>1)
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Oregon ho cambiato if come mi hai detto, ma ad ogni modo se inserisco un solo valore per i litri ed uno per i chilometri e poi digito -1 , il programma termina ma comunque mi stampa il risultato della variabile ris,lo stesso lo fa anche se provo a mettere if(totlt>1) e if(totlt>1), posso provare a mettere un else if(counter<1) printf("Non sono stati ineriti più valori"),che ne dici? in tanto provo

    grazie mille per il suggerimento
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Niente da fare,

    quello che vorrei fare io e , quando inserisco -1 termina il programma senza che mi stampi questo
     md=totkm/totlt;/*calcolo ed assegno alla variabile md il risultato della media dei km e dei lt */
             printf("La tua automobile percorre mediamente %.2f km con 1 litro di benzina\n",md);/*stampo il risultato*/
    
    invece quando digito -1 il programma termina , ma li dentro ci finisce il risultato di ris
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Ci sono riuscito
    
    /* es 3.17 pag 83 programma che calcola i chilometri che riesce a fare un auto con 1 litro di benzina, se sono inseriti più valori ne calcola la media */
    
    #include <stdio.h>
    
    /*inizio del programma */
    
    int main(void){
    	
    	float lt,km,ris,totlt,totkm,md;/*dichiaro le variabili*/
    	int counter,counter2;/*dichiaro due variabili contatore*/
    	
    	totlt=0;/*inizializzo la variabile a 0*/
    	totkm=0;/*inizializzo la variabile a 0*/
    	counter=0;/*inizializzo la variabile a 0*/
    	counter2=0;/*inizializzo la variabile a 0*/
    	/*fintanto che la variabile lt sarà diversa da -1 richiedi di inserire i dati*/
    	while(lt!=-1){
    		
    		counter++;/*incremento la variabile counter */
    			printf("Inserisci il nr. %d di rifornimento(-1 per terminare): ",counter);/*richiesta di inserimento lt*/
    				scanf("%f",&lt);/*memorizzazione del valore inserito nella variabile lt*/
    				
    		if(lt!=-1)/*controllo che il valore di lt sia diverso da -1 e da 0*/
    			if(lt!=0)
    				counter2++;	/*se il controllo risulta vero incremento la variabile che mi servirà per il calcolo della media */ 	
    		
    		
         if(lt<=0)/*controllo che il valore inserito nella variabile lt non sia  uguale o minore di 0*/
    	 	if(lt!=-1){ /*controllo che sia diverso da -1 per escludere il messaggio di errore*/
    		
    		
    		printf("Errore il dato per il rifornimento inserito non e' corretto\n\n");/*stampa messaggio di errore*/
    
    	}
    	
         if(lt==-1)	 
    			printf("\n\nHai scelto -1 , programma terminato\n\n");/*stampo messaggio di chiusura del programma*/
    		
    
    	 else if(lt!=-1)/*controllo che non sia stato inserito il valore sentinella per l'interruzione del programma*/
    	 	 if(lt>0)/*controllo che sia stao inserito un valore maggiore di 0*/
    	  
    	 {
    		
    		printf("Inserisci i chilometri: ");/*se il controllo risulta vero proseguo con richiedere i dati dei chilometri percorsi*/
    			scanf("%f",&km);/*memorizzo il valore nella variabile km*/
    		
    	 if(km<=0)
    	 	/*controllo che non vengano inseriti valori negativi o ugulia 0 pnella variabile km*/
    		printf("Errore il dato per i chilometri inserito non e' corretto\n\n");/*se risulta vero stampa messaggio di errore*/
    	
    		ris=km/lt;/*calcolo ed assegno alla variabile ris il risultato della divisione dei dui valori*/
    			printf("La tua auto percorre %.2f km con 1 litro di benzina \n\n",ris);/*stampo il risultato*/
    		
    		
    		
    	}
    	
    		totlt+=lt;/*sommo ed assegno alla variabile totolt i valori inseriti per il rifornimento*/
    		totkm+=km;/*sommo ed assegno alla variabile totkm i valori inseriti per i chilometri percorsi*/
    	
    	
    	}
    	/*fine ciclo while */
    	
    	if(counter2!=1)/*controllo che la seconda variabile contatore sia diversa da 1 e meggiore di 1*/ 
    		if(counter2>1)
    		{
    		/*se risulta vero */
    		md=totkm/totlt;/*calcolo ed assegno alla variabile md il risultato della media dei km e dei lt */
    			printf("La tua automobile percorre mediamente %.2f con 1 litro di benzina\n\n",md);/*stampo il risultato*/
    
    	}
    	
    
    
    	return 0;	/*programma eseguito correttamente*/
    	
    	
    }
    
    /*fine programma*/
    
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Scusa ma più che metterti il sorgente mio sembrava difficile fare (per agevolarti).

    Allora per inciso, e lo ribadisco, NON puoi fare confronti UGUALE tra variabili float. Non puoi "fidarti" di verificare "se variabile==0" o "variabile!=-1" o quello che preferisci, con valori FLOAT (o double eccetera).

    Quello che puoi fare è confronti del tipo MAGGIORE o MINORE di.
    L'UGUALE A diventa tipicamente un |x-y|<di

    Ecco perchè il programmello che ti ho messo, sia pure in versione didattica-relax, è molto ma moooooolto più "furbo" di quello che hai fatto.
    Molto più semplice, lineare, ragionevolmente sicuro (a parte se inserisci stringhe durante la lettura dai dati, ma ci porterebbe lontano), ha un senso nel ritornare un valore (perchè fai tornare sempre 0, come se il programma avesse sempre funzionato?)

    Ti suggerisco di studiarlo con acribia.

    "unsigned int" significa semplicemente "intero POSITIVO (o nullo)".
    "signed int" o "int" sono interi che possono essere col segno (cioè anche negativi)

    "break" significa "rompi", "interrompi", in generale "esci dal ciclo"

    I litri, e i km, dovranno essere sempre POSITIVI, non possono essere NEGATIVI (da discutere se possono essere 0).

    Quindi, per inciso, un doppio test per verificare se sono -1 o 0 (che non si può fare con l' ==, per inciso al quadrato), diventa banalmente (come nella mia versione) <0, oppure <=0 (ma l'UGUALE abbiamo detto non va bene)
    Osserva questo frammento

    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;
    }

    Se i km sono NEGATIVI, allora esco dal ciclo (posso mettere -1, -2, -0.5, non mi interessa)
    Se i km sono POSITIVI allora faccio la divisione (km/lt)
    Se i km sono ZERO (e lo zero per i float non è per nulla banale, ma avrei problemi con una divisione per zero) NON FACCIO NULLA. Questo è implicito non fatto che la scelta è <0, oppure >0.
    Quindi non avrò problemi di divisione per zero.
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Il fatto è che sto cercando di seguire gli argomenti del libro che ho affronato fino ad oggi, ossia if,else e while, il break e unsigned non li ho ancora affrontati, sono proprio agli inizi, ecco perchè alla fine metto sempre return 0, per ora il libro si è limitato a spiegare questo , infatti negli esempi che mostra mette sempre return 0,e per ora il libro consgilia di scrivere così, spiegherà più nel dettaglio l'uso di return nei prossimi capitoli.Questo è quello che ho capito io fino al capitolo dove sono arrivato, magari ho capito male , vorrà dire che mi riguardo i due capitoli.
    Quello che non mi è ancora chiaro è perchè non posso fare confronti con variabii float? cosa c'è di sbagliato?
    Come suggerisce il libro , mi serve una variabile sentinella per interrompere il programma , in questo caso suggerisce -1, io gli ho voluto aggiungere un messaggio di errore nel caso incui l'utente erroneamente digitasse un valore negativo o 0, così il programma può andare avanti fino a quando non si decide di interromperlo digitando -1.
    Seguendo il tuo esempio posso realizzare lo stesso programma omettendo il break e unsigned?
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Certo che puoi. ma non devi operare con confronti di uguaglianza, con i numeri float, quindi come "valore sentinella" avrai un QUALSIASI valore negativo, non esattamente -1.

    Perchè? Lo scoprirai suppongo nel corso di calcolo numerico, o come si chiama oggi
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Questo no te lo so dire , per ora ho capito che 0=vero 1=falso, e di inserire a fine programma return 0 per indicare che il programma è terminato correttamente, a logica dovrei mettere anche return 1 per indicare che il programma non è terminato correttamente , ma quando il programma non termina correttamente? quando inserisco valori negativi?quando da un risultato sbagliato?deve succedere qualcosa se il programma non termina correttamente giusto? ma cosa? per me il programma finesce correttamente se nell'output stampa i messaggi che io ho scritto ed esegue le istruzioni che gli ho dato,quindi se inserisco il valore sentinella anche in questo caso termina correttamente , lo stesso vale nel caso incui inserisco 1 solo rifornimento ed 1 solo valore per i km mi fa il risultato e non necessariamente la media.Quindi per questo esercizio quando non termina correttamente?

    Nel tuo programma hai scritto while(1), ma nel ciclo come condizione non devo metergli qualche variabile? tipo while(x>1) e non solo 1? come hai scritto tu capisco che il ciclo continua fintanto che lt e km è 1 giusto? quindi se dovessi mettere while(lt>0) il programma andrà avanti finatato che inserisco dei numeri maggiori di 0 e andrà a terminare sia che inserisco 0 o dei valori negativi giusto?

    altra domanda nella devisione del tuo programma ho notato che non hai assegnato il risultato a nessuna variabile , te lo sei dimenticato o è una cosa fattibile?

    Scusami se ti faccio tutte queste domande ma stò cercando di capire bene quello che ho appreso fin ora se è corretto oppure no , e soprattutto quello che uno più esperto vuole spiegarmi.
    grazie mille per l'aiuto
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Gigio80 ha scritto:


    Questo no te lo so dire , per ora ho capito che 0=vero 1=falso, e di inserire a fine programma return 0 per indicare che il programma è terminato correttamente, a logica dovrei mettere anche return 1 per indicare che il programma non è terminato correttamente , ma quando il programma non termina correttamente? quando inserisco valori negativi?...Quindi per questo esercizio quando non termina correttamente?
    Supponiamo che io inserisca km 10 e litri zero.
    Il programma, secondo te, termina correttamante?
    Nel tuo programma hai scritto while(1), ma nel ciclo come condizione non devo metergli qualche variabile? tipo while(x>1) e non solo 1?
    Lo hai scritto sopra, ma in senso contrario
    Zero è generalmente considerato falso, 1 (o comunque >0, il che tipicamente è 1) vero
    quindi "while (1)" significa "finchè è vero"
    potresti mettere "while (1>0)"
    come hai scritto tu capisco che il ciclo continua ...
    ...Per sempre...
    Uscirai dal ciclo esplicitamente mediante un break.
    In realtà si può eliminare il break, mettere la condizione alla fine (cioè fare una sorta di do...loop) e altre 1000 variazioni
    altra domanda nella devisione del tuo programma ho notato che non hai assegnato il risultato a nessuna variabile , te lo sei dimenticato o è una cosa fattibile?
    perchè lo dovrei fare (assegnare il risultato) ad una variabile, se poi non ci faccio nulla?
    Una variabile mantiene un valore che è utile (in seguito).
    Scusami se ti faccio tutte queste domande ma stò cercando di capire bene quello che ho appreso fin ora se è corretto oppure no , e soprattutto quello che uno più esperto vuole spiegarmi.
    grazie mille per l'aiuto
    vabbè tranqui un millennio fa ero pure io un principiante
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    perchè lo dovrei fare (assegnare il risultato) ad una variabile, se poi non ci faccio nulla?
    Una variabile mantiene un valore che è utile (in seguito).
    Da quello che ho capito io se eseguo un calcolo ho bisogno poi di assegnare questo valore ad una variabile per poi poterla stampare ,pensavo che se non assegno una variabile poi il compilatore mi da errore.

    Per quanto riguarda il resto ora i è chiaro

    grazie mille
  • Re: DUBBIO SU ESERCIZIO SVOLTO

    Dato che avevo un dubbio , mi sono riletto il capito sul while , il mio sbaglio è stato quello di usare le variabili float per iserire i dati dei km e dei lt,perchè dice di svogere gli esercizi solo con gli argomenti trattati nel capitolo, infatti dice che per il mometo di usare variabili intere per utilizzare il ciclo while ,e dato che in una divisione di due interi è possibile avere anche un risultato con virgola mobile dice che si può utilizzare un operazione di cast ossia float ris----------> ris=(float)km/lt così posso avere un risultato con virgola mobile da una divisione fra due varibili intere, ecco perchè sul primo codice che avevo scritto avevo messo quell cast che non capivi.Dato che tu mi insegni che non è possibile fare dei confronti con delle variabili di tipo float , ora utilizzando quel cast posso dichiarare quelle variabili di tipo int , ho riscritto il codice prendendo spunto dal tuo ed ho scritto queto
    
    /*programma che calcola quanti chilometri riesce a fare un auto con 1 litro di benzina , se più valori ne calcola la media*/
    
    #include <stdio.h>
    
    /*inizio funzione main*/
    
    int main(void){
    	
    	int lt,km,totlt,totkm,counter ;/*dichiarazione delle varibili*/
    	float ris;/*dichiarazione della variabile float per l'assegnazione del risultato*/
    
    	/*inizia ciclo while*/
    	totlt=0;/*inizializzo le variabili*/
    	totkm=0;
    	counter=0;
    	lt=0;
    	
    	while(lt!=-1){
    		
    		counter++;/*incremento la variabile contatore*/
    		
    			printf("Rifornimento nr.%d inserisci i litri(-1per terminare): ",counter);/*richiesta di inserimento dato*/
    				scanf("%d",&lt);/*memorizzazione del valore inserito*/
    	
    	if(lt!=-1){
    		/*controllo che la variabile lt sia diversa da-1 */
    		
    			printf("Inserisci i chilometri: ");/*richiesta di inserimento dato*/
    				scanf("%d",&km);/*memorizzazione del valore inserito*/
    	
    }
    
    	totlt+=lt;/*assegno la somma dei vari rifornimenti*/
    	totkm+=km;/*assegno la somma dei vari chilometri */
            
            if(km>0)
    	if(lt!=-1){
    		/*controllo che la variabile km sia aggiore di 0 e lt sia diversa da -1 */
    			ris=(float)km/lt;
    			printf("La tua auto percorre %.3f km con un litro di benzina\n\n",ris);/*calcolo e stampo il risultato*/
    		
    	}
    	
    	else
    		printf("Hai scelto -1, programma terminato\n\n");/*se viene scelto il valore sentinella visualizza il messaggio*/
    	
    	}
    	/*fine ciclo while*/
    	if(counter>2){
    		/*controllo che la variabile contatore sia maggiore di 2 per poter calcolare la media*/
    			ris=(float)totkm/totlt;
    			printf("La tua auto percorre mediamente %.3f km con un litro di benzina\n",ris);/*calcolo e stampa della media*/
    	}
    
    	
    	return 0;/*programma eseguito correttamente*/
    
    
    }
    /*fine funzione main*/
    


    così ora va bene , o ci sono ancora degli sbagli?
Devi accedere o registrarti per scrivere nel forum
26 risposte