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.
Scarica

Cap. 2 Deitel