Mediana tra tre numeri - Soluzione

Un esempio di soluzione per l'esercizio per il calcolo della mediana è la seguente:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a, b, c;  /* Dati in ingresso */
    int m;        /* Risultato */
    char s[80];

    /* Lettura dei dati */
    printf("Inserire il primo valore: ");
    fgets(s, sizeof(s), stdin);
    a = atoi(s);
    printf("Inserire il secondo valore: ");
    fgets(s, sizeof(s), stdin);
    b = atoi(s);
    printf("Inserire il terzo valore: ");
    fgets(s, sizeof(s), stdin);
    c = atoi(s);

    /* Ci sono sei modi diversi in cui si possono ordinari 3 elementi */
    if (a <= b && a <= c) {
        /* a e` il minimo */
        if (b < c)
            m = b;
        else
            m = c;
    } else if (b <= a && b <= c) {
        /* b e` il minimo */
        if (a < c)
            m = a;
        else
            m = c;
    } else {
        /* c e` il minimo */
        if (a < b)
            m = a;
        else
            m = b;
    }

    /* Stampa del risultato nel formato previsto da pvcheck */
    printf("[MEDIANA]\n");
    printf("%d\n", m);
    return 0;
}

Commenti

  • viene usata fgets per la lettura di una stringa da tastiera, per cui serve anche la dichiarazione della stringa (s in questo caso) per memorizzare i caratteri inseriti da tastiera
  • vengono usata atoi per convertire le stringhe in numeri interi
  • la strategia della soluzione prevede di trovare prima il minimo globale, e la mediana risulta essere il minimo tra i rimanenti due numeri; le operazioni svolte sono:
    • con a <= b && a <= c si stabilisce se a è il minimo globale (e la mediana è il minimo tra b e c)
    • alternativamente, con b <= a && b <= c si stabilisce se è b ad essere il minimo globale (e la mediana è il minimo tra a e c)
    • in caso entrambe le precedenti siano false, allora è c ad essere il minimo globale (e la mediana è il minimo tra a e b)

Hands-on

prova-tu Riscrivi il primo costrutto condizionale if (a <= b && a <= c) { omettendo le parentesi tonde come segue:

if a <= b && a <= c {

Ricompila il programma e verifica cosa succede. Perché?

La sintassi del costrutto condizionale è if ( espr ). Le parentesi tonde sono obbligatorie. Omettere le parentesi tonde corrisponde ad un errore di sintassi, che viene segnalato automaticamente dal compilatore.

prova-tu Verifica il funzionamento della soluzione proposta con pvcheck modificando il programma per omettere la stampa del marcatore [MEDIANA]. Cosa ottieni da pvcheck?

I marcatori sono indispensabili a pvcheck per identificare i diversi risultati attesi. Se viene omesso il marcatore pvcheck segnala la sua mancanza.

prova-tu Verifica il funzionamento della soluzione proposta con pvcheck modificando il messaggio di stampa del risultato in La mediana è %d\n, e mantenendo invariata la stampa del marcatore. Cosa ottieni da pvcheck?

pvcheck si aspetta che il risultato venga stampato ESATTAMENTE con il formato specificato. Se viene stampato del testo in eccesso (o manca del testo) la risposta viene considerata sbagliata.

prova-tu Verifica il funzionamento della soluzione proposta con pvcheck modificando il marcatore, stampando per esempio [RISULTATO] al posto di [MEDIANA]. Cosa ottieni da pvcheck?

Il marcatore deve essere esattamente quello atteso da pvcheck; se viene usato un nome diverso, pvcheck considera assente il marcatore necessario.

prova-tu Verifica la soluzione proposta in modo da individuare prima il massimo globale, e poi cercando il massimo tra i rimanenti due numeri. Verifica poi con pvcheck che la nuova soluzione sia corretta!