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 sea
è il minimo globale (e la mediana è il minimo trab
ec
) - alternativamente, con
b <= a && b <= c
si stabilisce se èb
ad essere il minimo globale (e la mediana è il minimo traa
ec
) - in caso entrambe le precedenti siano false, allora è
c
ad essere il minimo globale (e la mediana è il minimo traa
eb
)
- 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!