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
fgetsper la lettura di una stringa da tastiera, per cui serve anche la dichiarazione della stringa (sin questo caso) per memorizzare i caratteri inseriti da tastiera - vengono usata
atoiper 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 <= csi stabilisce seaè il minimo globale (e la mediana è il minimo trabec) - alternativamente, con
b <= a && b <= csi stabilisce se èbad essere il minimo globale (e la mediana è il minimo traaec) - in caso entrambe le precedenti siano false, allora è
cad essere il minimo globale (e la mediana è il minimo traaeb)
- con
Hands-on
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.
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.
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.
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.
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!