Obiettivo:
Lo scopo dell'esercizio è di leggere un
valore positivo n e stampare la stringa "n
è pari"
oppure "n
è
dispari" a seconda del valore n.
- Invocare l'editor per
il nostro programma
> emacs
pari_dispari.c &
-
Digitare il seguente
testo all'interno della finestra dell'editor
(sfruttiamo comandi visti nelle ultime lezioni di Fondamenti di
Programmazione):
/*
Legge un
intero positivo e
indica se il
valore e' pari o dispari
*/
#include <stdio.h>
#include <stdlib.h>
int main () {
/*
dichiariazioni */
int valore;
/* immissione dati */
do {
printf("Inserisci un numero intero
positivo:\n");
scanf("%d",&valore); // leggiamo un valore
} while (valore <= 0); // ripetiamo la lettura se il valore
non e' positivo
/* elaborazione ed
output risultato */
if (valore % 2) printf("%d e' dispari.\n",valore);
else printf("%d e' pari.\n",valore);
return EXIT_SUCCESS;
}
|
Programma Pari_Dispari (le parti in blu
sono commenti)
La prima riga
è la direttiva
al
preprocessore che serve per includere la libreria standard di
Input/Output.
La seconda direttiva al
preprocessore riferisce un'altra libreria standard dove
è definita la costante EXIT_SUCCESS
usata nell'ultima
istruzione del programma.
Le direttive al
preprocessore vengono
poste all'inizio del file e cominciano sempre con il carattere #.
Notate che qui non dobbiamo
mettere il consueto punto e virgola.
La terza riga
è
presente in tutti i programmi C, e definisce la funzione main. Il
corpo della funzione, è una sequenza di comandi
racchiusi tra parentesi graffe.
Il corpo di main è
composto da
tre parti che
troveremo spesso anche in seguito (separate da righe vuote per
favorire la leggibilità):
- dichiarazioni;
- immissione
dati;
- elaborazione
ed output del risultato.
Nella parte di
dichiarazioni abbiamo una sola dichiarazione (la variabile valore
di tipo int).
Si ricordi che i nomi di variabile sono stringhe alfanumeriche (ma
possono anche contenere il carattere underscore _)
che non iniziano
con una cifra.
Importante:
Date nomi significativi alle
variabili! Ad esempio, meglio usare tassoDiInteresse
che t.
Tenete però
presente che
alcuni sistemi potrebbero considerare significativi solo i primi 31
caratteri del nome che avete scelto (quindi non eccedete!)
Nomi riservati:
Alcune parole NON
POSSONO essere usate come nomi validi di variabile
perchè
sono
parole chiave del
linguaggio C:
auto,
break,
case,
char,
const,
continue,
default,
do,
double,
else,
enum,
extern,
float,
for,
got,
if,
int,
long,
register,
return,
short,
signed,
sizeof,
static,
struct,
switch,
typedef,
union,
unsigned,
void,
volatile,
while.
Consiglio:
Usare prevalentemente lettere minuscole per comporre
i nomi di variabili e usare le maiuscole (oppure il carattere _) per separare le parole delle
frasi che descrivono il significato delle (e danno il nome alle)
variabili stesse.
Ad esempio, meglio usare tassoDiInteresse
oppure tasso_di_interesse
che
tassodiinteresse.
Le costanti
(valori che non variano durante l'esecuzione del programma) sono invece
solitamente
indicate da nomi composti di sole maiuscole (eventualmente anche da
_).
Passiamo adesso alla seconda parte del programma.
L'immissione dati avviene tramite una richiesta di immissione (il
primo comando printf)
seguita
dal comando di input vero e proprio (scanf).
Consiglio:
Quando richiedete dei dati all'utente, indicate chiaramente che tipo di
dati il programma si aspetta. Ad esempio, nel nostro caso scrivere nel
messaggio che accompagna la richiesta di immissione dati che bisogna
inserire un numero intero positivo.
Torniamo adesso alla funzione di input scanf.
Il primo argomento della funzione è la stringa del
controllo
di formato
che contiene particolari sequenze di escape il cui primo carattere
è sempre %.
La
sequenza
%d
indica che si attende un
valore intero decimale. Il valore letto viene assegnato alla
locazione di memoria della variabile riferita come secondo argomento
di scanf.
Ricordatevi di
prefissare sempre la variabile per l'input con l'operatore di
indirizzo &.
Dovendo leggere un intero positivo, l'immissione dati
è posta
dentro un ciclo do_while: la
richiesta dati viene ripetuta se
il valore immesso è minore o uguale a 0. Solo quando si
immetterà un valore corretto (cioè un intero
maggiore di
0) si
passerà ad eseguire le istruzioni di elaborazione e output.
Nota
bene:
Come si vede dal codice sorgente sopra riportato, esiste un altro modo
in C per inserire dei commenti: la doppia barra // . In questo caso pero' il
commento termina alla fine della riga.
Passiamo adesso alla terza fase del programma, elaborazione ed output
del risultato.
Una volta letto il valore ed accertato che si tratti di un valore
corretto, usiamo l'operatore di resto %
(modulo divisione tra interi)
per accertare se il valore è pari (resto 0 modulo 2) oppure
dispari.
Il controllo e la stampa avvengono grazie alla struttura di
controllo if_else: l'espressione
fra parentesi che segue if viene
valutata e se il
risultato
è 1 (che corrisponde alla costante TRUE) viene eseguito il comando
che precede else,
mentre se il risultato e' 0 (che corrisponde alla costante FALSE) esegue il comando
che segue else.
Notate che nei comandi
di output utilizziamo ancora la sequenza di
escape %d
per visualizzare
il
contenuto della variabile valore
(passata come secondo
argomento a printf).
Come nel caso precedente, %d indica che la variabile da stampare e' di tipo intero
decimale.
L'ultima istruzione,
quando eseguita, indicherà al sistema che
l'esecuzione del programma è terminata con successo.
Adesso abbiamo scritto
il programma... ma come facciamo ad eseguirlo?
Il compilatore C che troviamo
sotto Linux (gcc) viene
invocato passando il nome del file come argomento e produce un file
binario eseguibile chiamato a.out.
Possiamo usare
l'opzione -o per
ridenominare l'eseguibile.
>
gcc -oPariCheck pari_dispari.c
Adesso possiamo invocare l'eseguibile come se fosse
un comando
ordinario. Spesso però il sistema non si rende
automaticamente
conto che il nuovo comando è disponibile e quindi dobbiamo
indicare precisamente che l'eseguibile è un file della
nostra directory di lavoro.
>
./PariCheck
Esercitazioni
non guidate
Esercizio 1 (da non
inviare per email)
Scrivere un programma serie.c
che legga una serie di
valori interi (terminata dal valore 0), e che restituisca in output la
somma, il valor medio, il massimo e il minimo dei valori letti
(escludendo dal computo il valore 0 che termina la serie). Compilare
il codice sorgente per ottenere un file eseguibile con nome Serie.
Attenzione: la media potrebbe non essere
un valore intero!
Usare una variabile di tipo float per
calcolare la media. Usare la sequenza di escape %f
per
visualizzare il valore della
media, che e' una variabile di tipo float.
Consiglio: Prevedere il caso della
sequenza vuota (attenti
alla divisione per 0!).
Risolvere
il seguente esercizio e spedire i soli
files sorgente
(suffisso .c) all'indirizzo paolo.santi@iit.cnr.it all'interno di
un messaggio di posta elettronica con subject: Esercitazione Lezione 3.
Esercizio 2
Un numero od una parola e' detta palindromo
(o palindroma) quando si
può leggere allo stesso modo indipendentemente dalla
direzione
della lettura (da sinistra verso destra oppure da destra verso
sinistra). Un esempio di numero palindromo è 47374, mentre
una
parola palindroma e', ad esempio, osso.
Scrivere un programma palindromo.c
che
legga un valore
intero di esattamente 5 cifre e determini se si tratta di un numero
palindromo oppure no. Compilare il sorgente nel file eseguibile CheckNum.
Torna alla
HomePage del
corso