Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08 Laboratorio di Linguaggi lezione I: "Hello, world!" Marco Tarini Laboratorio di Linguaggi • docente: Marco Tarini e-mail: [email protected] • ricevimento: Mercoledì 13:00 - 18:30 o anche su appuntamento • libro di testo consigliato: Kelley Al, Pohl Ira: "C Didattica e Programmazione" ("A Book on C") quarta edizione - anche la terza va bene Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Laboratorio di Linguaggi • Pagina del corso: http://vcg.isti.cnr.it/~tarini/?57 – (oppure: google for "Marco Tarini" => "Teaching" => "Linguaggi-07") Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Laboratorio di Linguaggi • piccola guida pratica di C – guida essensiale di alcuni emementi di C v = argomanto già trattato Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Linguaggio C: cenni storici • 1972: nasce il C, – by Brian Kernighan & Dennis M.Richie, AT&T Bell Labs – scopo: poter riscrivere in un linguaggio a più alto livello il codice del sistema operativo UNIX – evoluzione del B • Anni 80: si sviluppa il C tradizionale • 1983: comincia la definizione dello standard ANSI C, – (ANSI = American National Standards Institute) • 1990: nascita ufficiale dello "ANSI C" – (o "ANSI ISO/C") Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Perchè un corso di C ? Di certo, é un linguaggio di 20-30 anni fa! • Obsoleto? Roba vecchia? Ma: • Ancora un industry standard – diffusissimo – prob. il linguaggio meglio provvisto di librerie al mondo • Indispensabile in alcuni contesti – es programmazione di sistemi operativi • Molto propedeutico – basso livello (es. gestione diretta della memoria) – “toccare con mano” (es. ottimizzazioni) • Bonus: C++ (quasi gratis, sapendo Java e C) Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Un monito prima di iniziare C (n.): A language that combines all the elegance and power of assembly language with all the readability and maintainability of assembly language. The Hacker's Dictionary Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Caratteristiche del Linguaggio C • Linguaggio imperativo – con numerosi tipi di dato e strutture di controllo • "Medio" livello – – – – cioè più basso di Java! gestione memoria diretta gestione files diretta puntatori… importante! • Focalizzato su efficienza e compattezza di codice • Linguaggio scarno, ma estendibile – esistono molte librerie per operazioni non definite dal linguaggio… • Possibile sviluppare progetti modulari – composti da più files sorgente (source files) compilabili separatamente – molto utile per progetti complessi Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Caratteristiche del Linguaggio C • Il C è un linguaggio tipizzato – cioè: il tipo di ogni espressione è del tutto noto al momento della compilazione x = y + z ; int int int Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria C e Java a confronto... • i costrutti sono simili ma i++ ... if (x<0) x=-x; ... è più elegante dell’ l’equivalente i=i+1 int x=1, i; for (i=1; i<=10; i=i+1) { x = x * i; } int log2=0, x=100; while (x>1) { x = x / 2; log2++; } Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria C e Java a confronto... • ma scordatevi... – la programmazione ad oggetti (le classi) • in C niente metodi* ! – (* member functions che si applicano all’oggetto che le chiama)! • solo funzioni globali • ...se volete pensatele come metodi statici – macchine astratte (“java runtime environment”) • il C è molto, molto concreto • gestione diretta della macchina • puramente compilato, non compilato-poi-interpretato – gestione delle eccezioni... Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Un programma in C • Un programma è un’insieme di – funzioni, e – variabili. • La funzione main – funzione speciale, è l’inizio del programma – deve esistere Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Le variabili • Dichiarazioni (semplici) tipo (delle variabili x, y, z, w): int (intero) opzionalmente, le variabili possono essere inizializzate qui, il valore iniziale di z è 5 int x , y , z = 5, w; float ratio, ratio_bis ; tipo (delle variabili ratio e ratio_bis): float (intero) Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Caratteristiche del Linguaggio C • Il C usa lo scoping statico (come Java) viene definita la variabile globale intera "a", (che vale 5) viene definita la procedura "proc" che… …scrive il valore di a viene definita un altra variabile locale intera "a", (che vale 10) viene invocata la procedura "proc" int a=5; void proc() { printf("%d",a); } void main() { int a=10; proc(); } Marco Tarini - Laboratorio di Linguaggi - scoping statico: il programma scrive "5" se lo scoping fosse dinamico, il programma scriverebbe "10" ! 2007/08 - Università dell’Insubria Le funzioni int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Le funzioni tipo del risultato: intero (output della funzione) corpo della funzione “cosa fa” un blocco delimitato da {} nome (identificatore) della funzione: “potenza” lista dei parametri formali, ciascuno preceduto dal tipo (input della funzione) int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } variabili locali • qui, due • visibili solo nel corpo della funzione. • dichiarate all’inizio! comando “return”: restituzione del risultato, e uscita dalla funzione ci deve essere! Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Le procedure • Sono funzioni... ...solo, non restituiscono nessun valore tipo del risultato: “void” (nessuno) void saluta_n_volte (int n) { int i; for (i=1; i<=n; i++) { printf("ciao "); } } nota: niete comando “return” nel corpo. (ma si può usare “return”, senza valore, per uscire dalla funzione) Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Chiamare (“invocare”) le funzioni int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; }; return res; } int main(){ int base=10, milione; milione = potenza( base, 6); ... } Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Errori comuni di C... • le variabili locali si possono definire solo all’inizio di un blocco! { { int x=1; for (int i=1; i<=10; i=i+1) { x = x * i; } int z = int w = NO } } { { int x=1, i; for (i=1; i<=10; i=i+1) { x = x * i; } x=2, z, k=5; x+k; h=4, w; w+h; int x=2, z,w, k=5, h=4; z = x+k; w = w+h; SI } } Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Errori comuni di C... • Vietato annidare funzioni! – le funzioni in C sono tutte allo stesso livello int funzione_uno (int b, int e) { int x, y; int funzione_due( int a) { ... } funzione annidata (nested function) male, male... (non compilerà) ... } –(ma, è vero, si può fare ad esempio in Pascal) Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Passaggio di parametri • Sempre per copia – mai per riferimento ! – esempio... void raddoppia (int x) { x = x*2; } int main(){ int incassi = 5; raddoppia( incassi ); ... } – ...di errore – nota: compila perfettamente! Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria