DOMANDA Qualche Chiarimento Sull'utilizzo Delle Funzioni (sottoprogrammi) In C++

Evans221

Nuovo Utente
Salve a tutti, ho da poco iniziato a studiare le funzioni, che consentono di chiamare dal main la parte di istruzioni che vogliamo eseguire, definita esternamente ad esso.

Ho ancora qualche dubbio sull'argomento: quali solo le variabili che vanno dichiarate (sia nei prototipi che nella definizione) all'interno delle parentesi?

Ad esempio, voglio scrivere una funzione void leggi che mi permette di leggere gli elementi di un vettore.
La funzione in se è:

cout << "Inserisci numero di elementi del vettore: ";
cin >> riemp;
for (i=0; i<riemp; i++)
cout << "Inserisci valore del " << i+1 << " elemento: ";
cin >> vettore;

E dunque nel prototipo e nella definizione quali sono le variabili che devo chiamare? Riemp e Vettore? E perchè non chiamare anche i allora? All'inizio pensavo venissero chiamate tutte le variabili che compaiono nelle istruzioni ma non mi è ben chiaro cosa mettere nelle parentesi delle funzioni...
 

DispatchCode

Utente Attivo
579
335
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Salve a tutti, ho da poco iniziato a studiare le funzioni, che consentono di chiamare dal main la parte di istruzioni che vogliamo eseguire, definita esternamente ad esso.

Ho ancora qualche dubbio sull'argomento: quali solo le variabili che vanno dichiarate (sia nei prototipi che nella definizione) all'interno delle parentesi?

Ad esempio, voglio scrivere una funzione void leggi che mi permette di leggere gli elementi di un vettore.
La funzione in se è:

cout << "Inserisci numero di elementi del vettore: ";
cin >> riemp;
for (i=0; i<riemp; i++)
cout << "Inserisci valore del " << i+1 << " elemento: ";
cin >> vettore;

E dunque nel prototipo e nella definizione quali sono le variabili che devo chiamare? Riemp e Vettore? E perchè non chiamare anche i allora? All'inizio pensavo venissero chiamate tutte le variabili che compaiono nelle istruzioni ma non mi è ben chiaro cosa mettere nelle parentesi delle funzioni...
Nel prototipo (o dichiarazione, se è questa che intendi) non è obbligatorio utilizzare il nome, è sufficiente il tipo. Banalmente per spiegarmi:

Dichiarazione:
Codice:
int somma(int, int);
Definizione:
Codice:
int somma(int a, int b)
{
  // Corpo della funzione
}
In generale, alla funzione passi i parametri che servono alla funzione stessa, per poter effettuare una determinata operazione. Se hai una funzione che - ad esempio - eleva al quadrato, ti servirà passare alla funzione solo un numero: ovvero il numero che vuoi elevare al quadrato.
Tieni presente che tutte le variabili che crei nella funzione, lì rimangono. Sono tutte variabili locali, che esistono cioè solo nel corpo della funzione (o, in generale, in un preciso blocco); quando la funzione termina (restituendo o no un valore) le variabili dichiarate al suo interno verranno distrutte. Quindi se vuoi popolare un vettore, è sensato passare alla funzione il vettore stesso (che poi sarà un puntatore al primo elemento del vettore, la locazione 0), altrimenti non te ne farai molto essendo locale a quella funzione.

Mi sembri molto confuso riguardo ai parametri anche. Se hai domande di qualche tipo, ponile pure, e cercheremo di risponderti il meglio possibile. Così ti saranno più chiari questi concetti (che sono alla base di altri).
 
  • Mi piace
Reactions: Mursey

Evans221

Nuovo Utente
Nel prototipo (o dichiarazione, se è questa che intendi) non è obbligatorio utilizzare il nome, è sufficiente il tipo. Banalmente per spiegarmi:

Dichiarazione:
Codice:
int somma(int, int);
Definizione:
Codice:
int somma(int a, int b)
{
  // Corpo della funzione
}
In generale, alla funzione passi i parametri che servono alla funzione stessa, per poter effettuare una determinata operazione. Se hai una funzione che - ad esempio - eleva al quadrato, ti servirà passare alla funzione solo un numero: ovvero il numero che vuoi elevare al quadrato.
Tieni presente che tutte le variabili che crei nella funzione, lì rimangono. Sono tutte variabili locali, che esistono cioè solo nel corpo della funzione (o, in generale, in un preciso blocco); quando la funzione termina (restituendo o no un valore) le variabili dichiarate al suo interno verranno distrutte. Quindi se vuoi popolare un vettore, è sensato passare alla funzione il vettore stesso (che poi sarà un puntatore al primo elemento del vettore, la locazione 0), altrimenti non te ne farai molto essendo locale a quella funzione.

Mi sembri molto confuso riguardo ai parametri anche. Se hai domande di qualche tipo, ponile pure, e cercheremo di risponderti il meglio possibile. Così ti saranno più chiari questi concetti (che sono alla base di altri).
No in realtà appena iniziate a studiare avevo poco chiara la differenza tra passaggio per valore e per riferimento e quindi non capivo molto bene come impostare una funzione. Ti ringrazio, la tua risposta è sta chiarissima e d'aiuto!
In pratica se una funzione somma ha 3 variabili ad esempio
Codice:
int a, b;
int tot = a+b;
La funzione per accedervi sarebbe:
Codice:
/*Prototipo:*/ int somma(int, int, int);
/*Definizione:*/ int somma(int a, int b, int tot);
/*Chiamata:*/ somma(a, b, tot);
Giusto?
E potrei anche evitare di dichiararla in parentesi ma dichiararla nella funzione stessa? Ad esempio anzichè
Codice:
int somma(int a, int b, int tot)
potrei scrivere
Codice:
int somma(int a, int b) {
int tot;
}
cioè dichiare la 3° variabile tot all'interno della funzione stessa? Funzionerebbe comunque?
 

DispatchCode

Utente Attivo
579
335
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
No, non è propriamente come dici. Una funzione somma() sarebbe più simile a:

Codice:
int somma(int, int);
e definita quindi come:

Codice:
int somma(int a, int b)
{
  return a+b;
}
E verrà quindi chiamata come:

Codice:
int main()
{
  printf("Risultato: %d", somma(10, 20));

  return 0;
}
Scopo di una funzione è solamente eseguire un compito. Si tratta di quel tipo di compito che viene magari richiesto più volte nel programma; oppure di una funzionalità particolare del programma.
Altri esempi di funzioni sono quelle che utilizzi correntemente: la funzione printf ad esempio. A questa funzione passi una stringa (che è il formato, come ho fatto lì sopra), ed uno o più valori (dipende se devi stampare valori e quanti ne devi stampare). Altro aspetto importante delle funzioni è che astraggono una funzionalità. Nel caso della printf() non ti serve sapere come funziona internamente, non ti serve sapere cosa fa insomma, per poterla utilizzare.
Discorso analogo per scanf() e qualsiasi altra funzione.

Per quanto riguarda la tua altra domanda, sì, puoi dechiarare variabili nelle funzioni. Anzi, è cosa assai frequente. Si tratta sempre di variabili locali che esistono solo per la durata della funzione stessa: al termine della funzione, non esisteranno più (la faccio breve senza dettagli solo perchè rischierei di mandarti in confusione ;) ).

Cosa importante: il parametro della funzione riceve il valore che passi al momento della chiamata. Quindi tutte queste variabili vengono distrutte. Un parametro ha senso solo se alla funzione serve un parametro per eseguire un compito. Nel caso della somma tra due numeri, ha senso usare solo due parametri in quanto la somma avviene appunto tra soli due numeri. Il totale non ti serve; piuttosto, sarà il valore che restituirai da quella funzione. Ovviamente puoi anche memorizzare il risultato in una variabile, e poi restituirlo (ma in un caso del genere sarebbe anche inutile l'esistenza della variabile).

Codice:
int somma(int a, int b)
{
  int tot = a+b;
  return tot;
}
 
  • Mi piace
Reactions: Evans221

Hobet

Utente Attivo
609
222
Hardware Utente
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
Hard Disk
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
Scheda Video
GTX 1070ti MSI
Scheda Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Internet
Fastweb 200/30
Sistema Operativo
PucyBuntu
No in realtà appena iniziate a studiare avevo poco chiara la differenza tra passaggio per valore e per riferimento e quindi non capivo molto bene come impostare una funzione.
@Evans221
Eccoti un banale esempio di passaggio per valore e per parametro, l'esempio è cosi base che te darà un idea molto chiara.

VALORE:
Codice:
int eleva_Al_Quadrato(int);
main(){

int numero = 2;

eleva_Al_Quadrato(numero);

printf("%d", numero);
return 0;
}

eleva_Al_Quadrato(int parametro){
return parametro*parametro;
}
PARAMETRO

Codice:
void eleva_Al_Quadrato(int);
main(){

int numero = 2;

eleva_Al_Quadrato(&numero);

printf("%d", numero);
return 0;
}

eleva_Al_Quadrato(int *iPtr){
*iPtr = *iPtr * *iPtr;
}
Nel primo esempio int numero continuerà a valere 2, nel secondo varrà 4. Non mi metto a scrivere papiri sul perchè, ma se hai dubbi te li chiarirò volentieri
 
  • Mi piace
Reactions: Evans221

Entra

oppure Accedi utilizzando