Un piccolo studente che ha bisogno di una grande mano...

di il
51 risposte

51 Risposte - Pagina 4

  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Raga, stavo studiando le funzioni...
    Semplice programma: passaggio per valore.
    
    #include <iostream>
    using namespace std;
    int funzione (int a, int b)
    {
    	int c = a + b;
    	return c;
    }
    int main ()
    {
    	int x, y, somma;
    	cout << "Quali numeri vuoi sommare?" << endl;
    	cin >> x >> y;
    	somma = funzione (x, y);
    	cout << "La somma vale: " << somma;
    	return 0;
    }
    
    Nella funzione che dichiaro devo inserire il tipo + nome di ogni variabile (int a, int b) poi la richiamo nel main e in "corrispondenza" ci infilo le variabili già inserite del main (x,y)...
    Passaggio per indirizzo è invece:
    
    #include <iostream>
    using namespace std;
    int funzione (int *a, int *b)
    {
    	int c = *a + *b;
    	return c;
    }
    int main ()
    {
    	int x, y, somma;
    	cout << "Quali numeri vuoi sommare?" << endl;
    	cin >> x >> y;
    	somma = funzione (&x, &y);
    	cout << "La somma vale: " << somma;
    	return 0;
    }
    
    Quando inserisco tipo+variabile nella funzione ho bisogno di usare * prima del nome della variabile, nel main quando infilo le variabili devo inserire &.
    Sostanzialmente succede la stessa cosa...
    Mi sapreste spiegare meglio? Come mai dovrei preferire una, rispetto l'altra?
    Grazie...
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Luggigi: "Mi dà srand e rand non dichiarati nello scope..."

    Questo succede perché devi includere il file di intestazione della libreria dalla quale sono tratte. Usa #include <cstdlib>.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Luggigi: "Come mai dovrei preferire una, rispetto l'altra?"

    Ci sono un sacco di ragioni che dipendono dal contesto, dalle condizioni. Sarebbe fuorviante riportarne solo una, e per riportarne di più ci vorrebbe l'equivalente di un capitolo. Capirai che non è proprio pratico.

    Di base, comunque, SI TENDE A usare il passaggio per indirizzo quando si deve modificare la variabile, oppure quando si devono passare quantità di dati sconvenientemente ponderose. Particolarmente, in C++ quando hai degli oggetti che, nel passaggio per valore, usano costruttori di copia che implicano allocazioni/deallocazioni e "movimento" di dati in quantità esagerate. C'è da dire che in C++ tante volte si preferisce usare i reference, che sono un caso particolare con ulteriori dettagli che varrebbe la pena conoscere.

    Ti conviene leggere qualcosa di ben più esteso di così, perché il "sunto" che ti ho appena fatto è lacunoso assai.

    P.S. dimenticavo: quando passi per valore, passi una copia del dato, cioè una variabile nuova di zecca nella quale viene copiato il valore della variabile originale; quando passi per indirizzo passi un numero che dice in quale posizione di memoria si trova la variabile originale, e in pratica fornisci alla funzione chiamata i mezzi per accedere direttamente a quel che è contenuto in quello spazio di memoria, leggendolo e/o modificandolo (a meno che usi const, nel qual caso puoi solo leggere).
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Mi sa che tra un po' ti si dice di aprire un nuovo thread, perché hai già cambiato argomento non una volta sola.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Infatti ... è diventata una chat ...

    Un nuovo thread sarebbe d'obbligo, magari con un titolo adeguato e in modo di discutere di un solo argomento.
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Sostanzialmente mi sono messo un po' sotto e ho capito funzioni + passaggio per puntatore / indirizzo.
    Adesso mi sto esercitando in vista dell'esame.
    Devo aprire un altro thread? In fin dei conti credo che l'argomento del thread siano i dubbi che mi sono venuti nel corso dello studio: sbaglio?
    Se in caso sto sbagliando, mi scuso ovviamente... non era mia intenzione.

    Esercizio:
    "Scrivere un programma C++ che legga da input una sequenza di interi positivi terminata dal valore sentinella zero e conti quante volte il valore inserito è maggiore del valore inserito precedentemente."
    Esercizio un po' strano, valore sentinella zero: mi sta suggerendo di usare un while.
    Devo inizializzare secondo me una variabile x ed una cont a zero più dichiarare una variabile y ed una cont1.
    In pratica, aggiungendo una y devo dire quante volte y è maggiore della precedente. Secondo me solo per il primo numero, y è maggiore di y volte rispetto a 0. Mi sa anche che con cont1 devo fare lo scambio fra x e y, in modo tale che "rimanga salvato" il valore dell'ultimo valore aggiunto in x.
    Per mezzo di un ciclo while aggiungo ora la mia sequenza da interi, con cont in cout mando il rapporto y/x per vedere quante volte y è maggiore di x + devo fare ogni volta il gioco dello scambio prima di rientrare nel ciclo con "la nuova aggiunta".
    Diciamo che non riesco ad ottenere ciò che voglio...
  • Re: Un piccolo studente che ha bisogno di una grande mano...

    Non hai capito.

    Guarda che devi proprio creare un nuovo thread con titolo opportuno sullo specifico problema tecnico (già questo non è che andasse bene).

    Poi ricorda che non si lascia un esercizio e vasta ma si discute di un particolare problema o codice. Quesro non è un corso di programmazione o una scuola ma un forum tecnico.

    Leggi il regolamento.
Devi accedere o registrarti per scrivere nel forum
51 risposte