Affronteremo oggi un esercizio su array e funzioni in C++, creando un menù di scelta che consente di scegliere quali operazioni eseguire sugli array.
In particolare il problema si occupa di generare un array di 50 numeri casuali compresi fra 1 e 100 e offrire a menu le seguenti scelte:
1. Calcolare la media
2. Visualizzare il massimo
3. Visualizzare il minimo
4. Rigenerare l’array
5. Visualizzare i valori che distano meno di 4 dalla media
6. Calcolare la moda
7. Uscire dal programma
Quindi definiamo i prototipi delle funzioni e procedure che useremo nel programma.
Creiamo innanzitutto la funzione per generare il menù di scelta, utilizzando il costrutto swith-case.
Poi creiamo la funzione genera che serve a generare un array casuale di numeri da 1 a 100 dove includiamo anche la stampa dell’array in modo da visualizzare a video gli elementi generati. La funzione non restituisce nulla.
Le funzioni per il calcolo del massimo e del minimo prendono come parametro l’array e ritornano un valore intero che corrisponde al massimo e al minimo.
La funzione per il calcolo della media prende come parametro l’array e ritorna un valore float.
Infine creiamo la funzione per il calcolo della moda che prende come parametro l’array e non restituisce nulla.
Ecco dunque l’algortimo completo per la risoluzione del problema che utilizza array e funzioni in C++.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define N 50
void genera(int a[N]); //prototipo funzione che genera un array casuale
float media(int a[N]); //prototipo funzione per il calcolo della media
int max(int a[N]); //prototipo funzione per il calcolo del massimo
int min(int a[N]); //prototipo funzione per il calcolo del minimo
void dist(int a[N]); //prototipo funzione distanza dalla media
void moda(int a[N]); //prototipo funzione per il calcolo della moda
int menu_scelta(void)
{
int selezione = 0;
do
{
cout<<endl<<"1 - Calcolare la media"<<endl;
cout<<"2 - Massimo"<<endl;
cout<<"3 - Minimo"<<endl;
cout<<"4 - Rigenera array"<<endl;
cout<<"5 - Visualizzare i valori che distano meno di 4 dalla media"<<endl;
cout<<"6 - Calcolare la moda"<<endl;
cout<<"7 - Esci"<<endl;
cout<<"Effettua una scelta:"<<endl;
cin>>selezione;
}
while (selezione< 1 || selezione>7);
return selezione;
}
int main(void)
{
int scelta;
int massimo,minimo;
float med;
int v[N];
genera(v);
while((scelta=menu_scelta())!=7){
switch(scelta){
case 1:
med=media(v);
cout<<"media: "<<med<<endl;
break;
case 2:
massimo=max(v);
cout<<"Il massimo e':"<<massimo<<endl;
break;
case 3:
minimo=min(v);
cout<<"Il minimo e':"<<minimo<<endl;
break;
case 4:
genera(v);
break;
case 5:
dist(v);
break;
case 6:
moda(v);
break;
}
}
return 0;
}
void genera(int a[N]){
int i;
srand(time(NULL));
for (i=0; i<N; i++)
a[i]=rand()%100+1;
cout<<"Stampo l'array generato"<<endl;
for (i=0; i<N; i++)
cout<<a[i]<<"\t";
}
float media(int a[N]) {
int m=0;
int i;
for (i=0; i<N; i++){
m+=a[i];
}
m=m/N;
return m;
}
int max(int a[N]) {
int massimo=a[0];
int i;
for (i=0; i<N; i++)
if(a[i]>massimo)
massimo=a[i];
return massimo;
}
int min(int a[N]) {
int minimo=a[0];
int i;
for (i=0; i<N; i++)
if(a[i]<minimo)
minimo=a[i];
return minimo;
}
void dist(int a[N]) {
float med=media(a);
int i, dist1, dist2, trovato=0;
dist1=med+4;
dist2=med-4;
cout<<"I valori sono che distano meno di 4 dalla media sono: "<<endl;
for (i=0; i<N; i++){
if(a[i]>dist2 && a[i]<dist1){
cout<<a[i]<<" in posizione "<<i<<"\t";
trovato=1;
}
}
if(trovato!=1)
cout<<" nessun elemento "<<endl;
}
void moda(int a[N]) {
int cont=0, i, pos, moda, max=1;
for (int i=0; i<N; i++){
cont=0;
for (int j=i+1; j<N; j++){
if (a[i]==a[j]){
//se trova un numero uguale incrementa il contatore
cont++;
pos=i; //memoriazziamo l'indice dell'elemento
}
if (cont>max){ //se cont è maggiore del massimo
max=cont; //in max mettiamo il valore di cont
moda=pos; //memorizziamo in moda l'indice dell'elemento con frequenza più alta
}
}
}
cout<< "Il numero: "<<a[moda]<< " compare "<<max<<" volte"<<endl;
}
Chiaramente questa è solo una possibile soluzione al problema proposto, proponete pure la vostra nei commenti sotto.
Alcuni link utili
Iterazioni con il ciclo for in C++
Esercizi con switch case in C++
Successione di Fibonacci in C++
Esercitazione sugli array in C++