[C] Primo approccio alle funzioni(potenza)

frab1
Buongiorno, sto cercando di prendere dimestichezza con le funzioni(procedure) in C...ho una funzione che calcola l'elvamento a potenza di una variabile di tipo double. Ho scritto la funzione e subito dopo l'ho chiamata passandole i parametri(base ed esponente). Ecco il codice:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	double elevamento_potenza(double valore, int potenza)
	{
		double valore_ritorno = 1.0;
		int i;
		
		for(i=0; i<potenza; i++)
		{
			valore_ritorno*=valore;
		}
		return(valore_ritorno);
	}

	double valore=4.0;
	int potenza=2;
	double risultato=elevamento_potenza(valore,potenza);
	printf("Il risultato dell'elevamento a potenza vale: %f\n",risultato);
}

E' formalmente corretto del codice scritto in questa maniera? O meglio, in C prima si dichiara la funzione e poi si richiama o è possibile anche fare il contrario? Ad esempio in assembly prima mi scrivevo tutto il main, e le procedure le mettevo in fondo al sorgente...
Il void tra parentesi va messo?!
Inoltre l'uso dell'operatore di assegnazione *= non mi è cosi chiaro...A cosa serve fondamentalmente?
Grazie :)

Risposte
vict85
Una funzione non va scritta dentro il main, quindi il tuo codice è completamente sbagliato e non compilerà in nessun compilatore C. Devi tenere conto che l'uso delle funzioni consiste anche nell'evitare di inserire troppe cose nel main (oltre a strutturare meglio il programma).

Comunque a *= b è solo un modo per semplificarsi la vita. Infatti è equivalente a scrivere a = a * b .

Riguardo alla funzione puoi fare in due modi. O copiarla interamente prima del main oppure scrivere
#include ...
#include ...

double elevamento_potenza(double valore, int potenza);

int main (void)
{ ...
}

double elevamento_potenza(double valore, int potenza)
{
      ...
}


Spesso i professori preferiscono questa seconda e ci sono buone ragioni per farlo. Io devo dire che tendo ad usarne un terzo che consiste nel creare un file .h ed eventualmente un secondo file .c ma è un modo eccessivo per una sola funzione.

frab1
"vict85":
Una funzione non va scritta dentro il main, quindi il tuo codice è completamente sbagliato e non compilerà in nessun compilatore C. Devi tenere conto che l'uso delle funzioni consiste anche nell'evitare di inserire troppe cose nel main (oltre a strutturare meglio il programma).

Comunque a *= b è solo un modo per semplificarsi la vita. Infatti è equivalente a scrivere a = a * b .

Riguardo alla funzione puoi fare in due modi. O copiarla interamente prima del main oppure scrivere
#include ...
#include ...

double elevamento_potenza(double valore, int potenza);

int main (void)
{ ...
}

double elevamento_potenza(double valore, int potenza)
{
      ...
}


Spesso i professori preferiscono questa seconda e ci sono buone ragioni per farlo. Io devo dire che tendo ad usarne un terzo che consiste nel creare un file .h ed eventualmente un secondo file .c ma è un modo eccessivo per una sola funzione.


La seconda possibilità è quella che viene definita come Prototipizzazione vero?
Grazie dei preziosi consigli!!

frab1
ora invece sto provando a scrivere un sorgente che dato un vettore, chiama una funzione che ha il compito di stamparlo..
#include <stdio.h>
#include <stdlib.h>

void stampa_vettore(int dim, int my_array[])
{
	int i;
	for (i=0;i<dim;i++){
		printf("%d", my_array[i]);
	}
}

int main(void)
{
	int my_array[]={6,6,7,5,6,5,5,6,7,8,4};
	int dim=11;
	void stampa_vettore(dim,my_array[]);
}


ma ho seri dubbi sulla chiamata nel caso in cui la funzione sia di tipo void... :roll:

vict85
Lo correggerei così.

#include <stdio.h>
//#include <stdlib.h> // Non stai usando stdlib quindi non serve inserirla

void stampa_vettore(int dim, int my_array[])
{
	for (int i=0; i != dim; ++i) /* Dal '99 puoi definire l'intero anche all'interno del ciclo. 
                                *   L'uso di != invece di < è una mia preferenza personale.
                                *   il tuo professore potrebbe essere rimasto al C89 
                                * e quindi pensare che sia codice C++
                                */
	{
		printf("%d ", my_array[i]); // Se non metti uno spazio tra le variabili come fai a distinguere i valori bene?
	}
}

int main(void)
{
	int my_array[]={6,6,7,5,6,5,5,6,7,8,4};
	const int dim=11;     // è meglio definire costanti le cose che è meglio non modificare, oppure usare un define
	stampa_vettore(dim,my_array[]); // NON devi mettere void prima della chiamate della funzione.
}



Oppure anche

#include <stdio.h>

void stampa_vettore(int n, int v[]);

int main(void)
{
	int my_array[]={6,6,7,5,6,5,5,6,7,8,4};
	const int dim=11;
	stampa_vettore(dim,my_array[]);
}

void stampa_vettore(int n, int v[])
{
	for (int i=0; i != n; ++i) {
		printf("%d ", v[i]);
	}
}


Ho cambiato i nomi delle variabili della funzioni per mostrarti che possono essere diversi da quelli del main.

frab1
"vict85":
Lo correggerei così.

#include <stdio.h>
//#include <stdlib.h> // Non stai usando stdlib quindi non serve inserirla

void stampa_vettore(int dim, int my_array[])
{
	for (int i=0; i != dim; ++i) /* Dal '99 puoi definire l'intero anche all'interno del ciclo. 
                                *   L'uso di != invece di < è una mia preferenza personale.
                                *   il tuo professore potrebbe essere rimasto al C89 
                                * e quindi pensare che sia codice C++
                                */
	{
		printf("%d ", my_array[i]); // Se non metti uno spazio tra le variabili come fai a distinguere i valori bene?
	}
}

int main(void)
{
	int my_array[]={6,6,7,5,6,5,5,6,7,8,4};
	const int dim=11;     // è meglio definire costanti le cose che è meglio non modificare, oppure usare un define
	stampa_vettore(dim,my_array[]); // NON devi mettere void prima della chiamate della funzione.
}



Oppure anche

#include <stdio.h>

void stampa_vettore(int n, int v[]);

int main(void)
{
	int my_array[]={6,6,7,5,6,5,5,6,7,8,4};
	const int dim=11;
	stampa_vettore(dim,my_array[]);
}

void stampa_vettore(int n, int v[])
{
	for (int i=0; i != n; ++i) {
		printf("%d ", v[i]);
	}
}


Ho cambiato i nomi delle variabili della funzioni per mostrarti che possono essere diversi da quelli del main.

Inizio a capire un po di piu :-)
Ma nel primo esempio che mi hai fatto, la compilazione mi da' un errore quando chiamo la funzione(penultima riga del main)..e anche nella seconda...

error: expected expression before ‘]’ token

vict85
Si, hai ragione. Non mi ero accorto di quell'errore. Togli “[]” e dovrebbe funzionarti tutto bene.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.