Tema d’esame – 1° compitino 2005 Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore massimo nell’array e calcolare la media di tutti i suoi elementi. Nel dettaglio, si richiede di scrivere le seguenti funzioni C: – main prevede un ciclo globale in grado di far eseguire il programma più volte, finchè l’utente non decide di terminare; main chiama la funzione visualizzaMenu per stampare il menu dei comandi ed esegue le azioni relative alla scelta dell’utente ritornata da tale funzione (comprende il controllo sugli errori di input) – visualizzaMenu stampa il menu dei comandi, ricevendo un array di stringhe (lista delle opzioni) come parametro dal main, e ritorna l’intero corrispondente alla scelta fatta dall’utente; notare che l’array di stringhe del menu va definito nel main e poi passato come parametro a visualizzaMenu – caricaVettore è chiamata dal main e carica l’array con 100 interi casuali da 10 a 100 e stampa in modo leggibile gli elementi generati – cercaMassimo, chiamata dal main, trova e stampa il dato nell’array col valore più alto, oltre alla frequenza con cui tale valore compare nell’array; questa funzione non ritorna nulla al main, stampa autonomamente il massimo e la sua frequenza – calcolaMedia, chiamata dal main, ritorna la media dei dati dell’array (2 decimali) Anche il buon uso di rientri nel codice e commenti sarà oggetto di valutazione. Visualizzazione del programma (1/2) Visualizzazione del programma (2/2) Sviluppo del main (1/2) 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 #include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 100 /* Caricamento librerie – Per I/O e random */ /* Definizione di costante – Dimensione dell’array */ int visualizzaMenu ( char [ ] [50] ); void caricaVettore ( int [ ], int ); void cercaMassimo ( int [ ], int ); float calcolaMedia ( int [ ], int ); int main (){ /* Prototipi delle funzioni */ /* Definizione della funzione principale */ char menuOperazioni [4] [50] = { /* Dichiarazioni di variabili */ { "1) Carica l’array“ }, { "2) Ricerca il massimo“ }, { "3) Calcola la media“ }, { "0) Esci dal programma“ } }; int vettoreCasuale [SIZE], scelta = -1; float media; Sviluppo del main (2/2) 22 while ( scelta != 0 ){ /* Ciclo per eseguire più volte il programma */ 23 scelta = visualizzaMenu(menuOperazioni); /* Carica il menu */ 24 switch (scelta){ /* Decisione di cosa fare in base all’input utente */ 25 case 1: 26 caricaVettore(vettoreCasuale, SIZE); 27 break; 28 case 2: 29 cercaMassimo(vettoreCasuale, SIZE); 30 break; 31 case 3: 32 media = calcolaMedia(vettoreCasuale, SIZE); 33 printf( "\nLa media dei valori e' %5.2f\n\n“, media ); 34 break; 35 case 0: /* Se l’input è 0 non fa nulla e al prossimo giro esce */ 36 break; 37 default: /* Rifiuta ogni input diverso dai precedenti */ 38 printf( “Scelta non corretta. Inserire un nuovo valore\n“ ); 39 break; /* Ma non esce, passa al giro successivo del ciclo*/ 40 } 41 } 42 } 43 Sviluppo delle funzioni (1/2) 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 /* Funzione che visualizza il menu e ritorna la scelta dell’operazione da fare */ int visualizzaMenu ( char menu [ ] [50] ){ int i, selezione = 0; printf( "\n\n\n\nMENU DEI COMANDI\n*********************\n“ ); for ( i=0; i<4; i++ ) printf( "%s\n“, menu[i] ); /* Stampa riga per riga */ printf( "\nDigitare la scelta corrispondente all’operazione: “ ); scanf( “%d”, &selezione ); return selezione; } /* Funzione che carica il vettore con numeri casuali */ void caricaVettore ( int vettore [ ], int dimensione ){ int valoreCasuale, i; srand( time( NULL ) ); /* Randomizza la sequenza generata da rand() */ for ( i=0; i<dimensione; i++ ){ /* Ciclo che riempie il vettore */ valoreCasuale = 10 + ( rand() % 91); /* con numeri casuali */ vettore[i] = valoreCasuale; } printf( “\n” ); for ( i=0; i<dimensione; i++ ){ printf( "%3d “, vettore[i] ); if ( i % 20 == 19 ) printf( “\n” ); } } /* Stampa il vettore originale */ Sviluppo delle funzioni (2/2) 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 /* Funzione che cerca e stampa sia il massimo che la sua frequenza */ void cercaMassimo ( int vettore [ ], int dimensione ){ int i, max = 0, fmax = 0; for ( i=0; i<dimensione; i++ ){ if ( vettore[i] > max ){ /* Se il dato è maggiore del massimo corrente */ max = vettore[i]; /* esso diventa il nuovo massimo corrente */ fmax = 1; /* e si resetta il contatore delle occorrenze */ } else if ( vettore[i] == max ) fmax++; /*Se il dato è uguale al */ } /* massimo corrente, ne incrementa il contatore */ printf( "\nIl massimo e' %d, presente %d volte\n\n“, max, fmax ); } /* Funzione che calcola la media dei valori del vettore passato */ float calcolaMedia ( int vettore [ ], int dimensione ){ int i, totale = 0; for ( i=0; i<dimensione; i++) totale += vettore[i]; return (float) totale / dimensione; }