Un plauso alla tua caparbietà.
E' per questo che continuerò a risponderti, anche se il suggerimento di Alex_Drake di munirti di un buon manuale, sia meglio di brancolare nel buoi come fai tu.
Facciamo un esempio.
Per prima cosa guarda questo prototipo di funzione:
float perimetro (float,float);
Tradotto in parole significa che questa funzione accetta in ingresso due numeri in virgola mobile, e restituisce un numero in virgola mobile. Il fatto che si chiami perimetro ti fa intuire cosa essa debba calcolare. Infatti, andiamo al corpo della funzione vera e propria:
float perimetro (float lato1,float lato2)
{
float perim;
perim=2*(lato1+lato2);
return (perim);
}
Nulla di complicato mi pare. Se poi dici che con la parte più 'aritmetica' del linguaggio te la cavi qui la cosa è semplicissima.
Vediamo però un pezzettino di codice in cui tu utilizzerai la funzione appena creata:
.
.
.
a=10.0; b=20.0;
c=perimetro(a,b);
.
.
.
Ho inizializzato le variabili a e b, tanto per fare, esse deriveranno da quello che vuoi tu, un input esplicito da parte dell'utilizzatore del programma, da formule e calcoli più sofisticati, ecc.
Ciò che dovresti notare è come le variabili del 'corpo' della funzione e le variabili della 'chiamata' alla funzione abbiano nomi differenti (lato1 e lato2 nel primo caso, e a e b nel secondo).
L'ho fatto apposta, perchè in effetti quando chiami la tua funzione, i valori numerici contenuti in a e b vengono copiati rispettivamente nei valori numerici delle variabili lato1 e lato2 che di fatto risultano 'dichiarate' proprio nella 'dichiarazione' della funzione. Ecco perchè tu non hai più bisogno di dichiarare tali variabili all'interno della funzione stessa, ed ecco perchè la funzione può utilizzare le variabili lato1 e lato2 al suo interno come meglio gli aggrada.
Altro fatto di notevole importanza è che lo 'sdoppiamento' delle variabili ti consentirebbe, ad esempio, all'interno della funzione perimetro di modificare i valori di lato1 e lato2 come meglio ti aggrada (nell'esempio che ti ho fatto questo non accade), senza che questo interferisca con i valori effettivi delle variabili a e b.
Ad esempio se a e b derivano da input dell'utente, chi ti dice che per sbaglio uno dei due non sia negativo? E' ovvio che in quel caso il calcolo del perimetro non sarà corretto. Ma se tu riscrivessi la funzione perimetro così:
float perimetro (float lato1,float lato2)
{
float perim;
lato1=fabs(lato1);
lato2=fabs(lato2);
perim=2*(lato1+lato2);
return (perim);
}
Ecco che il calcolo sarebbe corretto, perchè forzeresti lato1 e lato2 ad essere per forza positivi (ok, ho fatto un pò di brodo inutile, ma è un esempio e dovrebbe servire a farti capire). Ma le variabili a e b inserite dall'utente nel frattempo sono rimaste del segno che il malcapitato utente gli ha assegnato.
La tua seconda domanda contiene già la risposta. Si azzerano perchè altrimenti avrebbero valore casuale (secondo lo standard ANSI C questo comportamento è indefinito e dipende dalla implementazione del particolare compilatore. Esistono compilatori che dichiarando una variabile automaticamente la azzerano, altri che invece non lo fanno. Il buon programmatore o compila sempre con un compilare ben preciso, oppure si mette il ferro dietro la porta azzerando sempre prima le variabili, specie se come nella funzione che segnali, al valore finale delle singole variabili si arriva per sommatorie successive).
La domanda 3 mi pare un ripetizione della domanda 1.
Infine non sono su Skype come zax2010, per cui non saprei chi tu abbia trovato.
Domani mi cerco. Voglio vedere chi sono!