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.

  1. Invocare l'editor per il nostro programma

    > emacs pari_dispari.c &

  2. 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à):


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