DOMANDA Utilizzo di void in c++

  • Autore discussione Autore discussione MPG
  • Data d'inizio Data d'inizio
Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
E' giusto ma solo in parte. Sono cose che non trovi però sui libri, devi ragionarci tu per capire, in quanto derivano da ciò che si è appreso (qui si, sui libri).
Dico che è giusto in parte poichè se la funzione riceve due parametri vuol dire che effettua solo la somma, e l'input lo leggi dal main(). Quindi devi spostare la lettura nel main, e poi passare le due variabili come parametri (altrimenti non avrebbe senso scritto in quel modo).
 
Guarda sarà l'ora ma non so piu' come modificarlo cosa devo correggere? Perche ' cosi' mi funziona....
 
Comunque non editare i post precedenti aggiungendo commenti, altrimenti ci perdiamo qualcosa (ho notato ora che hai editato il tuo post precedente).
Riprendo il tuo edit.

Cioè se do' a a valore 3 e a b valore 5 che mi da somma 8 questi valori sono memorizzati nei parametri della funzione sommaValori ma queste variabili non sono le stesse del main? Non capisco sinceramente...

Ti da somma 8 dopo che la funzione viene eseguita, ma quando chiami la funzione, a questa vengono passati i valori 3 e 5 ed assegnati ai parametri della funzione. Tutto ciò che accade in quella funzione rimane li.
Considera questo codice, che è simile a quello che stavi facendo (tranne per il cout che non ho utilizzato):

C++:
#include<iostream>

void sommaVariabili(int a, int b, int s)
{
    s = a + b;
}


int main()
{
    int n1 = 2, n2 = 10, somma = 0;
    sommaVariabili(n1, n2, somma);
    std::cout << "somma: " << somma;
    
    return 0;
}

l'output sarà 0, in quanto l'operazione di addizione che è stata fatta nella funzione è locale alla funzione, e la variabile "s" (il parametro) esisterà solo sino a che la funzione non sarà terminata.

Non voglio farti fare ulteriore confusione; era per sottolineare il fatto che il parametro "somma" era inutile, per quanto appena detto. Più avanti vedrete in che modo si può modificare il valore del chiamante, ma solo quando vedrete i puntatori; se non erro BAT nel primo post ha fatto un discorso simile.


Infine quando prima scrivi per questa parte:

"
void sommaValori(double a, double b)
{
cin >> a;
cin >> b;
cout << (a+b);
}

"
Se noti la funzione è "void" e significa quindi che non viene restituito nessun valore al chiamante; il chiamante è quel codice che invoca la funzione stessa, nel tuo caso il main(). "

Poichè faccio sempre fatica a capirlo perchè si dice che non restituisce alcun valore anche se in questo caso dice di fare la somma di a+b ? perchè in realtà il valore lo determina il main? puoi spiegarmelo diversamente?
Ti ringrazio molto.

Nel tuo caso la funzione non restituisce niente: effettua solo la stampa a video, ma questo non significa che dalla funzione torni un valore al chiamante.

Una funzione restituisce un valore se viene indicato nella firma della funzione un tipo di ritorno. In pratica:
C++:
void sommaValori(double a, double b);

non restituisce alcun valore al chiamante, mentre invece:

C++:
double sommaValori(double a, double b);

indica che la funzione restituisce un valore di tipo double.
Quindi in questo ultimo caso la funzione verrebbe scritta in questo modo:

C++:
double sommaValori(double a, double b)
{
    return (a+b);
}

Il valore non viene determinato dal main; il valore viene restituito alla funzione chiamante (se c'è un tipo di ritorno).
In generale: quando una funzione viene eseguita e termina il suo compito, questa torna sempre al chiamante; qui c'è la differenza tra il tipo di ritorno "void" (senza alcun valore), oppure il ritorno con un determinato tipo. Se c'è il tipo di ritorno, il valore che viene restituito viene "passato" al chiamante (che normalmente lo memorizza in una variabile, o lo stampa a video).
Il chiamante è semplicemente la funzione che effettua la chiamata verso una funzione.

C++:
void f1()
{
   // Corpo funzione
}

void f()
{
    // corpo funzione
    f1();
}

int main()
{
    f();
    return 0;
}

In questo caso il main chiama la funzione f. Al suo interno, la funzione f() chiama la funzione f1(). Quindi quando la funzione f1() giunge al termine, torna al chiamante, che è f(). Quando termina la funzione f(), torna al chiamante, che è main().

Il "return 0 " del main(), anche in questo caso torna al chiamante: essendo però la funzione che avvia il programma, il controllo torna al sistema operativo. Il valore 0 (come diceva qualcuno prima, non ricordo chi) indica l'esito della terminazione; normalmente il valore 0 indica che il programma è terminato senza errori.
 
Ok ora ho capito molto di piu' !
Ritornando all'esercizio avevi scritto al post 16
"è giusto in parte poichè se la funzione riceve due parametri vuol dire che effettua solo la somma, e l'input lo leggi dal main(). Quindi devi spostare la lettura nel main, e poi passare le due variabili come parametri (altrimenti non avrebbe senso scritto in quel modo)."
Avevo tolto l's c'è qualcosa che devo ancora modificare?
Ultim cosa perchè nel main devo scrivere" sommaValori (a, b)" e mettere le variabili "double a, b" , ma non va se scrivo nel main "sommaValori (double a, double b)"? Perchè devo mettere solo parametri e non variabili?




Codice:
#include <iostream>

using namespace std;



void sommaValori (double a, double b)

{
cin>>a;
cin >>b;
cout<<a+b;
}


int main()
{
    double a, b;
    sommaValori (a,b);

    }

******************
INoltre tu prima scrivi che nel caso sotto il valore viene restituito alla funzione chiamante (se c'è un tipo di ritorno).

Codice:
       double sommaValori(double a, double b)
{
    return (a+b);
}
mi fai un esempio completo dell'esercizio con il main?

********************
Infine il prof aveva scritto in velocità parlando dei modi di fare le somme:


int main()
{
double x,y,s;
cin>>x>>y;//8 9

sommaValori1(x,y);

cout<<sommaDouble(x,y);

//oppure

s=sommaDouble(x,y);
}

Purtroppo va spesso in velocità e bisogna capire e non tutti sono cosi pronti a capire.. (me compreso), potresti spiegarmi un attimo editando l'esercizio completo ? Mette sia sommaValori1 che sommaDouble....
 
Ultima modifica:
perché il tipo delle variabili è il modo con cui una funzione identifica i valori che gli passi;
le funzioni che scrivi hanno una "firma", ossia hanno un nome, un tipo di valore ritornato (eventualmente vuoto = void) ed una lista di parametri cisacuno con un suo tipo
quando dichiari esternamente al main
void sommaValori (double a, double b) { // corpo funzione}
in questa dichiarazione i 2 double si chiamano parametri FORMALI
questa funzione riceverà in input dei valori di cui FA UNA COPIA E RINOMINA INTERNAMENTE con a e b
Quando nel main avrai per esempio
double x = 3.1415;
double y = 2.7172;

la chiamata
sommaValori(x, y); // senza tipo, è sottinteso che sono double
prende x, fa una copia del valore di x in un'altra cella di memoria che indica con a (passaggio per valore)
prende y, fa una copia del valore di y in un'altra cella di memoria che indica con b (passaggio per valore)
esegue i calcoli con a e b senza alterare x ed y

EDIT: esempio per il tuo caso
C++:
#include <iostream>
using namespace std;

double sommaVal(double a, double b){
    return a+b;
}

int main() {
    double a, b;
    cout << "Inserisci a --> ";
    cin >> a;
    cout << "\nInserisci b --> ";
    cin >> b;
    double somma = sommaVal(a, b);
    cout << a << " + " << b << " =  " << somma << endl;
    return 0;
}
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top