Struttura Programmi Algebra di Boole

33
Struttura Programmi Prof. Alessandro Campi 1

Transcript of Struttura Programmi Algebra di Boole

Page 1: Struttura Programmi Algebra di Boole

Struttura Programmi

Prof. Alessandro Campi

1

Page 2: Struttura Programmi Algebra di Boole

2

Struttura di un programma C

inclusione librerie / per poter invocare funzioni utili (i/o, ...) /

dichiarazione di variabili globali e funzioni

int main ( ) {

dichiarazione di variabili locali

istruzione 1; / tutti i tipi di operazioni, e cioè: /

istruzione 2; / istr. di assegnamento /

istruzione 3; / istr. di input / output /

istruzione 4; / istr. di controllo (condizionali, cicli) /

...

istruzione N;

}

parte esecutiva

parte dichiarativa locale

parte dichiarativa globale

Ogni programma C deve contenere un modulo int main() {...}

Page 3: Struttura Programmi Algebra di Boole

3

• Parte dichiarativa: contiene le dichiarazioni degli

elementi del programma

– Dati, ed eventualmente funzioni (ma solo nella parte globale)

• Parte esecutiva: contiene le istruzioni da eseguire,

che ricadono nelle categorie:

– Istruzioni di assegnamento (=)

– Strutture di controllo:

• Condizionali (if-then-else e switch)

• Iterative, o cicli (while, do e for)

– Istruzioni di Input/Output (printf, scanf, ...)

Struttura di un programma C

Page 4: Struttura Programmi Algebra di Boole

4

Variabili globali e locali

• Le variabili globali sono dichiarate fuori dalle

funzioni

– per convenzione: all’inizio, dopo le #include

• Le variabili locali sono dichiarate internamente

alle funzioni, prima della parte esecutiva

• In caso di programmi monomodulo (cioè contenenti una sola funzione, il main()), variabili

globali e locali sono equivalenti

– È pertanto indifferente il luogo in cui sono dichiarate

• La differenza si ha nei programmi multimodulo

Page 5: Struttura Programmi Algebra di Boole

5

Commenti

• Porzioni di testo racchiuse tra /* e */

– Se un commento si estende da un certo punto fino alla fine di una sola riga si può anche usare //

/* Programma che non fa nulla ma mostra

i due modi per inserire commenti in C */

int main {

int valore; // Dich. inutile: variabile mai usata

return 0;

}

• I commenti sono ignorati dal compilatore

• Servono per aumentare la leggibilità e la facilità di modifica di un programma– A distanza di tempo, per persone diverse dall’autore, ...

Page 6: Struttura Programmi Algebra di Boole

6

Istruzioni semplici e composte(simple and compound statements)

• Sequenze di istruzioni semplici

– Ogni istruzione semplice termina con ;

– ; è detto il “terminatore” dell’istruzione

• Si possono raggruppare più istruzioni in

sequenza tra { e } a costituire un blocco

– Il blocco costituisce una “super-istruzione”

• Non è necessario il ; dopo }, in quanto il

blocco è già una istruzione

– non necessita del terminatore per diventarla

Page 7: Struttura Programmi Algebra di Boole

7

Teorema di Böhm e Jacopini

• Tutti i programmi possono essere scritti in

termini di tre strutture di controllo:

– Sequenza: istruzioni eseguite in ordine

– Selezione: istruzioni che permettono di

prendere strade diverse in base a una condizione (costrutto di tipo if-else)

– Iterazione: istruzioni che permettono di

eseguire ripetutamente un certo insieme di altre istruzioni (costrutti di tipo while, do e for)

Page 8: Struttura Programmi Algebra di Boole

8

Sequenza

int main() {

int integer1, integer2, sum;

printf ("Enter first integer\n");

scanf ("%d", &integer1 );

printf ("Enter second integer\n");

scanf ("%d", &integer2);

sum = integer1 + integer2;

printf ("\nSum is %d\n\n", sum );

return 0;

}

Page 9: Struttura Programmi Algebra di Boole

9

Selezione

int main()

{

int n;

printf (“Inserisci un numero\n");

scanf ("%d", &n );

if ( n > 0 )

printf ("Un numero positivo ! \n");

else

printf ("Un numero negativo o nullo\n");

printf ("Fine del programma\n");

return 0;

}

condizione

Page 10: Struttura Programmi Algebra di Boole

10

Iterazione

int main()

{

int n = 9;

printf ( " PRONTI...\n " );

while ( n > 0 ) {

printf (" ...meno %d ...\n", n);

n = n-1;

}

printf ( " ...VIA!!! \n " );

return 0;

}

condizione

Page 11: Struttura Programmi Algebra di Boole

11

Iterazione

int main()

{

int n = 9;

printf ( " PRONTI...\n " );

while ( n > 0 )

printf (" ...meno %d ...\n", n);

n = n-1;

printf ( " ...VIA!!! \n " );

return 0;

}

Che fa?

condizione

Page 12: Struttura Programmi Algebra di Boole

12

Iterazione

int main()

{

int n = 9;

printf ( " PRONTI...\n " );

while ( n > 0 ) ; {

printf (" ...meno %d ...\n", n);

n = n-1;

}

printf ( " ...VIA!!! \n " );

return 0;

}

Che fa?

condizione

Page 13: Struttura Programmi Algebra di Boole

13

• L’esecuzione dipende da condizioni sul

valore di espressioni booleane, costruite

mediante operatori:

– Relazionali (predicano sulla relazione tra due valori)

==, !=, <, >, <=, >=

– Logici (predicano sul valore di verità di espressioni logiche)

! (NOT)

&& (AND)

|| (OR)

Istruzioni condizionali

Page 14: Struttura Programmi Algebra di Boole

14

Operatori logici di basee loro tabelle di verità

A B A and B

0 0 0

0 1 0

1 0 0

1 1 1

(prodotto logico)

A B A or B

0 0 0

0 1 1

1 0 1

1 1 1

(somma logica)

A not A

0 1

1 0

(negazione)

Le tabelle elencano tutte le possibili combinazioni in ingresso

e il risultato associato a ciascuna combinazione

Page 15: Struttura Programmi Algebra di Boole

15

• A modellare alcune (non tutte) forme di ragionamento

– A = è vero che 1 è maggiore di 2 ? (sì o no, qui è no) = 0

– B = è vero che 2 più 2 fa 4 ? (sì o no, qui è sì) = 1

– A and B = è vero che 1 sia maggiore di 2 e che 2 più 2 faccia 4 ?

Si ha che A and B = 0 and 1 = 0, dunque no

– A or B = è vero che 1 sia maggiore di 2 o che 2 più 2 faccia 4 ?

Si ha che A or B = 0 or 1 = 1, dunque sì

• OR, AND e NOT vengono anche chiamati connettivi logici,

perché funzionano come le congiunzioni coordinanti “o” ed “e”,

e come la negazione “non”, del linguaggio naturale

• Si modellano ragionamenti (o deduzioni) basati solo sull’uso di

“o”, “e” e “non” (non è molto, ma è utile)

A che cosa servono le espressioni logiche?

Page 16: Struttura Programmi Algebra di Boole

16

• Le espressioni logiche (booleane) non modellano:– Domande esistenziali: “c’è almeno un numero reale x tale

che il suo quadrato valga −1 ?” (si sa bene che non c’è)x | x2 = −1 è falso

– Domande universali: “ogni numero naturale è la somma di quattro quadrati di numeri naturali ?” (si è dimostrato di sì)x | x = a2+b2+c2+d2 è vero (“teorema dei 4 quadrati”)

Più esattamente andrebbe scritto: x a,b,c,d | x = a2+b2+c2+d2

• e sono chiamati “operatori di quantificazione”, e sono ben diversi da or, and e not

• La parte della logica che tratta solo degli operatori or, and e not si chiama calcolo proposizionale

• Aggiungendo gli operatori di quantificazione, si ha il calcolo dei predicati (che è molto più complesso)

Che cosa non si può modellaretramite espressioni logiche?

Page 17: Struttura Programmi Algebra di Boole

17

Condizioni: esempi

X == 0

X > 0 && A != 3

!( (x+5)*10 >= ALFA3 / (Beta_Due+1) )

Esistono regole di precedenza

! a || b && c

prima !, poi &&, poi ||

( (!a) || ( b && c ) )

in caso di dubbio, usare le parentesi ( tonde )

Page 18: Struttura Programmi Algebra di Boole

18

Dettagli

• && e || si valutano da sinistra a destra

• La valutazione di una espressione logica

procede finché necessario per dedurne la

verità o falsità, e si arresta appena è definita:

( x != 0 ) && ( (100 / x) == 0 )

Se x vale zero l’espressione risulta falsa e

non si verifica alcun errore (di divisione per

zero), perché è inutile procedere a valutare

oltre && (ovviamente è inutile solo se x vale zero)

Page 19: Struttura Programmi Algebra di Boole

19

Vero/falso in C

• Una condizione (espressione relazionale o logica) assume il valore

0 se risulta FALSA

1 se risulta VERA

• Ogni valore “non zero” è considerato veroif ( 3 ) ...

if ( -1 ) ...

while (1) ... /* continua PER SEMPRE !! */

if ( a – a ) ... /* sarà sempre FALSO, indipendentemente dal valore di a */

Page 20: Struttura Programmi Algebra di Boole

20

• L’istruzione di assegnamentoint a = 0, b = 4;

a = b;

printf( "%d", a );

• Il predicato di confrontoint a = 0, b = 4;

if ( a == b )

printf( "uguali" );

else

printf( "diversi" );

Assegnamento (=) e uguaglianza (==)

Page 21: Struttura Programmi Algebra di Boole

21

• Costrutto a selezione singola:if ( espressione )

istruzione

oppure a selezione doppia:if ( espressione )

istruzione1

else

istruzione2

• I rami possono contenere istruzioni composte:if ( espressione )

{ seq.1 di istruzioni }

else

{ seq.2 di istruzioni }

• Gli if possono essere annidati

ramo

then

ramo

thenramo

else

sequenze di più

istruzioni

Istruzioni condizionali (if-then-else)

Page 22: Struttura Programmi Algebra di Boole

22

if (x < 0) x = -x; else x = x + 10;

Per maggior leggibilità, è bene usare

regole di incolonnamento (indentazione)

if (x < 0)

x = -x;

else

x = x + 10;

è una questione di stilema è molto importante

Istruzione condizionale semplice

Page 23: Struttura Programmi Algebra di Boole

23

if (x < 0)

x = - x; /* trasforma x nel suo valore assoluto */

if ( a > b ) { /* indica il massimo tra due valori */

max = a;

printf("massimo: %d", max);

}

else {

max = b;

printf("massimo: %d", max);

}

if ( a > b )

max = a;

else

max = b;

printf("massimo: %d", max);

Esempi

Page 24: Struttura Programmi Algebra di Boole

24

#include <stdio.h> /* Calcolo del valore assoluto */

int main ( ) { /* programma principale */

int numero, valass; /* dichiarazione delle variabili */

printf ("Calcolo Valore Assoluto.\n\n");

printf ("Inserisci Numero Intero:");

scanf ("%d", &numero); /* acquisizione valore */

if (numero < 0)

valass = - numero;

if (numero >= 0)

valass = numero;

printf ("Numero: %d\n", numero); /* output */

printf ("Valore assoluto: %d\n", valass); /* output */

return 0;

}

ramo

then

condizione

Istruzioni condizionali(selezione singola)

Page 25: Struttura Programmi Algebra di Boole

25

#include <stdio.h> /* Calcolo del valore assoluto */

int main ( ) { /* programma principale */

int numero, valass; /* dichiarazione delle variabili */

printf ("Calcolo Valore Assoluto.\n\n");

printf ("Inserisci Numero Intero:");

scanf ("%d", &numero); /* acquisizione valore */

if (numero < 0)

valass = - numero;

else

valass = numero;

printf ("Numero: %d\n", numero); /* output */

printf ("Valore assoluto: %d\n", valass); /* output */

return 0;

}

ramo

then ramo

else

condizione

Istruzioni condizionali(variante con selezione doppia)

Page 26: Struttura Programmi Algebra di Boole

26

1 /* Uso delle strutture condizionali,

2 degli operatori relazionali e

3 di uguaglianza */

4 #include <stdio.h>

5

6 int main()

7 {

8 int num1, num2;

9

10 printf ("Enter two integers, and I will tell you\n");

11 printf ("the relationships they satisfy: ");

12 scanf ("%d%d", &num1, &num2); /* lettura di due numeri interi */

13

14 if (num1 == num2)

15 printf ("%d is equal to %d\n", num1, num2);

16

17 if (num1 != num2)

18 printf ("%d is not equal to %d\n", num1, num2);

19

20 if (num1 < num2)

21 printf ("%d is less than %d\n", num1, num2);

22

23 if (num1 > num2)

24 printf ("%d is greater than %d\n", num1, num2);

25

26 if (num1 <= num2)

27 printf ("%d is less than or equal to %d\n",

28 num1, num2);

Page 27: Struttura Programmi Algebra di Boole

27

29

30 if (num1 >= num2)

31 printf ("%d is greater than or equal to %d\n",

32 num1, num2);

33

34 return 0; /* il programma è terminato con successo */

35 }

> Enter two integers, and I will tell you

> the relationships they satisfy: 3 7

> 3 is not equal to 7

> 3 is less than 7

> 3 is less than or equal to 7

> Enter two integers, and I will tell you

> the relationships they satisfy: 22 12

> 22 is not equal to 12

> 22 is greater than 12

> 22 is greater than or equal to 12

Page 28: Struttura Programmi Algebra di Boole

28

if (i < 100)

if (i > 0)

printf ("Minore di 100 e maggiore di zero\n");

else

if (i == 0)

printf("Uguale a zero\n");

else

printf("Minore di zero\n");

else

if (i == 100)

printf( "Uguale a 100\n");

else

printf ("Maggiore di 100\n");

if-then-else annidati

Page 29: Struttura Programmi Algebra di Boole

29

if (n > 0) {

if (a>b)

z = a;

}

else

z = b;

Potenziale ambiguità:

if (n > 0) if (a>b) z = a; else z = b;

ogni else si associa

all’if più vicino

l'indentazione lo rende evidente

se incerti, usare le parentesi

if (n > 0) { if (a>b) z = a; } else z = b;

Annidamento, blocchi, indentazione

if (n > 0)

if (a>b)

z = a;

else

z = b;

Page 30: Struttura Programmi Algebra di Boole

30

• Spesso accade di voler scrivere molti

if annidati (alternative multiple):

if (...)fai qualcosa1;

elseif (…)

fai qualcosa2;

elseif(…)

Sequenze di if

Page 31: Struttura Programmi Algebra di Boole

31

if (n % 2 == 0)printf("%d è pari", n);

elseif (n % 3 == 0)

printf("%d è multiplo di 3", n);

elseif (n % 5 == 0)

printf("%d è multiplo di 5", n);

elseif (n % 7 == 0)

printf("%d è multiplo di 7", n);

elseif (n % 11 == 0)

printf("%d è multiplo di 11", n);

elseif (n % 13 == 0)

printf("%d è multiplo di 13", n);

else printf ("il numero %d non ha divisori primi < 15", n);

Esempio

Page 32: Struttura Programmi Algebra di Boole

32

/* Se un numero n ha divisori primi <15, stampa il minimo, altrimenti stampa un messaggio che lo segnala */

if (n % 2 == 0)

printf("%d è pari", n);

else if (n % 3 == 0)

printf("%d è multiplo di 3", n);

else if (n % 5 == 0)

printf("%d è multiplo di 5", n);

else if (n % 7 == 0)

printf("%d è multiplo di 7", n);

else if (n % 11 == 0)

printf("%d è multiplo di 11", n);

else if (n % 13 == 0)

printf("%d è multiplo di 13", n);

else printf ("il numero %d non ha divisori primi < 15", n);

Una rappresentazione più leggibile

Page 33: Struttura Programmi Algebra di Boole

33

if (n % 2 == 0)printf("%d è pari", n);

if (n % 3 == 0) printf("%d è multiplo di 3", n);

if (n % 5 == 0) printf("%d è multiplo di 5", n);

if (n % 7 == 0) printf("%d è multiplo di 7", n);

if (n % 11 == 0) printf("%d è multiplo di 11", n);

if (n % 13 == 0) printf("%d è multiplo di 13", n);

Cosa cambia?

if (n % 2 == 0)printf("%d è pari", n);

else if (n % 3 == 0) printf("%d è multiplo di 3", n);

else if (n % 5 == 0) printf("%d è multiplo di 5", n);

else if (n % 7 == 0) printf("%d è multiplo di 7", n);

else if (n % 11 == 0) printf("%d è multiplo di 11", n);

else if (n % 13 == 0) printf("%d è multiplo di 13", n);