[RISOLTO][C] Addebito del parcheggio

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

jolly

Utente Attivo
Messaggi
110
Reazioni
4
Punteggio
38
Salve a tutti,rieccomi con un nuovo esercizio,anche se sto molto incasinato,ho riletto più volte il capitolo delle funzioni,ma purtroppo non ho capito quasi niente :(.
Non mi vogliono proprio entrare in testa,ma da come ho capito sono molto importanti,e se non capisco questo argomento non potrò andare avanti con vettori,puntatori e roba varia.

Comunque l'esercizio è questo: Un garage addebita un importo minimo di $ 2.00,per un parcheggio fino a tre ore. Il garage addebita un 'addizionale di $0.50 per ogni ora che ecceda le tre di base.Ed infine addebita $1o.00 da 24 ore in poi.
Scrivete un programma che calcoli e visualizzi gli addebiti per ognuno dei tre clienti.Dovrete immettere le ore di parcheggio per ogni cliente.Il vostro programma dovrà calcolare e visualizzare il totale degli addebiti.Il programma dovrà utilizzare la funzione calculateCharges per determinare l'addebito di ogni cliente.

Togliendo le funzioni ho svolto cosi l'esercizio.
Codice:
#include <stdio.h>
/* la funzione main è il punto di inizio dell'esecuzione del programma */
int main( void )
{
	int i,x=1,ore,aggiunta; /* dichiarazioni delle variabili */
	float prezzo; 

	for (i=1; i<=3; i++) { /* ripete il ciclo 3 volte */
		printf( "Cliente %d\n", x); /* visualizza il numero del cliente,cioè 1 cliente,2 cliente... */

		printf( "Quante ore hai sostato?: "); /* sollecita l'inserimento */
		scanf( "%d" , &ore); /* legge l'intero e lo memorizza nella variabile ore */

		if (ore <=3) { /* se ore è minore o uguale a 3 */
			prezzo=2.00; 
		}
	
		else if (ore >3 && ore <24) {
			aggiunta=ore-3; /* con la variabile aggiunta ci calcoliamo le ore in più,perchè fino a 3 ore il prezzo è fisso,dopo 						cambia ad esempio se le ore sono 5,facendo ore-3,abbiamo ricavato le ore in più che andremo a 						calcolare sotto,con un prezzo differente */ 						
			prezzo=aggiunta*0.50+2; /* prezzo è uguale ad aggiunta che sarebbero le ore in più per 0.50 */
		}
		
		else if (ore >= 24) {
			prezzo=10.00;
		}

		printf( "Deve pagare la somma di %.2f\n",prezzo); /* Visualizza a schermo la somma che deve pagare ogni cliente */
		x+=1; /* la variabile x corrisponde al cliente */
	}
	
	return 0; /* indica che il programma è terminato con succeso */
} /* fine della funzione main */

Ma ora non so proprio come fare per scriverlo con la funzione,se c'è qualcuno che gentilmente potrebbe aiutarmi a comprendere anche in modo elementare l'uso delle funzioni gli è ne sarei molto grato
 
Ultima modifica:
Re: [C] Addebito del parcheggio

Partiamo intanto col farti capire le funzioni: innanzitutto sappi che la main() è essa stessa una funzione, solamente che il pc sa che deve esguirla per prima.
Detto in parole povere, le funzioni sono dei "pezzi" di programma richiamabili più volte all' interno del programma stesso.

esempio:

#include <stdio.h>

/*prototipo funzione:
va definito il tipo di dato che restituisce (in questo caso nulla, quindi void), il nome della funzione e il tipo di dato ricevuto come parametro(puoi anceh definire funzioni senza parametri), in questo caso un intero int
*/
void funzioneStampa(int);

/*funzione principale*/
int main() {

funzioneStampa(5);
funzioneStampa(8);
funzioneStampa(-13);

return 0;
}

/*
definizione della funzione: cosa fa esattamente (NB. puoi definirla prima o dopo il main NON al suo interno)
*/
funzioneStampa(int dato) {
printf("%d\n", dato);
}
 
Re: [C] Addebito del parcheggio

grazie Devil 8Ball,perfetto fin qua mi è chiaro,se non sbaglio all'inizio di questa riga
Codice:
funzioneStampa(int dato) {
devo scrivere void?

Il fatto è che non riesco a capire lo scopo delle funzioni,cioè in questo caso non era molto più semplice scrivere
Codice:
#include <stdio.h>

int main( void )
{
        printf( "5\n" "8\n" "-13\n" );
        return 0;
}

:) ?
 
Re: [C] Addebito del parcheggio

Certo, mio errore...
Si certo in questo caso era molto più semplice usare un printf, ma ho voluto usare un esempio semplice per farti capire.
Immagina però ad esempio che tu debba utilizzare più volte un particolare algoritmo in un programma... da 10000 righe
Senza le funzioni dovresti riscriverti l' algoritmo ogni volta!!! In caso di modifiche poi diventeresti matto!!!
Dichiarandoti una funzione che sviluppa quel particolare algoritmo la puoi richiamare ogni volta in una riga...
Inoltre, se sevi modificare l' algoritmo, modifichi solo la funzione
Comunque ti capisco, questi programmi sono molto semplici e visualizzarli con funzioni non è molto intuitivo, ma fidati che andando avanti non ne potrai proprio fare a meno
 
Re: [C] Addebito del parcheggio

Ecco guarda ho trovato una vecchia raccolta di funzioni che ho usato per l' esame di C in università, forse può chiarirti le idee.
P.S. più avanti ti spiegheranno come richiamare funzioni da altri file... non preoccuparti
 

Allegati

  • util.txt
    util.txt
    4.9 KB · Visualizzazioni: 316
Re: [C] Addebito del parcheggio

ma fidati che andando avanti non ne potrai proprio fare a meno
lo spero tanto :D perchè se ciò accadrà vuol dire che finalmente ho capito come si usano xd.

Grazie per l'allegato,anche se ad essere sincero non ci ho capito quasi niente :(
 
Re: [C] Addebito del parcheggio

Ah l' allegato era solo per farti capire come si utilizzano le funzioni... avendo quel file, puoi usare la funzione ScanString(...) in un qualunque programma senza riscriverla.
 
Re: [C] Addebito del parcheggio

prima di svolgere la funzione dell'esercizio,ho provato un po ad allenarmi per capire meglio queste funzioni,ho provato a realizzare una per calcolare il minore di tre numeri ecco come ho fatto:
Codice:
#include <stdio.h>

int media (int a,int b,int c);

int main (void)
{
	int num1,num2,num3;

	printf( "Inserisci 3 numeri: " );
	scanf( "%d%d%d", &num1,&num2,&num3);
	printf( "Il minore è %d\n" , media (num1,num2,num3 ));

	return 0;
}

int media (int a,int b,int c)
{
	int min = a;

	if (b<min){
		min=b;
	}

	if (c<min){
		min=c;
	}

	return min;
}

Il programma funziona bene,ma la cosa che mi sorprende è che fino a questo punto il libro ha sempre insegnato che prima di usare una variabile,essa deve essere dichiarata,altrimenti si verifica un errore,poi studio le funzioni e mi accorgo che se la dichiaro si verifica l'errore :O ma com'è questa storia.

Nel mio caso avevo dichiarato la variabile min,in questo modo:
Codice:
#include <stdio.h>

int media (int a,int b,int c,int min);

int main (void)
{
	int num1,num2,num3;

	printf( "Inserisci 3 numeri: " );
	scanf( "%d%d%d", &num1,&num2,&num3);
	printf( "Il minore è %d\n" , media (num1,num2,num3,min ));

	return 0;
}

int media (int a,int b,int c,int min)
{
	int min = a;

	if (b<min){
		min=b;
	}

	if (c<min){
		min=c;
	}

	return min;
}

Ma cosi mi restituiva degli errori,mentre se non dichiaro la variabile funziona bene. :O
Come mai?
 
Re: [C] Addebito del parcheggio

Controllati meglio le definizioni di parametri, variabili locali e globali.
Nel secondo caso ti dà errore in quanto min non la dichiari come variabile all' interno della funzione, bensì come parametro... che vuol dire?
I parametri sono variabili (detto alla buona) che devono essere inizializzate alla chiamata di funzione e che sono necessarie al suo svolgimento.
La variabile min deve essere (in base a quello che hai descritto nella funzione) il risultato, quindi non avrebbe senso inizializzarla come parametro no?
 
Re: [C] Addebito del parcheggio

Giusto...ho provato a mettere insieme quel poco che ho capito ecco come ho svolto l'esercizio principale:
Codice:
#include <stdio.h>

float calcolaOre (int tempo,int add); /* dichiarazione della funzione calcolaOre */

/* la funzione main è il punto di inizio dell'esecuzione del programma */
int main ( void )
{
	int i,x=1,ore,aggiunta; /* dichiarazioni delle variabili */

	for (i=1; i<=3; i++) { /* ripete il ciclo 3 volte */
		printf( "Cliente %d\n", x); /* visualizza il numero del cliente,cioè 1 cliente,2 cliente... */

		printf( "Quante ore hai sostato?: "); /* sollecita l'inserimento */
		scanf( "%d" , &ore); /* legge l'intero e lo memorizza nella variabile ore */

		printf( "%.2f\n" , calcolaOre (ore,aggiunta)); /* chiamata di funzione */
		x+=1; /* la variabile x corrisponde al cliente */
	} /* fine del ciclo for */

	return 0; /* indica che il programma è terminato con succeso */
} /* fine della funzione main */

float calcolaOre (int tempo,int add ) /* inizio della funzione calcolaOre */
{
	float prezzo;	

	if (tempo<=3) {
		prezzo=2.00;
	}
	
	if (tempo>3 && tempo<24) {
		add=tempo-3;
		prezzo=add*0.50+2;
	}

	if (tempo>=24) {
		prezzo=10.00;
	}
	
	return prezzo;
}

Devo dire che il programma funziona bene....va bene come ho scritto il codice?
P.s va bene come commento? printf( "%.2f\n" , calcolaOre (ore,aggiunta)); /* chiamata di funzione */
 
Re: [C] Addebito del parcheggio

Ottimo direi, vedo che stai imparando in fretta l' utilizzo delle funzioni...
Si nel printf chiami effettivamente una funzione, quindi il commento è giusto
Solo una cosa sui commenti:
1 - ormai sei abbastanza rodato sul c, quindi a meno che il prof non ti obblighi, commenti tipo "il main è la funzione principale" ecc puoi evitarli;
2 - nei prototipi delle funzioni, non serve mettere il nome della variabile, è sufficiente il tipo: float calcolaOre(int, int);
3 - i commenti sui prototipi spiegano molto brevemente la funzione, mentre sulla dichiarazione delle funzioni devi essere più specifico: nel tuo caso sul prototipo calcolaOre(int, int) bastava dire "funzione per il calcolo del prezzo del parcheggio", nella dichiarazione invece devi specificare che tipi di input riceve, come li deve ricevere, che risulati ottieni e come li ottieni, eventuali errori o casi non gestiti o bug conosciuti....
in sostanza una cosa del tipo "la funzione prende in input il tempo trascorso (int tempo), il prezzo all' ora (add) e restituisce il prezzo totale (float)"
Commenti scritti in questo modo ti aiutano enormemente con programmi molto lunghi e semplificano la vita a chi vede per la prima volta il tuo programma
 
Re: [C] Addebito del parcheggio

grazie gentilissimo e sempre molto chiaro e preciso :).
Magari avessi un prof,studio solo soletto :D,ho provato a modificare alcuni commenti seguendo i tuoi consigli ecco:
Codice:
#include <stdio.h>

float calcolaOre (int,int); /* prototipo della funzione per calcolare il prezzo del parcheggio */

int main ( void )
{
	int i,x=1,ore,aggiunta; /* dichiarazioni delle variabili */

	for (i=1; i<=3; i++) { /* ripete il ciclo 3 volte */
		printf( "Cliente %d\n", x); /* visualizza il numero del cliente,cioè 1 cliente,2 cliente... */

		printf( "Quante ore hai sostato?: "); 
		scanf( "%d" , &ore); 

		printf( "%.2f\n" , calcolaOre (ore,aggiunta)); /* chiamata di funzione */
		x+=1; /* aggiunge 1 alla variabile x che corrisponde al cliente */
	} /* fine del ciclo for */

	return 0; 
} 

/* la funzione prende in input le ore inserite dall'utente (int tempo) e le ore che superano quelle 3 di base (int add) e restituisce il  prezzo che ogni cliente dovrà pagare (float prezzo) */
float calcolaOre (int tempo,int add )
{
	float prezzo;	

	if (tempo<=3) {
		prezzo=2.00;
	}
	
	if (tempo>3 && tempo<24) {
		add=tempo-3;
		prezzo=add*0.50+2;
	}

	if (tempo>=24) {
		prezzo=10.00;
	}
	
	return prezzo;
}

Per chiarirmi un po le idee,prendiamo ad esempio la funzione main:
int main ( void ) dove:
int significa che la funzione restituisce un risultato di tipo intero.
main nome della funzione.
( void ) quel void corrisponde ad un parametro o argomento?
Se ho capito bene nella definizione di funzione si dicono parametri,mentre nel prototipo si dicono argomenti giusto?

Se il tipo del valore di ritorno fosse void,es void main(); il return 0 alla fine si può anche togliere perchè quel void significa che la funzione non restituirà nessun risultato giusto?

Mentre in questo caso int main ( void ) il return 0 va messo,perchè anche se il parametro è void,esso deve restituire un intero giusto?

Scusa per tutte queste domande,ma vorrei far chiarezza su questi concetti :)
 
Re: [C] Addebito del parcheggio

allora:
1 - int main(void) corrisponde a int main(null) o a int main(), quindi un questo caso consideralo un modo per dire "non ci sono parametri" (più avanti scoprirai come passare argomenti al main... ma ti lasco la sorpresa).
2 - Le definizioni andando a memoria sono corrette ma per scrupolo controlla...
3 - si se il main lo dichiari void, allora il return 0 è inutile (anzi in compilazione ti dovrebbe dare errore); di solito si utilizza per capire se il programma termina correttamente, infatti io molto spesso se il mio codice esegue tutto normalmente faccio return 1, altrimenti return -1 con stampa dell' errore...
P.S. qualche ripetizione / lezione via Skype te la posso dare senza problemi!
 
Re: [C] Addebito del parcheggio

scusate l'OT:

jolly che cosa studi?? io sono al primo anno di ingegneria elettronica e sto studiando anche io le funzioni :sisi: in realtà ora sono alle stringhe di vettori
 
Re: [C] Addebito del parcheggio

Devil 8Ball:
Capito...grazie mille per la disponibilità.

e_ale92:
bhe in realtà sto imparando la programmazione solo per passione,sono diplomato come geometra e al momento sono senza lavoro.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top