Esercizio calcolo di una mediana di un vettore

di il
12 risposte

Esercizio calcolo di una mediana di un vettore

Buongiorno a tutti, ho un esercizio che mi chiede la seguente:
"Si scriva un programma in C che dato un vettore di numeri interi arbitrari (dimensione definita
dall’utente nel main) calcolare il valore mediano.
Per il calcolo del valore mediano è necessario fare un ordinamento del vettore e poi
prendere il valore centrale. Sia per l’ordinamento che per il calcolo del mediano è necessario
usare le funzioni."

Ho fatto il seguente codice:
#include <stdio.h>

void ordina_crescente(int* vett, int n);
int mediana(int* vett, int N);

int main() {
    int i, N;
    printf("Quanti numeri vuoi inserire: ");
    scanf("%d", &N);
    int vett[N];
    
    for(i=0; i<N; i++) {
        printf("Inserire %d° numero: ", i+1);
    scanf("%d", &vett[i]);
    
    }
    printf("La mediana e': %d\n", mediana(vett, N));
    return 0;

}
    
void ordina_crescente(int*vett, int n){
int c, d, swap;
for(c=0; c<n-1; c++) {
    for(d=0; d<n-c-1; d++) {
        if(vett[d] > vett[d+1]) {
            swap = vett[d];
            vett[d] = vett[d+1];
            vett[d+1] = swap;
        }
    }
}
}

int mediana(int* vett, int N) {
    ordina_crescente(vett, N);
    int mediana;
    if(N%2==1) {
        mediana = (N+1)/2;
        return vett[mediana-1];
    }
    else if(N%2==0) {
        mediana = ((N/2) + ((N/2)+1))/2;
        return vett[mediana];
    }
    return 0;
}
Il problema nasce quando voglio calcolare la mediana di un vettore costituito da un numero pari di elementi, mentre se è costituito da un numero dispari di elementi nessun problema. Potreste aiutarmi ? Grazie

12 Risposte

  • Re: Esercizio calcolo di una mediana di un vettore

    A occhio sembra tutto giusto. Che problema ti da?
  • Re: Esercizio calcolo di una mediana di un vettore

    Se ad esempio inserisco 4 numeri, mi restituisce il terzo valore.
    Se ne inserisco 6 mi restituisce il quarto valore.
    In sintesi se inserisco N numeri (con N pari) mi restituisce il ((N/2)+1)esimo valore (dopo che il vettore è stato ordinato chiaramente)
  • Re: Esercizio calcolo di una mediana di un vettore

    Ipotizziamo di avere il seguente array ordinato: 1 5 8 9. Se ho ben capito la mediana dovrebbe essere 6.5, giusto? In tal caso come fai ad ottenere tale valore da una scrittura del genere v? Al variare di i (0, 1, 2, 3) non c'è nessun valore dell'array pari a 6.5!

    P.S.
    Dal momento che un numero o è pari o è dispari, quell' if/elseif può essere sostituito da un semplice if/else.
  • Re: Esercizio calcolo di una mediana di un vettore

    Si la mediana di quel vettore è 6.5 , hai capito il procedimento.
    Quindi dovrei modificare il vettore ? Non ho ben capito
  • Re: Esercizio calcolo di una mediana di un vettore

    Ok adesso ho capito. Quando c'è un array con numero di elementi pari devi prendere i due elementi centrali e farne la media. Quindi mediana diventerebbe:
    mediana = N/2;
    e il valore da ritornare dovrebbe essere
    return (vett[mediana-1] + vett[mediana])/2
    Ovviamente però tu stai trattando tutto come int, quindi nell'esempio che ti è stato fatto ti ritroverai 6 e non 6.5.
  • Re: Esercizio calcolo di una mediana di un vettore

    Eduadie ha scritto:


    Ok adesso ho capito. Quando c'è un array con numero di elementi pari devi prendere i due elementi centrali e farne la media. Quindi mediana diventerebbe:
    mediana = N/2;
    e il valore da ritornare dovrebbe essere
    return (vett[mediana-1] + vett[mediana])/2
    Ovviamente però tu stai trattando tutto come int, quindi nell'esempio che ti è stato fatto ti ritroverai 6 e non 6.5.
    Ok perfetto adesso risulta, però appunto dovrei far ritornare un valore decimale, cosa devo modificare ?
  • Re: Esercizio calcolo di una mediana di un vettore

    Si la mediana di quel vettore è 6.5 , hai capito il procedimento.
    Quindi dovrei modificare il vettore ? Non ho ben capito
    Scusa ma hai capito qual è la definizione di mediana di un vettore con un numero pari di elementi? Chiedo perchè ho l'impressione, alla luce anche dell'altro topic, che non rifletti molto sul codice che scrivi.
    In ogni caso la mediana di un array di dimensione pari è data dalla media aritmetica dei due elementi centrali, di indice rispettivamente pari a N/2-1 e N/2, ossia mediana=(v[N/2-1]+v[N/2])/2. A tal proposito è concettualmente sbagliato confondere la mediana di un array con gli indici dello stesso.
    Ok perfetto adesso risulta, però appunto dovrei far ritornare un valore decimale, cosa devo modificare ?
    Conosci la differenza tra divisione intera e divisione non intera?
  • Re: Esercizio calcolo di una mediana di un vettore

    Nippolo ha scritto:


    Si la mediana di quel vettore è 6.5 , hai capito il procedimento.
    Quindi dovrei modificare il vettore ? Non ho ben capito
    Scusa ma hai capito qual è la definizione di mediana di un vettore con un numero pari di elementi? Chiedo perchè ho l'impressione, alla luce anche dell'altro topic, che non rifletti molto sul codice che scrivi.
    In ogni caso la mediana di un array di dimensione pari è data dalla media aritmetica dei due elementi centrali, di indice rispettivamente pari a N/2-1 e N/2, ossia mediana=(v[N/2-1]+v[N/2])/2. A tal proposito è concettualmente sbagliato confondere la mediana di un array con gli indici dello stesso.
    Ok perfetto adesso risulta, però appunto dovrei far ritornare un valore decimale, cosa devo modificare ?
    Conosci la differenza tra divisione intera e divisione non intera?
    Si ho capito la definizione, e ho capito cosa volevi dire riguardo indici del vettore ed elementi dello stesso, non me ne ero reso conto.
    Una divisione intera è una divisione tra due numeri dove non si ottiene resto, a differenza di quella non intera
  • Re: Esercizio calcolo di una mediana di un vettore

    Devi prima di tutto cambiare il tipo di ritorno della funzione visto che può ritornare anche un numero decimale.
    Attraverso un cast a float/double eseguire una divisione tra due interi.

    In modo molto elementare:
    
    valore1 = (float/double)elemento1;
    valore2 = (float/double)elemento2;
    ritorna (elemento1+elemento2)/2;
    
  • Re: Esercizio calcolo di una mediana di un vettore

    Una divisione intera è una divisione tra due numeri dove non si ottiene resto, a differenza di quella non intera
    Intendevo che nel C l'operazione 7/2 ritorna risultati diversi in base al tipo degli operandi (ossia dividendo e divisore):
    - se gli operandi sono entrambi interi anche il risultato sarà un intero. Esso sarà costituito dalla parte intera del quoziente (in questo caso 7/2=3);
    - se almeno uno degli operandi non è intero, potrebbe essere per esempio un float o un double, anche il risultato sarà dello stesso tipo (in questo caso 7/2=3.5).

    A questo discorso si collega l'intervento di Eduadie sul concetto di CAST. A tal proposito sai cosa si intende con cast?
  • Re: Esercizio calcolo di una mediana di un vettore

    Sinceramente no, col professore non ne abbiamo mai parlato
  • Re: Esercizio calcolo di una mediana di un vettore

    cls ha scritto:


    Sinceramente no, col professore non ne abbiamo mai parlato
    Ti suggerirei di adattare tutto a float/double ma l'esercizio da come leggo impone l'uso di numeri interi. Quindi o devi studiare il cast da autodidatta (se il professore lo permette) o ti accontenti della divisione senza virgola. Altri metodi non esistono.
Devi accedere o registrarti per scrivere nel forum
12 risposte