Home > Corso di programmazione, GNU/Linux > Corso di programmazione: “Ciao Mondo!”, il nostro primo programma

Corso di programmazione: “Ciao Mondo!”, il nostro primo programma

Riprendiamo dopo una lunga pausa la nostra guida introduttiva alla programmazione, con la promessa che faremo una-due lezioni a settimana.

E’ arrivato il momento di compilare il nostro primo programma. Useremo come riferimento Ubuntu, ma la stessa cosa vale anche per qualsiasi distribuzione GNU/Linux molti altri sistemi Unix.

Prima di tutto abbiamo bisogno di un editor di testo con cui scrivere il nostro programma. Io userò Gedit, ma se avete KDE potrete usare Kate, mentre con Xfce avete mousepad. Altrimenti da terminale una scelta semplice è usare nano.

Poi abbiamo bisogno di un compilatore, cioè del programma che trasforma il codice sorgente in linguaggio macchina del processore. Il compilatore GNU si chiama gcc (che stava per GNU C Compiler quando compilava solo il C, mentre adesso che compila una caterva di linguaggi la sigla è passata a significare GNU Compiler Collection). Viene usato da GNU/*, da Mac OS X e dai vari sistemi BSD, nonché su OpenSolaris ma funziona anche su Windows.

Gcc è preinstallato, per cui non c’è bisogno di fare nulla.

Infine è necessario avere le librerie che contengono le istruzioni del C. La libreria fondamentale è la GNU C Library (glibc) che ovviamente è preinstallata, altrimenti non funzionerebbe nulla nel sistema operativo essendo questo basato proprio sul C. Ma a noi servono anche gli headers (intestazioni), vale a dire i file che contengono gli elenchi delle istruzioni contenute nelle librerie. Su Ubuntu ci basterà installare il pacchetto build-essential che contiene tutto e molto più di ciò che ci serve.

Apriamo quindi in nostro editor di testo e salviamo subito il file con il nome ciaomondo.c

Fatto ciò, copiamo questo programma:

#include <stdio.h>

int main()
 {
   printf("Ciao Mondo!\n");
   return 0; 
 }

L’include che vediamo all’inizio non è una istruzione del C, ma un’istruzione per il compilatore, o meglio per la parte del compilatore che si occupa di analizzare il codice prima della compilazione vera e propria. Questa parte si chiama preprocessore e l’include è per questo detta “direttiva per il preprocessore. Il preprocessore legge questa direttiva e va a prendere il file stdio.h dalla cartella /usr/include/ che contiene appunto le intestazioni della libreria C che si occupano dell’Input/Output (difatti stdio sta per Standard Input/Output). Questo file verrà incorporato nel nostro sorgente, cosicché nei fatti il nostro programma sarà composto anche dalla libreria.

Vediamo a cosa ci serve… l’istruzione printf è una istruzione contenuta proprio in stdio. Essa stampa a video ciò che è contenuto nelle parentesi.

E’ importante ricordare che in C i parametri (ovvero i dati che le istruzioni debbono elaborare) sono racchiusi tra parentesi.

Nel nostro caso si tratta di una serie di caratteri che, tecnicamente, viene detta “stringa”. Una stringa è appunto una sequenza di caratteri.

Ora, prima di printf vediamo questo strano int main(). Vediamo anche qui queste parentesi, peraltro vuote. Cos’è questo Main? Non è altro che la parte principale del programma. Nel nostro caso è tutto il programma, ma questo non importa al compilatore: il C pretende che ci sia sempre una parte principale, anche se è l’unica.

Finora ho usato un termine generico: istruzione. Ma il termine giusto è funzione. Una funzione, in C, è una blocco di codice racchiuso tra parentesi graffe che può ricevere dei dati in Input e restituire (a volte si dice all’inglese: ritornare) il risultato come Output. E’ molto simile al concetto matematico di funzione: ad esempio y=f(x). f() può essere qualsiasi cosa, ad esempio y=x*2.

Il main è esso stesso una funzione: nel nostro caso non ha parametri in ingresso, ma vedremo in seguito che possiamo definirli. In uscita invece, ha un numero intero (int).  Vedremo tra poco a cosa può servirci.

Vediamo anche che certe istruzioni sono scritte più “dentro” di altre. Questo stile si chiama indentazione e non è obbligatoria, ma serve solo a rendere più leggibile il programma. In questo modo sappiamo che printf e return sono parte della funzione main, a colpo d’occhio. L’ultimo particolare da notare è che ogni istruzione deve terminare con il punto e virgola.

Ora salviamo il file e apriamo il terminale. Il comando per compilare il nostro programma è:

gcc -o ciaomondo  ciaomondo.c

il parametro -o (output) definisce il nome che vogliamo sia dato al file eseguibile. Di solito è lo stesso del sorgente (ovviamente senza il .c), ma possiamo scegliere quel che ci pare. Per convenzione però gli eseguibili non hanno estesione (cioè la parte del nome dopo il punto, come .txt, .exe, ecc.).

Infine eseguiamo il nostro programma:

./ciaomondo

e vedremo il risultato. Non vi sarete probabilmente accorti di un particolare: dopo aver stampato la scritta “Ciao Mondo!” il terminale è andato a capo. Questo perché abbiamo terminato la stringa con la sequenza \n, che appunto rappresenta un “a capo” (n=new line, nuova linea). Provate a toglierlo e a ricompilare per vedere l’effetto.

Ora diamo sempre da terminale:

echo $?

questa istruzione dice alla shell di stampare il codice di uscita dell’ultimo comando, nel nostro caso proprio ciaomondo. Vedremo che verrà stampato uno 0. Ora facciamo un esperimento: invece di return 0 mettiamo return 2. Ricompiliamo il programma, eseguiamolo e diamo di nuovo echo $?. Vedremo un bel 2 visualizzato dalla shell.

E’ infatti l’istruzione return che restituisce il valore della funzione main. Siccome main è il programma principale, il valore viene ritornato al programma chiamante, vale a dire la shell.

A cosa serve tutto ciò? Principalmente a segnalare un eventuale errore. Per convenzione 0 vuol dire che l’esecuzione è andata a buon fine, ogni altro valore indica un errore. In questo modo i programmi possono comunicare alla shell o ad altri programmi se sono riusciti a compiere il loro lavoro o meno.

Nella prossima puntata vedremo come interagire con l’utente e cosa sono le variabili.

  1. Ermes_85
    12 Maggio 2010 alle 7:22

    O_O devo ricominciare a studiare. Interessante molto interessante. Grazie per l’enorme lavoro.

    "Mi piace"

  2. Alex.diste
    12 Maggio 2010 alle 9:55

    Guido gli editor di testo che hai detto però non hanno la sintax highlight ossia l evidenziazione in colori diversi delle parole chiave del linguaggio di programmazione riconosciuta. Mi chiedevo quindi se esistono plugin appositi (magari per gedit)? Sennò un alternativa potrebbe essere Eclipse, o sbaglio?

    Tornando un pò più IT, quando mi hanno insegnato la basi di programmazione a scuola mi facevano sempre usare void main e quindi ritornare nulla, è meglio, peggio? Cosa cambia?

    "Mi piace"

    • 12 Maggio 2010 alle 10:36

      Guido gli editor di testo che hai detto però non hanno la sintax highlight ossia l evidenziazione in colori diversi delle parole chiave del linguaggio di programmazione riconosciuta.

      se avessi provato ti saresti accorto che hai torto.

      Tornando un pò più IT, quando mi hanno insegnato la basi di programmazione a scuola mi facevano sempre usare void main e quindi ritornare nulla, è meglio, peggio? Cosa cambia?

      cambia che è un errore, anche se non grave. gcc lo segnala come warning ma comunque lo compila.

      "Mi piace"

    • Andrea
      12 Maggio 2010 alle 13:45

      DEVI usare eclipse o tool simili. Altrimenti è una pazzia scrivere codice con un editor di testo ‘normale’. Puoi usare Eclipse o KDevelop.

      "Mi piace"

      • 12 Maggio 2010 alle 17:49

        perché è una pazzia? chi te l’ha detto?

        "Mi piace"

        • Andrea
          12 Maggio 2010 alle 17:56

          Nei progetti che seguo in c e c++ che contengono decine/centinaia di classi, ti assicuro che un aiuto dell’editor, intellisense e debugger in primis, è indispensabile 😉

          "Mi piace"

          • 12 Maggio 2010 alle 19:50

            ecco, appunto, parliamo di grossi progetti, non di piccoli programmi.

            "Mi piace"

          • Andrea
            13 Maggio 2010 alle 8:14

            “ecco, appunto, parliamo di grossi progetti, non di piccoli programmi.”

            Se parli di didattica con progetti di 20 righe va bene, anzi, all’inizio è molto utile per capire l’uso di compilatori e altro. Ma l’uso di gedit e simili si ferma lì.

            "Mi piace"

          • 13 Maggio 2010 alle 10:56

            questo è un corso introduttivo. Non posso mica fare 10 lezioni su come si usa eclipse….

            "Mi piace"

          • Andrea
            13 Maggio 2010 alle 11:40

            E chi l’ha mai detto? La mia frase iniziale sul consiglio di Eclipse era una risposta ad Alex, non una critica al tuo corso, ci mancherebbe.

            "Mi piace"

      • Tufano Michele
        12 Maggio 2010 alle 17:54

        @Alex.diste e Andrea

        Basta anche Gedit.

        Apri gedit, salva il file in nomefile.c, inizia a scrivere e vedrai che le key words verranno evidenziate in diversi colori. Inoltre in Modifica -> Preferenze -> Caratteri e Colori puoi scegliere i vari colori disponibili.

        p.s. Non so quanto sia utile utilizzare eclipse con C. Mentre con java, eclipse è molto comodo per i vari suggerimenti dei metodi, programmando in C non so quanto ti possa aiutare.

        "Mi piace"

        • Andrea
          12 Maggio 2010 alle 17:58

          Scusa, ma stai parlando di esempi di 10 righe o progetti con decine di file? Nel primo caso ok, gedit va bene. Ma per progetti corposi, se non vuoi impazzire, DEVI usare un ambiente di sviluppo evoluto. Forse non si era capito quello che volevo dire 🙂

          "Mi piace"

          • Tufano Michele
            12 Maggio 2010 alle 18:09

            “Altrimenti è una pazzia scrivere codice con un editor di testo ‘normale’.” (cito)

            Tu in questa frase hai parlato di “scrivere codice”, e nello scrivere, editare codice…personalmente penso non ci siano molti vantaggi nell’utilizzo di un ambiente di sviluppo.

            Nell’organizzazione dei file e dei progetti, senza dubbio c’è un notevole vantaggio nell’uso di eclipse (o qualsivoglia altro ambiente di sviluppo).

            Se poi “scrivere codice” intendevi in modo generale lo sviluppo di in progetto in C, beh ovviamente hai ragione.

            "Mi piace"

          • Andrea
            13 Maggio 2010 alle 8:20

            “Se poi “scrivere codice” intendevi in modo generale lo sviluppo di in progetto in C, beh ovviamente hai ragione.”

            Come ho detto sopra all’autore del blog, per la didattica iniziale e per semplicissimi programmi per capire l’uso di compilatore, mi sta bene l’uso di un text editor. Ma oltre no: voglio vedere chi ha il coraggio di scrivere un progetto di un certo peso con gedit senza il solo debugger, unit testing e via discorrendo.

            Spero di avere chiarito ora il mio pensiero 😉

            "Mi piace"

          • Giusy
            26 ottobre 2010 alle 18:21

            Ciao Andrea. Capito per caso in questo forum. Ho infatti un problema in C e sto cercando in rete una soluzione per risolverlo. Da quello che ho letto, usi Eclipse per il linguaggio C.
            Anch’io sto imparando C utilizzando questo Editor e il problema che ho credo riguardi Eclipse, perchè lo stesso listato in altri Editor funziona correttamente. Questo è il listato:

            #include

            int main () {
            int n;
            printf(“Inserisci un numero intero: “);
            scanf(“%d”,&n);
            printf(“Hai inserito %d\n” , n);
            return 0;
            }

            La compilazione viene eseguita correttamente. Quando avvio l’eseguibile, il programma non mi da la possibilità di inserire l’input da tastiera. Svolge tutto il programma ed esce. Clicco il bottone rosso di forma quadrata (terminate) della console per vedere cosa è successo e questo è l’output:
            “Inserisci un numero intero: Hai inserito 2130567168”
            Restituisce un valore di default perchè la variabile non è inizializzata e non mi ha fatto inserire alcun valore.
            Che faccio? Ho provato ad aggiungere fflush() e getchar() ma è uguale.
            Puoi rispondermi al mio indirizzo email: giusy.intravaia@yahoo.it

            "Mi piace"

  3. Emanuele
    12 Maggio 2010 alle 12:35

    Per l’indentazione, meglio usare i tab o gli spazi? E qual’è quella convenzionale della open source community?

    "Mi piace"

    • giowck
      12 Maggio 2010 alle 14:16

      meglio TAB, in quanto cosí ognuno puó decidere la profonditá dell’ identazione… a qualcuno piace 4 ad altri 8… mentre se usi gli spazi, costringi tutti ad usare quel formato…

      "Mi piace"

      • Emanuele
        12 Maggio 2010 alle 15:15

        Grazie giowck. Dunque nel C non c’è un limite al numero di colonne che possono essere occupate dal codice sorgente? Te lo chiedo da programmatore Fortran dove il limite è alla 132esima colonna…

        Almeno un link sulle convenzioni dell’indentazione è chiedere troppo? 🙂

        "Mi piace"

        • 12 Maggio 2010 alle 17:55

          intendi il numero di caratteri per riga? non mi risulta ci sia nessun limite.
          Le convenzioni per l’indentazione sono numerose, ogni progetto usa le sue.
          Queste sono le principali: http://en.wikipedia.org/wiki/Indent_style
          Se si vuole usare lo stile GNU, c’è un programmino chiamato indent che fa tutto lui.
          C’è anche una gui (universalindentgui) che permette di usare le diverse convenzioni. Una manna per non litigare con gli sviluppatori di altri progetti 🙂

          "Mi piace"

          • Emanuele
            12 Maggio 2010 alle 18:58

            Sì, mi riferivo ai caratteri per riga. Grazie per le risposte!

            Ciao.

            "Mi piace"

  4. aury88
    12 Maggio 2010 alle 19:15

    Grazie per la lezione Guiodic 😉
    ho fatto solo un corso veloce di programmazione C all’università, che si è fermato alle malloc…pensi di andare oltre o farai anche altri linguaggi di programmazione?
    complimenti e grazie per l’ottimo ripasso.

    "Mi piace"

    • 12 Maggio 2010 alle 19:52

      non lo so ancora, ma mi hai dato un’indea. Non sarebbe male iniziare con C e magari poi affrontare qualche altro linguaggio. Ci penserò.

      "Mi piace"

  5. shishimaru
    13 Maggio 2010 alle 9:36

    Grazie mille Guiodic 😉
    Andando passo alla volta capisco decisamente meglio!

    "Mi piace"

  6. Ale
    14 Maggio 2010 alle 14:41

    mi piace molto l’iniziativa di quresto corso, pensi di inserire anche qualche indicazione sulle modalità più opportuna per il naming delle funzioni e delle variabili, insomma qualche indicazione di stile ?

    "Mi piace"

    • 14 Maggio 2010 alle 16:54

      penso di no. Sono cose noiose e poi ognuno ha idee diverse in merito.

      "Mi piace"

  7. telperion
    15 Maggio 2010 alle 16:00

    Ma una volta scrivere:

    “Ciao bionda!”

    invece di sto ‘zzo di ciao mondo?!

    😉

    "Mi piace"

  8. mauri
    7 giugno 2010 alle 19:27

    @telperion concordo in pieno!!!
    @guiodic non ci lasciare a meta’ pero’ :=) scherzi a parte Grazie davvero!!!

    "Mi piace"

  9. 6 Maggio 2013 alle 20:29

    Hello to all, how is the whole thing, I think
    every one is getting more from this web page, and your views are pleasant for new visitors.

    "Mi piace"

  1. 13 ottobre 2017 alle 4:28

Lascia un commento