Introduzione alla Programmazione in C

Download Report

Transcript Introduzione alla Programmazione in C

12
10
8
6
4
INTRODUZIONE
ALLA PROGRAMMAZIONE
in linguaggio C
Colonna 1
Colonna 2
Colonna 3
2
di Mauro Casula
0
Riga 1
Riga 2
Riga 3
Riga 4
{
Scopi del seminario
●
●
●
●
Essere chiaro ed esauriente;
Spiegare nei dettagli i concetti della
programmazione in generale;
Usare tali concetti per trovare soluzioni nel miglior
modo possibile;
Vedere esempi pratici di programmazione in C
(approfondimenti nel Workshop).
Importanza del linguaggio di
programmazione
Non esiste un linguaggio PERFETTO per risolvere
bene tutti i possibili problemi nel miglior modo
Quindi bisogna conoscere più linguaggi
e usare quello più adatto alla soluzione trovata
Quindi avere chiare le implicanze informatiche
(anche di programmazione) del problema affrontato
Importanza del linguaggio di
programmazione (II)
Ogni linguaggio ha:
–
i suoi pregi e i suoi difetti
(compilato/interpretato, ottimizzaz., facilità di sviluppo);
–
una sua sintassi specifica (ma i concetti rimangono);
–
le sue librerie native (più quelle aggiuntive);
–
le sue “scorciatoie” (liste, dizionari...);
–
il suo fascino.
Prevenire è meglio che curare
Prima di iniziare a programmare bisogna:
●
●
●
●
pensare e avere chiaro lo scopo del programma da
sviluppare;
pensare e avere chiaro il modo in cui si intende risolvere il
problema (algoritmo) e fissarlo tramite diagramma a
blocchi o pseudo-codice;
pensare e scegliere il linguaggio/architettura di sviluppo
più adatto alla soluzione trovata coi punti precedenti;
i problemi nasceranno sempre anche dopo aver pensato,
ma almeno si parte in vantaggio (e di molto anche).
Esempio pratico
Nel nostro caso: perché usare il C
e non un altro linguaggio?
Un po' di curiosità
●
●
Sviluppato da Dennis Ritchie e Ken Thompson
ai Bell Labs nel 1972 per realizzare il sistema
operativo UNIX
Si chiama “C”, poiché è l’evoluzione di un
linguaggio più grezzo, meno funzionale e
obsoleto chiamato “B” (ispirato al BCPL),
inventato precedentemente sempre da Ken
Thompson
Tipi di dati
●
void: vuoto
●
int / long / short / unsigned: numero intero
●
float / double: numero decimale (reale)
●
bool: booleano (vero/falso)
Istruzioni e
Blocchi di istruzione
●
●
●
●
Espressioni come y=5 o i++ sono istruzioni singole e
devono essere seguite da un punto e virgola. In C, il
punto e virgola quindi è un terminatore di istruzione;
L'esecuzione delle istruzioni avviene sempre in modo
sequenziale;
Un blocco è una sequenza di istruzioni raggruppate
all'interno di parentesi graffe { };
Il blocco, se viene eseguito, viene eseguito tutto e solo
nel momento in cui il programma entrerà nel blocco e
non in altri momenti.
Esempi di istruzioni e blocchi (I)
ISTRUZIONI
●
testo = “pippo” ;
●
a = 210 ;
●
b=1;
●
printf ( “pippo” ) ;
●
y++ ;
●
printf (“a+b=%d”, a+b);
●
if / else, do / while, switch;
●
break / continue;
BLOCCHI
● {
a++ ;
printf (“a+b=%d”, a+b);
}
●
{
}
a = 10 ;
b=7;
printf (“a+b=%d”, a+b);
Esempi di istruzioni e blocchi (II)
BLOCCHI
{
delta = b * b – 4 * a * c ;
if ( delta > 0 ) {
printf ( “Soluzioni distinte in campo Reale” ) ;
return 1 ;
} else if ( delta = 0 ) {
printf ( “Soluzioni coincidenti in campo Reale” ) ;
return 0 ;
} else {
printf ( “Non ha soluzioni in campo Reale” ) ;
return -1 ;
}
}
Struttura
di
un
programma
in
C
#include <stdio.h>
#include …
void funzione1( void );
void funzione2( void );
int main ( int argc, char *argv[ ] ) {
...
funzione1();
...
funzione2();
...
}
void funzione1( void ){
...
}
void funzione2( void ){
...
}
Problema 1
Sviluppare una semplice routine prima in pseudocodice, e poi in C, che chiuda una valvola quando il
liquido di un serbatoio raggiunge un certo livello e la
apra ad un altro certo livello. I livelli sono scelti da voi. Il
serbatoio contiene max 10 litri.
Si hanno a disposizione le seguenti funzioni e variabili
definite esternamente:
● chiudi_valvola()
● apri_valvola()
● livello
Soluzione 1 (pseudo-codice)
Inizio
●
se: livello = 9.5 litri
–
–
●
allora: chiudi_valvola()
altrimenti: non fare nulla
se: livello = 0.5 litri
–
–
allora: apri_valvola()
altrimenti: non fare nulla
livello = 9.5 ?
SI
NO
livello = 0.5 ?
NO
Fine
chiudi_valvola()
SI
apri_valvola()
Soluzione 1 (codice C)
void gestisci_valvola(void){
if (livello == 9.5){
chiudi_valvola();
}
if (livello == 0.5){
apri_valvola();
}
}
Problema 2
Sviluppare una semplice routine, in pseudo-codice, e
poi in C, che stampi dei messaggi personalizzati al
raggiungimento di certi livelli del liquido nel serbatoio
dell' esempio precedente. I livelli sono scelti da voi. Il
serbatoio contiene max 10 litri.
Si hanno a disposizione le seguenti funzioni e variabili
definite esternamente:
● printf(“Testo da stampare”)
● livello
Soluzione 1 (pseudo-codice)
Inizio
●
se: livello = 9 litri
–
●
se: livello = 5 litri
–
●
allora: stampa(“Quasi pieno”)
allora: stampa(“Metà”)
se: livello = 1 litri
–
allora: stampa(“Quasi vuoto”)
livello = 9
SI
stampa(“Quasi pieno”)
NO
livello = 5
SI
stampa(“Metà”)
NO
livello = 1
NO
Fine
SI
stampa(“Quasi vuoto”)
Soluzione 1a (codice C)
void verifica_livello( int livello )
{
if (livello == 9){
printf(“Quasi pieno”);
}
if (livello == 5){
printf(“Metà”);
}
if (livello == 1){
printf(“Quasi vuoto”);
}
}
Soluzione 1b (codice C)
void verifica_livello(void){
switch(livello){
case 9:
printf(“Quasi pieno”)
break;
case 5:
printf(“Metà”);
break;
case 1:
printf(“Quasi
vuoto”);
break;
}
}
Problema 3
Modificare la precedente routine gestione_valvola(), in
pseudo-codice, e poi in C, in maniera che il controllo
del livello sia continuativo ed interrompibile. I livelli
sono scelti da voi. Il serbatoio contiene max 10 litri.
Si hanno a disposizione le seguenti funzioni e variabili
definite esternamente:
●
●
●
chiudi_valvola()
apri_valvola()
livello
Soluzione 3 (pseudo-codice)
●
●
●
●
Inizio ciclo
inizio ciclo
se: livello = 9.5 litri
– allora: chiudi_valvola()
livello = 9.5
livello = 0.5
NO
se interrotto
allora: esci
–
altrimenti: torna a “Inizio ciclo”
chiudi_valvola()
NO
se: livello = 0.5 litri
– allora: apri_valvola()
–
SI
NO
interrotto?
SI
Fine
SI
apri_valvola()
Soluzione 3a (codice C)
void verifica_livello(void){
while(!interrotto){
if (livello == 9.5)
chiudi_valvola();
if (livello == 0.5)
apri_valvola();
} //while
}
Soluzione 3b (codice C)
void verifica_livello(void){
bool interrotto = false;
char input;
do{
if (livello == 9.5){
chiudi_valvola();
}
if (livello == 0.5){
apri_valvola();
}
input = getch();
if (input == 'E' || input == 'e')
interrotto=true;
}while(!interrotto);
}
Problema 4
Sviluppare una semplice routine (basandosi anche
sulle precedenti) in pseudo-codice, e poi in C, che
verifichi lo stato dei 3 serbatoi di vernice da 50 litri
ciascuno di un apparecchio per il tracciamento delle
strisce delle strade.
Si hanno a disposizione le seguenti funzioni e variabili
definite esternamente:
● printf(“Testo da stampare”)
● livello0, livello1, livello2, livello3
Soluzione 4 (pseudo-codice)
n_serbatoi = 4
●
n_serbatoi = 4
●
per ciascuno verifica:
–
–
livello = 9
allora: stampa(“Quasi pieno”)
allora: stampa(“Metà”)
livello = 5
se: livello = 1 litri
●
SI
stampa(“Quasi pieno”)
NO
se: livello = 5 litri
●
NO
SI
se: livello = 9 litri
●
–
cont_serb < 4
SI
stampa(“Metà”)
NO
allora: stampa(“Quasi vuoto”)
NO
livello = 1
Fine
SI
stampa(“Quasi vuoto”)
Soluzione 4a (codice C)
int liv_serbatoio , n_serbatoi = 4;
for ( int n_ciclo = 0 ; n_ciclo < n_serbatoi ; n_ciclo++ ) {
switch (n_ciclo) {
case 0:
liv_serbatoio = serbatoio0;
break;
case 1:
liv_serbatoio = serbatoio1;
break;
case 2:
liv_serbatoio = serbatoio2;
break;
case 3:
liv_serbatoio = serbatoio3;
break;
}
verifica_livello ( liv_serbatoio ) ;
}
void verifica_livello ( int livello ) {
if (livello == 9){
printf(“Quasi pieno”);
}
if (livello == 5){
printf(“Metà”);
}
if (livello == 1){
printf(“Quasi vuoto”);
}
}
Soluzione 4b (codice C)
int liv_serbatoio [ 4 ] ;
...
assegna_livello ( liv_serbatoio );
...
for ( int n_ciclo = 0 ; n_ciclo < n_serbatoi ;
n_ciclo++ ) {
verifica_livello ( liv_serbatoio [ n_ciclo ] ) ;
}
void verifica_livello ( int livello ) {
if (livello == 9){
printf(“Quasi pieno”);
}
if (livello == 5){
printf(“Metà”);
}
if (livello == 1){
printf(“Quasi vuoto”);
}
}
Bibliografia e approfondimenti
●
●
●
●
“Il linguaggio C”, B. Kernighan, D. Ritchie,
2a ed., 2004, Pearson/Prentice-Hall
“C - Corso completo di programmazione”,
H. Deitel, P. Deitel, 3a ed., Apogeo, 2007
http://staff.polito.it/claudio.fornaro/CorsoC/02LinguaggioC.pdf
https://www.quora.com/What-is-the-most-obfus
cated-C-code-you-have-ever-seen
Contatti
●
su FB: https://www.facebook.com/mauro.casula
●
sito: http://www.bodale.it
●
email personale: [email protected]
●
email personale GULMh: [email protected]
FINE
}