CAPITOLO 1 - Primi programmi in C++.

1.1 – Programmi e linguaggi

Un computer è un esecutore che conosce solo il linguaggio ( e quindi le istruzioni ) del suo processore. Sia le istruzioni che la macchina esegue e sia i dati su cui opera sono sequenze di bit (sequenze di simboli 0 e 1): esse costituiscono il linguaggio della macchina. Essendo tale linguaggio poco vicino a quello umano, si è ritenuto opportuno, in un primo momento, tradurre ogni singola istruzione con un codice mnemonico ( linguaggio Assembly ).

Un programma Assembly è una sequenza di tali istruzioni, mentre l'Assembler è il programma che traduce queste istruzioni in linguaggio macchina. Poiché il linguaggio Assembly era ancora molto legato alle istruzioni della CPU del particolare computer in uso, si ritenne opportuno sviluppare un linguaggio che fosse svincolato dalla macchina: un linguaggio di programmazione ad alto livello. Negli anni 50 nacque il ForTran ed in seguito diversi altri tra cui, negli anni 70, il Pascal ed il C, negli anni 80 il C++ . 

Come abbiamo visto, per risolvere un problema, è necessario eseguire una sequenza di istruzioni: un algoritmo.

Un programma per computer è un algoritmo scritto in un linguaggio di programmazione.

Un linguaggio di programmazione ad alto livello non richiede una conoscenza delle istruzioni della CPU del particolare computer a disposizione; le sue istruzioni-base sono abbastanza simili ad istruzioni in lingua inglese; in altre parole tali linguaggi si avvicinano più al modo di esprimersi di una persona che a quello di una macchina.

Le istruzioni scritte nel linguaggio ad alto livello costituiscono il programma sorgente; la traduzione in linguaggio macchina è compito di un programma detto compilatore, mentre il programma eseguibile viene detto programma oggetto. La creazione di un programma eseguibile è composto dalle seguenti fasi:

Queste fasi possono essere ripetute più volte:
il compilatore trova errori di sintassi nel programma sorgente; noi vi apportiamo le modifiche necessarie e lo rimandiamo al compilatore finché non compaiono più errori; dopo aver depurato il programma sorgente dagli errori di sintassi, eseguiamo il programma oggetto; esso può presentare degli errori semantici: non fornisce le soluzioni del problema che noi ci aspettavamo! A questo punto dobbiamo ripartire dal programma sorgente. Nell’esecuzione di queste fasi ci viene in aiuto un sistema di sviluppo:

sistema di sviluppo: un insieme di programmi che aiutano il programmatore nella scrittura e sviluppo di un programma sorgente (scritto in un linguaggio di alto livello assegnato) e ne permettono la sua traduzione in linguaggio macchina.

Vediamo gli elementi che costituiscono un sistema di sviluppo.
Il primo passo da fare, dopo aver risolto il problema, è quello di scrivere il programma sorgente contenente le istruzioni con il linguaggio di programmazione scelto. Un programma sorgente deve essere scritto con un editor ( un programma che consente di creare e modificare un testo scritto ), mentre si indica con edit o editing l'atto di scrivere il codice del programma sorgente sulla tastiera del computer. Con esso possiamo anche modificare il testo e, infine, salvarlo sulla memoria secondaria ( tipicamente un disco ). Il passo successivo è quello della compilazione: il programma sorgente viene tradotto nel linguaggio della CPU, il linguaggio-macchina. Ciò che si ottiene è il programma oggetto.

Durante questa fase viene spesso eseguita una precompilazione del programma sorgente mediante un programma detto preprocessore, ora generalmente incorporato nel compilatore. Nel caso del C++ si parla di direttive del preprocessore, in cui si uniscono al programma sorgente altri programmi della libreria standard che ne consentono il funzionamento.

L'output di un compilatore è un gruppo di moduli separati di codice macchina, che spesso corrispondono a sottoprogrammi nel codice sorgente. Questi moduli sono correlati fra loro ( in genere con istruzioni di chiamata e ritorno ) e, a volte, anche con altri moduli di programmi ottenuti da un'altra compilazione. Tutti questi moduli sono collegati attraverso il linker. Il compito del linker consiste nell'apporre gli appropriati indirizzi in tutte le istruzioni di chiamata e ritorno, in modo tale che tutti i moduli siano collegati tra loro con le giuste modalità. Un programma di questo tipo consente di costruire un singolo programma-oggetto in base a sezioni che possono essere scritte in vari linguaggi o che sono memorizzati in modo permanente nel sistema ( per esempio, utilità del sistema operativo ). Di solito l’uscita del compilatore, cioè il programma eseguibile scritto in binario, è inserito in una apposita cartella del disco rigido. Le fasi finali sono il caricamento del programma eseguibile nella memoria principale e la sua esecuzione.

1.2 – Il compilatore GNU C++ e CodeBlocks

GNU C++ (dove GNU sta per GNU’s Not Unix) è un dialetto del linguaggio ad alto livello C++ funzionante sotto i sistemi operativi Windows, Linux e Mac. Un suo ambiente di sviluppo è il CodeBlocks, disponibile gratuitamente dal sito www.codeblocks.org, di facile utilizzo (user-friendly), e funzionante sotto tutti e tre i sistemi operativi. Il linguaggio GNU C++ ha una parte di istruzioni in comune agli altri dialetti del C++ in commercio, perché sviluppato secondo le direttive ANSI (American National Standards Institute). Tali direttive sono cambiate nel corso del tempo: quelle basi si riferiscono alla pubblicazione del 1998, ma il compilatore GCC fa riferimento anche alle direttive del 2011, conosciute come C++11.
L'installazione di CodeBlocks non è difficile; su Windows, basta scaricare l'ultima versione con setup ed eseguirla. Su Linux Ubuntu, è sufficiente cliccare su "Ubuntu Software Center", scaricare ed installare prima CodeBlocks e poi g++. In ogni caso è possibile reperire informazioni su internet ricercando semplicemente "installare codeblocks su..." inserendo il proprio sistema operativo al posto dei puntini sospensivi.

Ovviamente, potrete utilizzare un qualsiasi sistema di sviluppo che conoscete purché accetti il linguaggio C++ ( per il Mac si può tranquillamente utilizzare xcode ).

Supponendo che abbiate installato sul vostro Personal Computer il sistema di sviluppo CodeBlocks scriviamo un programma per risolvere il seguente semplice problema:

dato il raggio di un cerchio calcolarne la circonferenza

L’utente del programma fornirà da tastiera il raggio del cerchio, il programma deve calcolarne la circonferenza e stampare il risultato sul video.

L’algoritmo che risolve il problema può essere schematizzato in tre passi:
leggi(raggio)
area = 2*raggio*pi-greco
stampa il valore della circonferenza

Con il primo passo intendiamo che il computer chiederà all’utente di fornire il valore del raggio da tastiera affinché venga portato in memoria. Con il secondo si assegnerà alla circonferenza il suo valore e con il terzo il computer informerà l’utente con un opportuno messaggio che il valore che inserirà sullo schermo è proprio la lunghezza della circonferenza del relativo cerchio. Le immagini seguenti si riferiscono al sistema operativo Windows, ma quelle relative al sistema operativo Linux (in particolare Ubuntu) o IOS su Apple sono molto simili.

Come possiamo indicare al computer di eseguire queste semplici istruzioni? Lanciamo il sistema di sviluppo sotto Windows; dopo la finestra di presentazione otteniamo la schermata seguente:

funzioni
Figura 1.2

Nel classico stile windows abbiamo la barra del titolo (dove è evidenziata la versione attuale del programma), le barre dei menù, le altre ad icone. Clicchiamo su Create a new project ed otteniamo

funzioni
Figura 1.3

Dopo aver cliccato su Console application scegliamo C++ per il linguaggio C++):

funzioni
Figura 1.4

Premiamo Next ed inseriamo il nome del progetto, primo; la cartella va inserita in Folder to create project in, che sarà la cartella contenente tutti i nostri esercizi. Nella finestra successiva premiamo ancora Next e, in quella seguente, Finish.

funzioni
Figura 1.5

funzioni
Figura 1.6

Nella finestra piccola in basso a sinistra, evidenziata da un rettangolo rosso, andiamo su Projects, scegliamo Source e main.cpp, dove finalmente apparirà il classico esempio di programma che stampa "Hello world".

funzioni

Figura 1.7

A questo punto siamo in fase di edit, cancelliamo il programma "Hello world" e scriviamo le nostre istruzioni:

// Calcola della circonferenza #include <iostream> using namespace std; int main () { float raggio,circonferenza; const float pi=3.1415; cout<<"Inserisci raggio :"; cin>>raggio; circonferenza=2*raggio*pi; cout<<"Circonferenza="<<circonferenza<<endl; return 0; }

programma cerchio

Figura 1.8

OSSERVAZIONI su ogni rigo del programma

RIGO 1: I simboli // consentono di scrivere commenti
RIGO 2: include il file iostream che gestisce le istruzioni di I/O del sistema operativo in uso
RIGO 3: "usa lo spazio dei nomi standard", dove namespace indica lo spazio dei nomi, "std" sta per standard
RIGO 4: Il programma inizia con int main () { parentesi graffa aperta
RIGO 5: float raggio,circonferenza; sono le variabili del programma: ci dicono che raggio e circonferenza sono numeri reali;
RIGO 6: const float pi=3.1415; definisce pi come una costante e ne assegna il valore
RIGO 7: cout<<"....";; Scrive su video ciò che appare tra virgolette “ ..” e NON va a capo.
RIGO 8: cin>>raggio; attende che si inserisca un dato dalla tastiera( il raggio).
RIGO 9: circonferenza=2*raggio*pi; Istruzione di assegnazione: si valuta l’espressione che appare a destra del simbolo =, il suo valore è assegnato alla variabile a sinistra.
RIGO 10: cout<<"Circonferenza="<<circonferenza<<endl; Scrive su video ciò che appare tra virgolette ed il valore contenuto nella variabile circonferenza; va a capo con endl;
RIGO 11: FINE del programma : } parentesi graffa chiusa

Possiamo compilare il programma scegliendo dal menù Build (Compila) la voce Build and run (Compila ed Esegui) o F9 o cliccando sull'apposita icona.

compilazione

Figura 1.9

Appena il programma viene mandato in esecuzione compare l’interfaccia CONSOLE-utente con la scritta:
Inserisci raggio =_
Il trattino intermittente, il cursore, che appare subito dopo il segno uguale, ci dice che il programma è in attesa di ricevere il valore del raggio: digitiamo 20, l’interfaccia mostrerà alla fine:

Inserimento

Figura 1.10

Il programma mostrerà il risultato del calcolo dell'area, il tempo trascorso, e chiederà di premere un tasto qualsiasi per terminare.

sul calcolo dell'acquisto di libri, di cui si conoscono prezzo e quantità, allo scopo di condurre il lettore a prendere confidenza con il compilatore e con il linguaggio di programmazione C++.

Tutti i programmi riportati in questo libro sono perfettamente funzionanti e possono essere compilati con un qualsiasi compilatore C++ ed in particolare con CodeBlocks.

Attenzione! Il programma viene copiato in una sola riga, per cui è necessario dividerlo in più righe assegnandogli gli spazi iniziali necessari per l'indentazione. Inoltre, nel copia ed incolla può accadere che vengano introdotti dei caratteri spuri che appaiono sotto la forma di spazi bianchi. L'errore segnalato è "240": in tal caso basta cancellare tali spazi e "riscriverli" con la barra spaziatrice!