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 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 -231
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
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) /
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
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 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 è un valore diverso da 0 (non necessariamente 1).
Gli operatori logici sono:
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).
I nomi non possono essere uguali a 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
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
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 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”, 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
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
#include<stdio.h>
main ( )
/* programma esempio uso printf()
calcola il quadrato e la metà di un numero*/
{ int numero = 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
23 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
Un semplice programma esempio
#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", numero);
printf("Cubo di %d = %d \n", numero, numero*numero*numero);
printf (" Triplo di %d = %d \n",numero, numero*3);
}
Direttiva di inclusione per la libreria stdio, input/output standard
25 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
27 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
29 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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
31 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
33 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:" );
scanf("%d", &numero);
printf ("\n\n\n");
// Forma Post-fissa y = numero++ ;
printf (" Postfissa: y=%d - Numero=%d\n", y, numero);
k = numero++ * i;
printf (" Postfissa: k=%d \n", k);
printf (" Postfissa: Numero = %d \n\n", numero);
// Forma Pre-fissa y = ++numero ;
printf (" Prefissa: y=%d - Numero=%d\n", y, numero );
k = ++numero * i;
printf (" Prefissa: k=%d \n", k);
printf (" Prefissa: Numero = %d \n", numero);
}
Esempio
35 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
scanf (“%d”, numero);
numero=4 y=numero++;
y=4
numero = 4+1 = 5 k = numero++ * i;
k = 5 * 6 = 30 numero = 5 + 1 = 6
y=++numero;
numero = 6 + 1 = 7 y= 7
k =++numero * i;
numero = 7 + 1 = 8 k = 8 * 6 = 48
37 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
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
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:
39 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
C - Strutture di controllo
Selezione
if (<condizione>)
<istruzione>;
se <condizione> è vera è eseguita <istruzione>
dove <istruzione> è formata da 1 sola istruzione altra forma:
if (<condizione>) {
<istruzioni>;
}
se <condizione> è vera sono eseguite le <istruzioni>
dove <istruzioni> è più di 1 istruzione
N.B. < condizione> è un’espressione di tipo intero (in C non esiste il tipo logico) ed essa è falsa se ha un valore uguale a zero
………
if (i<100) {
a = b - i;
printf(”%f”, a);
} ………
C - Strutture di controllo
Esempi : Selezione
………
if (a>100)
printf(”%f”, a);
………
41 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);
if ((base > 0) && (altezza > 0)) { area = base * altezza;
printf("Area= %f \n", area);
} }
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);
if ((base > 0) && (altezza > 0)) { area = base * altezza;
printf("Area= %f \n", area);
}
if ((base <= 0) || (altezza <= 0))
printf("Errore: base e/o altezza non maggiori di zero \n");
}
Un semplice programma esempio
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 43
Programma esempio in C
#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);
}
... Modificare il programma C del calcolo del volume del parallelepipedo per verificare il rispetto delle precondizioni ...
#include<stdio.h>
main ( )
{ // programma per il calcolo del 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);
if ((LBase>0)&&(ABase>0)&&(H>0)) {Area_Base = LBase* ABase;
Volume=Area_Base*H;
printf ("Volume = %f \n",Volume);
}
if ((LBase<=0)||(ABase<=0)||(H<=0))
printf("\nErrore:almeno una dimensione non maggiore di zero\n");
Programma esempio in C
... il programma C del calcolo del volume del parallelepipedo modificato per verificare il rispetto delle precondizioni ...