[C] Primo approccio alle funzioni(potenza)
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:
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
#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
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
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.
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.
"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!!
ora invece sto provando a scrivere un sorgente che dato un vettore, chiama una funzione che ha il compito di stamparlo..
ma ho seri dubbi sulla chiamata nel caso in cui la funzione sia di tipo void...
#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...

Lo correggerei così.
Oppure anche
Ho cambiato i nomi delle variabili della funzioni per mostrarti che possono essere diversi da quelli del main.
#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.
"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
Si, hai ragione. Non mi ero accorto di quell'errore. Togli “[]” e dovrebbe funzionarti tutto bene.