1 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Il linguaggio C
- Sviluppato da Ritchie sulla base di due linguaggi di programmazione esistenti: BCPL e B
- Nel 1990 è stato standardizzato da ANSI (American National Standards Institute). Chiamato C89.
- Nel 1999 è stato aggiornato con l'introduzione di alcune caratteristiche innovative. Chiamato C99.
- Usato per sviluppare ed implementare il sistema operativo UNIX
- Il code del linguaggio è indipendente dalla piattaforma hardware (portabilità) - Esistenza di alcuni ‘dialetti’
Alcune parole chiavi del linguaggio C
3 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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 di N 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
231 – 1
(2.147.483.647)
-231
(2.147.483.648)
4 int
long int short int
Tipo Tipo
4 2
Dimensione Dimensione
(byte) (byte)
215 - 1 +32767 -215
-32768
-231
Valore Valore minimo minimo
231 - 1 Valore Valore massimo massimo
… riepilogando ...
5 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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
… costanti con nome SHRT_MIN, SHRT_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, USHRT_MAX, UINT_MAX e ULONG_MAX definite per rappresentare rispettivamente i valori massimi e minini dei tipi short, int, long int, unsigned short, unsigned int e unsigned long int …
… libreria limits.h …
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 /
Tipicamente per il tipo float sono usati 4 byte con una precisione di 6 cifre decimali, per il double 8 byte e 10 cifre decimali
Linguaggio C
±1.710+308
±2.210-308 8
double
precisione doppia float
precisione singola Tipo (IEEE 754)
4
Dimensione (byte)
±3.410+38
± 1.17.210-8 Valore minimo
Valore massimo
7 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Esistono due notazioni per scrivere/visualizzare numeri reali
<parte intera> < punto> <parte decimale>
4.34
notazione esponenziale
<parte intera> <e> o <E> <esponente con segno>
-3E3 rappresenta -310
3cioè –3000 5e-2 rappresenta 510
-2cioè 0.05
Linguaggio C
… costanti FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX, LDBL_MIN, LDBL_MAX relative rispettivamente ai valori massimi e minini dei tipi float, double e long double.
… libreria float.h …
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 char sono racchiusi tra apici, es.:
'A' 'b' ';' '&'
caratteri non stampabili (caratteri speciali per il controllo di dispositivi) 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 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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 un valore diverso da 0 (in genere il valore 1) per vero.
Quindi, se una operazione di relazione non è verificata da come risultato il valore 0; se la relazione è verificata il risultato è un valore diverso da 0 (non necessariamente 1).
Gli operatori logici sono rappresentati come segue:
NOT ! OR ||
AND &&
Linguaggio C
11 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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).
... C è case sensitive ...
I nomi di identificatori non possono essere uguali alle parole chiavi del linguaggio
Linguaggio C
Dichiarazione dei Nomi degli identificatori (variabili)
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
13 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Operatori Aritmetici
Assegnazione = somma + sottrazione - moltiplicazione * divisione / 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
Tipi Atomici
int - short int - long int - unsigned float - double - long double char
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>
}
15 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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>
// commento su unica linea <corpo del programma>
}
... Ovviamente i commenti non sono presi in considerazione dal compilatore ...
Esempio:
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 operazioni di ingresso/uscita chiamata <stdio.h>
La libreria <stdio.h> va indicata nelle direttive di inclusione
Linguaggio C
17 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Operazioni di uscita
printf(“<formato>”,<argomento1>,..., <argomentoN>);
<formato > : stringa che deve essere visualizzata, comprensiva dei riferimenti ai formati relativi ai tipi delle variabili i cui valori saranno visualizzati
<argomenti> : variabili i cui valori devono essere visualizzati
Alcuni formati:
%d : interi decimale %f : float %c : carattere
%o : interi ottale %e : float esponenziale %s : stringa
Linguaggio C
Operazioni di uscita
Alcuni caratteri per il controllo della stampa
\n indica il ritorno a nuova linea (a capo)
\t tabulazione
\’’ doppio apice
Linguaggio C
Es:
printf (“%d \n”, x); visualizza il valore di x con formato intero e poi va a capo
printf (“%d %d %f”, x, y, z);
visualizza i valori di x e y con formato intero, quello di z con formato reale
la corrispondenza tra formato e argomento è in base alla posizione
printf (“ ERRORE !”); visualizza la stringa ERRORE ! Sul video
19 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
….Esempi….
Operazioni di uscita Esempio:
…. si vuole visualizzare il messaggio:
Imponibile = …. Al IVA = ….. Importo IVA = ……
dove al posto dei …. vanno visualizzati i 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 della posizione)
….Esempi….
Operazioni di uscita Esempio:
Se: IMP = 32.4 ALIVA = 22 IMPIVA = 6.48
printf ("Imponibile = %f Al IVA = %d Importo IVA = %f \n”, IMP, ALIVA, IMPIVA);
…. visualizza il seguente messaggio:
Imponibile = 32.4 Al IVA = 22 Importo IVA = 6.48
21 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Un programma esempio: uso di printf()
#include<stdio.h>
main ( )
/* programma esempio uso printf()
calcola il quadrato e la metà di un numero*/
{ int numero = 7; // dichara la variabile numero e le assegna il valore 7
printf (" Numero = %d", numero);
printf ("\n\n\n");
printf(" Quadrato di %d = %d \n ", numero, numero*numero);
printf (" Un mezzo di %d = %d \n",numero, numero/2);
}
Direttiva di inclusione per la libreria stdio, input/output standard
Un programma esempio: uso di printf()
23 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
#include <stdio.h>
#include <limits.h>
// stampa i valori limite min. e max per i tipi interi di C int main(void)
{printf("Codifica del tipo SHORT \n");
printf("Valore minimo = %d \n",SHRT_MIN);
printf("Valore massimo = %d \n",SHRT_MAX);
printf("\nCodifica del tipo INT \n");
printf("Valore minimo = %d \n",INT_MIN);
printf("Valore massimo = %d \n",INT_MAX);
printf("\nCodifica del tipo LONG INT \n");
printf("Valore minimo = %ld \n", LONG_MIN);
printf("Valore massimo =%ld \n", LONG_MAX);
printf("\nCodifica del tipo UNSIGNED SHORT \n");
printf("Valore minimo = 0 \n");
printf("Valore massimo = %u \n", USHRT_MAX);
printf("\nCodifica del tipo UNSIGNED INT \n");
printf("Valore minimo = 0 \n");
printf("Valore massimo = %u \n", UINT_MAX);
printf("\nCodifica del tipo UNSIGNED LONG INT \n");
printf("Valore minimo = 0 \n");
printf("Valore massimo = %lu \n", ULONG_MAX);
}
Direttive di inclusione per le librerie stdio, e limits.h
Un programma esempio: uso di printf()
Un programma esempio: uso di printf()
25 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Operazioni di ingresso:
scanf(“<formato1> ... <formatoN>”,&<argomento1>,..., &<argomentoN>);
“<formato i>”:stringa indicante il formato in cui sarà inserito il valore dell’ argomento i-esimo
&< argomento1>, ..., &<argomentoN>: 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
Linguaggio C
Esempi:
scanf("%d", &x) legge il valore di x con formato intero scanf(“%f%f”,&base, &altezza)
legge i valori di base ed altezza con formato reale
#include<stdio.h>
main ( )
/* programma esempio scanf(): Legge il valore di un numero e ne calcola il cubo e il triplo*/
{int numero;
printf (" Immettere il valore di un numero intero: ");
scanf("%d", &numero);
printf ("\n\n\n");
printf (" Numero = %d\n", numero);
printf("Cubo di %d = %d \n\n", numero, numero*numero*numero);
printf (" Triplo di %d = %d \n\n",numero, numero*3);
}
Direttiva di inclusione per la libreria stdio, input/output standard
Un programma esempio: uso di scanf()
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 27
Un programma esempio: uso di scanf()
Un programma esempio: uso di scanf()
Overflow !!
Valore max per int:
2.147.483.647 Triplo e cubo di:
1.111.111.111 Superano il valore di INT_MAX
… Attenzione alla scelta de tipi in relazione ai valori che le variabili possono
29 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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
#include<stdio.h>
main ( )
/* questo programma calcola il doppio di un numero letto in input*/
{
int numero, Doppio;
printf(“immetti numero intero\n”);
scanf (“%d” , &numero);
Doppio = numero * 2;
printf (“Numero=%d doppio=%d\n”, numero, Doppio);
}
LDP
IntestazioneC
CommentoCommento
Sezione dichiarativa
Program primo;
// legge in input il valore di una variabile //di tipo intero e ne visualizza il suo // doppio
INT numero, Doppio;
begin
write(‘Immetti numero intero:’);
read (“%d” numero);
Doppio = numero * 2;
write(‘Numero = ‘, “%d”numero,
‘doppio= ‘, “%d”Doppio);
end.
Corpo del programma
31 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
#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;
printf (“Area= %f \n”,area);
}
LDP
IntestazioneC
CommentoCommento
Sezione dichiarativa
Program area_rettangolo;
// calcola l’area di un rettangolo FLOAT base, altezza, area;
begin
write (‘immetti valore della base’);
read (“%f” base);
write (‘immetti valore della altezza ‘);
read (“%f” altezza);
area = base * altezza;
write(‘Area= ‘,“%f”area);
end.
Corpo del programma
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;
printf ("Area= %f \n",area);
}
Direttiva di inclusione per la libreria stdio, input/output standard
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 33
Il programma esempio del calcolo del volume
del parallelepipedo
Program volume_parallelepipedo;
FLOAT LBase, ABase, H, Volume, Area_Base;
begin
write (“immetti valore della lunghezza di base (in dm)”);
read (“%f” LBase);
write (“immetti valore della altezza di base (in dm)”);
read (“%f” ABase);
write (“immetti valore della altezza del parallelepipedo (in dm)”);
read (“%f” H);
Area_Base = LBase* ABase;
Volume=Area_Base*H;
write(“Volume= “,“%f”Volume);
end.
LDP #include<stdio.h>
main ( )
{ // calcola il volume di un parallelepipedo float LBase, ABase, H, Area_Base, Volume;
printf ("immetti valore della lunghezza di base \n");
scanf ("%f" , &LBase);
printf("immetti valore altezza di base \n");
scanf("%f" , &ABase);
printf("immetti valore altezza parallelepipedo\n");
scanf("%f" , &H);
Area_Base = LBase* ABase;
Volume=Area_Base*H;
printf ("Volume= %f \n",Volume);
}
C
Il programma esempio del calcolo della capacità di un tino
cilindrico
Program capacita_tino;
FLOAT Diametro, Volume, Area_Base, Altezza, Capacita;
begin
write (“immetti valore della lunghezza del diametro (in dm)”);
read (“%f” Diametro);
write (“immetti valore della altezza del cilindro (in dm)”);
read (“%f” Altezza);
Area_Base = (Diametro/2)2 * 3,14;
Volume=Area_Base*Altezza;
Capacita = Volume/100;
write(“Capacità tino ettolitri “,“%f”Capacita);
end.
LDP #include<stdio.h>
main ( )
{ // calcola la capacità in hl di un tino
float Diametro, Capacita, Altezza, Area_Base, Volume;
printf ("immetti valore lunghezza del diametro\n");
scanf ("%f" , &Diametro);
printf("immetti valore altezza del cilindro \n");
scanf("%f" , &Altezza);
Area_Base = (Diametro/2)*(Diametro/2)* 3.14;
Volume=Area_Base*Altezza;
Capacita = Volume/100;
printf (" Capacita tino ettolitri = %f \n",Capacita);
}
C
… lo studente, a partire da quello in LDP, scriva in C il programma del calcolo della capacità del tino cilindrico …
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 35
Il programma in C del calcolo della capacità di un tino cilindrico
#include<stdio.h>
main ( )
{ // calcola la capacità in hl di un tino
float Diametro, Capacita, Altezza, Area_Base, Volume;
printf ("immetti valore lunghezza del diametro\n");
scanf ("%f" , &Diametro);
printf("immetti valore altezza del cilindro \n");
scanf("%f" , &Altezza);
Area_Base = (Diametro/2)*(Diametro/2)* 3.14;
Volume=Area_Base*Altezza;
Capacita = Volume/100;
printf (" Capacita tino ettolitri = %f \n",Capacita);
}
Operatori di incremento e decremento
Per incrementare di 1 il valore di una variabile, ad es:
a = a + 1;
in C è possibile usare l’ operatore di incremento ++
che incrementa di 1 la variabile a cui è applicato, ovvero:
a++ ; è equivalente alla istruzione a = a + 1;
Analogamente l’operatore di decremento -- decrementa di 1 la variabile a cui è applicato:
a-- ; è equivalente alla istruzione a = a - 1;
Linguaggio C
37 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Operatori di incremento e decremento Forma prefissa e postfissa
postfissa
a++ la variabile è incrementata dopo essere utilizzata a-- la variabile è decrementata dopo essere utilizzata
prefissa
++a la variabile è incrementata prima di essere utilizzata --a la variabile è decrementata prima di essere utilizzata
Attenzione ! Gli effetti di forma pre- o post- fissa possono essere differenti
Linguaggio C
Le espressioni:
y = a++ ed y = ++a producono risultati diversi per y Esempi:
Linguaggio C
y=a++
equivale alla sequenza di istruzioni y=a;
a=a+1;
se a=3 dopo l’esecuzione di y=a++
si ha: y=3 a=4
y= ++ a
equivale alla sequenza di istruzioni a=a+1;
y=a;
se a=3 dopo l’esecuzione di y=++a si ha: a=4 y=4
39 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Esempi:
Posto a=4 ed i=6
Linguaggio C
k = ++a * i; equivale a:
a = a + 1;
k = a * i;
ovvero a = 5; k = 30;
k = a++ * i; equivale a:
k = a * i;
a = a + 1;
ovvero: k= 24; a = 5;
#include<stdio.h>
main ( )
// programma esempio operatore incremento {int numero, y, k, i=6;
printf ("Immettere il valore di un numero intero:\n" );
scanf("%d", &numero);
printf (“\n\n Notazione Post-fissa: y = numero++;\n
numero = %d\n\n",numero);
y = numero++;
printf (" y = %d \n numero = %d \n", y, numero);
printf ("\n Notazione Post-fissa: k = numero++ * i; \n
numero = %d , i = %d \n\n",numero,i);
k = numero++ * i;
printf (" k=%d \n", k);
printf (" numero = %d \n\n", numero);
Esempio
41 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
printf ("\n Notazione Pre-fissa: y = ++numero; \n
numero = %d\n\n",numero);
y = ++numero ;
printf (" numero = %d \n y = %d\n", numero, y );
printf ("\n Notazione Pre-fissa: k = ++numero * i; \n
numero = %d , i = %d \n\n",numero,i);
k = ++numero * i;
printf (" numero = %d \n", numero);
printf (" k = %d \n", k);
system("Pause");
}
Esempio
scanf (“%d”, numero);
numero=9
y=numero++;
y=9
numero = 9+1 = 10
k = numero++ * i;
k = 10 * 6 = 60 numero = 10 + 1 = 11
y=++numero;
numero = 11 + 1 = 12 y= 12
k =++numero * i;
numero = 12 + 1 = 13 k = 13 * 6 = 78
43 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Altri uso degli operatori di incremento/decremeto 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);