Introduzione alla programmazione Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi
Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it Programmazione prof. Domenico Daniele Bloisi bloisi@dis.uniroma1.it Sito del corso http://www.dis.uniroma1.it/~pmn Nota: %7E corrisponde alla tilde ~ Pagina 2
Orario delle Lezioni Lunedì 10.15 11.45 Martedì 08.30 10.00 Giovedì 10.15 11.45 Venerdì 10.15 11.45 Aula 15, Via Scarpa 14 Pagina 3
Informazioni Generali Ing. Domenico Daniele Bloisi, PhD Dipartimento di Ingegneria Informatica Automatica e Gestionale Via Ariosto 25 (adiacente Piazza Dante, A fermate Manzoni, Vittorio Emanuele, Tram 3 fermata via Labicana) mailto:bloisi@dis.uniroma1.it http://www.dis.uniroma1.it/~bloisi Pagina 4
Ricevimento Martedì 15.00 17.00 DIS via Ariosto 25 Aula docenti adiacente aula A4 Si consiglia di inviare una email per conferma e di controllare preventivamente la bacheca degli avvisi Pagina 5
Programma Preliminare del Corso 1. Nozioni di base dei calcolatori e della programmazione 2. Nozioni introduttive dell analisi numerica, classificazione degli errori 3. Tipi di dato primitivi, variabili, espressioni e assegnazioni 4. Istruzioni condizionali e espressioni booleane 5. Soluzione di equazioni e sistemi di equazioni non lineari 6. Istruzioni di ciclo 7. Array e matrici 8. Soluzione di sistemi di equazioni lineari 9. Approssimazioni di dati e funzioni 10.Integrazione numerica 11.Definizione e uso di classi e cenni sull'ereditarietà 12.Cenni di Fortran Pagina 6
Obiettivi Imparare il concetto di algoritmo e programma Imparare a risolvere problemi in modo algoritmico Imparare a tradurre l algoritmo in programma Imparare a scrivere e compilare un programma in linguaggio C++ Pagina 7
Sommario : Introduzione Architettura dei calcolatori Linguaggi di programmazione Programmi = dati + operazioni Primo programma C++ Scrittura, compilazione, esecuzione di un programma Errori nei programmi Input da tastiera Invocazione di funzioni Pagina 8
Come è fatto un calcolatore? Hardware Processore Memoria Periferiche Funzionamento Esegue istruzioni elementari Esegue istruzioni molto velocemente Deve essere programmato: il software, cioè i programmi, caratterizzano il compito che esso svolge Pagina 9
Componenti di un calcolatore Pagina 10
Schema di un calcolatore Tastiera Mouse Stampante Modem Porte I/O Controller dischi Hard disk CD/ROM DVD CPU Scheda video Monitor Memoria Scheda audio Casse Microfono bus Scheda rete Altro PC Internet Pagina 11
Linguaggi di programmazione Linguaggio macchina 21 40 16 100 163 240 Linguaggio assemblativo (Assembler) iload intrate bipush 100 if icmpgt interror Linguaggi ad alto livello if (intrate > 100)... Pagina 12
Gerarchia di astrazioni 6 programma applicativo 5 linguaggio ad alto livello 4 Linguaggio assembly (assemblativo) 3 Nucleo di sistema operativo 2 Linguaggio macchina 1 microprogramma alto livello 0 Logica digitale basso Pagina 13
Linguaggio di Programmazione È dotato di un insieme di istruzioni che indicano al calcolatore cosa fare. Le istruzioni hanno una sintassi e una semantica ben determinata Sintassi: insieme di regole su come usare le istruzioni e scrivere un programma. Semantica: attribuzione del significato alle istruzioni e alla loro concatenazione. Esempi sono il C++ (studiato in questo corso), il Pascal, Java, etc. La traduzione verso il basso avviene tramite un compilatore. Pagina 14
Programma I programmi caratterizzano il compito che il calcolatore svolge. Un programma (indipendentemente dal linguaggio in cui è scritto) è costituito da due aspetti fondamentali: rappresentazione delle informazioni relative al dominio di interesse: DATI o OGGETTI manipolazioni della rappresentazione che realizzano le funzionalità richieste: OPERAZIONI Per scrivere un programma si devono affrontare entrambi gli aspetti. Pagina 15
Rappresentazione delle informazioni Le informazioni si rappresentano mediante tipi di dato. Un tipo di dato raccoglie informazioni dello stesso tipo (ad esempio, i numeri interi, i caratteri, le stringhe, ecc.). Nei linguaggi di programmazione ad alto livello esistono tipi di dato predefiniti, ed è possibile definire tipi per rappresentare informazioni di interesse specifiche per un applicazione (esempio, autovetture, persone, ecc.). Pagina 16
Realizzazione delle operazioni In genere, si realizza un operazione quando deve essere risolto un problema. Problema: dato un nominativo, trovare il corrispondente numero telefonico su un elenco telefonico. Per delegare ad un calcolatore la soluzione di un problema è necessario individuare un algoritmo che risolve il problema. Pagina 17
Algoritmo: definizione Algoritmo Procedimento risolutivo attraverso il quale otteniamo la soluzione ad un problema, ovvero un insieme di passi che, eseguiti in ordine, permettono di calcolare i risultati a partire dalle informazioni date in ingresso. Informazioni in ingresso INPUT Sequenza ordinata di passi ALGORITMO Risultati OUTPUT Pagina 18
Algoritmo: proprietà Un algoritmo è caratterizzato da: non ambiguità: le istruzioni devono essere univocamente interpretabili dall esecutore eseguibilità: ogni istruzione deve poter essere eseguita (in tempo finito) con le risorse a disposizione finitezza: l esecuzione dell algoritmo deve terminare in tempo finito per ogni insieme di dati in ingresso Pagina 19
Algoritmo: esempio Problema: dato un nominativo, trovare il corrispondente numero telefonico su un elenco telefonico. Algoritmo: scandire sequenzialmente i nominativi presenti nell elenco fino a che non si trova quello cercato, quindi restituire il numero di telefono associato al nominativo. Esistono altri algoritmi per risolvere lo stesso problema? Pagina 20
Codifica Una volta individuato l algoritmo, questo va codificato nel linguaggio di programmazione prescelto. Pagina 21
Compilazione Un compilatore è un programma traduttore, impiegato per produrre codice oggetto (in linguaggio macchina) a partire da codice sorgente scritto in un dato linguaggio di programmazione di livello più alto. Questo processo si chiama compilazione. Una volta prodotto il codice oggetto (ovvero un file eseguibile) risulta estremamente difficoltoso risalire al sorgente. Questa procedura viene chiamata reversing. Pagina 22
Paradigmi di Programmazione (1/2) Esistono differenti paradigmi di programmazione che si distinguono per l enfasi che pongono sui due aspetti fondamentali: dati (oggetti) e operazioni. I paradigmi di programmazione principali sono: 1. IMPERATIVO: enfasi sulle operazioni intese come azioni, comandi, istruzioni che cambiano lo stato dell elaborazione; gli oggetti sono funzionali alla elaborazione 2. FUNZIONALE: enfasi sulle operazioni intese come funzioni che calcolano risultati; gli oggetti sono funzionali alla elaborazione 3. ORIENTATO AGLI OGGETTI: enfasi sugli oggetti che complessivamente rappresentano il dominio di interesse; le operazioni sono funzionali alla rappresentazione Pagina 23
Paradigmi di Programmazione (2/2) In genere, in un programma sono utilizzati più paradigmi di programmazione. Quindi i linguaggi di programmazione forniscono supporto (in misura diversa) per i vari paradigmi. Pagina 24
Il linguaggio C++ Il C++ è un linguaggio di programmazione ad alto livello, che supporta i paradigmi imperativo, funzionale e orientato agli oggetti. Assembler C Lisp Lisp puro Linguaggio imperativo puro C++ estende il C creando uno strumento di programmazione orientato ad oggetti Linguaggio funzionale puro Pagina 25
Mini storia del C Il C nasce dall'idea di avere un linguaggio ad alto livello che permettesse di scrivere in modo efficiente un sistema operativo Ken Thompson nel 1969 si ispirò a due linguaggi esistenti CPL e BCPL e creò il linguaggio "B", ancora troppo poco efficiente per scrivere un sistema operativo Un suo collaboratore, Dennis Ritchie, nel 1972, migliorò il "B tramite vari passaggi, arrivando ad una nuova versione: "C, con il quale fu quasi interamente riscritto il sistema operativo UNIX per il PDP-11, con tempi inaspettatamente brevi Il successo ottenuto spinse Thompson, Ritchie e Kernighan ad utilizzare il C per scrivere il sistema operativo di altre macchine Da quel momento C ed UNIX rimangono legati indissolubilmente Il C subisce un lungo processo di standardizzazione che si concretizza nello standard ISO/IEC 9899-1990 Pagina 26
Mini storia del C++ Bjarne Stroustrup iniziò a lavorare ad un nuovo linguaggio di programmazione nel 1979. Egli decise di aggiungere al linguaggio C alcune delle caratteristiche di altri linguaggi. Fu scelto il C perché era un linguaggio per uso generico portabile e veloce. Inizialmente, le funzionalità di classe, classe derivata, controllo rigoroso dei tipi e argomento di default furono aggiunte al C. Nel 1983 il nome del linguaggio fu cambiato da "C con classi" a C++ e furono aggiunte nuove funzionalità. Nel 1985 fu pubblicata la prima edizione di The C++ programming Language, che fornì un'importante guida di riferimento del linguaggio, che non era ancora stato ufficialmente standardizzato. Un comitato che presentava membri della ANSI e della ISO ha standardizzato C++ nel 1998 (ISO/IEC 14882:1998). Pagina 27
Caratteristiche generali di C++ estende il C creando uno strumento di programmazione orientato ad oggetti; estremamente efficiente; molto usato in ambito scientifico e per la realizzazione di sistemi complessi; dispone di librerie di programma ricche e ben sviluppate. Pagina 28
Iniziamo a programmare Cosa occorre: Carta e Penna Un Editor di Testo Un compilatore Ambiente di Sviluppo Integrato IDE (es. Eclipse, MS Visual Studio, Dev C++, ) Pagina 29
Il primo programma C++ #include <iostream> int main() { std::cout << "Il mio primo programma C++." << std::endl; return 0; } Il programma e costituito da una serie di istruzioni o direttive per il compilatore. Pagina 30
Istruzioni del programma Le istruzioni hanno il seguente significato: #include <iostream> direttiva per includere la definizione di funzioni e variabili predefiniti nel linguaggio relativi all input/output. int main() {... } definizione della funzione main che racchiude il programma principale. Ogni programma C++ deve contenere una e una sola funzione main. Pagina 31
Istruzioni del programma std::cout << "Il mio primo programma C++." << std::endl; istruzione di stampa su video della frase Il mio primo programma C++. std::cout è il flusso (o stream) di output standard (std) usato per stampare su video std::endl rappresenta il carattere di ritorno a capo nello schermo. << è un operatore di inserimento dati in un flusso di output. Pagina 32
Istruzioni del programma return 0; istruzione che termina l esecuzione della funzione main e restituisce il risultato 0. Nota: il C++ è case-sensitive, cioè distingue tra caratteri minuscoli e caratteri maiuscoli. es. cout è diverso da Cout Pagina 33
Secondo Programma in C++ #include <iostream> int main() { std::cout << "Il mio secondo programma C++..." << std::endl; std::cout << "... e non sara l ultimo." << std::endl; return 0; } La sequenza di due istruzioni comporta l esecuzione delle due istruzioni nell ordine in cui sono scritte. Pagina 34
Scrivere, compilare ed eseguire un programma C++ 1. preparazione del testo del programma 2. compilazione del programma 3. esecuzione del programma compilato Pagina 35
Preparazione del testo del programma La preparazione del testo di un programma comporta la scrittura di un file contenente il programma. Per un programma C++ il nome del file deve essere: nome.cpp dove: nome è il nome del file contenente il testo del programma cpp è l estensione che indica che il file contiene un programma C++. Es. primo.cpp Nota: La scrittura di un programma può essere effettuata con qualsiasi programma che consenta la scrittura di un testo ( editor ). Es. Edit, NotePad, Notepad++, Emacs,... Pagina 36
Compilazione del Programma (1/2) La compilazione del programma serve a tradurre il programma in una sequenza di comandi direttamente eseguibili dal calcolatore. Esistono diversi compilatori C++. Uno dei più usati è g++, disponibile per diversi sistemi operativi Per usarlo occorre eseguire il seguente comando: g++ -o NomeEseguibile NomeFile.cpp Esempio: per compilare il programma primo.cpp, si può usare il comando g++ -o primo primo.cpp Pagina 37
Compilazione del Programma (2/2) La compilazione produce come risultato un file chiamato NomeEseguibile.exe in Windows, oppure NomeEseguibile in Unix/Linux/Mac, che contiene i comandi direttamente eseguibili dal calcolatore. Esempio: >g++ -o primo primo.cpp > Crea un file primo.exe in Windows Nota: se il processo di compilazione è corretto, il compilatore non stampa alcuna informazione, altrimenti stampa dei messaggi di errore. Pagina 38
Esecuzione del programma compilato L esecuzione di un programma si può effettuare solo dopo la compilazione, cioè quando si ha il file NomeEseguibile.exe (oppure NomeEseguibile) L esecuzione del programma avviene scrivendo il nome del file eseguibile al prompt di sistema. Ad esempio, per eseguire il programma primo.c si può usare il comando primo Il risultato dell esecuzione del programma è quindi la visualizzazione di Il mio primo programma C++. Pagina 39
Esempio di Compilazione ed Esecuzione tramite prompt Pagina 40
Il ciclo Edita-Compila-Verifica SI begin Scrittura programma SI Errori di esecuzione? Compilazione programma Verifica programma Errori di compilazione? NO NO end Pagina 41
Errori Il seguente programma contiene diversi errori. #include <iostream> int main () { std::cout << "I miei primi errori in C++..." << std::endl std::cout << "...e non saranno gli ultm!!!" << std::endl; return 0; } Tipi di errori: sintassi, semantica, logica. Pagina 42
Errori di Sintassi errori dovuti alla violazione delle regole sintattiche del linguaggio. Esempio: std::cout << "I miei primi errori in C++..." << std::endl manca il ; Questi errori sono individuati dal compilatore. >g++ -o errori errori.cpp errori.cpp: In function 'int main()': errori.cpp:5: error: expected ';' before "std" Pagina 43
Errori Semantici errori dovuti alla impossibilità di assegnare un significato ad un istruzione. Esempio: std::cout << "...e non saranno gli ultm!!!" << std::endl; errore di ortografia nella variabile cout Questi errori a volte sono individuati dal compilatore (errori di semantica statica), altre volte sono individuati a tempo di esecuzione (errori di semantica dinamica). >g++ -o errori errori.cpp errori.cpp: In function 'int main()': errori.cpp:5: error: 'Cout' is not a member of 'std' Pagina 44
Errori Logici errori relativi alle funzionalità realizzate dal programma (differenti da quelle desiderate). Esempio: "...e non saranno gli ultm!!!", la stringa da stampare non è corretta. Questi errori possono essere individuati solo analizzando o eseguendo test di verifica del programma. >g++ -o errori errori.cpp >errori I miei primi errori in C++......e non saranno gli ultm!!! Pagina 45
Programma Corretto #include <iostream> int main () { std::cout << "I miei primi errori in C++..." << std::endl; std::cout << "...e non saranno gli ultimi!!!" << std::endl; return 0; } Pagina 46
Formato del Programma Le parole in un programma C++ sono separate da spazi. Es. int main Si possono lasciare un numero di spazi (e/o di linee vuote) a piacere. Andare a capo equivale a separare due elementi del programma (come uno spazio). L indentazione non ha alcun effetto sull esecuzione del programma, essa è comunque molto importante perché rende i programmi più leggibili. Pagina 47
Indentazione L indentazione è l inserimento di una certa quantità di spazio vuoto all inizio di una riga di codice. Ogni riga viene indentata di un certo numero di spazi che dipende dalla sua posizione all interno della struttura logica del programma int main () { std::cout << "non indentato" << std::endl; return 0; } int main () { std::cout << "indentato" << std::endl; return 0; } Pagina 48
Commenti E possibile annotare il testo del programma con dei commenti. Il C++ dispone di due tipi di commento: // denota l inizio di un commento che si estende solo fino alla fine della riga /*... */ delimita un commento che può occupare più righe. Nota: I commenti non hanno alcun effetto sull esecuzione del programma, sono usati per rendere il programma più leggibile. Pagina 49
Uso dei namespace I namespace sono dei nomi che caratterizzano un insieme di funzioni e variabili del linguaggio. Essi sono usati per evitare possibili confusioni nei nomi usati nei programmi. In C++ esiste un namespace standard denominato std che contiene molte funzioni e variabili standard del linguaggio. Pagina 50
Uso dei namespace Per accedere alle funzioni o alle variabili di un namespace si usa la notazione namespace::variabile Ad esempio, std::cout è il termine usato per accedere alla variabile cout appartenente al namespace std. Pagina 51
Uso dei namespace Si puo omettere di specificare il namespace ad ogni occorrenza della variabile/funzione, se si dichiara in precedenza l'appartenenza della variabile/funzione al namespace, using std::cout; oppure si dichiara di voler usare tutto il namespace using namespace std; Pagina 52
Programmi equivalenti che usano namespace Esempio 1, equivalente al primo programma C++: #include <iostream> using std::cout; using std::endl; int main() { cout << "Il mio primo programma C++." << endl; return 0; } Pagina 53
Programmi equivalenti che usano namespace Esempio 2, equivalente al primo programma C++: #include <iostream> using namespace std; int main() { cout << "Il mio primo programma C++." << endl; return 0; } Pagina 54
Input da tastiera Per l'input da tastiera si usa il flusso (o stream) di input standard std::cin. #include <iostream> using std::cout; using std::cin; using std::endl; int main() { cout << "Inserisci un numero intero" << endl; int x; cin >> x; cout << "Hai inserito " << x << endl; } Pagina 55
Input da tastiera In questo programma il flusso di input cin è usato per leggere da tastiera un valore e inserirlo in una variabile (cfr. Unità 2). Il valore inserito viene poi stampato nell'ultima istruzione del programma. Pagina 56