Il 0% ha trovato utile questo documento (0 voti)
12 visualizzazioni61 pagine

Intro Linguaggioc

Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
12 visualizzazioni61 pagine

Intro Linguaggioc

Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 61

INTRODUZIONE AL LINGUAGGIO C

1
Introduzione

• Linguaggio di programmazione ad alto livello


• Sviluppato negli anni 70 (C – standard ANSI)
• Molto diffuso e adatto ad un ampio spettro di applicazioni:
▪ Scientifiche
▪ Gestionali
▪ Industriali, es. acquisizione dei dati, controllo dei processi
▪ Informatiche, es. SW di base (SO Unix), strumenti (CAD), pacchetti
applicativi
▪ Sistemi dedicati, es. microcontrollori, computer di bordo, domotica

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

• Un programma scritto in C è un file di testo strutturato in


modo opportuno
• Il programma scritto in modo corretto può essere compilato,
cioè tradotto in linguaggio macchina
▪ Le fasi di compilazione ed esecuzione saranno approfondite durante
le ore di laboratorio
• Imparare a programmare in C significa impararne la sintassi e
la semantica per fare in modo che esso:
▪ Sia compilabile (verifica sintattica)
▪ Si comporti come atteso (verifica semantica)

4
Hello world!

• Un esempio molto semplice di programma:

#include <stdio.h>

void main() {

printf("Hello World!");

5
Hello world!

• Un esempio molto semplice di programma:


Il codice inizia qui

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!

• Un esempio molto semplice di programma:

Specifica l’inclusione della libreria


stdio che permette di utilizzare le
Parte
dichiarativa #include <stdio.h> funzioni di input/output
globale main indica l’inizio del
Parte void main() { programma vero e proprio
dichiarativa
locale
printf("Hello World!");
Parte
esecutiva Il programma contiene una sola
} istruzione che deve terminare con ;
L’istruzione specificata stampa a
video il messaggio specificato tra gli
apici: «Hello world»

7
Hello world!

• Un esempio molto semplice di programma:


/* Il mio primo programma */

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?

• Dobbiamo trovare un elaboratore in grado di eseguirlo


• Problema: il calcolatore è in grado di elaborare istruzioni in
linguaggio macchina
• Dobbiamo quindi trovare anche un modo per trasformare il C
(linguaggio di alto livello) in linguaggio macchina (linguaggio
di basso livello)

9
Perché linguaggio macchina?

• Un elaboratore è un insieme di circuiti


• Si basa su logica binaria
• Il linguaggio C è vicino al modo di pensare umano
▪ È infatti un linguaggio di alto livello
• Il linguaggio macchina è vicino al modo di lavorare di un
elaboratore
▪ È infatti un linguaggio di basso livello

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!

• Un esempio molto semplice di programma:


/* Il mio primo programma */
#include <stdio.h>

void main() {
printf("Hello World!");
}

• L’esecuzione del programma porta al seguente output sul


terminale:
Hello World!

12
Una nota

• Potreste imbattervi anche in programmi che hanno un main


leggermente diverso

#include <stdio.h>
Parola chiave
int al posto di int main() {
void
printf("Hello World!");
Istruzione return 0;
return alla
fine del main }

• Questo main è equivalente a quello che abbiamo visto in


precedenza

13
La macchina astratta del C

• Quando si scrive un programma in C si immagina di avere una


macchina un po’ più astratta rispetto al calcolatore reale

BUS

CPU MEM.
Standard Input Standard Output
a
B La tastiera Il terminale
pluto
somma_1 video
...

14
La macchina astratta del C – Memoria

• Divisa in celle elementari


• Ogni cella può contenere un dato
• I dati possono essere
▪ Numeri MEM.
▪ Caratteri
3 a
▪ Stringhe (sequenze di caratteri in celle 4 B
adiacenti) ‘a’ pluto
7 somma_1
▪ … ... ...

• 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

• La macchina astratta del C ha due periferiche “standard” di


ingresso e uscita
▪ stdin : standard input che acquisisce i dati da tastiera
▪ stdout : standard output che visualizza i messaggi nel terminale video
che possono essere viste come “sequenze” (flussi) di byte,
normalmente interpretati come caratteri

16
La macchina astratta del C – CPU

• L’unità centrale di elaborazione (CPU) è in grado di eseguire


una alla volta in sequenza le istruzioni specificate nel
programma
• Ciascuna istruzione può contenere:
▪ Espressioni aritmetico/logica/relazionali aventi come operandi variabili
contenute nella memoria centrale e salvando ciascun risultato in una
variabile in memoria
▪ Letture dallo standard input che salvano i dati acquisiti in variabili
contenute in memoria
▪ Scritture sullo standard output di messaggi contenenti anche i dati
salvati nelle variabili in memoria
▪ Istruzioni di controllo che modificano il flusso sequenziale di
esecuzione

17
Organizzazione di un programma

• Nella parte dichiarativa globale vengono specificati


(nell’ordine)
▪ Le direttive include con cui si specifica quali librerie vengono usate
▪ Le direttive define per definire costanti da utilizzare nel programma
▪ La definizione di nuovi tipi di dato (vedremo più avanti)
▪ La dichiarazione di variabili globali (non le useremo in questo corso)

• Nella parte dichiarativa locale vengono dichiarate le variabili

• Nella parte esecutiva vengono specificate le istruzioni che


implementano l’algoritmo

18
Organizzazione di un programma – esempio

Parte #include <stdio.h>


dichiarativa
globale #define PI 3.14

Parte void main(){


dichiarativa float r, a;
locale
scanf("%f", &r);
Parte
a = r * r * PI;
esecutiva
printf("%f", a);
}

(il programma chiede all’utente la lunghezza del raggio di un


cerchio, ne calcola l’area e visualizza il risultato)
19
Direttiva include

Parte #include <stdio.h> Direttive include


dichiarativa
globale #define PI 3.14

Parte void main(){


dichiarativa float r, a;
locale
scanf("%f", &r);
Parte
a = r * r * PI;
esecutiva
printf("%f", a);
}

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

Parte #include <stdio.h>


dichiarativa
globale #define PI 3.14

Parte void main(){ main


dichiarativa float r, a;
locale
scanf("%f", &r);
Parte
a = r * r * PI;
esecutiva
printf("%f", a);
}

22
main

• È una parola chiave e indica l’inizio del programma vero e


proprio
• Le istruzioni che seguono saranno quelle effettivamente
eseguite dal calcolatore
• Le istruzioni che compongono il programma principale (cioè
il main) sono racchiuse all’interno di parentesi graffe { }

23
Dichiarazione di variabili

Parte #include <stdio.h>


dichiarativa
globale #define PI 3.14

Parte void main(){


dichiarativa float r, a; Dichiarazioni variabili
locale
scanf("%f", &r);
Parte
a = r * r * PI;
esecutiva
printf("%f", a);
}

24
Dichiarazione di variabili

• Sintassi C per la dichiarazione di variabili


tipo_variabile nome_var;
• Possiamo anche dichiarare più variabili dello stesso tipo
separandole con una virgola
tipo_variabile nome_var1, nome_var2;

• Esempi:
▪ int raggio, circonferenza;
▪ char carattere;

• Le variabili devono essere dichiarate prima di qualsiasi istruzione


eseguibile
• Il nome di una variabile deve essere univoco (cioè non deve essere
già stato utilizzato) e non deve essere una parola riservata
25
Dichiarazione di variabili

• La dichiarazione di variabile indica che e come una variabile


verrà utilizzata dal programma
▪ Definisce l’identificatore simbolico (nome) univoco
▪ Definisce il tipo, adatto ai valori da rappresentare (intero, carattere, …)
▪ Riserva (alloca) una locazione di memoria di dimensione adeguata a
contenere il tipo
▪ Associa in modo univoco l’indirizzo di memoria al nome
▪ Consente di rilevare, durante la compilazione, errori sull’uso improprio
della variabile nel programma

26
Perché dichiarare una variabile?

• Una variabile rappresenta uno spazio di memoria centrale


• Prima dell’esecuzione del programma deve essere chiaro
quanto spazio serve al programma
▪ Quindi devono essere note tutte le variabili che un programma
intende utilizzare
• Tutti gli accessi alla variabile indicano un accesso alla
memoria
▪ Quindi deve essere chiaro quale spazio di memoria è associato alla
variabile

• Durante l’esecuzione del programma le variabili hanno sempre


un valore ben definito
▪ Può essere significativo o non significativo, ma c’è

27
Tipi di dato

• Un tipo identifica la classe dei valori ammissibili, le operazioni


lecite, e la modalità con cui agiscono le operazioni
• Esistono due macro-classi di tipi:
▪ Tipi built-in (predefiniti)
▪ Tipi definiti dall’utente (prossime lezioni…)
• Sia quelli built-in che quelli definiti dall’utente possono
essere:
▪ Semplici
▪ Composti (prossime lezioni…)

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

Parte #include <stdio.h>


dichiarativa
globale #define PI 3.14 Dichiarazioni costanti

Parte void main(){


dichiarativa float r, a;
locale
scanf("%f", &r);
Parte
a = r * r * PI;
esecutiva
printf("%f", a);
}

33
Costanti

• Esistono due tipi di costanti


▪ Esplicite: esprimono direttamente dei valori
• 24 costante di tipo int
• 3.145 costante di tipo double
• 'A' costante di tipo char
▪ Simboliche
• Sono nomi simbolici che il programmatore adotta per indicare dei
valori prefissati (maggiore leggibilità)
• Hanno un tipo espresso implicitamente nel valore
• Devono essere precedentemente dichiarate

34
Dichiarazione di costanti

• Dichiarare una costante significa associare un simbolo ad un


valore
• A differenza delle variabili tale valore non cambierà mai
durante tutto il programma
• Per dichiarare una costante utilizziamo la direttiva #define

35
Direttiva #define

• La direttiva associa un nome ad un valore di qualunque tipo


• Ogni direttiva (specificata nella parte delle dichiarazioni)
definisce una costante
• Esempi
▪ #define NMMAZ 10
▪ #define VMAX 150.0
▪ #define FALSE 0
▪ #define TRUE 1
• In questo caso l’andare a capo indica la fine dell’istruzione
• Il nome della costante viene anche detta macro

36
Il compilatore e le macro

• In fase di compilazione ogni riferimento a macro viene


sostituito con il valore corrispondente
• Alla fine di questa sostituzione la costante è come se non
fosse stata dichiarata
• Per questo motivo il compilatore non riserva alcuna zona di
memoria ad una macro
#define PI 3.14
void main() {
void main() { float area;
float area; float raggio;
float raggio;
...
...
area = raggio * raggio
area = raggio * raggio
* 3.14;
* PI;
} }

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

• Si disegni il diagramma di flusso di un algoritmo che chiede


all’utente un lunghezza del raggio di un cerchio, calcola l’area
del cerchio e visualizza il risultato

Inizio

Leggi(r)
Sequenza
a = r*r*3.14

Scrivi(a)

Fine

39
Istruzioni semplici e composte

• Sequenze di istruzioni semplici


▪ Ogni istruzione semplice è un’espressione che termina con ;
▪ ; è detto il “terminatore” dell’istruzione
• Si possono raggruppare più istruzioni in sequenza tra { e } a
costituire un blocco
▪ Il blocco costituisce una “super-istruzione”
• Non è necessario il ; dopo }, in quanto il blocco è già una
istruzione

• Useremo i blocchi nelle istruzioni condizionali e di ciclo

40
Operatori

Nelle istruzioni è possibile utilizzare i seguenti operatori:


• Aritmetici
▪ + (somma)
▪ - (sottrazione) NOTA: Tra valori di tipo int e
▪ * (prodotto) char viene effettuata la
divisione intera. L’operatore %
▪ / (divisione)
calcola il resto della divisione
▪ % (resto) intera tra valori interi.
• Assegnamento
▪ = char, int, float
e double sono
• Esistono anche operatori di anche detti tipi
confronto e logici (prossime lezioni) aritmetici

41
Assegnamento

• È un operatore e si indica con il simbolo = (uguale)


• A sinistra dell’operatore deve sempre esserci una variabile
• A destra può esserci
▪ una costante
▪ una variabile
▪ un’espressione
• Esempi di istruzioni di assegnamento:
x = 23; w = 'a'; w = a; alfa = x + y;

• Attenzione! le variabili devono essere inizializzate


▪ Bisogna sempre assegnare un valore ad una variabile prima di
leggerne il contenuto in un’altra istruzione

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.

+ , – Addizione, Valutate per terze. Se ce ne sono diverse, si valutano


Sottrazione da sinistra a destra.
= Assegnamento Valutate per ultime. Se ce ne sono diverse, si valutano
da destra a sinistra.

43
Funzioni di Ingresso e Uscita

• In C, l’ingresso e l’uscita avviene tramite chiamate a due


“istruzioni” particolari (in realtà sono due sottoprogrammi)
disponibili nella libreria stdio.h
▪ printf()
▪ scanf()
• Per poterle utilizzare è necessario aggiungere la direttiva
#include <stdio.h>

44
Stampa su video

printf(stringa di controllo, elementi da stampare);


• printf() è l’identificatore riservato alla funzione
• stringa di controllo (racchiusa tra doppi apici ""), contiene:
▪ caratteri alfanumerici da stampare a video
▪ caratteri di conversione e/o di formato (preceduti dal simbolo %): utilizzati
per interpretare i valori degli elementi da stampare
• %d numero intero
• %f numero in virgola mobile
• %c carattere
▪ caratteri di controllo della stampa: caratteri ASCII a cui non corrisponde
alcun simbolo stampabile, hanno effetti di formato di stampa, come linea
nuova (\n), tabulazione (\t), ecc.

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

scanf(stringa di controllo, lista di variabili);


• scanf() è l’identificatore riservato alla funzione
• stringa di controllo (racchiusa tra doppi apici ""), contiene:
▪ caratteri di conversione e/o di formato (preceduti dal simbolo %):
utilizzati per interpretare i valori degli elementi letti da tastiera, che
devono essere memorizzati nelle variabili
• %d numero intero
• %f numero in virgola mobile
• %c carattere
▪ variabili a cui associare il valore letto: lista di identificatori di variabili. Le
variabili devono essere precedute dal simbolo &. La lista è ordinata
rispetto ai caratteri di conversione

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

• Si disegni il diagramma di flusso di un algoritmo che chiede


all’utente un lunghezza del raggio di un cerchio, calcola l’area
del cerchio e visualizza il risultato
#include <stdio.h>
Inizio #define PI 3.14
void main(){
Leggi(r) float r, a;
scanf("%f", &r);
a = r*r*3.14 a = r * r * PI;
printf("%f", a);
Scrivi(a) }

Fine

51
Compatibilità tra i tipi

• Attenzione! I tipi di dato delle variabili coinvolte in


un’operazione devono essere identici (o almeno compatibili)

• Il compilatore controlla la compatibilità tra i tipi


• In alcune situazioni risolve la non compatibilità tramite delle
regole di conversione automatica tra i tipi (cast)

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

• La conversione di un valore a float in un valore int


comporta la perdita della parte frazionaria
int i;
float f;

f = 4.3; /*OK!*/
i = 4.3; /*assegnamento incongruente con
perdita di informazione*/

f = 10; /*assegnamento incongruente senza


perdita di informazione*/
i = 10; /*OK!*/

54
Compatibilità tra i tipi

• Si può anche forzare la conversione di un valore da un tipo


all’altro mediante l’operatore di cast ()
▪ Si specifica tra parentesi tonde il tipo a cui convertire davanti al nome
della variabile/costante
int a, b;
float f1, f2; La divisione viene effettuata tra
a = 5; numeri interi e poi il risultato è
automaticamente convertito
b = 2;
durante l’assegnamento
f1 = a / b;
f2 = (float) a / b;
Il valore di a viene convertito
CAST a float prima della divisione; quindi
la divisione sarà tra due valori float
• f1 contiene 2.0
• F2 contiene 2.5
• L’operazione di cast ha priorità maggiore rispetto a qualsiasi altra
55
Esempi di assegnamenti, cast ed espressioni

#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

• Il tipo char è rappresentato attraverso una codifica


numerica intera (interi a 1 byte)
• Attenzione! c = 1 è diverso da c = '1'
▪ Nel primo caso a c è assegnato il valore 1
▪ Nel secondo caso a c è assegnata la codifica del carattere 1 e
quindi 49
• Supponendo che c=='1' con c di tipo char
▪ printf("%c", c); stampa il carattere 1
▪ printf("%d", c); è valido e stampa il numero 49
• Supponendo che i==90 con i di tipo int
▪ printf("%c", i); è valido e stampa il carattere 'Z'
▪ printf("%d", i); stampa il numero 90

58
Errori

• Quando scriviamo un programma possiamo commettere


degli errori
▪ Errori sintattici
• Una o più istruzioni del programma non seguono le regole
sintattiche del C
• Il compilatore si accorge di tali errori, li segnala e non genera
l’eseguibile

▪ Errori semantici:
• L’algoritmo non risolve il problema per cui è stato implementato
• Il compilatore NON può accorgersi di tali errori

59
Errori sintattici

/* somma di due interi */


#include <stdio.h>
«missing terminating " character».
Cioè mancano i doppi apici
void main()
{
int integer1, integer2, sum; «expected ‘;’ before ‘scanf’».
Cioè manca il ;
printf("Enter first integer\n);
scanf("%d", &integer1 );
printf("Enter second integer\n") «expected ‘)’ before ‘;’ token».
scanf("%d", &integer2); Cioè manca la parentesi
sum = integer1 + integer2;
printf("Sum is %d\n\n", sum;
}
ATTENZIONE: gli errori vanno corretti in ordine. Gli errori segnalati potrebbero celare al
compilatore altri errori sintattici presenti nel programma; quindi bisogna ricompilare
dopo aver corretto un po’ di errori segnalati per verificare che non ne appaiano altri
60
Errori semantici

/* somma di due interi */


#include <stdio.h>

void main()
{
int integer1, integer2, sum;

printf("Enter first integer\n");


scanf("%d", &integer1 );
printf("Enter second integer\n");
scanf("%d", &integer2); Ho scritto * al posto di +
sum = integer1 * integer2;
printf("Sum is %d\n\n", sum);
}

61

Potrebbero piacerti anche