Passaggio di parametri per valore o per riferimento

Passaggio di parametri per valore o per riferimento

In C++ ci sono due modi per il passaggio dei parametri alle funzioni: passaggio di parametri per valore o per riferimento.

Passaggio di parametri per valore

Per capire bene il concetto partiamo da un esempio tipico che viene utilizzato spesso nelle spiegazioni.

#include <iostream>
using namespace std;

void swap(int a, int b) {
   int temp;
  
   temp = a;
   a = b;
   b = temp;
}

int main()
{
	int x, y;
	cout<<"Inserisci il numero x:";
	cin>>x;
	cout<<"Inserisci il numero y:";
	cin>>y;

	swap(x,y);

	cout<<x;
	cout<<y;
return 0;
}

In quest’esempio la funzione swap ha lo scopo di scambiare il valore di a con quello di b e viceversa, utilizzando una variabile temporanea.

Nel main poi inserisco due valori e richiamo la funzione swap su di essi.

Stampo i valori in output ma non sono cambiati!

Perché? Non sono cambiati perché lo scambio è avvenuto all’interno della funzione swap ma non si può riflettere al di fuori di essa. La funzione swap infatti non restituisce un valore ma fa un’operazione di scambio che avviene all’interno della funzione stessa.

Diverso infatti quando scriviamo:

int somma (int a, int b)
{
   int s;
   s=a+b;
   return s;
}

Infatti in questo caso si ha un passaggio di parametri per valore ma la funzione mi ritorna la somma. E quindi quando poi vado a richiamare la funzione nel main mi restituirà effettivamente la somma.

Il discorso nell’esempio dello swap è ben diverso dunque.


Passaggio di parametri per riferimento

Un’altra modalità di passaggio di parametri è quello per riferimento.

Facciamo quindi subito un altro esempio.

#include <iostream>
using namespace std;

void swap(int *a, int *b) {
   int temp;
  
   temp = *a;
   *a = *b;
   *b = temp;
}

int main()
{
	int x, y;
	cout<<"Inserisci il numero x: ";
	cin>>x;
	cout<<"Inserisci il numero y: ";
	cin>>y;
	swap(x,y);
	cout<<"x vale: "<<x<<endl;
	cout<<"y vale: "<<y;
return 0;
}

Come potete notare il passaggio per riferimento avviene utilizzando il simbolo * e poi la variabile, cioè utilizzando il puntatore alla variabile.

Ad un puntatore infatti si fa puntare l’indirizzo della variabile e quindi chiaramente cambiando il puntatore si cambia il valore da esso puntato.

In questo modo la funzione invocata e quella invocante utilizzano le stesse variabili che dunque possono essere scambiate.

Questi sono solo dei semplici esempi per spiegare il passaggio di parametri per valore o per riferimento.

Alcuni link utili:

Ciclo while in C++

Ciclo do while

Iterazioni con il ciclo for in C++

Operatori logici in C++

Esercizi con switch case in C++

Switch case in C++

If else in C++

Casting in C++

Variabili in C++

Tutorial C++

Successione di Fibonacci in C++


Coding con Scratch

Coding con Scratch

In questo articolo impareremo a fare coding con Scratch in maniera semplice, senza utilizzare le strutture condizionali (se, se allora) o iterative (ripeti, ripeti fino a quando).


Esempio di coding con Scratch

Dato il perimetro di un triangolo equilatero calcolare l’area.

Bene, il problema è di facile risoluzione e presenta varie soluzioni.

La prima, più ovvia, prevede l’uso della formula:

area=sqrt(3)/36*(perimetro)2 dove con sqrt indichiamo la radice quadrata.

Il risultato di questa operazione con, ad esempio, il perimetro uguale a 24 cm è 27,71 cm2.

Ma ci sono anche altri procedimenti, bensì più lunghi, per trovare l’area.

Infatti, un triangolo equilatero ha tutti e tre i lati uguali, quindi diventa facile calcolare il lato. Basta fare questa operazione per ottenere la misura del lato: (24/3) cm=8 cm

Bene allora potremmo utilizzare questa formula:

area=sqrt(3)/4*(lato)2

Ho ancora un’altra possibilità che è quella di ricavarmi l’altezza e seguire questa formula area=(altezza)2/sqrt(3) ma ovviamente in questo caso è la soluzione meno logica da adottare.

Tutto ciò per mostrarvi che dato un problema esistono parecchie soluzioni, da quella più ottimale a quella meno, con più o meno passaggi.


Algoritmo che risolve l’area di un triangolo equilatero avendo il perimetro

Questo semplice problema si può risolvere anche creando del coding con Scratch, cioè utilizzando la programmazione a blocchi, molto semplice da implementare rispetto ai linguaggi di programmazione.

Utilizzo la prima soluzione che è la più ovvia.

Innanzitutto scelgo uno sfondo e uno sprite qualunque.

sfondo coding

Dopo creo le variabili, in questo caso me ne servono solo due: area e perimetro.

variabili area triangolo

Poi realizziamo il nostro codice a blocchi.

Chiediamo innanzitutto il perimetro e lo memorizziamo in una variabile.

Dopo memorizziamo nella variabile area il risultato della seguente formula: sqrt(3)/36*(perimetro)2

Ma il risultato sarà un numero con la virgola, quindi occorre arrotondarlo.
Per arrotondare a due cifre decimali moltiplico l’area per 100 e con la funzione arrotonda tolgo le altre cifre. Dopo divido il risultato per 100.

Ecco un esempio di coding con Scratch con la risoluzione del problema proposto.

coding scratch

Chiaramente si potrebbero aggiungere i controlli dell’input.

Questo è solo un possibile esempio di coding con Scratch. Ne farò tantissimi altri andando avanti nei tutorial.

Alcuni link utili

Divisori di un numero con scratch

Multipli di un numero con scratch

Numeri pari con scratch

Esercizi con scratch

Potenze con scratch

Quoziente potenze stessa base con scratch

Palindroma con scratch

Storiella con scratch

Serie buffa con scratch

Operazioni matematiche con scratch

Come sommare un intervallo di numeri con scratch

Anno bisestile con scratch

Selezione con scratch

Olimpiadi di informatica con scratch

Olimpiadi di matematica con scratch

Figure equivalenti con scratch

Come riconoscere gli angoli con scratch

Morra cinese con scratch

Giochi matematici autunno 2018

Esempi di giochi matematici Bocconi

Gioco della tabellina con scratch

Disegnare poligoni regolari con scratch

Numeri primi in Scratch