libri-javascript-python

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

Indice argomenti C++

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++

Array in C++

Esercitazione sugli array in C++

Esercizi con gli array

Ricerca sequenziale in C++

Ricerca in un array ordinato

Array con numeri random

Ricerca binaria