Intro Linguaggioc
Intro Linguaggioc
1
Introduzione
2
Alcune proprietà del C
• È un linguaggio imperativo
▪ il programma è composto come un insieme di istruzioni (dette anche
direttive o comandi), ciascuna delle quali può essere pensata come un
“ordine” che viene impartito al calcolatore
• È un linguaggio dichiarativo
▪ L’intenzione di utilizzare una variabile o una funzione deve essere
dichiarata a priori
• È un linguaggio strutturato
▪ Fornisce i costrutti base per la definizione di sequenza, selezione ed
iterazione
• È un linguaggio case sensitive
▪ Discrimina tra caratteri maiuscoli e minuscole
▪ e.g., Main è diverso da main!
3
Struttura di un programma C
4
Hello world!
#include <stdio.h>
void main() {
printf("Hello World!");
5
Hello world!
Parte
dichiarativa #include <stdio.h>
globale
In questo esempio la parte
Parte void main() { dichiarativa locale è vuota
dichiarativa
locale
printf("Hello World!");
Parte
esecutiva
} La parte esecutiva
contiene il vero e
proprio algoritmo
6
Hello world!
7
Hello world!
Parte
dichiarativa #include <stdio.h>
Possiamo aggiungere commenti dove si
globale vuole (testo tra /* */). Servono ai
Parte void main() { programmatori per rendere il codice più
dichiarativa leggibile; sono ignorati dal compilatore
locale
printf("Hello World!");
Parte
esecutiva
} Possiamo mettere quanti a-capo e
spazi vogliamo perché vengono
ignorati.
In realtà utilizzeremo una
convenzione detta “indentazione”
per rendere il codice leggibile
8
E ora che abbiamo il codice?
9
Perché linguaggio macchina?
10
Il flusso di sviluppo di un programma
Codifica del
Analisi Definizione programma
Del problema dell’algoritmo (linguaggio C)
Compilazione Esecuzione
del programma sul calcolatore
(linguaggio macchina)
11
Hello world!
void main() {
printf("Hello World!");
}
12
Una nota
#include <stdio.h>
Parola chiave
int al posto di int main() {
void
printf("Hello World!");
Istruzione return 0;
return alla
fine del main }
13
La macchina astratta del C
BUS
CPU MEM.
Standard Input Standard Output
a
B La tastiera Il terminale
pluto
somma_1 video
...
14
La macchina astratta del C – Memoria
• Semplificazioni / idealizzazioni /
approssimazioni / astrazioni
▪ Nessun limite al numero delle celle
▪ Nessun limite ai valori numerici contenuti
15
La macchina astratta del C – Standard I/O
16
La macchina astratta del C – CPU
17
Organizzazione di un programma
18
Organizzazione di un programma – esempio
20
Direttiva include
• Le direttive:
▪ sono istruzioni particolari rivolte al compilatore
▪ iniziano con il carattere # e non terminano con ;
• La direttiva include indica l’intenzione di utilizzo di una
libreria esterna (cioè una collezione di funzioni, cioè
sottoprogrammi che svolgono un compito più complesso di
una singola istruzione)
• Esempio
▪ #include <stdio.h> richiede la libreria di gestione degli input e
degli output (e.g., printf(), scanf(), …)
▪ #include <math.h> richiede la libreria con le principali funzioni
matematiche (e.g., abs(), sin(), …)
• Una volta inclusa una libreria è possibile utilizzare tutte le
funzioni definite al loro interno
21
main
22
main
23
Dichiarazione di variabili
24
Dichiarazione di variabili
• Esempi:
▪ int raggio, circonferenza;
▪ char carattere;
26
Perché dichiarare una variabile?
27
Tipi di dato
28
Tipi semplici built-in
char
• Occupa 8 bit (1 byte)
• Rappresenta i caratteri in codifica ASCII (American Standard
Code for Information Interchange)
• I caratteri sono rappresentati in memoria tramite un valore
numerico nell’intervallo da 0 a 255
• I caratteri sono rappresentati nel codice di un programma tra
apici semplici: '1', 'a'
• Caratteri speciali sono rappresentati mediante una specifica
sequenza di due caratteri che inizia con \
▪ '\n': a capo, '\t': tab
• Esempio:
char carattere1;
char carattere2, carattere3;
29
Tipi semplici built-in
TABELLA
ASCII
30
Tipi semplici built-in
int
• Occupa almeno 16 bit (2 byte). L’occupazione dipende dal
tipo di architettura del calcolatore
• Rappresenta gli interi relativi. Valori in complemento a 2 da
–32768 a + 32767
• Nei calcolatori moderni occupa 32 bit (4 byte) e rappresenta i
valori da – 2147483648 a + 2147483647
• Esempio:
int n01;
int numero5, num5;
31
Tipi semplici built-in
float
• Occupa 32 bit (4 byte)
• Rappresentano i razionali in virgola mobile. Valori espressi
tramite mantissa e esponente. Valori da -10E-38 a 10E+38
double
• Occupa 64 bit (8 byte)
• Rappresentano i razionali in virgola mobile. Valori espressi
tramite mantissa e esponente. Valori da -10E-308 a 10E+308
• Esempio:
float num7;
double base, altezza;
32
Constanti
33
Costanti
34
Dichiarazione di costanti
35
Direttiva #define
36
Il compilatore e le macro
37
Parte esecutiva
Contiene le istruzioni da
eseguire:
Parte #include <stdio.h>
• Istruzioni di dichiarativa
globale #define PI 3.14
assegnamento (=)
• Istruzioni di Parte void main(){
input/output dichiarativa float r, a;
• Strutture di controllo: locale
scanf("%f ", &r);
▪ Condizionali (if-else) Parte
a = r * r * PI;
esecutiva
▪ Iterative, o cicli (while, printf("%f", a);
do-while e for) }
38
Sequenza – un esempio introduttivo
Inizio
Leggi(r)
Sequenza
a = r*r*3.14
Scrivi(a)
Fine
39
Istruzioni semplici e composte
40
Operatori
41
Assegnamento
42
Esecuzione degli assegnamenti
1. Valutazione dell’espressione
▪ Il valore delle variabili che vi compaiono si trova memorizzato nelle
celle corrispondenti, e da lì è letto
2. Memorizzazione del risultato dell'espressione nella variabile
a sinistra del simbolo =
Operatori C Operazioni Precedenza
( ) Parentesi Valutate per prime. Se ci sono degli annidamenti, si
valuta prima la coppia più interna. Se ci sono più
coppie allo stesso livello, si valuta da sinistra a destra.
* , / , % Moltiplicazione, Valutate per seconde. Se ce ne sono diverse, si
Divisione, Modulo valutano da sinistra a destra.
43
Funzioni di Ingresso e Uscita
44
Stampa su video
45
Stampa su video
FUNZIONAMENTO:
printf (stringa di controllo, elementi da stampare);
• Stampa i caratteri alfanumerici tra doppi apici e al posto dei
caratteri di conversioni stampa il valore dell’identificatore
corrispondente nella lista da stampare
• I caratteri di controllo stampa posizionano il cursore nella
posizione opportuna
46
Esempio
#include <stdio.h>
void main() {
int num1;
float num2;
char car1;
num1=1;
num2=0.2;
car1='r';
printf("intero: %d\nrazionale: %f\ncarattere: %c\n",
num1, num2, car1);
} intero: 1
razionale: 0.2
carattere: r
47
Ingresso da tastiera
48
Ingresso da tastiera
FUNZIONAMENTO
scanf(stringa controllo, lista di variabili);
• Ad ogni pressione di un tasto, la funzione visualizza su video
il carattere alfanumerico premuto
• La sequenza di tasti premuti deve terminare con la pressione
del tasto Invio
• La funzione assegna alle variabili il valore binario del
carattere letto
49
Esempio
#include <stdio.h>
void main() {
int num1;
float num2;
char car1;
scanf("%d %f %c", &num1, &num2, &car1);
printf("intero: %d\nrazionale: %f\ncarattere: %c\n",
num1, num2, car1);
} 1 0.2 r
intero: 1
razionale: 0.2
carattere: r
50
Sequenza – un esempio introduttivo
Fine
51
Compatibilità tra i tipi
52
Compatibilità tra i tipi
• Operazioni di assegnamento
▪ Il valore alla destra dell’operatore verrà convertito nel tipo della
variabile alla sinistra
▪ La conversione del tipo è indolore se il tipo di dato a destra è inferiore
al tipo della variabile a sinistra dell’operatore, secondo la seguente
gerarchia:
char < int < float
▪ Altrimenti non è esclusa perdita di informazione
• Operazioni aritmetiche
▪ Il valore di tipo inferiore viene convertito nel tipo superiore
53
Compatibilità tra i tipi – Esempio
f = 4.3; /*OK!*/
i = 4.3; /*assegnamento incongruente con
perdita di informazione*/
54
Compatibilità tra i tipi
#define D 5.0
void main(){
float a;
float b, c=0;
int e;
b = –11;
a = D; /* OK */
D = a; /* NO */
a = 4 / 5; /* Che cosa succede? Perché? */
b = 4 / 5.0; /* Che cosa succede? Perché? */
b = 4 / 5 / 6.0; /* Che cosa succede? Perché? */
b = 3 / (float)5 / 6; /* Che cosa succede? Perché?*/
e = (float)4 / 5; /* Che cosa succede? Perché? */
...
56
Esempi di assegnamenti, cast ed espressioni
void main(){
char a;
char b, c = 'Q';
a = '\n'; /* OK: i caratteri di escape sono
caratteri a tutti gli effetti */
c = 'ps'; /* NO: 'ps' non è una costante valida*/
a = '7'; /* Che cosa succede? */
a = b; /* Che cosa succede? */
b = 7; /* Che cosa succede? */
a = 'g';
a = a+1; /* La var a contiene ‘h’ */
a = 'a'+1; /* La var a contiene ‘b’ */
a = 'g';
a = a – 'a' + 'A'; /* La var a contiene ‘G’ */
...
57
Una considerazione sul tipo char
58
Errori
▪ Errori semantici:
• L’algoritmo non risolve il problema per cui è stato implementato
• Il compilatore NON può accorgersi di tali errori
59
Errori sintattici
void main()
{
int integer1, integer2, sum;
61