Il linguaggio C
prima parte
Prof. Daniele Contarino
❑Introduzione
❑La sintassi
❑Le variabili e la gestione del I/O
❑La gestione del flusso
Indice degli argomenti
Il linguaggio C – prima parte 3 di 77 Daniele Contarino
Il linguaggio C è uno dei principali linguaggi di
programmazione al mondo. Nato insieme a UNIX, viene usato per realizzare sistemi operativi, driver, giochi e programmi altamente preformanti.
Per via della sua diffusione, molti altri linguaggi nati dopo il C hanno adottato una sintassi simile alla sua (C++, Java, C#,
PHP, etc. ) e la sintassi di questi linguaggi viene detta C-Like
Il linguaggio C
Il linguaggio C è stato inventato da Dennis Ritchie nei Bell Labs della AT&T nel 1972 per realizzare una nuova
versione del sistema operativo UNIX.
Prima di allora per la realizzazione di UNIX si usava il
linguaggio Assembly (che era a basso livello) e linguaggio C (che era ad alto livello) ha
permesso di semplificare il processo di sviluppo del
Il linguaggio C – La storia
Il linguaggio C – prima parte 5 di 77 Daniele Contarino
Gli ambienti di sviluppo disponibili
Compilatore Sistema operativo Free? Sito
GCC Unix – MacOS (in Xcode)
Windows (in MinGW) SI https://gcc.gnu.org/
Dev-C++ Windows SI https://sourceforge.net/
projects/orwelldevcpp/
Eclipse IDE
for C/C++ Developers
Unix – MacOS –
Windows SI https://www.eclipse.org/
Visual Studio
Community edition Windows SI https://www.visualstudio.
com/it/vs/community/
Netbeans
C and C++ Development
Unix – MacOS –
Windows SI https://netbeans.org/
✓ Introduzione
❑La sintassi
❑Le variabili e la gestione del I/O
❑La gestione del flusso
Indice degli argomenti
Il linguaggio C – prima parte 7 di 77 Daniele Contarino
La sintassi
• Qualunque programma in C inizia con il codice contenuto dentro la funzione main;
• Ogni blocco di codice è contenuto dentro le parentesi graffe { … }
• Per richiamare le librerie esterne si usa l’istruzione
#include <…>
• Ogni istruzione finisce con il punto e virgola ;
La sintassi
Ci sono alcune parole chiave (o parole riservate) che caratterizzano il linguaggio e che permettono di usare il linguaggio usando esse più alcune librerie:
auto break case char const
default do
double else
enum
float for goto if
int
register return short signed sizeof
struct switch typedef union
unsigned
volatile
while
Il linguaggio C – prima parte 9 di 77 Daniele Contarino
Hello World!
#include <stdio.h>
int main(){
// Il mio primo programma!
printf("Hello World!");
return 0;
}
Hello World!
Il linguaggio C – prima parte 11 di 77 Daniele Contarino
Hello World!
#include <stdio.h>
int main(){
// Il mio primo programma!
printf("Hello World!");
return 0;
}
Chiama il preprocessore per includere all’interno del programma la
libreria che gestisce l’input/output, lo
STanDard Input/Output
Hello World!
#include <stdio.h>
int main(){
// Il mio primo programma!
printf("Hello World!");
return 0;
}
La funzione principale (main in inglese) di ogni programma. Il codice scritto tra le sue
parantesi graffe verrà
eseguito all’avvio del
programma
Il linguaggio C – prima parte 13 di 77 Daniele Contarino
Hello World!
#include <stdio.h>
int main(){
// Il mio primo programma!
printf("Hello World!");
return 0;
}
Tutto quello che viene scritto dopo // è un commento del
programmatore e non viene elaborato dal compilatore.
Il commento multiriga viene inserito tra
/* …. */
Hello World!
#include <stdio.h>
int main(){
// Il mio primo programma!
printf("Hello World!");
return 0;
}
Stampa sullo schermo la frase Hello World!
sfruttando la funzione
printf contenuta dentro
stdio.h
Il linguaggio C – prima parte 15 di 77 Daniele Contarino
Hello World!
#include <stdio.h>
int main(){
// Il mio primo programma!
printf("Hello World!");
return 0;
}
Comunica al sistema operativo che il
programma è terminato
senza errori
Indentazione
Per migliorare la qualità della lettura del codice, si usa l’indentazione, ovvero spostare verso destra di un tab (ovvero 4 spazi) il sotto-blocco del codice, in maniera tale da capire immediatamente quale codice
appartiene a un blocco piuttosto che un altro.
#include <stdio.h>
int main(){
████printf("Hello World!");
Il linguaggio C – prima parte 17 di 77 Daniele Contarino
✓ Introduzione
✓ La sintassi
❑Le variabili e la gestione del I/O
❑La gestione del flusso
Indice degli argomenti
Le variabili
In informatica la variabile è un piccolo spazio (o allocazione) di memoria che contiene un valore che cambia nel corso dell’esecuzione del
programma.
Memoria RAM
005da28c 005da290 005da284
a02 -279
????
Il linguaggio C – prima parte 19 di 77 Daniele Contarino
Le variabili
Pippo
5 Pluto
f
Le variabili
Alcune delle parole riservate riguardano quelle che si chiamano i tipi di dato primitivi
auto break case char const
continue
default do
double else
enum extern
float for goto if
int long
register return short signed sizeof static
struct switch typedef union
unsigned void
volatile
while
Il linguaggio C – prima parte 21 di 77 Daniele Contarino
Le variabili
Tipo Dimensione Cosa contiene Segno Valore minimo Valore massimo
char
1 byte Singolo carattere signed -128 +127unsigned 0 +255
short
2 byte Numero intero signed -32.768 32.767unsigned 0 65.535
int
2 byte Numero intero signed -32.768 32.767unsigned 0 65.535
long
4 byte Numero intero signed -2.147.483.647 2.147.483.647unsigned 0 4.294.967.295
long long
8 byte Numero intero signed -9.223.372.036.854.775.808 9.223.372.036.854.775.807unsigned 0 18.446.744.073.709.551.615
float
4 byte Numero a virgolamobile - 1.175494e-38 3.402823e+38
double
8 byte Numero a virgolamobile 2.225074e-308 1.797693e+308
long double 10 byte Numero a virgola
mobile - 3.362103e-4932 1.189731e+4932
Utilizzo delle variabili
#include <stdio.h>
int main(){
<TIPO> <NOME VARIABILE 1>;
<TIPO> <NOME VARIABILE 2>;
...
}
Il linguaggio C – prima parte 23 di 77 Daniele Contarino
Utilizzo delle variabili
#include <stdio.h>
int main(){
int var1; // Dichiarazione int var2;
int somma;
var1 = 2; // Assegnazione var2 = 3;
somma = var1 + var2; // Assegnazione printf("La somma e’ %d", somma);
return 0;
}
Utilizzo delle variabili
#include <stdio.h>
int main(){
int var1; // Dichiarazione int var2;
int somma;
var1 = 2; // Assegnazione var2 = 3;
somma = var1 + var2; // Assegnazione printf("La somma e’ %d", somma);
return 0;
}
Il linguaggio C – prima parte 25 di 77 Daniele Contarino
Utilizzo delle variabili
#include <stdio.h>
int main(){
int var1; // Dichiarazione int var2;
int somma;
var1 = 2; // Assegnazione var2 = 3;
somma = var1 + var2; // Assegnazione printf("La somma e’ %d", somma);
return 0;
}
Utilizzo delle variabili
Il linguaggio C – prima parte 27 di 77 Daniele Contarino
printf
Tipo variabile Formato Esempio
char %c
printf ("%c", ‘s’); sint %d - %i
printf ("%d", 45); 45int %o
printf ("%o", 45); 55int %x - %X
printf ("%x - %X", 45, 45); 2d – 2Dint %u
printf ("%u", -45); 45char * (stringa) %s
printf ("Ciao %s!", "Pippo"); Ciao Pippo!float - double %f
printf ("%f", -18.4568); -18.456800float - double %e - %E
printf ("%e - %E", -18.4568); -1.845680e+001 -1.845680E+001float - double %g - %G
printf ("%g", -18.4568); -18.4568Esercizi
❖ Fai un programma che con due numeri effettua le 4 operazioni aritmetiche (somma, sottrazione,
moltiplicazione e divisione);
❖ Fai un programma che con un numero effettui la sua elevazione al quadrato
❖ Fai un programma che con un
numero ed un esponente effettui
la sua elevazione a potenza
Il linguaggio C – prima parte 29 di 77 Daniele Contarino
Acquisizione di dati dal mondo esterno
#include <stdio.h>
int main(){
int var1; // Dichiarazione int var2;
int somma;
// Aquisizione
printf("Dammi il primo numero: %d\n");
scanf("%d", &var1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &var2);
somma = var1 + var2; // Assegnazione printf("La somma e’ %d", somma);
return 0;
}
Acquisizione di dati dal mondo esterno
#include <stdio.h>
int main(){
int var1; // Dichiarazione int var2;
int somma;
// Aquisizione
printf("Dammi il primo numero: %d\n");
scanf("%d", &var1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &var2);
somma = var1 + var2; // Assegnazione printf("La somma e’ %d", somma);
return 0;
Il linguaggio C – prima parte 31 di 77 Daniele Contarino
Acquisizione di dati dal mondo esterno
scanf
Tipo variabile Formato Esempio
char %c scanf ("%c", &varChar);
int %d - %i scanf ("%d", &varInt);
int %o scanf ("%o", &varInt);
int %x - %X scanf ("%x", &varInt);
int %u scanf ("%u", &varInt);
char * (stringa) %s scanf ("%s", frase);
float - double %f scanf ("%f", &varDouble);
float - double %e - %E scanf ("%e", &varDouble);
Il linguaggio C – prima parte 33 di 77 Daniele Contarino
Esercizi
❖ Fai un programma che dati in input due numeri effettua le 4 operazioni aritmetiche (somma, sottrazione, moltiplicazione e divisione);
❖ Fai un programma che dato in input un numero effettui la sua elevazione al
quadrato
❖ Fai un programma che dato in
input un numero ed un esponente
effettui la sua elevazione a potenza
✓ Introduzione
✓ La sintassi
✓ Le variabili e la gestione del I/O
❑La gestione del flusso
Indice degli argomenti
Il linguaggio C – prima parte 35 di 77 Daniele Contarino
Gestione del flusso
Oggi pioverà
Se è vero
Se è falso
Gestione del flusso
Esattamente come con il meteo, in cui noi adattiamo il nostro abbigliamento in base alle condizioni climatiche, anche il programma si deve adattare in base alle
informazioni ricevute dal mondo esterno (ovvero dai dati
che riceve in ingresso)
Il linguaggio C – prima parte 37 di 77 Daniele Contarino
Gestione del flusso
Alcune delle parole riservate viste prime riguardano i comandi per la gestione del flusso del programma.
auto break case char const
continue
default do
double else enum extern
float for goto if
int long
register return short signed sizeof static
struct switch typedef union
unsigned void
volatile
while
Gestione del flusso
Esempio
"Un numero è divisibile per qualsiasi altro numero tranne per zero"
Nel programma di prima, nel caso della divisione bisogna
prevedere il caso in cui l’utente inserisce il numero zero
come divisore.
Il linguaggio C – prima parte 39 di 77 Daniele Contarino
Gestione del flusso
#include <stdio.h>
int main(){
int var1;
int var2;
float quoziente;
printf("Dammi il primo numero: %d\n");
scanf("%d", &var1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &var2);
// se var2 e’ uguale a zero
printf(“Errore! Il divisore e’ uguale a zero");
// altrimenti stampa il risultato quoziente = var1/var2;
printf("La divisione e’ %g", quoziente);
return 0;
}
Gestione del flusso
Cosa inseriamo al posto dei commenti?
Il costrutto
IF – ELSE
(se - altrimenti)
Il linguaggio C – prima parte 41 di 77 Daniele Contarino
If … Else
if(/* condizione */){
//Blocco di istruzioni se la condizione e’ VERA
} else {
//Blocco di istruzioni se la condizione e’ FALSA
}
Condizione
Blocco ELSE
FALSO
Blocco IF
VERO
Gestione del flusso
#include <stdio.h>
int main(){
int var1;
int var2;
float quoziente;
printf("Dammi il primo numero: %d\n");
scanf("%d", &var1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &var2);
if(var2 == 0){
printf(“Errore! Il divisore e’ uguale a zero");
} else {
quoziente = var1/var2;
printf("La divisione e’ %g", quoziente);
}
Il linguaggio C – prima parte 43 di 77 Daniele Contarino
Operatori di confronto
== Uguale
!= Diverso
> Maggiore
< Minore
>= Maggiore o uguale
<= Minore o uguale
Operatori di confronto
3 == 5 FALSO 4 == 4 VERO
3 != 5 VERO 4 != 4 FALSO
3 > 5 FALSO 6 > 4 VERO
3 < 5 VERO 6 < 4 FALSO
3 >= 5 FALSO 4 >= 4 VERO
3 <= 5 VERO 4 <= 4 VERO
Il linguaggio C – prima parte 45 di 77 Daniele Contarino
Operatori di confronto
=
Assegnazione a = 5
a contiene il valore 5
==
Confronto a == 5
a è uguale a 5?
Operatori logici
! NOT Negazione
&& AND Congiunzione
|| OR Disgiunzione inclusiva
Il linguaggio C – prima parte 47 di 77 Daniele Contarino
Operatori logici – NOT
Piove Stendo i vestiti
NO SI
SI NO
"Se piove NON stendo i vestiti"
Operatori logici – AND logico
Papà ha i soldi Mamma ha le ferie Si và in vacanza
NO NO NO
NO SI NO
SI NO NO
SI SI SI
"Andiamo in vacanza se papà ha i soldi e se a mamma
danno le ferie"
Il linguaggio C – prima parte 49 di 77 Daniele Contarino
Operatori logici – AND logico
A B A && B
FALSO FALSO FALSO
FALSO VERO FALSO
VERO FALSO FALSO
VERO VERO VERO
Tabella di verità della funzione AND
Operatori logici – OR logico
"Oggi mangiamo se Fabio o Elena hanno fatto la spesa"
Fabio ha fatto la
spesa Elena ha fatto la spesa
Si mangia
NO NO NO
NO SI SI
SI NO SI
SI SI SI
Il linguaggio C – prima parte 51 di 77 Daniele Contarino
Operatori logici – OR logico
A B A || B
FALSO FALSO FALSO
FALSO VERO VERO
VERO FALSO VERO
VERO VERO VERO
Tabella di verità della funzione OR
Controlli multipli
Un altro caso sono i controlli multipli. Essi spesso si risolvono con i
cosiddetti if a cascata
Il linguaggio C – prima parte 53 di 77 Daniele Contarino
Controlli multipli
Esempio
Sviluppare un menu per una calcolatrice
-- Programma calcolatrice –
Premi 1 per fare una addizione;
Premi 2 per fare una sottrazione;
Premi 3 per fare una moltiplicazione;
Premi 4 per fare una divisione.
Controlli multipli
#include <stdio.h>
int main(){
int scelta, var1, var2;
float risultato;
printf("– Programma calcolatrice--\n");
printf("Premi 1 per fare una addizione\n");
printf("Premi 2 per fare una sottrazione;\n");
printf(" Premi 3 per fare una moltiplicazione;\n ");
printf("Premi 4 per fare una divisione.\n");
scanf("%d", & scelta);
// continua ...
Il linguaggio C – prima parte 55 di 77 Daniele Contarino
Controlli multipli
if(scelta == 1){
// Istruzioni per eseguire la somma } else if(scelta == 2) {
// Istruzioni per eseguire la sottrazione } else if(scelta == 3) {
// Istruzioni per eseguire la moltiplicazione } else if(scelta == 4) {
// Istruzioni per eseguire la divisione } else {
// Messaggio di errore }
return 0;
}
Gestione del flusso
Lo stesso procedimento è possibile farlo usando
Il costrutto
SWITCH - CASE
(smistare - caso)
Il linguaggio C – prima parte 57 di 77 Daniele Contarino
Controlli multipli
#include <stdio.h>
int main(){
int scelta, var1, var2;
float risultato;
printf("– Programma calcolatrice--\n");
printf("Premi 1 per fare una addizione\n");
printf("Premi 2 per fare una sottrazione;\n");
printf(" Premi 3 per fare una moltiplicazione;\n ");
printf("Premi 4 per fare una divisione.\n");
scanf("%d", & scelta);
// continua ...
Controlli multipli
switch(scelta){
case 1:
// Istruzioni per eseguire la somma break;
case 2:
// Istruzioni per eseguire la sottrazione break;
case 3:
// Istruzioni per eseguire la moltiplicazione break;
case 4:
// Istruzioni per eseguire la divisione break;
default:
// Messaggio di errore
}
Il linguaggio C – prima parte 59 di 77 Daniele Contarino
Esercizi
❖ Preso in input un numero dire se questo è maggiore di zero;
❖ Dati in input 3 numeri dire quale di questi è il maggiore e il minore;
❖ Presa in input una lettera dire se questa è una vocale o una
consonante;
❖ Preso in input un voto (numero)
compreso tra 1 e 10 dire se il voto è
scarso, medio o buono;
I cicli
Spesso all’interno di un programma abbiamo la necessità di ripetere un blocco di codice diverse volte.
Per ripetere un blocco di codice abbiamo tre strumenti:
❖ WHILE
❖ FOR
❖ DO … WHILE
Il linguaggio C – prima parte 61 di 77 Daniele Contarino
I cicli
Esempio
"Effettuare una moltiplicazione SENZA usare l’operatore *"
Esempio di calcolo
4 x 3 = 4 + 4 + 4
Gestione del flusso
#include <stdio.h>
int main(){
int mul1, mul2, prodotto;
prodotto = 0;
printf("Dammi il primo numero: %d\n");
scanf("%d", &mul1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &mul2);
prodotto = prodotto + mul1;
// ripeti mul2 volte l’ultima istruzione // ...
printf("il prodotto e’ %d", prodotto);
return 0;
}
Il linguaggio C – prima parte 63 di 77 Daniele Contarino
Gestione del flusso
Cosa inseriamo al posto dei commenti?
Il costrutto
WHILE
(altrimenti)
Il ciclo WHILE
while(/* condizione */){
//Blocco di istruzioni da ripetere finchè // la condizione e’ VERA
}
Condizione
Istruzioni WHILE
FALSO
VERO
Il linguaggio C – prima parte 65 di 77 Daniele Contarino
Il ciclo WHILE
#include <stdio.h>
int main(){
int mul1, mul2, prodotto, contatore;
prodotto = 0;
contatore = 0;
printf("Dammi il primo numero: %d\n");
scanf("%d", &mul1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &mul2);
// ciclo WHILE
while(contatore < mul2){
prodotto = prodotto + mul1;
contatore = contatore + 1;
}
printf("il prodotto e’ %d", prodotto);
return 0;
}
Operatori unitari
I C troviamo alcuni operatori che permettono
contemporaneamente all’assegnazione anche alcune operazioni aritmetiche
var1 ++;
var1 += var2;
var1 --;
var1 -= var2;
var1 = var1 + 1;
var1 = var1 + var2;
var1 = var1 - 1;
var1 = var1 - var2;
Il linguaggio C – prima parte 67 di 77 Daniele Contarino
Il ciclo WHILE con gli operatori unitari
#include <stdio.h>
int main(){
int mul1, mul2, prodotto, contatore;
prodotto = 0;
contatore = 0;
printf("Dammi il primo numero: %d\n");
scanf("%d", &mul1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &mul2);
// ciclo WHILE
while(contatore < mul2){
prodotto += mul1;
contatore ++;
}
printf("il prodotto e’ %d", prodotto);
return 0;
}
Gestione del flusso
Una versione contratta del ciclo WHILE che include il contatore è
Il costrutto
FOR
(per)
Il linguaggio C – prima parte 69 di 77 Daniele Contarino
Il ciclo FOR
Condizione
Istruzioni FOR
FALSO
Istruzioni successive
VERO
for(/*init*/;/*condizione*/; /*operazione ad ogni ciclo*/){
//Blocco di istruzioni da ripetere finchè // la condizione e’ VERA
}
Init
Operazione ad ogni ciclo
Il ciclo FOR
#include <stdio.h>
int main(){
int mul1, mul2, prodotto, contatore;
prodotto = 0;
printf("Dammi il primo numero: %d\n");
scanf("%d", &mul1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &mul2);
// ciclo FOR
for(contatore = 0; contatore < mul2; contatore++){
prodotto += mul1;
}
printf("il prodotto e’ %d", prodotto);
return 0;
Il linguaggio C – prima parte 71 di 77 Daniele Contarino
Il ciclo FOR
Il ciclo DO … WHILE
Riprendiamo in esame il blocco di codice di prima sulla divisione e sul suo controllo in cui il divisore deve essere
diverso da 0
Il linguaggio C – prima parte 73 di 77 Daniele Contarino
Il ciclo DO … WHILE
#include <stdio.h>
int main(){
int var1;
int var2;
float quoziente;
printf("Dammi il primo numero: %d\n");
scanf("%d", &var1);
printf("Dammi il secondo numero: %d\n");
scanf("%d", &var2);
if(var2 == 0){
printf(“Errore! Il divisore e’ uguale a zero");
} else {
quoziente = var1/var2;
printf("La divisione e’ %g", quoziente);
}
return 0;
}
Il ciclo DO … WHILE
Modifichiamo il codice in maniera tale che l’utente sia invitato a reinserire il divisore in maniera tale da permettere la divisione.
Siccome il controllo avverrà solo
DOPO l’immissione del dato, abbiamo bisogno del costrutto DO … WHILE che pospone il controllo al blocco di
Condiz ione
Istruzione 2
VERO
FALSO
Istruzione 1
Il linguaggio C – prima parte 75 di 77 Daniele Contarino
Il ciclo DO … WHILE
#include <stdio.h>
int main(){
int var1;
int var2;
float quoziente;
printf("Dammi il primo numero: %d\n");
scanf("%d", &var1);
// ciclo DO ... WHILE do {
printf("Dammi il secondo numero: %d\n");
scanf("%d", &var2);
} while(var2 == 0);
quoziente = var1/var2;
printf("La divisione e’ %g", quoziente);
return 0;
}
Esercizi
❖ Dato un numero in input n, stampare a video tutti i numeri tra 0 e n;
❖ Dato un numero in input n, calcolare e stampare a video n! (fattoriale) n! = n * (n-1) * … * 2 *1;
❖ Completare l’esercizio della calcolatrice con il menu
(a posto dei numeri usare le lettere);
❖ Calcolare X
Yusando la moltiplicazione;
Il linguaggio C
Prof. Daniele Contarino
Questa presentazione è disponibile su danielecontarino.it
Tutti i marchi riportati appartengono ai legittimi proprietari; marchi di terzi, nomi di prodotti, nomi commerciali, nomi corporativi e società citati possono essere marchi di proprietà dei rispettivi titolari o marchi registrati d’altre società e sono stati utilizzati a puro scopo esplicativo ed a beneficio del possessore, senza alcun fine di violazione dei diritti di Copyright vigenti.