Codifica: dal diagramma a blocchi al linguaggio C++ E necessario chiarire inizialmente alcuni concetti. La compilazione Il dispositivo del computer addetto all esecuzione dei programmi è la CPU La CPU riconosce solamente il linguaggio macchina, cioè riesce a eseguire un programma solo se è scritto in linguaggio macchina Quando un programma è scritto in un linguaggio diverso dal linguaggio macchina (per esempio nel linguaggio C++), è necessario tradurre in linguaggio macchina il programma dato. Ciò significa che per esempio da un programma scritto in C++, con la traduzione si ottiene un programma equivalente in linguaggio macchina (nel senso che il programma in linguaggio macchina esegue le stesse operazioni del programma dato). Il programma da tradurre in linguaggio macchina è detto programma sorgente, o semplicemente sorgente, mentre il programma tradotto in linguaggio macchina è detto programma eseguibile. La traduzione in linguaggio macchina di un programma sorgente è chiamata compilazione Chi attua la compilazione è un programma chiamato compilatore Ogni linguaggio ha un proprio compilatore Per scrivere e compilare i nostri programmi sorgenti in C++ usiamo DEV C++ Cos è DEV-C++? E un IDE (Integrated Development Environment = Ambiente Integrato di Sviluppo), cioè un programma che mette a disposizione un editor (per scrivere i nostri programmi sorgenti in C++), un compilatore (per compilare i programmi dal C++ in linguaggio macchina) e un debug (per consentirci di rilevare e correggere gli errori del programma sorgente) #INCLUDE <IOSTREAM>.... Progr. Sorgente (in C++) DEV-C++ 010011 110111 100011.... Progr. Eseguibile (ling. macchina)
Come avviene la compilazione di un programma sorgente scritto nel linguaggio C++ Attuando molte semplificazioni, la compilazione in C++ avviene in due fasi: - la fase di precompilazione (svolta da un programma del compilatore detto preprocessore) - la fase di traduzione vera e propria in linguaggio macchina Nota: il preprocessore è di solito incluso nel compilatore, tuttavia può essere anche esterno al compilatore e chiamato dal compilatore quando serve. Il compilatore ha a disposizione nella memoria di massa (normalmente nell hard disk) delle raccolte di programmi chiamate librerie. Tali librerie hanno un nome. Nel sito http://www.cplusplus.com/reference/ ne troviamo elencate diverse: Per esempio, la libreria string ci mette a disposizione dei programmi grazie ai quali è possibile eseguire operazioni sulle stringhe (una stringa è una sequenza di caratteri).
Nel nostro programma sorgente in C++ scriviamo inizialmente le direttive al preprocessore, con le quali indichiamo quali librerie sono necessarie per il nostro programma. Esempi di direttive sono: #include <iostream> #include <string> #include <conio.h> Nota: per ora nei nostri programmi utilizziamo queste librerie per i motivi elencati di seguito iostream: string: conio.h: per poter usare l istruzione di input cin e l istruzione di output cout per operare sulle stringhe per poter usare la getch() Vediamo a questo punto, semplificando il tutto, come avviene la traduzione di un programma in C++ Nella prima fase Il preprocessore non attua alcuna traduzione, ma si limita a inserire nel programma sorgente, per ogni #include, la relativa libreria. Nella fase successiva avviene la traduzione vera e propria in linguaggio macchina del programma sorgente con le librerie incluse. La figura della pagina seguente riassume queste due fasi.
Libreria IOSTREAM Libreria STRING Libreria CONIO.H #INCLUDE <IOSTREAM> #INCLUDE <STRING> #INCLUDE <CONIO.H>. Programma sorgente in C++ FASE 1 (PRECOMPILAZIONE)..... Programma sorgente in C++ con le librerie incluse FASE 2 (TRADUZIONE IN L. MACCHINA) 010011110111100011.... Programma eseguibile (in ling. macchina) (Nota: nella fase 2 stiamo includendo anche il linkaggio, operazione che vedremo in seguito)
Nota: Durante la compilazione viene verificata la correttezza lessicale e sintattica del programma sorgente da tradurre in linguaggio macchina. Vediamo i due tipi di errori: lessicale e sintattico. Errore lessicale è presente quando una parola è scritta in modo non corretto: per esempio: if (x>0) x = x+2; cout<<x; elses x = x-2; cout<<x; la parola else del linguaggio C++ è scritta in modo errato. Errore sintattico È presente quando non è rispettata la sintassi di un istruzione. Per esempio, la sintassi dell istruzione cin prevede che con essa sia specificata una variabile (nella quale memorizzare il dato digitato alla tastiera dall operatore), perciò abbiamo un errore sintattico se scriviamo: cin>>100 infatti, come si può notare, gli elementi cin, >>, 100 sono tutti corretti dal punto di vista lessicale, però a destra del simbolo >> c è il numero 100, quando invece il compilatore si aspetta di trovarci il nome di una variabile.
Vediamo ora le corrispondenze fra i diagrammi a blocchi e il linguaggio C++ La struttura di un programma C++ è (per adesso) questa: #include <iostream> #include <string> #include <conio.h> using namespace std; int main() getch(); return 0; dove: il significato della using namespace std sarà chiarito in seguito int main() indica che la funzione principale del programma è main() e restituisce un risultato di tipo intero (per questo motivo in fondo al programma c è return 0) getch() ha lo scopo di fermare sullo schermo la visualizzazione dei risultati prodotti dal programma. Senza di essa non faremmo in tempo a leggere tali risultati.
Corrispondenze X = 10; cout<< Positivo ; cin>>a; meglio se si scrive per esempio: cout<< digita un numero ; cin>>a; If (X>0) X = X +2; cout<<x; else cin>>y; Y = X + Y;
Nota sulle parentesi graffe : Per scrivere le parentesi graffe, bisogna tenere premuti nella tastiera i tasti Shift e AltGr e quindi digitare i caratteri [ e ] Le parentesi graffe nel programma, vanno inserite subito dopo la int main() e per chiudere il programma, cioè subito dopo la return 0; Le parentesi graffe vanno aggiunte nell istruzione IF quando nella parte Vero e/o nella parte Falso siamo in presenza di piu di un istruzione. Vediamo di seguito degli esempi generici. V Istr1 Istr2 X>0 F Istr3 if (X>0) Istr1; Istr2; else Istr3; V Istr1 Istr2 X>0 F Istr3 Istr4 if (X>0) Istr1; Istr2; else Istr3; Istr4;
V Istr1 X>0 F Istr2 if (X>0) Istr1; else Istr2;