Ing. Irina Trubitsyna Concetti Introduttivi
Programma del corso Obiettivi: Il corso di illustra i principi fondamentali della programmazione con riferimento al linguaggio C. In particolare privilegia gli aspetti relativi alla rappresentazione dei dati e alla realizzazione di strutture dati elementari, alla definizione e all'utilizzo di funzioni e di librerie. Il corso intende porre l'enfasi più sulle tecniche di programmazione e tratterà alcuni algoritmi fondamentali. Al termine del modulo lo studente sarà in grado di sviluppare e verificare programmi C di media complessita'. Il linguaggio C Tipi di dato, operatori ed espressioni Flussi del controllo Funzioni e struttura dei programmi Vettori, Puntatori, Aritmetica dei Puntatori Strutture Input e Output 2
Materiale Didattico Libri di testo: Brian W. Kernighan, Dennis M. Ritchie, Il Linguaggio C,seconda edizione, Pearson Education, 2004. Lucidi ed altro materiale: http://wwwinfo.deis.unical.it/~irina/ Oppure sul sito di icampus: http://icampus.deis.unical.it/ 3
Altre informazioni Docente: Irina Trubitsyna, DEIS, cubo 41C, V piano e-mail: irina@deis.unical.it riceve venerdì, dalle 15:00 alle 17:00 Tutor: Antonella Dimasi e-mail: dimasi@exeura.it 4
Orario gruppo 1 : gruppo 2 : Arenare Giuseppe - Marchese Fanny Martino Gabriele - Viola Leonardo LUNEDI' MARTEDI' MERCOLEDI' GIOVEDI' VENERDI' 8.30 Lab gruppo1 9.30 Esercitazione Lab gruppo2 10.30 (Aula DS4) 11.30 Lezione 12.30 (Aula M1 ) 14.30 15.30 16.30 17.30 18.30 5
Prerequisiti Obiettivo lo studio della programmazione dei calcolatori elettronici. In particolare, scrivere programmi in C per risolvere problemi di calcolo Prerequisiti architettura del calcolatore rappresentazione delle informazioni D. Sciuto, G. Buonanno, L. Mari, Introduzione ai sistemi informatici, terza edizione, McGraw-Hill, 2005. 6
Lezione 1-Sommario1 Architettura del Calcolatore Architettura di Von Neumann Rappresentazione delle Informazioni Rappresentazione dei numeri Rappresentazione dei caratteri Programmazione dei calcolatori Linguaggi di programmazione Ciclo di vita di un programma 7
Prerequisiti - Introduzione In questo corso ci occuperemo di software, ovvero applicazioni E necessario però avere un idea dell hardware, ovvero dei dispositivi fisici che compongono il calcolatore Infatti il software specifica operazioni che vengono eseguiti dall hardware 8
Architettura del Calcolatore Hardware Dispositivi di Uscita -Schermo -Audio -Stampanti Dispositivi di Ingresso -Tastiera -Mouse Unità Centrale -Processore -Memoria di lavoro (memoria RAM) Memorie di Massa -Disco Rigido -Dischi Floppy -CD/DVD 9
Macchina di Von Neumann La macchina di Von Neumann è un modello semplificato dei calcolatori moderni ed è composta da 4 tipi di componenti funzionali: unità centrale di elaborazione (CPU Central Processing Unit) esegue istruzioni per l elaborazione dei dati svolge anche funzioni di controllo memoria centrale memorizza e fornisce l accesso a dati e programmi in esecuzione interfacce di ingresso e uscita componenti di collegamento con le periferiche del calcolatore bus svolge funzioni di trasferimento di dati e di informazioni di controllo tra le varie componenti funzionali 10
Processore CPU ( Central Processing Unit ) è il circuito integrato che effettua i calcoli responsabile di tutte le operazioni es: Pentium IV (a 1.8 GigaHertz) In sostanza legge e scrive dati dalla memoria RAM effettua operazioni aritmetiche è in grado di pilotare le periferiche 11
Memoria RAM Random Access Memory memoria di lavoro per la CPU circuito elettronico capace di mantenere uno stato in presenza di alimentazione memorizza lo stato di segnali elettrici volatile: perde lo stato in assenza di tensione Attenzione le elaborazioni del processore avvengono esclusivamente su dati nella RAM 12
Architettura di Von Neumann Schema di funzionamento il processore acquisisce dati dalle periferiche di ingresso o da una memoria di massa li memorizza nella memoria RAM accede alla RAM ed effettua operazioni scrive i risultati nella RAM invia i risultati alle periferiche di uscita trasferisce i dati permanentemente sulle memorie di massa Esempio: elaborazione di un documento il documento è salvato su disco viene aperto e caricato nella RAM vengono effettuate modifiche il contenuto della RAM e quello del disco sono disallineati al termine delle modifiche è necessario salvare la nuova versione sul disco 13
Memoria RAM Organizzazione della RAM composta di numerosi circuiti (celle) ciascuno capaci di memorizzare un bit di informazione Bit ( Binary Digit ) unità di memorizzazione per il calcolatore può valere 1 oppure 0 facilmente rappresentabile con un segnale elettrico V 3V 0.2V 1 0 t 14
Rappresentare Informazione con i Bit Con un bit due numeri (0 e 1) Con due bit quattro numeri (00, 01, 10, 11) Con tre bit otto numeri (000, 001, 010,..., 110, 111) Per rappresentare 1.000.000 di numeri servono 20 bit 15
Unità di Misura della Memoria Bit: 0/1 Byte: 8 bit unità convenzionale di riferim. KiloByte: 2 10 byte (1024 byte) 1024x8 bit = 8192 bit MegaByte: 2 20 byte (1 milione di byte ca.) circa 8 milioni di bit GigaByte: 2 30 byte (1 miliardo di byte ca.) circa 8 miliardi di bit 16
Memoria RAM Struttura della RAM bit organizzati in registri Registro 16, 32 o 64 bit ogni registro ha un suo indirizzo Es: 64MByte di RAM ca. 64 milioni di byte ca.16 milioni di registri da 32 bit (2 24 registri) #0 #1 #2 #3 bit 0 bit 1 bit 31.................. #2 24-1... 17
Rappresentazione delle Informazioni Tutte le informazioni sono rappresentate attraverso sequenze di bit Esempio: numero -57 su 16 bit 1111111111000111 carattere A su 8 bit 10000001 Codifica (o Codice) insieme di regole per rappresentare oggetti con altri oggetti in questo caso: lettere, numeri, immagini ecc. attraverso sequenze di bit Interazione con il calcolatore l utente ha l impressione di lavorare con oggetti familiari (parole, cifre, ecc.) rappresentazione interna in forma di bit 18
Rappresentazione dei Numeri Rappresentazione dei num. naturali rappresentazione posizionale in base 2 semplice (simile a quella dei numeri decimali): ogni bit è una cifra Rappresentazione dei num. interi codifica in complemento a 2 regole complesse Rappresentazione dei num.reali: Fixed point (virgola fissa): un numero razionale è rappresentato come una coppia di numeri interi: la parte intera e la parte decimale 12,52 <12; 52> Floating point (virgola mobile): un numero razionale e rappresentato come un intero moltiplicato per una opportuna potenza di10, cioè con una coppia <mantissa, esponente> 12,52 = 1252/100 = 1252 * 10-2 <1252; -2> 19
Alcune Interessanti Considerazioni I Considerazione numeri di tipo diverso vengono rappresentati in modo completamente diverso II Considerazione la rappresentazione in virgola mobile è esponenziale (i valori crescono rapidamente) III Considerazione alcuni numeri reali non possono essere rappresentati in modo esatto In particolare: la rappresentazione in virgola mobile consente di rappresentare solo un numero fissato di cifre decimali alcuni numeri (es: 1/3) devono essere approssimati troncando le cifre decimali questo introduce errori nella rappresentazione e quindi nei calcoli 20
Rappresentazione dei Caratteri Codice ASCII a 7 bit al carattere è associato un num. tra 0 e 127 la rappr. del carattere coincide con quella del numero nota: vale anche per le cifre (0-9) ed i caratteri speciali (es: +) A 65 1000001 0 48 0011000 21
Rappresentazione dei Caratteri Limiti del codice ASCII a 7 bit numero di caratteri rappresentabili molto basso (non include lettere accentate) Codice ASCII a 8 bit ( Extended ASCII ) al carattere è associato un num. tra 0 e 255 maggior numero di caratteri rappresentabili Al giorno d oggi codice UNICODE (16 bit o superiore) 22
Tabella dei Codici ASCII Estesi 23
Linguaggi di Programmazione Linguaggi per impartire istruzioni al processore Programma sequenza di istruzioni normalmente pensato per risolvere un problema di calcolo al programma vengono forniti dei dati il programma calcola eseguendo le istruzioni il programma restituisce i risultati 24
Evoluzione dei Linguaggi Esistono numerosi linguaggi differenti per funzionalità e tecnologia anni 60 COBOL metà anni 50 FORTRAN metà anni 60 BASIC 1968 Pascal 1974 C 1991 VB 1990 C++ 1994 Java 2000 C#, VB.NET Linguaggi di Programmazione Procedurale Linguaggi Ibridi Linguaggi Orientati agli Oggetti 25
Linguaggi di Programmazione programmazione procedurale C clean C programmazione orientata agli oggetti linguaggio di questo corso - sostanzialmente equivalente ma più semplice del C C++ Java, C# 26
Linguaggi di Programmazione Attenzione i linguaggi della stessa famiglia sono normalmente basati sugli stessi concetti Differenze alcuni linguaggi forniscono funzionalità che altri non hanno sintassi semantica 27
Sintassi e Semantica Sintassi grammatica del linguaggio insieme delle regole che stabiliscono quali frasi (programmi) sono corretti Esempio: in Italiano: maiuscola dopo il punto in C++: le istruzioni si concludono con ; Semantica significato del linguaggio insieme delle regole che stabiliscono come il calcolatore esegue i programmi corretti Esempio: in italiano: andrò è un azione nel futuro in C++: cout << Ciao ; Attenzione sintassi e semantica dei linguaggi di programmazione sono rigorose 28
Sintassi e Semantica Attenzione: ci sono due diverse nozioni di correttezza Correttezza Sintattica assenza di errori sintattici il programma è eseguibile Correttezza Semantica (o Logica) implica la correttezza sintattica il prog. risolve correttamente il problema Verifica della correttezza sintattica viene verificata dal compilatore consente di eliminare gli errori sintattici Verifica della correttezza semantica esecuzione e test del programma prove di funzionamento per controllare che il programma si comporti correttamente processo più complesso e delicato 29
Ciclo di Vita di un Programma Per programmare è necessario conoscere almeno un linguaggio (sintassi e semantica) Ma questo non basta il processo di sviluppo del software è complesso è necessario un metodo (ovvero una metodologia ) per affrontare questa complessità 30
Ciclo di Vita di un Programma Il punto di partenza la descrizione del problema, normalmente fornita in linguaggio naturale è opportuno analizzarla accuratamente Il punto di arrivo l applicazione correttamente funzionante Un passo intermedio fondamentale concepire una strategia per la soluzione del problema 31
Ciclo di Vita di un Programma Algoritmo: sequenza finita di passi, elementari e non ambigui, che risolve un problema in un tempo finito PROBLEMA ALGORITMO PROGRAMMA strategia risolutiva linguaggio di programmazione Efficienza: algoritmo deve risolvere il problema utilizzando al meglio le risorse a disposizione 32
Ciclo di Vita di un Programma Avendo concepito l algoritmo è possibile procedere alla scrittura del codice Codice sorgente istruzioni del linguaggio di programmazione non è direttamente eseguibile dal processore Linguaggio macchina linguaggio di comandi eseguibili dal processore (molto semplici) 33
Linguaggi ad alto livello Conviene impostare la soluzione di un problema a partire dalle mosse elementari del linguaggio macchina? SI, per risolvere il problema con efficienza NO, se la macchina di partenza ha mosse di livello troppo basso (difficile progettare un algoritmo) Linguaggi di Programmazione ad Alto Livello Alto livello di astrazione: le istruzioni corrispondono ad operazioni più complesse esempi: Pascal, Basic, C, C++, Java E necessario tradurre il programma nel linguaggio macchina mediante opportuni programmi (interprete o compilatore) 34
Compilatore Processo di compilazione verifica della correttezza sintattica trasforma il codice sorgente in codice oggetto Processo di collegamento collega il codice oggetto a quello delle librerie esterne (es: op. matematiche) produce il codice eseguibile completo dell applicazione 35
Ciclo di Vita di un Programma A questo punto l applicazione è eseguibile è necessario verificarne la correttezza logica Fase di test esecuzione ripetuta dell applicazione su dati di test per verificarne il funzionamento 36
Ciclo di Vita di Un Programma Analisi del Problema Scelta dell Algoritmo Scrittura del Programma errori nella strategia codice sorgente Compilazione e Collegamento codice eseguibile errori sintattici errori logici ATTENZIONE queste fasi non si svolgono in cascata Verifica Uso e Manutenzione 37
Compilazione e Collegamento codice sorgente es:primo.cpp Compilazione Compilatore librerie esterne precompilate es: iostream Collegamento Collegatore ( linker ) codice oggetto (ling. macchina) es: primo.obj codice eseguibile es: primo.exe 38
Termini della licenza Questo lavoro si basa sul lavoro di G. Mecca Programmazione Procedurale in Linguaggio C++. Questo lavoro viene concesso in uso secondo i termini della licenza Attribution-ShareAlike di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA 39