Struttura Programmi Algebra di Boole
Transcript of Struttura Programmi Algebra di Boole
Struttura Programmi
Prof. Alessandro Campi
1
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() {...}
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
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
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, ...
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
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)
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;
}
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
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
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
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
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
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
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?
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?
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 )
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)
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 */
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 (==)
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)
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
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
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)
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)
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);
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
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
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;
30
• Spesso accade di voler scrivere molti
if annidati (alternative multiple):
if (...)fai qualcosa1;
elseif (…)
fai qualcosa2;
elseif(…)
Sequenze di if
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
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
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);