Un esercizio molto utile per approfondire l’utilizzo dei puntatori in C/C++. Questa volta troviamo il max e min di un vettore, problema piuttosto classico per queste strutture dati, ma utilizziamo i puntatori per stampare i valori trovati.
Tralasciamo le prime due funzioni decisamente intuitive ma utili: una riempie l’array di numeri casuali da 1 a 100, estremi settabili e l’altra stampa semplicemente il vettore. Le due funzioni che ci interessano sono speculari e ben note all’alunno che ha già cominciato un percorso di programmazione in c/c++. Concentriamoci sul massimo.
int * massimo(int _v[])
{
int i = rangeMin;
int *m = &i;
for (int i=0; i < N; i++)
{
if (_v[i] > *m)
{
m = &_v[i];
//cout << *m << endl; //DEBUG
}
}
return m;
}
Il parametro passato è banalmente il vettore. Assumiamo per semplicità che sia gestito interamente. Qualche lettore potrà infatti essere abituato a passare sempre coppia vettore e numero di elementi “attivi” del vettore con n <= dimensione complessiva del vettore. Il tipo di ritorno forse è inusuale ma vogliamo esplicitamente tornare un puntatore, non la copia di qualche elemento, ma proprio un puntatore a quell’elemento scovato. Quindi prima ancora di scrivere il codice dobbiamo creare un puntatore ad intero che chiamo m. Ora la strategia algoritmica. Devo trovare il max e fondamentalmente l’algoritmo è noto. Scorro tutto il vettore ed uso un buffer per mettere da parte il valore massimo intermedio fino al prossimo confronto. In un esercizio standard, questo sarebbe un semplice contenitore dello stesso tipo del vettore e li ci metterei una copia del numero del vettore candidato di volta in volta ad essere il massimo.
#include <iostream>
#include <time.h>
using namespace std;
#define N 10
#define rangeMin 1
#define rangeMax 100
void riempiVettoreRandom(int _v[], int _min, int _max)
{
for (int i=0; i < N; i++)
{
_v[i] =rand() % (_max - _min )+ _min;
}
}
void stampaVettore(int _v[])
{
for (int i=0; i < N; i++)
{
cout << _v[i] << " ";
}
cout << endl;
}
int * massimo(int _v[])
{
int i = rangeMin;
int *m = &i;
for (int i=0; i < N; i++)
{
if (_v[i] > *m)
{
m = &_v[i];
//cout << *m << endl; //DEBUG
}
}
return m;
}
int * minimo(int _v[])
{
int i = rangeMax;
int *m = &i;
for (int i=0; i < N; i++)
{
if (_v[i] < *m)
{
m = &_v[i];
//cout << *m << endl; //DEBUG
}
}
return m;
}
int main()
{
int *pmax;
int *pmin;
int vettore[N];
srand(time(NULL));
riempiVettoreRandom(vettore, rangeMin,rangeMax);
stampaVettore(vettore);
pmax= massimo(vettore);
cout <<"Il massimo è "<< *pmax << endl;
pmin= minimo(vettore);
cout << "Il minimo è " << *pmin;
return 0;
}
Ultima modifica 28 Dicembre 2023