Media, mediana e moda

di il
7 risposte

Media, mediana e moda

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]);
	}	
}

7 Risposte

  • Re: Media, mediana e moda

    for(int i = 0; i < dim; ++i) {
    	++frequenze[a[i]];
    }
    Credo che il segmentation fault venga da qui. Stai usando l'elemento di un vettore come indice per un altro. Se "a[ i ]" vale 100, tu stai incrementando di 1 l'elemento 100 di frequenze.
    EDIT: ho visto che hai posto limite 10 ai numeri da inserire, quindi in teoria dovresti essere al riparo da quel problema.
  • Re: Media, mediana e moda

    Andrea Quaglia ha scritto:


    for(int i = 0; i < dim; ++i) {
    	++frequenze[a[i]];
    }
    Credo che il segmentation fault venga da qui. Stai usando l'elemento di un vettore come indice per un altro. Se "a[ i ]" vale 100, tu stai creando l'elemento 100 di frequenze.
    Si ok, è vero ma i numeri che si possono inserire da traccia dell'esercizio sono da 0 a 10 in quanto voti decimali di studenti... Nel provare il codice ho inserito solo numeri da 0 a 10.
    Questo è l'esempio per 12 studenti:
    Questo e' un programma dove verranno utilizzate delle funzioni per il calcolo della media, della mediana, della moda ed il bubble sort applicato a degli array contenente le votazioni da 0 a 10 di 12 studenti.

    Si prega di inserire un array di 12 numeri interi da 0 a 10:
    7
    7
    8
    4
    10
    9
    7
    5
    5
    9
    10
    9

    Stampiamo l'array:
    7 7 8 4 10 9 7 5 5 9 10 9

    Ordiniamo l'array.
    Stampiamo l'array:
    4 5 5 7 7 7 8 9 9 9 10 10

    Calcoliamo la media. La media e': 90 / 12 = 7.5000

    Calcoliamo la mediana della lista di numeri interi nell'array:
    La mediana e': 8

    Stampiamo l'array:
    4 5 5 7 7 7 8 9 9 9 10 10

    Stampiamo le frequenze relative a ciascun numero dell'array.

    0 0
    1 0
    2 0
    3 0
    4 1
    5 2
    6 0
    7 3
    8 1
    9 3
    10 2

    Vuoi procedere con un altro array? Inserisci 1 per continuare oppure 0 per terminare: -1

    Time elapsed: 000:20:359
    Press any key to continue
    Questo è l'esempio per 6 studenti (quello che non va; per 6 o meno studenti):
    Questo e' un programma dove verranno utilizzate delle funzioni per il calcolo della media, della mediana, della moda ed il bubble sort applicato a degli array contenente le votazioni da 0 a 10 di 6 studenti.

    Si prega di inserire un array di 6 numeri interi da 0 a 10:
    7
    7
    8
    5
    6
    7

    Stampiamo l'array:
    7 7 8 5 6 7

    Ordiniamo l'array.
    Stampiamo l'array:
    5 6 7 7 7 8

    Calcoliamo la media. La media e': 40 / 6 = 6.6667

    Calcoliamo la mediana della lista di numeri interi nell'array:
    La mediana e': 7

    Stampiamo l'array:
    5 6 7 7 7 8

    Time elapsed: 000:07:765
    Press any key to continue
  • Re: Media, mediana e moda

    int frequenze[dim + 1];
    for(int i = 0; i <= dimVote; ++i) {
    	frequenze[i] = 0;
    }
    Se passi un array di 6 studenti, dim vale 6 e dimVote 10. Quindi frequenze ha dimensione 7 e tu fai un ciclo da 0 a 10 compreso su frequenze...
  • Re: Media, mediana e moda

    In calcoloModa hai scritto

    int frequenze[dim + 1];

    usando il numero di studenti al posto del numero di voti
  • Re: Media, mediana e moda

    Andrea Quaglia ha scritto:


    int frequenze[dim + 1];
    for(int i = 0; i <= dimVote; ++i) {
    	frequenze[i] = 0;
    }
    Se passi un array di 6 studenti, dim vale 6 e dimVote 10. Quindi frequenze ha dimensione 7 e tu fai un ciclo da 0 a 10 compreso su frequenze...
    Giusto, non ci avevo fatto caso...questo perchè il programma era partito per un numero di 20 studenti; poi dovendoci apportare delle modifiche per un altro esercizio ho provato un pò a fare delle prove... Cmq a questo punto come mai per 6 studenti non funziona (ed hai spiegato il perchè) mentre per 7 studenti funziona? Eppure il problema della dimensione di frequenze = 8 è sempre minore di dimVote che è 10...
  • Re: Media, mediana e moda

    La possibilità di avere un crash (sporcando lo stack) aumenta con il fatto di avere meno memoria a disposizione.
  • Re: Media, mediana e moda

    oregon ha scritto:


    La possibilità di avere un crash (sporcando lo stack) aumenta con il fatto di avere meno memoria a disposizione.
    Grazie!
Devi accedere o registrarti per scrivere nel forum
7 risposte