La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Lezione 8 – A.A. 2016/2017 Prof. Giovanni Acampora

Presentazioni simili


Presentazione sul tema: "Lezione 8 – A.A. 2016/2017 Prof. Giovanni Acampora"— Transcript della presentazione:

1 Lezione 8 – A.A. 2016/2017 Prof. Giovanni Acampora
Informatica Informatica - A.A Lezione 8 – A.A. 2016/2017 Prof. Giovanni Acampora

2 Introduzione alla programmazione in linguaggio C
Ruolo dei linguaggi di programmazione Il primo programma C Tipi semplici in C Operatori principali Operazioni di Input/Output Informatica - A.A

3 Linguaggi ad alto e basso livello
Come visto la macchina di Von Neumann è capace di eseguire sequenze ben ordinate di istruzioni in linguaggio macchina del tipo: Codice istruzione-indirizzo1…indirizzoN L’istruzione deve essere presente nel set di istruzioni della ALU. Un programma in L.M. è intrinsecamente legato all’hardware per cui è stato realizzato. Il L.M. è un linguaggio di basso livello. I linguaggi che permettono di svincolarsi dalla rappresentazione hardware vengono chiamati linguaggi di alto livello. Informatica - A.A

4 Assembler Il primissimo passo nella gerarchia dei linguaggi è il linguaggio assembler. Si tratta di un linguaggio di basso livello che però ammette una rappresentazione “human readable” del programma. Linguaggio Macchina Linguaggio Assembler LOAD R1,X LOAD R2,Y ADD R3,R1,R2 STORE R3,Y Il linguaggio assembler è una semplice traduzione del L.M., i comandi assembler ammettono una trascrizione 1 a 1 con quelli della ALU, e sono quindi specifici per ogni CPU. Un assemblatore è quella parte del sistema operativo che trascrive un programma in assembler nel suo corrispondente in L.M. Informatica - A.A

5 Linguaggi ad alto livello (I)
Agli albori della programmazione (fino alla nascita del FORTRAN alla fine degli anni ’50) l’assembler era l’unico linguaggio esistente. Sebbene l’assembler possa in principio essere utilizzato direttamente per implementare qualsiasi algoritmo esso presenta numerose gravi limitazioni per un utilizzo in progetti complessi: Portabilità Leggibilità Riutilizzabilità Controllo degli errori Questo ha portato alla creazione di linguaggi più vicini al linguaggio naturale e più lontani da quello della macchina…. Informatica - A.A

6 Linguaggi ad alto livello (II)
Un linguaggio di alto livello NON ammette una semplice traduzione 1 a 1 con le istruzioni della macchina, ma definisce costrutti e comandi specifici del linguaggio e indipendenti dalla macchina su cui devono essere eseguiti. Il processo di traduzione in L.M. (l’unico veramente compreso dal calcolatore) è quindi di gran lunga più complesso che per un programma assembler. Programma in C , C++, FORTRAN, JAVA,… COMPILATORE o INTERPRETE Istruzioni in L.M. Informatica - A.A

7 Dall’algoritmo al processo (I)
Algoritmo/Pseudocodice Editor o ambiente di sviluppo grafico Programma Sorgente Preprocessore COMPILATORE Analisi lessicale : “ortografia” Analisi sintattica (parsing) : “grammatica/logica” Analisi semantica: “significato” Ottimizzazione, assembling File oggetto Informatica - A.A

8 Dall’algoritmo al processo (II)
File oggetto Linker + librerie esterne Programma eseguibile Loader Processo in memoria Informatica - A.A

9 Compilazione Analisi lessicale (scanning): la sequenza di caratteri del programma sorgente è scomposta in unità fondamentali (lessemi) caratterizzate da un identificativo numerico univoco (token). I simboli non riconosciuti generano un messaggio di errore e la fine della compilazione. Analisi sintattica (parsing): le sequenze di token vengono analizzate per vedere se corrispondono a costrutti sintatticamente definiti all’interno del linguaggio. Le regole per costruire questi costrutti formano la grammatica del linguaggio. Analisi semantica: le sequenze di istruzioni riconosciute dal parser vengono interpretate e si generano le sequenze di codice assembler necessarie per realizzarle. Informatica - A.A

10 Caratteristiche Generali del C
Il C è un linguaggio:  semplice (~30 keywords)  tipizzato  strutturato  procedurale Basso livello (vicino all’architettura del sistema, il cuore (kernel) del sistema operativo linux e` scritto in C) Grande flessibilità (adatto a piccoli e grandi progetti, adatto per implementare il SW per online ed offline ...) Informatica - A.A

11 Il primo programma in C /* Hello world: il mio primo programma C */
Commento su più righe; il compilatore ignorerà tutto quanto compreso fra /* e */. /* Hello world: il mio primo programma C */ #include<stdio.h> int main(){ //inizio del programma printf(“Hello world \n”); //fine del programma return 0; } Direttiva al preprocessore per includere le dichiarazioni delle funzioni standard di I/O Commento su una riga; il compilatore ignorerà i caratteri fra // e la fine del rigo. Simbolo di fine istruzione Informatica - A.A

12 Il programma in C un’insieme funzioni e variabili.
la funzione speciale main è l’inizio del programma (deve esistere) int main() { int ierr; ..... return ierr; } Informatica - A.A

13 Compilazione & linking con il compilatore GNU
$ gcc [opzioni] [–lnomelib] [-o file.exe] file.c Cerca le librerie di nome: libnomelib.a in una sequenza di directories di default ed effettua il linking. Esempio: -lm effettua il link con la libreria di funzioni matematiche /usr/lib/libm.a Nome del file sorgente C Genera in output un eseguibile chiamato file.exe invece del default, che è a.out Nome del compilatore: include anche il linker Informatica - A.A

14 Esempi Da evitare!!!: $ gcc –Wall primo.c –o primo.c Comando
Output File Run command $ gcc –Wall primo.c a.out ./a.out $ gcc –Wall primo.c –o primo primo ./primo $ gcc –Wall matr.c –lm –o matr.exe matr.exe ./matr.exe $ gcc –Wall matr.c –o matr.exe -lm $ gcc –Wall primo.c –o primo.c Da evitare!!!: Informatica - A.A

15 Un programma utile Un programma utile
Questo valore non può essere cambiato /* Euroconvertitore */ #include<stdio.h> int main(){ float cifra_in_lire, cifra_in_euro; const float conv_fact = ; printf(“Inserisci la cifra in lire \n”); scanf(“%f”,&cifra_in_lire); cifra_in_euro = cifra_in_lire/conv_fact; printf(“Il controvalore euro e\’ %f \n”, cifra_in_euro); return 0; } Dichiarazione delle variabili. Legge dallo standard Input un tipo float e lo mette nella variabile cifra_in_lire Scrive sullo standard Output un messaggio contenente un tipo float che è il contenuto della variabile cifra_in_euro !!! Attenzione: il C e’ “case sensitive” !!! Informatica - A.A

16 Cosa calcola questo programma ?
#include <stdio.h> int main() { int i, numVal, value; double sum; scanf("%d", &numVal); sum = 0; for(i = 0; i < numVal; i++) { scanf("%d",&value); sum = sum + value; } printf("\n %lf\n", sum/numVal); return 0; Legge un dato dallo standard input Scrive caratteri nello standard output Informatica - A.A

17 /* Calcolo della media di numeri interi */ #include <stdio.h>
int main() { int i, numVal, value; double sum; printf(“\nMedia di una sequenza di numeri interi\n"); printf("Quanti interi vuoi introdurre ? "); scanf("%d", &numVal); sum = 0; for(i = 0; i < numVal; i++) { printf(“Entra Valore n.%d: ",i+1); scanf("%d",&value); sum = sum + value; } printf("\n Media = %lf\n", sum/numVal); return 0; Informatica - A.A

18 Variabili e tipi Come ampiamente discusso la rappresentazione interna di un numero intero con segno è diversa da quella di un intero senza segno. Ci sono poi almeno tre possibili rappresentazioni dei numeri in virgola mobile secondo lo standard IEEE754: singola doppia e quadrupla precisione rispettivamente con 32, 64 e 128 bit. I caratteri vengono rappresentati tramite il codice ASCII e necessitano di un byte (8 bit). Il tipo di una variabile deve essere sempre dichiarato Il linguaggio C e’ tipizzato Informatica - A.A

19 Tipi semplici predefiniti in C (I)
Tipi interi: int = intero con segno, 32 bit short = intero con segno, 16 bit long = intero con segno, 64 bit unsigned int = come int ma senza segno unsigned short = come short ma senza segno unsigned long = come long ma senza segno I tipi character sono in realtà interi di 8 bit: char = intero di 1 byte Informatica - A.A

20 Tipi semplici predefiniti in C (II)
Tipi float: float = virgola mobile, 32 bit double = virgola mobile, 64 bit long double = virgola mobile, 128 bit Il tipo più usato è il double, float è conveniente talvolta per risparmiare memoria in vettori di grandi dimensioni. In aggiunta a questi tipi c’è il tipo speciale void che rappresenta l’assenza di valore (valore vuoto). Vedremo meglio il suo utilizzo in seguito. Informatica - A.A

21 Il qualificatore const
Il qualificatore const può essere premesso a qualsiasi tipo, indicando che la variabile così definita non verrà modificata nel corso del programma. In tal caso bisogna assegnare il valore iniziale alla variabile in fase di definizione: const int max_iterazioni = 100; const char no = ‘n’; const float pigreco = ; Informatica - A.A

22 Sommare patate con cipolle…
Nelle operazioni con tipi diversi, di norma un tipo inferiore viene “promosso” al tipo superiore secondo la scala: Char, short => int =>long => float =>double =>long double Esempio: Se i è un int e f è un float i viene promosso a float e il risultato dell’operazione i + f è a sua volta un float Bisogna ovviamente fare molta attenzione alle conversioni in cui si perde informazione, dove può avvenire un troncamento, come nel caso i=x con i int e x float. Informatica - A.A

23 Operatori aritmetici, relazionali e logici
* / % Operatore modulo: x%y è il resto della divisione di x per y e quindi vale zero se x è multiplo di y Operatori relazionali: > >= < <= == != Operatori di uguaglianza e disuguaglianza: x = = y è vera se x è uguale a y x != y è vera se x è diverso da y Operatori logici: && || AND logico OR logico Informatica - A.A

24 Operatori di incremento e decremento
Spesso in un programma occorre incrementare o decrementare di 1 una variabile. Il C dispone di particolari operatori dedicati a ciò, che sono: Se usati rispettivamente prima o dopo di una variabile ne determinano il preincremento (variabile prima incrementata e poi utilizzata) o il postincremento (variabile prima utilizzata e poi incrementata). Informatica - A.A

25 Esempi n = 5; k = n++; n = 5; k = ++n; n = 5; n = 5; n++; ++n;
Da ora in poi k è uguale a 5 ed n è uguale a 6 n = 5; k = ++n; Da ora in poi k è uguale a 6 ed n è uguale a 6 n = 5; n++; n = 5; ++n; Da ora in poi n è uguale a 6 Informatica - A.A

26 Operatori di assegnamento
Un’altra particolare classe di operatori del C permette di scrivere in forma compatta le operazioni in cui una variabile viene modificata a partire da sé stessa. Ad esempio: x += 2 è equivalente a x = x + 2 x -= è equivalente a x = x - 3 y *= x è equivalente a y = y*x y *= x è equivalente a y = y*(x + 1) z %= x è equivalente a z = z%x Informatica - A.A

27 Funzione printf (I) printf e’ una funzione della libreria stdio che permette ad un programma di passare informazioni allo standard output. Il formato con cui sono presentati i numeri e le stringhe di caratteri e’ definito da un insieme di regole e simboli di formattazione. printf(formato, arg1, arg2….); printf(“%f %f %f %f”, x, y, x*y, x/y); formato : stringa di caratteri che contiene le informazioni per la formattazione, i descrittori del formato arg1,arg2..: nomi di variabili di cui si vuole stampare il contenuto Informatica - A.A

28 Funzione printf (II) La stringa di controllo e’ costituita da caratteri ordinari e da direttive per il controllo del formato. Il descrittore del formato ha la seguente forma: %[-][ampiezza][.precisione]tipo - allineamento del campo a sinistra (default a destra) ampiezza il numero totale di campi di carattere che il dato occupera’ (e’ necessario avere una stima dei valori che la variabile puo’ assumere) ; printf(“%13.6f %15.6e %f”, x, y, x/y); Informatica - A.A

29 Funzione printf (III) precisione
il numero max di caratteri da stampare per una stringa; il minimo numero di cifre da stampare per un intero il numero di cifre decimali per un numero floating point d per dati di tipo int; f per dati di tipo float; lf per dati di tipo double; c per dati di tipo char; s per le stringhe e,E,g per dati di tipo double con notazione scientifica; tipo Informatica - A.A

30 Funzione printf (III) Esempi:
printf(“%f %f %f %f”, x, y, x*y, x/y); printf(“%13.6f %15.6e %f”, x, y, x/y); printf(“\n Index = %d Value = %f”, i, item); printf(“Client%s owns %d points\n”, Name,PN); p.s.: Usare “man 3 printf” per ulteriori dettagli Informatica - A.A

31 Funzione scanf Esempi: Non dimenticare !!
scanf e’ una funzione della libreria stdio che permette ad un programma di ottenere informazioni dallo standard input. Esempi: scanf(“%f %f %f %f”, &x, &y, &z, &time); Non dimenticare !! scanf(“%d %d %f”, &i, &j, &v); p.s.: Usare “man 3 scanf” per ulteriori dettagli Informatica - A.A

32 Esempio: area di un cerchio
/* programma per il calcolo dell’area di un cerchio */ #include <stdio.h> int main(){ float raggio, area; printf(“\n Dammi il raggio [cm]: ”); scanf(“%f”,&raggio); area = * raggio * raggio; printf(“\n Area = %f ”, area); return 0; } Informatica - A.A

33 Sequenze di Escape Escape Sequence Character ASCII Value \a \b \f \n
Sono delle combinazioni di caratteri composte da \ (backslash) seguita da uno o piu’ caratteri. Sono di solito usate per specificare alcune particolari funzioni di terminali e stampanti Escape Sequence Character ASCII Value \a \b \f \n \r \t \v \’ \\ Alert/bell Backspace Formfeed Newline Carriage return Horizontal tab Double quotation Single quotation Backslash 7 8 12 10 13 9 11 34 92 Informatica - A.A


Scaricare ppt "Lezione 8 – A.A. 2016/2017 Prof. Giovanni Acampora"

Presentazioni simili


Annunci Google