1
Struttura di un programma in linguaggio C
Un programma in linguaggio C è tipicamente strutturato nel seguente modo:
[<direttive di inclusione>]
main ( ) {
<sezione dichiarativa>
<corpo del programma>
}
I commenti in C
• preceduti da
//
(se il commento è scritto su una sola riga)• oppure racchiusi tra
/* */
(se il commento è scritto su più righe)// questo è un commento (su una sola linea) [<direttive di inclusione>]
main ( ) {
/* questo è un commento disposto su più linee */
<sezione dichiarativa>
/* altro commento */
... Ovviamente i commenti non sono presi in considerazione dal traduttore ...
Esempio:
3
Linguaggio C
Tipi definiti dal linguaggio
… per ora solo i tipi atomici
INTERO int
costituito da numeri interi compresi tra -2(N-1)a 2(N-1)- 1 dove N è il numero di bit usato per rappresentare un numero intero (valori tipici sono 16 e 32).
Oltre a int si hanno i tipi interi short int e long int per rappresentare numeri interi con un numero di bit minore o maggiore di N (tipicamente short int usati 16 bit mentre per long int 32 bit, 16 o 32 bit per int)
Principali operatori (interni) del tipo
somma +
sottrazione -
moltiplicazione *
divisione (intera) / (il risultato è un numero intero - con troncamento) resto della divisione %
Linguaggio C
2
31- 1 -2
314 int
long int short int
Tipo
4 2
Dimensione
(byte)
+32767 -32768
-2
31Valore minimo
2
31- 1 Valore massimo
… riepilogando ...
5
Possibile aggiungere il qualificatore unsigned alla definizione di tipo, che consente alla variabile di contenere solamente numeri positivi
+232 - 1 0
4 unsigned int
unsigned long int unsigned short int
Tipo
4 2
Dimensione (byte)
65535 0
0 Valore minimo
+232 - 1 Valore massimo
Linguaggio C
REALE float
costituito dall sottinsieme dei numeri reali rappresentabile dall’elaboratore.
Si hanno anche i tipi double e long double per rappresentazioni in doppia precisione e maggiori.
Principali operatori (interni) del tipo
somma +
sottrazione -
moltiplicazione * divisione (intera) /
Linguaggio C
float
precisione singola Tipo
4
Dimensione (byte)
+3.2⋅⋅10±±38 -3.2⋅⋅10±±38
Valore minimo
Valore massimo
7
Esistono due notazioni per scrivere numeri reali
• parte intera punto parte decimale 4.34
• notazione esponenziale (parte intera + e o E esponente con segno)
-3E3 rappresenta -3 ⋅⋅ 10
3cioè –3000 5e-2 rappresenta 5 ⋅⋅ 10
-2cioè 0.05
Linguaggio C
CARATTERE char
costituito dall’insieme dei caratteri di stampa.
In realtà, in C è assunto come tipo carattere il sottinsieme dei numeri interi compresi tra 0 e 255, ovvero dai valori numerici del codice ASCII con cui sono codificati i caratteri.
• i valori di tipo charsono racchiusi tra apici, es.:
'A' 'b' ';' '&'
• caratteri non stampabili vengono indicati con la sequenza (sequenza di escape):
\ <carattere convenzionale>
Es.:
'\n' indica il ritorno a nuova linea (a capo) '\t' tabulazione
'\’’ ' doppio apice
Linguaggio C
9
Operazioni su char
Ad ogni carattere corrisponde una rappresentazione numerica univoca I caratteri sono totalmente ordinati
Possibili operazioni:
restituire il carattere che segue/precede;
operazioni di uguaglianza/disuguaglianza;
chiedersi se un carattere è maggiore/minore di un altro
…
Linguaggio C
LOGICO non esiste in C
E’ assunto in sua vece il tipo intero, assumendo il valore 0 per falso e il valore 1(o più in generale un valore diverso da 0) per vero.
Quindi se una operazione di relazione non è verificata da come risultato il valore 0; se la relazione è verificata il risultato è 1 (o un valore diverso da 0).
Gli operatori logici sono:
NOT !
OR ||
AND &&
Linguaggio C
11
Nomi degli identificatori (variabili)
devono iniziare con un carattere alfabetico (una lettera, il carattere _ è considerato una lettera) seguito da altre lettere o cifre; non possono contenere il carattere <spazio> né altri caratteri.
E’ fatta distinzione tra maiuscolo e minuscolo, per cui il nome ris è diverso da Ris o RIS (ovvero ris, Ris e RIS sono tre variabili diverse).
I nomi non possono essere uguali a parele chiavi del linguaggio
Deve essere indicato il tipo di ogni variabile prima di un utilizzo della stessa
<nome tipo> <lista variabili>;
Es.
float area_quadrato, lato_quadrato;
int nro_studenti, ore_lezioni;
char sigla;
double radice_equazione;
Quando viene dichiarata, una variabile può essere inizializzata con un valore Es. int nro_studenti, ore_lezioni = 20;
Linguaggio C
Operatori
Aritmetici
somma +
sottrazione -
moltiplicazione * divisione (intera) / resto della divisione %
Relazionali
uguaglianza ==
diverso !=
maggiore >
minore <
maggiore o uguale >=
minore o uguale <=
Alcune funzioni
Aritmetiche
valore assoluto - tipo intero - abs(int n) quoto e resto divisione intera div(int m, int n) Trigonometriche
seno sin(x) coseno cos(x) tangente tan(x)
Esponenziali e logaritmiche e elevato alla x exp(x) log. in base e di x log(x) log. Base 10 di x log10(x) Altre
elevazione a potenza pow(x, y) radice quadrata sqrt(x)
Linguaggio C
13
Operazioni di calcolo e assegnazione
<identificatore> = <espressione>;
<espressione> può essere semplice come una singola costante o può essere una combinazione di variabili, operatori, …
Semantica:
calcola il valore di un’espressione (lato destro, rispetto a segno =) ed assegnalo ad una variabile (lato sinistro)
L’eventuale valore memorizzato precedentemente nella variabile viene sostituito dal nuovo valore
Es.
A = 26;
perimetro_quadrato = lato_quadrato * 4;
Linguaggio C
Altri operatori di assegnazione Forme di assegnazione del tipo
<identificatore> = <identificatore> <op> <espressione>;
Es. x = x - 5 * k;
a = a + p * (r + j);
possono essere scritte nella forma
<identificatore> <op> = <espressione>;
Es. x - = 5 * k;
a + = p * (r + j);
Linguaggio C
15
Operatori di incremento e decremento
operatore di incremento ++ incrementa di 1 la variabile a è cui applicato operatore di decremento -- decrementa di 1 la variabile a cui è applicato Es.
a++ ; è equivalente alla istruzione a = a + 1;
a-- ; è equivalente alla istruzione a = a - 1;
Forma prefissa e postfissa
prefissa ++a la variabile è incrementata prima di essere utilizzata --a la variabile è decrementata prima di essere utilizzata postfissa a++ la variabile è incrementata dopo essere utilizzata
a-- la variabile è decrementata dopo essere utilizzata
Linguaggio C
Es.
y=a++ equivale alle istruzioni y=a; seguita da a=a+1;
se a=3 dopo l’esecuzione di y=a++ si ha: y=3 a=4 y=++a equivale alle istruzioni a=a+1; seguita da y=a
se a=3 dopo l’esecuzione di y=++a si ha: a=4 y=4 Es.
Posto a=4 ed i=6
k = a++ * i; equivale a: k = a * i; a = a + 1; ovvero k= 24; a = 5;
k = ++a * i; equivale a: a = a + 1; k = a * i; ovvero a = 5; k = 30;
Linguaggio C
17
Operazioni di ingresso e uscita
Un programma C comunica con l’esterno tramite uno o più flussi (stream).
Esistono:
• un flusso standard di ingresso, per le operazioni di ingresso ed associato alla tastiera,
• un flusso standard di uscita, per le operazioni di uscita ed associato al monitor.
Ai flussi sono associate delle funzioni predefinite che si trovano in una specifica libreria di ingresso/uscita chiamata <stdio.h>
Linguaggio C
Operazioni di ingresso:
scanf (<formato>, <argomenti>);
<formato> : stringa indicante il formato in cui saranno inseriti i valori
< argomenti>: nomi di variabili, preceduti dal carattere &,cui saranno assegnati i valori inseriti
Alcuni formati:
%d : interi decimale %f : float %c : carattere
%o : interi ottale %e : float esponenziale %s : stringa
Es:
scanf("%d", &x)
legge il valore di x con formato interoLinguaggio C
19
Operazioni di uscita
printf (<formato>, <argomenti>);
<formato> : stringa che deve essere visualizzata, comprensiva dei riferimenti ai tipi di dati contenuti nelle variabili
<argomenti>:variabili contenenti i dati da visualizzare Alcuni formati:
%d : interi decimale %f : float %c : carattere
%o : interi ottale %e : float esponenziale %s : stringa Alcuni caratteri per il controllo della stampa
\n indica il ritorno a nuova linea (a capo)
\t tabulazione
\’’ doppio apice Es:
printf (“%d”, x); visualizza il valore di x con formato intero
printf (“%d%d%f”, x, y, z); visualizza i valori di x e y con formato intero, quello di z con formato reale
Linguaggio C
…. Osservazioni ….
Operazioni di uscita Esempio:
…. si vuole visualizzare il messaggio:
Imponibile = XXXX Al IVA = YYY Importo IVA = ZZZZ
dove XXXX , YYY , ZZZZ sono valori delle 3 variabili IMP, ALIVA, IMPIVA
… l’istruzione avrà il seguente formato:
printf ("Imponibile = %f Al IVA = %d Importo IVA = %f \n”, IMP, ALIVA, IMPIVA);
Ad ogni simbolo di formato sarà sostituito il valore della corrispondente variabile (la corrispondenza è in base all’ordine)
21
C - Strutture di controllo
Sequenza o blocco
{
<istruzioni>
}
{
printf(”Immetti un numero intero: ");
scanf("%d", &i);
a = i * 4 + b - c;
printf("%d", a);
} Esempio:
Un semplice programma esempio
#include<stdio.h>
main ( )
/* questo programma calcola l’area di un rettangolo */
{
float base, altezza, area;
printf (“immetti base \n”);
scanf (“%f” , &base);
printf(“immetti altezza \n “);
scanf(“%f” , &altezza);
area = base * altezza;
Direttiva di inclusione per la libreria stdio, input/output standard
23
C - Strutture di controllo
Selezione
if (<condizione>) <istruzione>;
se <condizione> è vera è eseguita <istruzione> (è 1 sola istruzione)
altra forma:
if (<condizione>) {
<istruzioni>;
}
se <condizione> è vera sono eseguite le <istruzioni>
N.B. < condizione> è un’espressione di tipo intero (in C non esiste il tipo logico) ed essa è vera se ha un valore diverso da zero
………
if (i<100) {
a = b - i;
printf(”%f”, a);
} ………
C - Strutture di controllo
Esempio :
Selezione
25
C - Strutture di controllo
Selezione
if (<condizione>) <istruzione1>;
else <istruzione2>;
se <condizione> è vera è eseguita <istruzione1> (è 1 sola istruzione) altrimenti, se <condizione> è falsa, è eseguita <istruzione2>
if (<condizione>) {
<istruzioni1>;
} else
{
<istruzioni2>;
}
se <condizione> è vera sono eseguite le <istruzioni1> altrimenti se,
<condizione> è falsa, sono eseguite le <istruzioni2>
C - Strutture di controllo
Esempio : Selezione
………
if (numero > 1000) {
a = b * numero;
printf(”%f”, a);
} else
c = b - numero;
………
27
#include<stdio.h>
main ( )
/* questo programma calcola l’area di un rettangolo */
{
float base, altezza, area;
printf (“immetti base \n”);
scanf (“%f” , &base);
printf(“immetti altezza \n“);
scanf(“%f” , &altezza);
if ((base > 0) && (altezza > 0)) {
area = base * altezza;
printf(“Area= %f \n”, area);
} else
printf(“Errore: base o altezza = <0 \n”);
}
Un semplice programma esempio
switch (<espressione>) {
case c1:
S1;
break;
case c2:
S2;
break;
…
case cN:
Sn;
break;
default: Sdefault; break;
}
Selezione
semantica
Valuta <espressione>
se ha valore c1 esegui S1; esci dalla struttura switch (break);
se ha valore c2 esegui S2; esci dalla struttura switch (break);
…
se ha valore cN esegui Sn; esci dalla struttura switch (break);
altrimenti (se il valore di espressione è diverso da c1 ,..., cN ) esegui Sdefault; esci dalla struttura switch (break);
…. (è opzionale)
N.B. :break provoca l’uscita immediata dalla struttura switch Selezione a più vie:
29
#include<stdio.h>
main ( )
/* questo programma stampa da 1 a 3 stelle o un ! */
{
scanf("%d", &num);
switch (num) {
case 1: printf("*\n"); break;
case 2: printf("**\n"); break;
case 3: printf("***\n"); break;
default: printf("!\n"); break;
} }
Selezione: switch
Esempio: stampa da 1 a 3 stelle in base al numero (compreso tra 1 e 3) immesso , altrimenti un !
C - Strutture di controllo
while (<condizione>)
<istruzione>;
while (<condizione>) {
<istruzioni>;
}
do
<istruzione>;
while <condizione>;
do {
<istruzioni>;
}
while <condizione>;
Cicli iterativi
<Istruzione/i> sarà eseguito tante volte fintantoché <condizione> risulta
vera
31
#include <stdio.h>
main () {
int Num;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
while (Num<=100) Num=Num+10;
printf ( ”Numero= %d \n”, Num);
}
Esempio Ciclo while
#include <stdio.h>
main () {
int Num;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
do
Num=Num+10;
while (Num <=100);
printf ( ”Numero= %d \n”, Num);
}
Esempio Ciclo do … while
33
C - Strutture di controllo
Ciclo ripetitivo (a conteggio)
for (<espressione1>; <condizione>; <espressione2>)
<istruzione>;
for (<espressione1>; <condizione>; <espressione2>) {
<istruzioni>;
}
<espressione1>: è l’espressione usata per inizializzare la variabile di controllo del ciclo
<condizione>: è l’espressione logica per verificare la terminazione del ciclo
<espressione2>: è l’espressione usata per determinare il passo di incremento della variabile di controllo
Es:
for (i=1; i<100; i++) printf(“%d “, i);
#include <stdio.h>
main () {
int Num;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
for (i=1;i<=10;i++)
printf ( “%d \n”, Num*i);
}
Esempio Ciclo for
35
Operazioni di ingresso:
scanf (<formato>, <argomenti>);
<formato> : stringa indicante il formato in cui saranno inseriti i valori
< argomenti>: nomi di variabili, preceduti dal carattere &,cui saranno assegnati i valori inseriti
supponiamo di avere il seguente codice:
scanf("%c", &B);
…………
do
{printf ("immetti un carattere della sequenza \n");
scanf("%c", &C);
………
}
while (C!='0');
… possiamo avere qualche problema ….
…. Osservazioni ….
… In esecuzione …
immetti un carattere della sequenza immetti un carattere della sequenza
…. il problema è dovuto al trattamento del <return> ….
…. modo per risolverlo ….
scanf("%c", &B);
…………
do
{printf ("immetti un carattere della sequenza \n");
scanf(”\n%c", &C);
………
}
while (C!='0');
…. Osservazioni ….
37
#include <stdio.h>
main () {
// trova e conta carattere dato in input in sequenza caratteri int Volte;
char C, Cerca;
do
{ printf("immetti il carettere da cercare \n");
scanf("%c", &Cerca);
}
while (Cerca=='0');
Volte=0;
do
{ printf ( "immetti un carattere della sequenza \n");
scanf("\n%c", &C);
if (C==Cerca) Volte=Volte+1;
}
while (C!='0');
printf ("Carattere %c presente %d volte \n", Cerca, Volte);
}