Ho scritto un codice per il calcolo di media, mediana e moda ma funziona solo per un numero di studenti maggiore o uguale a 7; per 6 o meno studenti non calcola la moda ed in debug mi da questo codice di errore: "Program Received signal SIGSEGV. Stack trace is available in the 'Call Stack' tab". Uso CodeLite. Per provare il codice con 6 studenti o meno cambiare la dimensione della Macro SIZE da 12 (o più) a 6 (o meno).
#include <stdio.h>
#include<stdlib.h>
#define SIZE 12
#define MAXVOTE 10
void printArray(int a[], int dim); // stampa l'array
void bubbleSort(int a[], int dim); // ordina l'array
void calcoloMedia(int a[], int dim); // calcola la media dei valori inseriti
void calcoloMediana(int a[], int dim); //calcola la mediana tra i valori inseriti cioe' il valore centrale della lista di valori
void calcoloModa(int a[], int dim, int dimVote); // calcola la moda cioe' il valore piu' frequente
int main(void) {
int array[SIZE];
int answer = 1;
printf("Questo e' un programma dove verranno utilizzate delle funzioni per il calcolo della media, della mediana, della moda ");
printf("ed il bubble sort applicato a degli array contenente le votazioni da 0 a 10 di %d studenti.\n\n", SIZE);
while(answer == 1) {
printf("Si prega di inserire un array di %d numeri interi da 0 a 10:\n", SIZE);
for(int i = 0; i < SIZE; ++i) {
scanf("%d", &array[i]);
}
puts("");
printArray(array, SIZE);
bubbleSort(array, SIZE);
printArray(array, SIZE);
calcoloMedia(array, SIZE);
calcoloMediana(array, SIZE);
printArray(array, SIZE);
calcoloModa(array, SIZE, MAXVOTE);
printf("\nVuoi procedere con un altro array? Inserisci 1 per continuare oppure 0 per terminare: ");
scanf("%d", &answer);
puts("");
}
}
void printArray(int a[], int dim) { // stampa l'array
printf("Stampiamo l'array:\n");
for(int i = 0; i < dim; ++i) {
printf("%d\t", a[i]);
}
puts("\n");
}
void bubbleSort(int a[], int dim) { // ordina l'array
printf("Ordiniamo l'array.");
for(int pass = 0; pass < dim; ++pass) {
for(int i = 0; i < (dim - 1); ++i) {
if(a[i] > a[i+1]) {
int hold = a[i+1];
a[i+1] = a[i];
a[i] = hold;
}
}
}
puts("\n");
}
void calcoloMedia(int a[], int dim) { // calcola la media dei valori inseriti
int total = 0;
for(int i = 0; i < dim; ++i) {
total += a[i];
}
printf("Calcoliamo la media. La media e': %d / %d = %.4f", total, dim, (float)total / dim );
puts("\n");
}
void calcoloMediana(int a[], int dim){ //calcola la mediana tra i valori inseriti cioe' il valore centrale della lista di valori
printf("Calcoliamo la mediana della lista di numeri interi nell'array:\n");
printf("La mediana e': %d", a[SIZE / 2]);
puts("\n");
}
void calcoloModa(int a[], int dim, int dimVote) { // calcola la moda cioe' il valore piu' frequente
int frequenze[dim + 1];
for(int i = 0; i <= dimVote; ++i) {
frequenze[i] = 0;
}
printf("\nStampiamo le frequenze relative a ciascun numero dell'array.\n");
for(int i = 0; i < dim; ++i) {
++frequenze[a[i]];
}
puts("\n");
for(int i = 0; i <= dimVote; ++i) {
printf("%d\t%d\n", i, frequenze[i]);
}
}