Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    4

    funzioni in c++

    Ciao a tutti,
    sono un principiante del c++, lo sto studiando per l'università, ma essendo non frequentante, ho parecchi problemi, tra cui un esame a breve .
    Vado al punto:
    in una funzione del genere:

    #include <iostream>
    using namespace std;
    void test(int a, int& b)
    {
    a /= 2;
    for (int k = 0; k < a; k++)
    {
    b *= 2;
    }
    }

    void main()
    {
    int x = 4, y = 1;
    test(x, y);
    cout << x << " " << y << endl;

    test(y, x);
    cout << x << " " << y << endl;
    }

    Non capisco perchè il risultato è:

    x = 4 y = 4
    x = 16 y = 4

    In pratica non capisco il procedimento.
    Come già detto le basi minime le ho studiate,
    ma non avendo frequentato il corso mi manca davvero tanto!!!
    Mi scuso in anticipo se per voi è una domanda banale.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Il modo migliore per capire cosa fa è prendere un pezzo di carta ed eseguire a mano l'algoritmo. Ricorda che test(x,y) è diverso da test(y,x), dato che inverti l'ordine dei parametri.

    Prova a farlo, poi se hai ancora problemi torni.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: funzioni in c++

    Originariamente inviato da raven27
    Non capisco perchè il risultato è:

    x = 4 y = 4
    x = 16 y = 4

    In pratica non capisco il procedimento.
    Conosci la differenza tra il passaggio di parametri per valore e per riferimento? Il succo dell'esercizio è tutto qui
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    4
    Dunque dalle dispense che sto studiando ho intuito che il problema
    riguarda lo scambio di parametri, ma non capisco le definizioni:

    "nello scambio per valore la funzione chiamante passa alla funzione chiamata
    i valori dei parametri attuali, non i parametri attuali"

    "nello scambio per riferimento la funzione chiamante passa alla funzione chiamata
    il riferimento dei parametri attuali".

    nella riga
    void test(int a, int& b)
    cosa indica la &???, il tipo di passaggio del parametro???

    e poi gli operatori /= *=
    o anche ++ -- += -=

    non ci crederete, ma non ho trovato ancora una spiegazione!!!
    Vi assicuro che ci sto provando a risolvere da me, infatti, sono partito dal non sapere affatto usare visual studio, a scrivere semplici programmi con costrutti condizionali e iterativi, facili operazioni di calcolo...E tutto anche grazie a voi.

    ma proprio questa parte non riesco a capirla

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da raven27
    "nello scambio per valore la funzione chiamante passa alla funzione chiamata
    i valori dei parametri attuali, non i parametri attuali"
    Passaggio per valore: la funzione riceve una copia delle variabili passate. Questo significa che ogni modifica effettuata sui parametri non sarà visibile al di fuori della funzione.
    Originariamente inviato da raven27
    "nello scambio per riferimento la funzione chiamante passa alla funzione chiamata
    il riferimento dei parametri attuali".
    Passaggio per riferimento: la funzione riceve un riferimento alle variabili passate. In pratica le evetuali modifiche a quelle variabili si rifletteranno anche al di fuori della funzione.

    Originariamente inviato da raven27
    nella riga
    void test(int a, int& b)
    cosa indica la &???, il tipo di passaggio del parametro???
    Indica che b viene passato per riferimento (a invece viene passato per valore).

    Originariamente inviato da raven27 e poi gli operatori /= *=
    o anche ++ -- += -=
    non ci crederete, ma non ho trovato ancora una spiegazione!!!
    Su cosa stai studiando? Mi pare impossibile che tu non riesca a trovare il significato di questi operatori...

    In breve:

    x /= y è la forma abbreviata di x = x / y (e cosi via gli altri)
    x++ sta per x = x +1
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    4
    Ho studiato dalla dispensa che il prof ha messo in rete, solo che è molto superficiale, ad esempio elenca quasi tutti i termini e gli operatori fondamentali per la programmazione c++, ma non ne spiega il significato, probabilmente perchè è stato spiegato in laboratorio o a lezione.
    Io ci sono arrivato o attraverso i forum o rifacendo gli esercizi che hanno svolto in lab.

    Vi scrivo quello che ho capito finora, al massimo vi fate 2 risate
    La funzione copia il valore di x e lo "inserisce" nella variabile A che viene divisa per 2.
    ma siccome la variabile A è presa per valore il programma restituisce x=4

    Poi esegue il ciclo di for per 2 volte pertanto il riferimento di y che viene "inserito" nella variabile B viene restituito con valore pari a 4.

    Però non mi spiego i risultati che mi dà se inverto x e y

    scusatemi ancora se ho scritto delle oscenità!!!

  7. #7
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Originariamente inviato da raven27:
    Però non mi spiego i risultati che mi dà se inverto x e y.
    Ricordati che tra le due funzioni i valori non vengono resettati, quindi dopo la prima funzione x=4 e y=4.

    Poi fai lo stesso ragionamento solo che la seconda volta che chiami la funzione a = valore di y, quindi a = 4 mentre b = riferimento di x, quindi b = 4. Tuttavia ogni modifica fatta su b si ripercuoterà su x.

    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    la risposta è più facile di quello che sembra (... anche se in realtà in logica proposizionale è mooooolto più difficile di quello che si può sospettare )

    Vabbè la spiegazione-niubbo è questa:

    quando passi una variabile ad una funzione (per valore)questa viene "sdoppiata", e può mantenere lo stesso nome, oppure no.

    Quando nella definizione della funzione c'è scritto
    (tipo nomevariabile,...) avrai una variabile nomevariabile del tutto INDIPENDENTE dal valore della variabile "padre".
    Alla chiamata della funzione nomevariabile viene impostata al valore che passi alla funzione, poi "si sgancia".

    Dimezzi la variabile "figlia" (dentro la funzione) fuori dalla funzione la variabile "padre" rimarrà identica.
    ----------
    Il passaggio per "riferimento" è un modo per "incapsulare" i puntatori C; lo riconosci perchè c'è

    (tipo & nomevariabile,...)

    In questo caso nomevariabile è un [i]alias[/b] della variabile "padre".
    Se dimezzi la variabile "figlia", anche la variabile "padre" sarà dimezzata

    EDIT:
    codice:
    // a viene sempre lasciato invariato FUORI da questa funzione
    // perchè è passata per valore (int a, manca l' &)
    // quindi puoi paciugare il primo parametro quanto vuoi, ma FUORI
    // non avrai effetti collaterali
    
    // mentre il secondo parametro (b) viene passato per riferimento,
    // (c'è la &), QUINDI le modifiche che farai al SECONDO PARAMETRO
    // varranno anche fuori dalla funzione test
    
    void test(int a, int& b) 
    {
    a /= 2; 
    for (int k = 0; k < a; k++)
    {
    b *= 2;
    }
    }
    
    void main() 
    {
    int x = 4, y = 1; 
    test(x, y); 
    cout << x << " " << y << endl; 
    
    // nella prima chiamata il PRIMO PARAMETRO
    // non viene modificato (è passato per valore)
    // quindi x (primo parametro) prima e dopo la chiamata sarà identico
    // ossia x=4  test() x=4
    // il SECONDO parametro invece cambia anche FUORI
    // y=1 test() y=4
    
    
    test(y, x); 
    cout << x << " " << y << endl; 
    
    // bene, stesso discorso.
    // solo che questa volta il PRIMO parametro (quello "fisso") è y
    // y=4 test() y=4
    // mentre il SECONDO parametro cambia
    // x=4 test() x= 16
    }

    Riassumendo: il PRIMO PARAMETRO rimane invariato (fuori), il SECONDO viene paciugato.

    Indipendentemente da come si chiamano fuori:
    test(pippo,pluto) => pippo rimane uguale,e pluto cambia
    test(x,y) => x rimane uguale, y cambia
    test(y,x) => y rimane uguale, x cambia

    test(x,x) COSA FA? (te lo lascio per esercizio!)

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    4
    Ok ci sono!!!
    grazie a tutti, non mi resta che fare parecchio esercizio!!!

    con test(x,x)
    i valori di ritorno saranno
    x=16 y=1

    perchè la variabile x viene presa sia per valore che per riferimento
    e pertanto verrà modificata.

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    23
    @Raven72 per la prossima volta mi raccomando il codice tra i tag ma soprattutto formattato: è molto più comprensibile sebbene si tratti di programmi semplici!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.