Capitolo 2 (Deitel) Introduzione alla programmazione in C Indice degli argomenti 2.1 - Introduzione 2.2 - Un semplice programma in C: visualizzare una linea di testo 2.3 - Un altro semplice programma in C: sommare due numeri interi 2.4 - Concetti di base sulla memoria 2.5 - L’aritmetica del C 2.6 - Prendere decisioni: operatori di uguaglianza e relazionali 2.7 - Parole chiave del C 2000 Prentice Hall, Inc. All rights reserved. 2.1 - Introduzione • Il linguaggio di programmazione C – Offre allo sviluppatore un approccio “disciplinato” e strutturato alla progettazione di un programma (programmazione strutturata) – Consente di creare programmi chiari, leggibili, semplici da testare e “debuggare”, facili da modificare • Concetto di “Programmazione strutturata” – Verrà approfondito nei prossimi capitoli (3 e 4) – Sarà utilizzato in tutta la parte rimanente del corso 2000 Prentice Hall, Inc. All rights reserved. 2.2 - Un semplice programma in C: visualizzare una linea di testo (1/5) CODICE DEL PROGRAMMA OUTPUT 1 2 3 4 5 6 7 8 /* Fig. 2.1: fig02_01.c Un primo programma in C */ #include <stdio.h> int main(){ printf( “Benvenuto nel mondo del C!\n" ); return 0; } Benvenuto nel mondo del C! • Commenti – Sono il testo racchiuso tra /* e */ , che è ignorato dal compilatore – Servono a descrivere il codice che implementa il programma – Un altro modo per scrivere i commenti è //: • In questo caso tutto il testo che segue // e sta nella stessa riga è un commento 2000 Prentice Hall, Inc. All rights reserved. 2.2 - Un semplice programma in C: visualizzare una linea di testo (2/5) • #include <stdio.h> – Tutte le righe che iniziano con # sono direttive per il preprocessore • Dicono al calcolatore di caricare il contenuto di un determinato file (i file .h contengono la definizioni di funzioni di libreria del C) – <stdio.h> è la libreria che abilita le operazioni standard di input/output • int main() – I programmi C contengono una o più funzioni, una sola delle quali deve chiamarsi ”main”:è quella principale che richiama poi tutte le altre – Per indicare una funzione si scrive il nome della funzione seguito da ( ): • Se la funzione riceve dei parametri di input, essi stanno tra le ( ) • Se non ne ha, le parentesi sono vuote e lo si può indicare anche con (void) – int significa che la funzione main restituisce (output) un valore intero – Le parentesi graffe identificano un blocco di istruzioni (o statement): • Il corpo (blocco di istruzioni) di ogni funzione deve essere racchiuso { } • Le istruzioni vengono eseguite in ordine, dall’alto verso il basso 2000 Prentice Hall, Inc. All rights reserved. 2.2 - Un semplice programma in C: visualizzare una linea di testo (3/5) • printf( “Benvenuto nel mondo del C!\n" ); – L’intera riga rappresenta una tipica istruzione in C: • Un’istruzione ordina al calcolatore di eseguire una determinata azione • Tutte le istruzioni devono terminare con un punto e virgola • Qui l’azione è stampare a video la sequenza di caratteri tra le “ “ – L’istruzione è costituita da una funzione di stampa a video formattata: • printf è una funzione inclusa nella libreria stdio.h per l’I/O • Visualizza tutto quello che gli viene passato come parametro, dentro le ( ) – \ è il carattere di escape: • \ toglie al carattere che lo segue il suo usuale significato • In generale \ serve ad indicare che la funzione printf dovrà fare qualcosa diversa dall’ordinario, come dare una formattazione al testo visualizzato • Qui \n indica il carattere speciale newline (nuova riga, vai a capo) • Ci sono anche altri caratteri di formattazione: – \t crea i “rientri” del testo e \r posiziona il cursore a inizio riga corrente – \a fa suonare i beeper del Pc,, \’,\”.\\ consentono la stampa di ‘,” e \ 2000 Prentice Hall, Inc. All rights reserved. 2.2 - Un semplice programma in C: visualizzare una linea di testo (4/5) • return 0; – E’ uno dei possibili modi per uscire da una funzione – In questo caso, indica al S.O. che il programma è terminato regolarmente – Per la sintassi C, va messo a fine main perché la funzione ritorna un int • Parentesi graffa chiusa } – Indica che la fine del main è stata raggiunta, ovvero che la funzione non contiene ulteriori istruzioni dopo la }, cosa che vale per tutte le funzioni • Linker – Quando una funzione viene chiamata, il linker la localizza nella libreria – Una volta trovata, la inserisce nel programma oggetto (traduzione del programma sorgente effettuata dal compilatore) – Se invece il nome della funzione è scritto male, il linker segnalerà un errore perché non riesce a trovare la funzione nella libreria 2000 Prentice Hall, Inc. All rights reserved. 2.2 - Un semplice programma in C: visualizzare una linea di testo (5/5) • Scrittura del codice – #include <stdio.h> int main(void) {printf(“Benvenuti nel mondo del C!\n");return 0;} – Anche scritto come sopra, il programma funziona correttamente ma è assolutamente illeggibile – Se il codice di un programma è scritto in modo disordinato, diventa difficile scovare eventuali errori o modificarlo in un secondo momento • Alcuni suggerimenti – Inserire i commenti – Far rientrare (indent) il corpo della funzione di un livello (2/3 spazi) – Scrivere una sola istruzione per ogni riga 2000 Prentice Hall, Inc. All rights reserved. 2.3 - Un altro semplice programma in C: sommare due numeri interi (1/7) 1 /* Fig. 2.5: fig02_05.c Programma di addizione */ 2 #include <stdio.h> 3 4 int main(){ 5 int integer1, integer2, sum; /* dichiarazioni */ 6 7 printf( “Inserisci il primo intero\n" ); /* prompt */ 8 scanf( "%d", &integer1 ); /* legge un intero */ 9 printf( “Inserisci il secondo intero\n" ); /* prompt */ 10 scanf( "%d", &integer2 ); /* legge un intero */ 11 sum = integer1 + integer2; /* assegnamento della somma*/ 12 printf( “La somma è %d\n", sum ); 13 return 0; 1. Inizializzazione delle variabili 2. Input 3. Somma 4. Output /* visualizza la somma */ /* indica che il programma è terminato con successo */ 14 } Inserisci il primo intero 45 Inserisci il secondo intero 72 La somma è 117 2000 Prentice Hall, Inc. All rights reserved. Visualizzazione del programma 2.3 - Un altro semplice programma in C: sommare due numeri interi (2/7) • Come prima – Commenti, #include, <stdio.h> e main • int integer1, integer2, sum; – Dichiarazione delle variabili • Le variabili non sono altro che contenitori, cioè locazioni di memoria in cui un valore può essere immagazzinato • Prima di essere usata, ogni variabile deve essere dichiarata (una ed una sola volta) con un nome univoco ed un tipo di dato e poi inizializzata • Le dichiarazioni vanno messe sempre prima di ogni istruzione eseguibile, altrimenti si genera un errore di sintassi (di compilazione) • Così il compilatore può stabilire subito lo spazio di memoria da allocare alle variabili e controllare che le operazioni tra variabili siano adatte al loro tipo – Durante l’esecuzione del programma, ogni variabile ha un nome, un tipo ed un valore corrente assegnato 2000 Prentice Hall, Inc. All rights reserved. 2.3 - Un altro semplice programma in C: sommare due numeri interi (3/7) • Tipi di dato – Il tipo di una variabile indica quale tipo di valori può assumere il contenuto della variabile stessa • char indica che la variabile può contenere caratteri (es. a, b, C, $, -, ?) • int,short,long indicano che la variabile può contenere valori interi (es. -1, 0, 21); la differenza tra i 3 tipi sta nel range di interi rappresentabili • float indica che la variabile può contenere numeri reali rappresentati in virgola mobile a singola precisione (es. 3.14, 2.187, -5.39) • double indica che la variabile può contenere valori reali rappresentati in virgola mobile a doppia precisione (es. 1.23456789101112) • int integer1, integer2, sum – Sono i nomi delle variabili (identificatori) • Gli identificatori sono composti da lettere, cifre (ma non possono iniziare con una cifra) e underscore ( _ ) • Ogni identificatore può essere composto al massimo da 31 caratteri • Il C è case sensitive (fa distinzione tra maiuscole e minuscole) 2000 Prentice Hall, Inc. All rights reserved. 2.3 - Un altro semplice programma in C: sommare due numeri interi (4/7) Tipo Dimensione in byte Range di valori rappresentabili char 1 (8 bit) Tutti i caratteri della tabella ASCII int 2 (16 bit) Da -32.768 a +32.767 short (int) 2 (16 bit) Da -32.768 a +32.767 long (int) 4 (32 bit) Da -2.147.483.648 a +2.147.483.647 float 4 (32 bit) Da -3,4 x 10 double 8 (64 bit) Da -1,8 x 10 2000 Prentice Hall, Inc. All rights reserved. 38 308 a +3,4 x 10 a +1,8 x 10 38 308 2.3 - Un altro semplice programma in C: sommare due numeri interi (5/7) • scanf( "%d", &integer1 ); – Funzione C che riceve un valore in input dall’utente • scanf prende i dati dallo standard input (di solito la tastiera) • E’ un’altra delle funzioni contenute nella libreria stdio.h per l’I/O • L’effettivo inserimento di un valore è confermato dall’utente col tasto INVIO – La scanf prevede due parametri/argomenti: • %d è una specifica di conversione che indica il tipo del dato da inserire; in questo caso deve essere un intero (%c per i caratteri, %f per i float, ecc..) • &integer1 indica la locazione di memoria in cui salvare la variabile • integer1 è il nome della variabile che assume il valore in input • & si chiama “operatore indirizzo” e crea confusione inizialmente, per ora occorre solo ricordare di anteporlo al nome della variabile nelle scanf – In questo esempio l’utente risponderà alla scanf digitando un numero e premendo il tasto INVIO (return) 2000 Prentice Hall, Inc. All rights reserved. 2.3 - Un altro semplice programma in C: sommare due numeri interi (6/7) • = (operatore di assegnamento) – E’ un operatore binario che assegna un valore ad una variabile – Operatore binario significa che necessita di due operandi, come anche l’operatore +: il primo sta sempre alla sua sinistra, il secondo a destra sum = variable1 + variable2; – La variabile che riceve il valore è sulla sinistra mentre il valore assegnato è dato dall’espressione sulla destra (scrivere 3=a; dà errore !!!) • printf( “La somma è %d\n", sum ); – Funzione duale della scanf (rispetto a prima, qui ha 2 parametri): • %d indica il tipo del dato da visualizzare, che qui è un intero • sum specifica la variabile da cui prendere il valore da visualizzare • Il valore della variabile verrà scritto nella stringa al posto di %d – Volendo, i calcoli possono essere eseguiti anche direttamente all’interno dell’istruzione printf, ottenendo un output equivalente printf( “La sommma è %d\n", integer1 + integer2 ); 2000 Prentice Hall, Inc. All rights reserved. 2.3 - Un altro semplice programma in C: sommare due numeri interi (7/7) • Specifiche di conversione – Possono essere usate sia con printf che con scanf Stringa di controllo Cosa viene stampato %d, %i Un intero decimale %c Un carattere %s Una stringa di caratteri %o Un numero ottale %x, %X Un numero esadecimale %u Un intero senza segno %f Un numero reale (con virgola) %e, %E Un numero in formato esponenziale %% Il carattere % 2000 Prentice Hall, Inc. All rights reserved. 2.4 - Concetti di base sulla memoria (1/2) • Variabili – La memoria del calcolatore è un insieme di locazioni (celle) contigue – Ogni variabile ha un nome, un tipo, una dimensione ed un valore • La dimensione è determinata dal tipo • I nomi delle variabili corrispondono a locazioni nella memoria del calcolatore – Quando si assegna un nuovo valore ad una variabile, ad esempio con una scanf, esso rimpiazza quello vecchio, che è quindi perso per sempre – Leggere il contenuto di una variabile in memoria non ne altera mai il valore • Una rappresentazione visiva: integer1 2000 Prentice Hall, Inc. All rights reserved. 45 2.4 - Concetti di base sulla memoria (2/2) 1 /* Programma di stampa dell’input inserito*/ 2 #include <stdio.h> 3 4 102 103 int main(void){ 5 int i; 6 7 printf( “Inserisci un numero intero\n" ); 8 scanf( "%d", &i ); 9 printf( “Il valore inserito è %d\n“ , i ); 10 return 0; 11 } Inserisci un intero -33 Il valore inserito è -33 104 -33 i 105 106 107 108 109 • Azione di printf/scanf in memoria – Quando si esegue il programma, la variabile i viene associata all’indirizzo di memoria con indice 104; quindi nel corso dell’esecuzione, i rappresenterà l’indirizzo di memoria 104 ed è li che il valore di input -33 verrà salvato 2000 Prentice Hall, Inc. All rights reserved. 2.5 - L’aritmetica del C (1/2) • In quasi tutti i programmi sono presenti calcoli aritmetici – Si usa il carattere * per la moltiplicazione e / per la divisione – La divisione tra interi tronca sempre la parte decimale 7 / 5 darà come risultato 1 – L’operatore “modulo” (%) restituisce il resto di una divisione 7 % 5 darà come risultato 2 (se gli operandi non sono interi, ho errore sintattico) • Precedenze tra gli operatori – Alcuni operatori aritmetici hanno la precedenza rispetto ad altri (per esempio, la moltiplicazione viene eseguita prima dell’addizione) • Se si vuole evadere il comportamento standard, le priorità tra operatori possono essere modificate usando le parentesi dove serve – Esempio: si vuole calcolare la media di tre variabili a, b e c • Non si deve scrivere: a + b + c / 3 (errore logico) • Si scrive: (a + b + c ) / 3 2000 Prentice Hall, Inc. All rights reserved. 2.5 - L’aritmetica del C (2/2) • Operatori aritmetici Operazione in C Operatore aritmetico Espressione in C Addizione + f+7 Sottrazione - p–c Moltiplicazione * b*m Divisione / x/y Modulo % r%s • Regole di precedenza Operatore Operazione Ordine di valutazione (precedenza) () Parentesi Sono valutate per prime. Se sono nidificate, sono valutate per prime le espressioni nella coppia di ( ) più interna. Nel caso che ci siano più coppie di parentesi allo stesso livello (non nidificate), queste saranno valutate da sinistra a destra. *, / , % Moltiplicazione, Divisione, Modulo Sono valutate per seconde. Nel caso in cui ce ne siano molte, sono valutate in ordine da sinistra a destra. +. - Addizione, Sottrazione Sono valutate per ultime. Nel caso in cui ce ne siano molte, sono valutate in ordine da sinistra a destra. 2000 Prentice Hall, Inc. All rights reserved. 2.6 - Prendere decisioni: operatori di uguaglianza e relazionali (1/4) • Le possibili istruzioni eseguibili in C servono a: – Compiere azioni (calcoli, input/output di dati) – Prendere decisioni • Si può ad esempio voler stampare a video "promosso" o “bocciato" in base al voto di un esame che viene immesso come input • Struttura di controllo if – In questo capitolo la vediamo nella sua versione più semplice, verrà poi meglio approfondita nei capitoli successivi – Se una condizione è soddisfatta, allora il blocco di istruzioni all’interno del corpo della struttura if viene eseguito • 0 corrisponde a falso, diverso da zero a vero (non esiste il “tipo booleano”) – Al termine della struttura if, riprende l’esecuzione del programma lineare • Per creare condizioni si usano: – Operatori relazionali (di confronto) – Operatori logici, che vedremo nel prossimo capitolo 2000 Prentice Hall, Inc. All rights reserved. 2.6 - Prendere delle decisioni: operatori di uguaglianza e relazionali (2/4) • Operatori di uguaglianza e relazionali Operatori di uguaglianza e relazionali Operatori di uguaglianza e relazionali in una condizione C Significato della condizione in C = if (x == y) Se x è uguale a y … ≠ if (x != y) Se x è diverso da y … > if (x > y) Se x è maggiore di y … < if (x < y) Se x è minore di y … ≥ if (x >= y) Se x è maggiore o uguale a y … ≤ if (x <= y) Se x è minore o uguale a y … Operatori di uguaglianza Operatori relazionali 2000 Prentice Hall, Inc. All rights reserved. 2.6 - Prendere delle decisioni: operatori di uguaglianza e relazionali (3/4) 1 /* Fig. 2.13: fig02_13.c 2 Usare le strutture if, operatori relazionali e di uguaglianza */ 3 #include <stdio.h> 4 5 int main(){ 6 1. Dichiarazione variabili int num1, num2; 7 8 printf( “Inserisci due numeri interi e ti dirò\n" ); 9 printf( “quali relazioni soddisfano: " ); 10 scanf( "%d%d", &num1, &num2 ); /* legge due interi */ 2. Input 11 12 13 if ( num1 == num2 ) printf( "%d è uguale a %d\n", num1, num2 ); 14 15 16 if ( num1 != num2 ) 19 4. Visualizzazione printf( "%d è diverso da %d\n", num1, num2 ); 5. Uscita dal main 17 18 3 Struttura If if ( num1 < num2 ) printf( "%d è minore di %d\n", num1, num2 ); 20 2000 Prentice Hall, Inc. All rights reserved. 2.6 - Prendere delle decisioni: operatori di uguaglianza e relazionali (4/4) 21 22 if ( num1 > num2 ) printf( "%d è maggiore di %d\n", num1, num2 ); 23 24 25 if ( num1 <= num2 ) printf( "%d è minore o uguale di %d\n", num1, num2 ); 26 27 28 if ( num1 >= num2 ) printf( "%d è maggiore o uguale di %d\n", num1, num2 ); 29 30 return 0; /* indica che il programma è terminato con successo*/ 31 } Inserisci due numeri interi e ti dirò quali relazioni soddisfano: 3 7 3 è diverso da 7 3 è minore di 7 3 è minore o uguale di 7 Inserisci due numeri interi e ti dirò quali relazioni soddisfano : 22 12 22 è diverso da 12 22 è maggiore di 12 22 è maggiore o uguale di 12 2000 Prentice Hall, Inc. All rights reserved. Visualizzazione del programma in due esecuzioni successive 2.7 - Parole chiave del C • Parole chiave – Sono parole speciali riservate del C – Non possono mai essere utilizzate come identificatori/nomi di variabili Parole chiave auto double int struct break case char const continue default do else enum extern float for goto if long register return short signed sizeof static switch typedef union unsigned void volatile while 2000 Prentice Hall, Inc. All rights reserved.