3. Corso C - Introduzione al linguaggio C

In questa lezione inizieremo ad analizzare la sintassi del linguaggio C, quali sono le regole alle quali bisogna attenersi per non avere errori in fase di compilazione e qual è la struttura generale di un programma.
Un primo aspetto molto importante da sottolineare è che il linguaggio C è case-sensitive, fa quindi distinzione tra caratteri minuscoli e maiuscoli: se nel nostro programma scriviamo Printf invece di printf otterremo un errore bloccante in fase di compilazione. In alcuni casi questi errori possono rivelarsi di facile risoluzione, ma altre volte possono rivelarsi molti insidiosi, quindi è bene iniziare fin da subito ad utilizzare delle convenzioni nella scelta dei caratteri maiuscoli/minuscoli e fare molta attenzione in fase di stesura del codice. 

Un secondo aspetto, che in alcuni casi è causa di fraintendimenti, è che il C non tiene conto di spazi ripetuti, nè tabulazioni ripetute nè “a capo” quindi un programma potrebbe essere scritto, se solo lo si volesse, anche su una sola riga.

Nonostante questa libertà, o forse dovremmo dire a causa di questa libertà, esistono delle convenzioni sugli “a capo” e tabulazioni che prendono il nome di regole di indentazione che servono a rendere il codice più leggibile. Più avanti vedremo come scrivere un programma in maniera chiara seguendo queste convenzioni.

In questi articoli cercherò di attenermi allo stile di indentazione denominato K&R dal nome degli autori B. Kernighan e D. Ritchie, autori del testo “The C Programming language” (link) ritenuto, ancora oggi, la vera “bibbia” del linguaggio C. Purtroppo in certe occasioni l’indentazione del codice non sarà perfetta a causa di problemi di impaginazione, chiedo perdono in anticipo.

I commenti

All’interno del codice di un programma spesso è necessario, o utile, inserire dei commenti, ovvero delle annotazione che spieghino dei passaggi particolarmente complessi alle persone che lo leggeranno. Addirittura potrebbe capitare proprio a noi stessi, magari dopo qualche anno dalla stesura di un programma, di dover rimettere mano, per una qualsiasi ragione, al nostro stesso codice e voler continuare a capirci qualcosa senza troppe difficoltà e perdite inutili di tempo.

I commenti vengono del tutto ignorati dal compilatore, è quindi possibile scrivere tutto senza preoccuparsi di errori sintattici.

Esistono due tipi di commenti in C, il primo è il commento di riga, si usa per aggiungere una piccola descrizione. Per creare un commento di questo tipo basterà anteporre // alla riga sulla quale è scritto il commento, come mostrato nell’esempio:

//questo è un commento

int main (int argc, char **argv)

Il secondo è detto commento multiriga e viene usato per aggiungere i commenti più lunghi.

Per inserire un commento multiriga bisognerà racchiudere il testo tra i caratteri ” /* ” e ” */ ” come in questo esempio:

/* il metodo sottostante serve solo

  a dare una giustificazione a questo commento

*/

int main(int argc, char **argv) {

}

La struttura del codice

Un programma in C è composto da uno o più blocchi di codice, il blocco principale si chiama main ed è necessario che in ogni programma ve ne sia uno e uno solo. I blocchi di codice (quindi anche il main) hanno la seguente struttura:

valore_di_ritorno NOME_BLOCCO (parametri)

{

        operazioni nel blocco ;

        operazioni nel blocco ;

        ...

        return VALORE ;

}

Anche se in questo momento tutto ci può sembrare poco chiaro possiamo notare alcuni aspetti:

  • Il contenuto del blocco è racchiuso dentro una coppia di parentesi graffe
  • Ciascuna riga all’interno del blocco termina con un punto e virgola.
  • Le istruzioni all’interno del blocco sono scritte più a destra rispetto al nome del blocco.

Bene, abbiamo appena imparato le prime due regole sintattiche del linguaggio C e una regola di indentazione! Le parentesi graffe sono utilizzate per delimitare il contenuto di un blocco, indicando chiaramente il suo inizio e la sua fine, i punti e virgola servono a delimitare chiaramente ogni singola istruzione mentre l’indentazione verso destra serve ad agevolare la comprensione del codice nel caso di blocchi annidati uno dentro l’altro come in questo caso:

valore_di_ritorno NOME_BLOCCO (parametri)

{

        valore_di_ritorno NOME_BLOCCO (parametri)

{

                operazioni nel blocco ;

                operazioni nel blocco ;

                ...

                return VALORE ;

}

operazioni nel blocco ;

        operazioni nel blocco ;

        ...

        return VALORE ;

}

Il codice così indentato risulta molto più leggibile rispetto alla sua versione non indentata:

valore_di_ritorno NOME_BLOCCO (parametri)

{

valore_di_ritorno NOME_BLOCCO (parametri)

{

operazioni nel blocco ;

operazioni nel blocco ;

...

return VALORE ;

}

operazioni nel blocco ;

operazioni nel blocco ;

...

return VALORE ;

}

Un blocco di codice è formalmente una funzione, che presi in input alcuni parametri, dopo aver effettuato alcune operazioni, fornisce un valore in output. In questo caso non stiamo parlando di funzione strettamente matematica, perchè i valori in input e in output possono non essere sempre numeri, pensiamo ad una funzione che presi in input i dati come nome, cognome etc, restituisca in input il codice fiscale, oppure una funzione che presi in input i dati di un dipendente mi restiuisca l’importo della sua busta paga…

Se confrontiamo lo schema con il blocco main dell’esempio del capitolo precedente possiamo vedere subito come la struttura sia identica (ho utilizzato i colori per evidenziare le componenti del blocco):

 

 

int main (int argc, char **argv)

 

{

printf(“Questo è il mio primo programma”);

return 0;

}

valore_ritornato NOME_BLOCCO (parametri)

 

{

operazioni nel blocco ;

operazioni nel blocco ;

return VALOREl;

}

 

 

Esaminando il codice, adesso che sappiamo che un blocco è a tutti gli effetti una funzione, possiamo quindi dire che:

  • La funzione si chiama main
  • La funzione accetta “quacosa” in input, vedremo poi meglio cosa.
  • Che il valore_ritornato è un int che sta per intero ovvero numero senza virgola
  • Esegue una operazione in cui scrive la stringa “Questo è il mio primo programma”
  • Resituisce il valore zero.

Secondo questo schema allora come potrebbe essere scritto un blocco di codice o, più formalmente, una funzione, per sommare due numeri? Per esempio in questo modo:

int somma_due_numeri(int numeroA, int numeroB) {

      int risultato  =  numeroA +   numeroB;        

      return risultato;

}

Seguendo l’esempio precedente possiamo analizzare questa funzione dicendo che:

  • La funzione si chiama somma_due_numeri
  • La funzione accetta “qualcosa” in input, che a guardare bene in questo caso sembrano due int, quindi due numeri senza virgola
  • Restituisce in output un numero senza virgola
  • Esegue una operazione in cui somma i due numeri ricevuti in input
  • Resituisce il valore appena calcolato

Bene, abbiamo scritto il nostro secondo programma in C!

Adesso che siamo bravi proviamo ad analizzare queste funzioni, io non darò alcun suggerimento:

int età(int annoNascita)

{

        int risultato  =  2011 - annoNascita;

        return risultato;

}

int duratadelmese (char *nomeMese) {

        if nomeMese = gennaio

return 31;

        if nomeMese = febbraio

return 28 ;

        if nomeMese = marzo

return 31;

        ...

}

int secondiInUnaSettimana()

{

        return (60 * 60 * 24 * 7);

}

Nota: Se avete già seguito qualche corso di programmazione C vi sarete accorti che questa lezione è stata leggermente atipica, perchè nel 99% dei casi i corsi iniziano parlando di altri argomenti e tralasciando interamente la struttura generale di un programma C. Sebbene questo sia lo standard defacto a mio avviso non è il modo migliore per approcciarsi al C, spero quindi di aver fornito un approccio nuovo e piacevole al linguaggio.

- See more at: http://www.devapp.it/wordpress/5-introduzione-al-c.html#sthash.P8LYqLMe.dpuf

 

video giochi
Flag Counter
motori di ricerca