fondamenti di informatica
parte 4
appunti per la laurea in Ingegneria
Civile, Edile, Ambientale
a.a. 2005-2006
di
anna maria carminelli gregori
[email protected]
Ancora linguaggio C & C++
fond. di informatica 1 parte 4
1
Esercizi proposti
Ora che le frasi più importanti del C e C++ …
calcolo del M.C.D. e del m.c.m. di 2 interi;
//calcolo del M.C.D. di 2 numeri interi con
//algoritmo di Euclide: lettura di 2 interi dei quali uno
maggiore dell’altro e inizializza resto =1;
// Fintantochè il resto è diverso da 0 fai:
// { dividi il più grande (dividendo) per il più piccolo

(divisore)
// analizza il resto della divisione
// assegna al dividendo il valore del divisore ed al

divisore il valore del resto }
// Il divisore dell’ ultima divisione è il M.C.D.
2
Prima di proseguire
ancora qualche riflessione utile.
E’ gia’ stato detto che lo schema di flusso puo’
essere di notevole aiuto quando la logica del
programma da costruire non e’ semplice. Altrimenti
puo’ bastare indicare nei commenti gli obiettivi nel
linguaggio naturale (pseudocodice).
Se nel tema dell’ esame (applicativo) gli obiettivi
sono posti con la stesura stessa (come appare
anche dal testo seguente relativo all’ esame del
17.10.2000) lo schema di flusso non occorre e non
e’ richiesto.
3
Tema del 17.10.2000
Scrivere in C++ un programma,
strutturato in sottoprogrammi, che letti da
tastiera 3 dati numerici, positivi e ciascuno <1
_ ne valuti il minimo e il massimo;
_ se il minimo e’ inferiore a 0.25 proceda a
moltiplicare per 1.1 i dati e a rivalutarne il
minimo e il massimo, ripetendo tali operazioni
fintantoche’ il minimo risulti maggiore o
uguale a 0.25;
(segue)
fond. di informatica 1 parte 4
4
Tema ...
_ visualizzi sul video o i dati modificati,
 o la stringa ”Non occorre modificare i valori letti”;
_ (memorizzi in una tabella in Memoria
Centrale e) visualizzi sul video i dati originali.
N.B. E' SCONSIGLIATO L' USO DI VARIABILI
GLOBALI.
L’ uso delle tabelle sara’ mostrato +oltre quindi
nell’ ultima domanda attualmente e’ considerata
solo la richiesta di visualizzazione.
fond. di informatica 1 parte 4
5
Considerazioni e ...
I 3 dati numerici, sono positivi e ciascuno <1:
per memorizzarli occorreranno 3 variabili di tipo
…. Di questi 3 dati si deve valutare il minimo e
il massimo, NON l’ ordinamento !
Per valutare il minimo occorre considerare una
variabile dello stesso tipo dei dati e chiamarla
per esempio min. Per il massimo la variabile
dello stesso tipo sara’ max.
La rivalutazione del minimo implica un
procedimento iterativo che si puo’ realizzare
con una funzione contenente la frase while.
fond. di informatica 1 parte 4
6
<condizione>
Nella sintassi delle frasi if, while et similia
compare una condizione o asserzione logica
che puo’ essere vera (True) o falsa (False).
Sono due possibili valori di stato che vengono
assunti da una qualsiasi asserzione logica nel
caso che essa si verifichi o no. Potendo
contrassegnare un’ asserzione logica con un
identificatore di variabile, questa assumera’
il valore vero se l’ asserzione logica si verifica,
falso in caso contrario. Pero’ il significato della
variabile diventa quello di una variabile logica
fond. di informatica 1 parte 4
7
Il discorso quindi
si apre verso una nuova direzione che e’ la
logica, trattata da molteplici studiosi ed autori
gia’ nel periodo greco-romano (1 es. Aristotele)
La logica matematica studia i possibili mezzi
matematici atti a descrivere la logica delle
proposizioni. Tra i suoi studiosi c’ e’ per
esempio il filosofo Leibnitz. Un logicomatematico molto importante e’ George Boole
che nel 1847 publico’ un trattato di logica
matematica che da lui prese il nome di Algebra
di Boole.
A questo tipo di algebra ci introducono anche:
fond. di informatica 1 parte 4
8
...
Gli operatori logici del C e
C++ :
Negazione not
!
Prodotto logico and
&&
Somma logica or
||
Il loro significato sara’ chiarito proprio dall’
algebra di Boole ed anche dall’ esempio
seguente che puo’ facilitarne l’ introduzione. L’
es. si riferisce al prg. project15 di programm4
che converte minuscole in maiuscole. La frase if
che li’ si usa e’ simile alla seguente:
fond. di informatica 1 parte 4
9
&& = and  e inoltre
if (car>=‘a’)
{if (car<=‘z’) putchar (car+’A’-’a’) }
else putchar (car);
Significato: se car e’ compreso nell’intervallo a-z allora
scrivi car dopo averlo convertito in maiuscolo se no
scrivilo cosi’ come e’. (Remember: A=6510 , a=9710 in
pratica è un cambiamento di scala.) Con gli operatori
logici la frase puo’ essere cosi’ riscritta:
 if ((car>=‘a’) && (car<=‘z’)) putchar (car+’A’-’a’)
else putchar (car); // 65=A________90=Z__97=a________121=z
come è in project23. Si deduce dunque che: …
fond. di informatica 1 parte 4
10
il collegamento tra
espressioni relazionali
puo’ avvenire con operatori logici in modo da
costruire espressioni logiche.
Preciso significato logico dell’ operatore && di
collegamento nell’esempio precedente:
se car >’a’ e inoltre car < ‘z’ allora convertilo.
L’ espressione car >’a’ && car < ‘z’ e’ di tipo
logico. Il C non prevedeva alcun tipo di dato logico e
occorreva usare il tipo int con i 2 valori 0 e 1 per
rappresentare 0 False (Falso) e 1 True (Vero). Il
C++ nelle ultime versioni, prevede il tipo bool per
rappresentare veriabili logiche. Vedere project71 in
programm2 dove ripeti è stata dichiarata variabile
logica ossia bool ripeti;
fond. di informatica 1 parte 4
11
Il significato
degli operatori logici del C e C++ e’ il seguente:
Negazione not
! => opposto di
Prodotto logico and && => e inoltre
Somma logica or
|| => oppure
Le costanti logiche True=Vero=1 e False=Falso=0
(che puo’ assumere ogni variabile e/o espressione
logica) sono tipiche dell’ algebra di Boole, non del
C dove venivano definite con
#define True 1 Queste definizioni appaiono
#define False 0 nei prg. per compatibilità col C
fond. di informatica 1 parte 4
12
Come tradurre costanti ed
operazioni dell’ A.d.B. in C++
Per prima cosa si considerano le costanti True e False.
In C++ la definizione esiste già, in C puo’ avvenire con
la direttiva al precompilatore già vista:
#define True 1 // in C basta che sia positiva  0
#define False 0
Stabilito che True = 1 si capisce il significato del ciclo
infinito while(1) ed anche alcune condizioni del tipo:
if (ripeti) cout<< “ch”; ….
O NO ? Se NO cfr. programm1 e provare
13
True e False
sono le 2 uniche costanti logiche dell’ algebra
di Boole con valori: False=0 True 0 posta = 1
Le variabili booleane o logiche sono simili alle
variabili numeriche usate nell’ algebra classica,
ma possono assumere solo questi 2 valori ossia
sono binarie. Oggetto dell’ algebra di Boole
sono insiemi di variabili con nomi diversi e
contenenti False = 0 o True =1.
Sulle 2 entita’ 0 e 1 si possono introdurre le 3
operazioni basilari dell’ algebra di Boole.
fond. di informatica 1 parte 4
14
Algebra di Boole
L’ idea di G. Boole era quella di automatizzare il
ragionamento umano. Punto di partenza del
suo discorso sono le proposizioni con significato
di osservazioni e/o ‘asserzioni logiche’. Es. Oggi
piove; Prendo un taxi; Sono ricco; Socrate e’ un
uomo; .…Di ciascuna di queste si puo’ dire che
e’ vera o falsa. (Quali altre non hanno questo
significato? Per es. le ingiunzioni: Non uscire!)
Ad ogni asserzione logica si puo' associare una
variabile a 2 valori (binaria) contenente uno dei
2 valori Vero o Falso, (True , False), 1 o 0. Si
tratta delle variabili booleane o logiche.
fond. di informatica 1 parte 4
15
Operazioni di base dell’
algebra booleana sono:
il prodotto logico o congiunzione = and ,
la somma logica o disgiunzione = or ,
la complementazione o negazione = not.
La definizione di ogni operazione avviene
tramite una tabellina: in quelle del prodotto e
della somma compaiono due variabili
indipendenti ed una variabile dipendente
che contiene il risultato; in quella della
negazione la variabile indipendente e’ solo
una come la variabile dipendente.
fond. di informatica 1 parte 4
16
Tabellina di Prodotto
(congiunzione
= and )
X
0
1
0
1
Y
0
0
1
1
XY
0
0
0
1
con X e Y var. indipend. e XY var. dipend.
Tabellina di Somma (disgiunzione = or )
X
0
1
0
1
Y
0
0
1
1
X+Y con X e Y var. indipend. e X+Y var. dipend.
0
1
ARITMETICA ELEMENTARE, MA PARTICOLARE
1
perche’ 1 e’ il tetto oltre il quale non si va !!!
1
fond. di informatica 1 parte 4
17
Tabellina di negazione e …
funzioni elementari !
A
0
1
not (A)=Ā
1
0
con A var. indipend. e not(A) var. dipend.
not (A) e’ indicata anche con A barrato
ossia A negato o -A
Ogni operazione puo’ essere considerata come
una funzione elementare di 1 o 2 variabili
G.Boole, evidenziando la correlazione tra le
var. binarie e le proposizioni logiche associabili
ad esse, sottolinea come anche le operazioni
booleane su tali proposizioni logiche assumono
un significato logico.
fond. di informatica 1 parte 4
18
Significato logico delle
operazioni booleane (esempi)
 Operazione logica congiunzione = and = . = ‘e inoltre’
 Piove Ho soldi Prendo taxi
 X
Y
X Y (come in algebra e’ omesso il . )
 0
0
0
 1
0
0
 0
1
0
 1
1
1
 Oper. logica complementazione Fa freddo Non Fa freddo
 se la var. vale 1 il risultato e’ 0
A
not (A)=Ā
“ “ “
“ 0 “ “
“ 1
0
1

1
0
fond. di informatica 1 parte 4
19
Operazioni algebriche ==>
operazioni logiche
 Operazione logica disgiunzione = or = + = ‘oppure’
 Piove Fa fresco Metto impermeabile
 X
Y
X+Y
 0
0
0
 1
0
1
 0
1
1
 1
1
1
Altro esempio: sia b = oggi piove ed e’ tempo brutto;

c = oggi e’ tempo bello;
se b = true (=1) deve essere c = false (=0) e
viceversa, e poi non puo’ essere che sia b=c=true
fond. di informatica 1 parte 4
20
Conclusioni:
1a conclusione: l’ A.d.B. definisce operazioni di
tipo matematico che permettono di interpretare
operazioni logiche;
2a conclusione: gli operatori dell’ A.d.B. possono
effettuare automaticamente le proposizioni
logiche tipiche dell’ intelligenza umana … primo
passo verso la programmazione logica (Prolog);
3a conclusione: data la semplicita’ dell’ A.d.B. e’
possibile l’ automazione dei suoi calcoli con
circuiti elettronici.
fond. di informatica 1 parte 4
21
Gli operatori logici del C e
C++
(come gia’ visto) collegano le variabili logiche o le
espressioni relazionali e permettono di ottenere cosi’
un’ espressione logica.
Complementazione not !
Prodotto logico and
&&
Somma logica or
||
Es. di uso in project23 di programm4.
Con questi operatori o simili, ma di uguale significato,
il C, C++ e gli altri linguaggi di programmazione come
il Pascal, il Basic, ... possono essere usati per costruire
programmi con analisi di tipo logico (per es. gli Expert
System per le diagnosi automatiche.)
fond. di informatica 1 parte 4
22
A proposito della variabile
logica da usare in project22…
riprendermo il discorso non alla
fine di parte 4

fond. di informatica 1 parte 4
23
A.d.B. e dualita’
L’ A.d.B. si puo’ definire in modo molto rigoroso
introducendo il concetto di reticolo caro ai
matematici. In questo approccio elementare si
introdurrano le Proprieta’ degli elementi, degli
operatori logici e delle operazioni logiche.
a) l’ elemento 0 si dice duale dell’ elemento 1, l’
operatore + duale dell’ operatore . e vale la
seguente legge di dualita’:
b) da qq. identita’ booleana se ne puo’ trarre
un’ altra per dualita’ sostituendo i rispettivi
duali agli elementi 0 e 1 ed a ogni operatore.
fond. di informatica 1 parte 4
24
c) proprieta’ delle operazioni
logiche: si dimostrano con
tabelline dette tabelle di verita’ e si possono
estendere a n variabili.
1) associativa della somma:
 (A+B)+C = A+(B+C)
NOTA: la somma di 2 o piu’ variabili assume il valore 0
solo se tutte la var. sono 0 e assume 1 negli altri casi
2) associativa del prodotto:
 (A B)C = A(BC)
NOTA: il prodotto di 2 o piu’ variabili assume il val. 1
solo se tutte la var. sono 1 e assume 0 negli altri casi
25
Proprieta’ delle operazioni
dell’ Algebra di Boole
3)

4)

5)

doppia negazione:
not (not A) = A
distributiva del prodotto:
A (B+C) = AB + AC
distributiva della somma:
A+(BC) = (A+B)(A+C) (piove o (c’e’ vento e inoltre
fa freddo) = (piove o c’e’ vento) e inoltre (piove o fa freddo))
6) assorbimento
 AA = A
A+A = A
7) proprieta’ del complemento: A+Ā =1
fond. di informatica 1 parte 4
26
Proprieta’ fondamentali &
Legge di de Morgan:
not (A+B) = not(A)not(B) il negato della somma
logica = prodotto dei negati (ossia il negato di piove
o fa fresco = non piove e inoltre non fa fresco)
 duale: not(AB) = not(A) + not(B)
Fa comodo per le esclusioni, per es. se si vuole inviare
posta in UE, ma non in Belgio né in Francia, si può
scrivere in entrambi i modi seguenti:
if ( !(stato== “Belgio” || stato==“Francia”) ) invia(p);
if (!(stato== “Belgio”) && !(stato==“Francia”))inv(p);
Altro esempio in project233 programm4 e di
seguito.
fond. di informatica 1 parte 4
27
main ()
{ /* Inizio programma */

char car;

cout<<"\ndammi un carattere:";

while ((car = getchar()) != EOF)

{
//not( A
+
B
)
//if (( car >= 'f') && ! ((car >= 't')||(car == 'h')))putchar(car);
if (( car >= 'f')&& !(car >= 't')&& !(car == 'h'))
 putchar(car); //not A
and not B

}
 return 0;
} /* Fine programma */
fond. di informatica 1 parte 4
28
Saltare fino a 30
de Morgan (continua)
Legge di de Morgan estesa: (chiarisce la
dualita’ )
se in un’ espressione booleana si
sostituisce ogni variabile col suo
complemento, ogni operatore + con
l’operatore prodotto, ogni operatore
prodotto con l’operatore + si ottiene il
complemento dell’ espressione data.
fond. di informatica 1 parte 4
29
Applicazione alla
legge di de Morgan duale che e’:
not(AB) = not(A) + not(B) (il negato del
prodotto = somma dei negati)
Se in not(AB) (1o menbro) si sostituisce
A con not(A), B con not(B) e l’ operatore . con
+ si ottiene:
not(not(A) + not(B)) ossia il complemento di
not(A) + not(B) (2o menbro) che e’ uguale a
not(AB)!! quindi il complemento di not(AB)=AB,
o come si indichera’ tra 2 diapo, nand(AE) = (Ā+Ē).
fond. di informatica 1 parte 4
30
Operazioni algebriche ==>
circuiti logici
Come si e’ gia’ visto, ogni operazione
eseguibile su variabili booleane (somma,
prodotto, complementazione ed altre da
queste deducibili) puo' essere definita tramite
una tabella con variabili indipendenti e
dipendenti detta tabella di verita’ .
E per ciascuna di queste tabelle di verita'
esiste il corrispondente circuito elementare
…=>Importanza delle tabelle di verita’
fond. di informatica 1 parte 4
31
Tabelle di verita’ delle
Operazioni fondamentali
Meo 1 lez.9 e
seg.
che sono: not

or

and
ed anche: xor
or esclusivo

nand
and negato

nor
or negato
Per le relative tabelle ed i corrispondenti circuiti
elementari (detti porte logiche = gate) vedere
la diapo seguente tratta dal Bishop.
fond. di informatica 1 parte 4
32
fond. di informatica 1 parte 4
33
Realizzazione circuitale del
calcolo binario
Per rappresentare grandezze binarie si usa di
norma la tensione elettrica come grandezza di
riferimento con valori convenzionali: alto =1
basso =0.
Un circuito elettronico elementare che
rappresenti un’ operazione dell A.d.B. e’ detto
porta (gate). Esso riceve in ingresso uno o due
impulsi elettrici da 1 o da 2 punti di ingresso e
fornisce 1 uscita nel punto di uscita: le tensioni sui 2
punti di ingresso rappresentano i valori delle
variabili indipendenti; la tensione sul punto di
uscita il valore della variabile dipendente.
fond. di informatica 1 parte 4
34
Grafici dei circuiti elementari
= porte
I simboli dei circuiti elementari (porte)
riportati in diapo 34 sono tratti dal Bishop.
In ogni circuito elettronico di E.E. sono
utilizzate le porte.
I circuiti logici ottenuti combinando le
porte logiche corrispondono a funzioni
dell’ A.d.B. e si dicono circuiti
combinatori.
 SALTARE FINO A DIAPO 42 compresa
fond. di informatica 1 parte 4
35
Funzioni di variabili booleane
SALTARE FINO A DIAPO 42
Con solo 2 valori discreti (e non un' infinita'
di valori continui come 0.001, 0.011, 0.111 …
0.990 ...) anche le Funzioni dell’ A.d.B. si
possono rappresentare in forma tabellare.
 Per esempio siano 2 variabili booleane A, E col significato di:
 A = oggi piove; E = ho l' ombrello; la funzione f(A,E) (col
significato di: f(A,E) = esco in auto), si potra' scrivere cosi’:
A E
f(A,E)
0
0
0
oggi piove=ho l’ombrello=esco in auto=falso
1
0
1
“
“ vero “ “
falso “
“ “ vero
0
1
0
etc.
1
1
1
fond. di informatica 1 parte 4
36
Tabelle di verita' delle f(x,y)
La tabella precedente e' la tabella di verita'
della funzione f(A,E). La sua espressione
booleana si costruisce "elencando" tutte le
condizioni che portano f(A,E) ad assumere
valore VERO.
Nell’ esempio: f(A,E) e’ vera (ossia esco in
auto) se A e’ vera e inoltre E e’ falsa (oggi
piove e non ho l’ ombrello) oppure se A e’ vera
e inoltre E e’ vera (oggi piove e inoltre ho l’
ombrello). ANCHE: f(A,E) e’ vera se:
A e’ vera e inoltre Ē e’ vera
oppure se A e inoltre E sono vere.
fond. di informatica 1 parte 4
37
L’ espressione booleana di f
e’ quindi: f(A,E) = AĒ + AE = A(Ē+E) = A
Questo e’ il modo di costruire l’ espressione
booleana di una qualunque funzione f(X,Y,Z …)
dove X, Y, Z… sono variabili booleane
(L’ "elenco" di tutte le condizioni che portano f
ad assumere SOLO il valore VERO =1, e’
costruito con le righe della tabella di verita’ in
cui f=1: su ogni riga le variabili sono legate da
operatori and mentre le righe sono legate da
operatori or).
fond. di informatica 1 parte 4
38
Semplificazione
L’ espressione ottenuta puo’ poi essere
tradotta in un circuito logico equivalente: se
pero’ non e’ semplice e’ meglio
semplificarla applicando le fondamentali
proprieta’ dell' algebra di Boole.
Si arriva ad un' espressione booleana
semplificata che si traduce in un circuito
logico piu’ semplice e quindi piu’
economico di quello che si otterrebbe
utilizzando l' espressione non semplificata.
fond. di informatica 1 parte 4
39
Esempio:
A
E
U
f
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
1
1
0
0
0
1
0
1
A parole:
f e’ VERA se A,E,U sono
tutte FALSE oppure se
A e E sono FALSE e
inoltre U e’ VERA
oppure se A,E,U sono
tutte VERE oppure se A
e inoltre U sono VERE
e inoltre E e’ FALSA.
fond. di informatica 1 parte 4
40
Semplificazione
L' espressione booleana corrispondente e’:
f= ĀĒŪ + ĀĒU + AĒU + AEU
1a espressione da
semplificare
1o passo ĀĒŪ + ĀĒU = ĀĒ (Ū+U) = ĀĒ proprieta’ dist.
del prodotto e del complemento (U+ Ū)=1
2o passo AĒU + AEU = AU(E+Ē) = AU proprieta’ dist.
del prodotto e del complemento (E+Ē)=1
...
Quindi:
f
f= ĀĒ + AU .
..
fond. di informatica 1 parte 4
41
Il circuito corrispondente
(molto piu’ semplice di quello relativo all’
espressione non semplificata) e’ elementare:
i 2 segnali A e U entrano direttamente in una
porta and mentre i segnali A e E prima di
entrare in una porta and devono essere
complementati o possono entrare direttamente
in una porta nor. Riflettere su questo: per
quale legge ? Le uscite delle 2 porte and e nor
entrano poi in una porta OR da cui esce il
segnale risultante, valore della f(A,E,U).
fond. di informatica 1 parte 4
42
Conclusioni:
 i circuiti logici che si ottengono combinando le porte
logiche, corrispondono a funzioni dell' algebra booleana
ciascuna caratterizzata da una Tabella di Verita’ e
rappresentata da un' espressione che si semplifica usando
le relazioni fondamentali, per es. la proprieta’ distributiva
del prodotto: A(B+C) = AB + AC; o la proprieta’
distributiva della somma: A+(BC) = (A+B)(A+C); (fa
freddo o (nevica e piove)) o anche usando la proprieta’
di assorbimento:
 A+A = A; AA = A
 o le leggi di de Morgan, di dualita’ … tutte le leggi dell’
A.d.B.
fond. di informatica 1 parte 4
43
Circuiti logici Combinatori:
smemorati
I Circuiti logici Combinatori che si
ottengono combinando le porte logiche,
corrispondono a funzioni dell' algebra booleana
ed hanno la caratteristica di essere
"smemorati":
i valori di uscita sono funzione dei soli valori di
ingresso in un dato istante.
fond. di informatica 1 parte 4
44
Altro tipo di circuiti logici
sono i circuiti sequenziali
con memoria: i valori di uscita sono funzione dei valor
di ingresso e dello Stato del circuito.
Per Stato di un sistema si intende in generale il valore
della situazione in cui il sistema si trova.
Esempio del prof. Mezzalama e’ il sistema "apriporta” a
2 Stati: porte aperte-porte chiuse e relativi
comportamenti diversi.
Esempio tipico di Circuiti Combinatori e’ il
Decodificatore; Esempio tipico di Circuiti Sequenziali
e’ il Registrino di Memoria detto Flip-Flop.
Tutti questi Circuiti si trovano nella CPU di E.E.
SALTARE FINO A DIAPO 55 compresa
45
Decodificatori SALTARE FINO A
DIAPO 55
Per la conversione dei dati da un formato all'
altro sono necessari appositi DECODIFICATORI.
Un semplice esempio di DECODIFICATORE
elementare e’ formato da un circuito con 2
morsetti di ingresso (su cui scrivere un codice
da 0 a 3) e 4 morsetti di uscita di cui solo uno
deve essere attivo in un certo istante. Il codice
scritto sui 2 morsetti di ingresso indica il
morsetto di uscita che si vuole rendere
attivo nell' istante considerato. Queste sono le
specifiche del circuito DECODIFICATORE.
fond. di informatica 1 parte 4
46
L’ esempio di decodificatore
presentato appare inizialmente come una
scatola nera qui sotto rappresentata che
per ogni segnale di input ha un segnale di
output.

A _____
______0_

______1_

E _____
______2_

______3_
fond. di informatica 1 parte 4
47
Sui morsetti di ingresso si
scrive un codice con:
segnale su: A
E

0
0
basso su A basso su E

0
1
"
" " alto " "

1
0
alto
" " basso " "

1
1
"
" " alto " "
Dei morsetti di uscita solo uno deve essere
attivo in un cero istante.
Il circuito attua quattro funzioni booleane
distinte.
fond. di informatica 1 parte 4
48
Per ciascuna funzione
booleana di uscita
si puo’ scrivere una tabella di verita’. Per es. per
l'uscita 0 si ha:
A
E
USC.0

0
0
1

0
1
0

1
0
0

1
1
0
Dalla prima riga della tabella si deduce: USC.0 = ĀĒ
quindi il DECODIFICATORE prima visto come una
scatola nera contiene al suo interno anche porte nor:
in una di queste entrano i segnali A ed E (teorema di
de Morgan).
fond. di informatica 1 parte 4
49
Sintesi di circuiti
Si e’ arrivati alla sintesi del circuito USC.0
tramite l' ispezione della tabella della verita’
che descrive la funzione logica USC.0 per ogni
combinazione di valori delle due variabili A e E.
E' questa una tecnica usata per la sintesi di
circuiti combinatori semplici; la sintesi di ogni
circuito combinatorio complesso si ottiene con
la descrizione delle funzioni (= operazioni) che
il circuito stesso deve realizzare. La descrizione
viene espressa in un linguaggio simile ad un
linguaggio di programmazione. (Corso di Reti
logiche)
fond. di informatica 1 parte 4
50
Perche’ ?
L’ispezione delle tabelle di verita’ che
descrivono funzioni logiche per ogni
combinazione di valori delle variabili di
ingresso, diventa pesante all’ aumentare
del numero N delle variabili. Il numero
delle righe di una tabella di N var. e’ pari a
2N (num. di combinazioni diverse) ossia di
tipo esponenziale e quindi al crescere di N
(= 10, 20, 30 ...) si deve usare un altro
metodo.
fond. di informatica 1 parte 4
51
Flip-Flop Set-Reset = FF_SR
Circuito elementare di memoria che memorizza
un BIT = BInary digiT = cifra binaria =>
informazione elementare
E’ realizzato con 2 porte nor retroazionate
come si vede nel grafico di Meo-Mezzalama
dove Q indica lo stato attuale del circuito.
E’ detto anche multivibratore bistabile …
Domanda: che tipo di circuito e’ ? Sequenziale!
fond. di informatica 1 parte 4
52
Q= STATO del SISTEMA
circuito FF_SR : o 0 o 1
Se in ingresso S = R = 0 risulta

se Q=0 allora not(Q)=1 e

Q restera’ 0

in uscita

se Q=1 allora not(Q)=0 e

Q restera’ 1
Il RISULTATO e’ diverso pur avendo lo stesso
ingresso: cio’ dipende dallo STATO del circuito
=> il valore di uscita e’ funzione dell’ ingresso e
inoltre dello STATO del circuito … sequenziale
fond. di informatica 1 parte 4
53
Altre situazioni:
 Se in ingresso S = 1 (SET) e R = 0 risulta:
se attualmente Q=0 allora nor(QS)=0=not(Q)

quindi Q = nor(not(Q)R) diventa 1;
0

0
invece se Q=1 allora nor(QS) = 0 = not(Q)

quindi Q = nor(not(Q)R) resta 1.
 Se in ingresso S = 0 e R =1 (RESET) risulta:
se attualmente Q=0 allora nor(QS)=1=not(Q)
quindi Q = nor(not(Q)R) resta 0; ed anche
se Q=1 nor(QS) = 0 = not(Q) quindi
Q=nor(not(Q)R) diventa 0. In definitiva: ...

0
1fond. di informatica 1
parte 4
54
FF_SR: 8 situazioni possibili =
4 input X 2 stati attuali (Q_ora)





X
0
1
0
1
Y nor(X+Y)
0
1
0
0
1
0
1
0
S R Q_ora Q_poi
0
0
0
0
0
1
0 S=R=0 no modifiche
1 Q_poi=Q_ora
1
1
0
0
0
1
1 S=1 forza Q_poi a 1
1
 0
 0
1
1
0
1
0 R=1 forza Q_poi a 0
0





 1 1
0
0 o 1 Ambiguita’ da
 1 1
1
0 o 1 togliere con
modifiche nella struttura (FF tipo D o55JK)
fond. di informatica 1 parte 4
La Dipendenza dal tempo
deve essere introdotta in tutti i circuiti
collegandovi il segnale di clock come ingresso
ulteriore: e’ il segnale periodico che cadenza il
funzionamento dei circuiti e permette la
sincronizzazione di tutte le operazioni.
Es. i Flip-Flop non sono usati singolarmente,
ma aggregati a gruppi di 4 o di 8 (=byte) o di
32 (registro). Le linee portanti l’ informazione
entrano in porte and col segnale di clock: le
uscite delle porte and diventano gli ingressi
dei Flip-Flop => Tutti FF sono temporizzati
nello stesso modo e sono attivi solo quando e’
attivo il segnale di clock.
fond. di informatica 1 parte 4
56
Memorie
I Flip-Flop vengono usati negli elementi di
memoria di E.E. ossia nella RAM e nei registri
della CPU.
La memoria principale o C.M. di E.E. (composta
con circuiti denominati RAM =Random Access
Memory) ha come parametri significativi il
tempo di ciclo TC e la capacita’ C (dimensione).
TC = intervallo tra la richiesta di un dato da
parte della CPU e la fine della risposta della
memoria che torna allo stato di ricezione.
fond. di informatica 1 parte 4
57
SRAM e DRAM:
sono 2 tipi di circuiti.

TC < 10 nsec
SRAM = Static RAM
C << C(DRAM)
+ veloci, ma + costose e
+ voluminose

.


TC < 50 nsec
DRAM = Dinamic RAM

C  20 Milioni di bit / chip
+ usate
Legenda: il chip e’ … il “nostro centopiedi”
fond. di informatica 1 parte 4
58
ROM (Read Only Memory)
Circuiti con informazione memorizzata in modo
permanente

1) programmabili 1 sola volta in fabbrica
Tipi 2) “
““
“
dall’ utente

3) cancellabili e riprogrammabili “ “
.
+volte
1) ROM, 2) PROM, 3) EPROM
fond. di informatica 1 parte 4
59
Emulazione della C.M.
Della C.M. di E.E. fu detto (parte 1) che nel
Modello di von Neumann la memoria e’ di tipo
lineare ossia: successione di locazioni
(posizioni, celle, byte, parole) numerate (e
quindi indirizzabili) sequenzialmente !
Problema1: sua emulazione con un programma
in C e C++.
Problema2: memorizzare le tavole dell’ A.d.B.
Soluzione: utilizzo di tabelle o array o altro ?
fond. di informatica 1 parte 4
60
Array
E’ un tipo di variabile composta, strutturata
Importante perche’ permette di:
mantenere in memoria un insieme di elementi
omogenei (dello stesso tipo, detto tipo base);
tutti presenti contemporaneamente, posti in
memoria consecutivamente a partire da un
indirizzo iniziale, ma accessibili in modo
casuale o diretto usando la loro posizione;
accessibili +volte tramite appositi indici interi
che in C e C++ assumono uno tra i valori
compresi in un dato intervallo a partire da 0 (a
cui corrisponde il primo elemento dell’ array);
Richiede un’ opportuna definizione in cui sia
61
dichiarata al compilatore la sua dimensione.
Esempi di definizione di array o
tabelle a + dimensioni in C++
int a[5] array monodimensionale o vettore di
5 componenti intere memorizzabili in:
a[0], a[1], a[2], a[3], a[4]. Necessario 1 indice
per individuare la componente iesima a[i]
float f[2][3] array bidimensionale o matrice
di 2 righe e 3 colonne memorizzabili in:
f[0][0], f[0][1], f[0][2], (tipo base=float)
f[1][0], f[1][1], f[1][2] Necessari 2 indici per
individuare la componente i,jesima f[i][j]
int c[2][3][4] array tridimensionale di tipo intero
62
(4 matrici di 2 righe e 3 col.: necess. 3 indici).
Possibili inizializzazioni:
In fase di compilazione:
float f[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
int g[100] = {7}; // si inizializza solo g[0]=7;
int dedo [] = { 2, 3};//inizializzazione obbligatoria:
NON c’ e’ dimensione => il compilatore la calcola
automaticamente in base al numero di valori di
inizializzazione: UNico caso ammesso senza dimension.
In fase di esecuzione con cicli a ripetizione notare:
es. for (i=0; i<5; i++) f[i] = (float) i ;
 for (i=0; i<100; i++) g[i] = 0;// g azzerata
fond. di informatica 1 parte 4
63
Creazione-stampa di vettori
Il primo esempio d’uso di vettori e’ in program5 il
project24 (qui di seguito) dove si notano i vettori tab e
cop dichiarati di MAX componenti o elementi. Il
vettore tab e’ creato nel main con un for mentre in
cop (non inizializzato) sono letti, con la procedura
leggi, e sempre con un for, i valori degli elementi del
vettore, uno dopo l’ altro; la sua copia e’ fatta nella
procedura copia, la visualizzazione nella procedura
scrivi;
in tutti i sottoprogrammi il passaggio di vettori (e
array in generale) e’ fatto per indirizzo.
fond. di informatica 1 parte 4
64
Uno spezzone di project24
#define MAX 2 // Dichiarazione dei Prototipi dei
MODULI usati
void attendi(); void scrivi(int*); void leggi (int []);
 void copia (int [],int []);
 main() /* Inizio Modulo principale */
 { int n, tab[MAX], cop[MAX]; /* definizione vettori
senza inizializzazione e INIZIO Parte esecutiva */
clrscr();

for (n=0; n<MAX; n++) //creazione di tab

tab[n] = MAX-n;
cout<<"\nho costruito tab e vado a scriverla"<<endl;
scrivi(tab);
// tab inizializzata
fond. di informatica 1 parte 4
65
continua
cout<<"\nnon ho costruito cop ma vado a
scriverla"<<endl;
scrivi(cop); // cop non inizializzata
cout<<"\nora vado a leggere cop"<<endl;
leggi (cop);
 cout<<"\nora vado a copiare cop in
tab"<<endl;

copia(tab,cop); // tab=cop

cout<<"\nho copiato cop in tab e vado a
scriverla"<<endl;

scrivi(tab); attendi(); return (0);
fond. di informatica 1 parte 4
66
Meo 1 lez. 37
Il nome del vettore o tabella e’
sinonimo dell’ indirizzo del primo elemento del
vettore => Si puo’ scrivere: float ris[10];
float *p; p=ris; /*oppure*/ p=&ris[0];
ris e’ un puntatore, ma costante perche’
sigillato a puntare sempre allo stesso vettore.
Es. char* puni =“sono un’ idea”; // puni e’
inizializzato con l’ indirizzo di s, ma poi avendo:
puni =“punto un oggetto”; // a puni si assegna
un altro indirizzo: quello di p.
Non si puo’ mai invece modificare l’ indirizzo
in ris, il contenuto
SI !!!
fond. di informatica 1 parte 4
67
Allocazione in memoria di tabelle
Sia: int tab[3] = {25, 53, 64};
tab nome ed indirizzo
Central Memory
iniziale della tabella;
tab
25
tab è “sinonimo“ di
10000;
25 và in tab[0]
53 “ “ tab[1]
64 “ “ tab[2]
da 1000C c’ è altro.
fond. di informatica 1 parte 4
53
64
altro
10000
10004
10008
1000C
11111
68
Esempi di vettori in...program5
PROBLEMA: calcolare la frequenza di caratteri
alfabetici contenuti in una frase terminante col
punto. Alla fine: visualizzare tutte le frequenze !=0
Progetto logico: n.o caratteri alfabeto ingl. =26;
n.ocontatori di frequenza=26=n.oelementi vett.
da inizializzare a zero; int freq[26]={0,0,… 0};
lettura e calcolo: fintantoche’ il carattere letto
non e’ il punto, aggiungi 1 all’ elemento che
indica la frequenza del carattere letto; poi fai la
visualizzazione. fond. di informatica 1 parte 4
69
Progetto logico: continua
Come si puo’ trovare questo elemento?
Nel vettore freq[26] si trova tramite l’ indice intero
corrispondente nel codice ASCII al carattere letto, ma:
‘A’=65; … ‘Z’=90; ‘a’=97; … ‘z’= 122
Occorre fare un cambiamento di scala ossia riportare i
valori dei codici ASCII nell’ intervallo 0-25
=> per i caratteri minuscoli basta fare: car_letto - ‘a’;
e poi incrementare il contatore freq[car_letto- ‘a’]++;
invece per i maiusc. occorre prima convertirli a minus.
con: car_letto = car_letto - ‘A’ + ‘a’ (cfr. project15-16)
e incrementare il contatore freq [car_letto-‘a’]++;
(come sopra).
fond. di informatica 1 parte 4
70
La visualizzazione
Si puo’ fare con un for dove la var. di controllo
e’ ancora il codice ASCII del carattere:
for (char ch = ‘a’; ch<=‘z’; ch++)
if (freq(ch- ‘a’) != 0) // sempre cambio-scala!
cout << “\nIl car.”<< ch<<“ ha la frequenza: ”
<< freq[ch- ‘a’];
Con questo progetto logico
fare il programma monoblocco prima e poi
strutturato a moduli.
fond. di informatica 1 parte 4
71
Non confondere stringhe
costanti con tabelle di caratteri
La stringa char *pst= “buonino”; e’ costante. C
e C++ la vedono come una sequenza di caratt.
terminanti con \0. Questo è il segnale di fine
stringa!!! Essa non e’ copiata in pst: a pst e’
assegnato l’ indirizzo del suo primo car. b.
Dovendo leggere o inizializzare una stringa di
caratteri qualunque e’ responsabilita’ del
programmatore riservarle adeguato spazio
in memoria. Una tabella (vettore) di caratteri
puo’ servire a questo scopo, ma non e’ l’ unica
soluzione.
fond. di informatica 1 parte 4
72
programma leggiora (prj25)
 /*Il programma lavora con stringhe.
 Dapprima usa la funzione sizeof ("IO") che ritorna la
dimensione di IO ossia il suo numero di caratteri che sarà 3
dato che ogni stringa termina con '/0';
 poi usa un puntatore a stringa che permette di visualizzare la
stringa, ma non il suo numero di caratteri;
 poi ancora in leggi chiede la stringa che deve leggere nell'
array ora.*/
 /* Variabili del main*/ char ora[15]; int n; char* ps ="bello";
 clrscr(); n = (int)sizeof("IO");
 cout<<"Numero di caratteri della stringa: "<<n<<endl;
 n= (int)sizeof(*ps);
 cout<<"Stringa puntata da ps: "<< ps
 <<" Numero di car. della stringa puntata da ps: "<<n;
 leggi(ora);
 scrivi(ora);
 attendi();
fond. di informatica 1 parte 4
73

return (0);
 void leggi(char time[])
 /* Legge una stringa con l'ora sulla riga:

variabile utilizzata che esce definita: time */
 { /*Inizio leggi */

int i;

printf ("\n srivimi l' ora: ");
// in C si scriverebbe gets(time), in C++
 cin.get(time,15); /* procedura del C++ per leggere
tutti i caratteri*/
 cout<<"\n sono in leggi: ";
 for (i=0; time[i]!='\0'; i++) // si noti la fine del for !!!
 cout<<(time [i]);
 } /* Fine leggi */ fond. di informatica 1 parte 4
74
Es. char riga[40];
Ogni elemento della tabella riga e’ di tipo char e quindi
disponibile a contenere un carattere.
Per assegnare una stringa di caratteri ad una tabella ci
sono varie possibilita’: leggercela da tastiera (e per un
es. di cio’ vedere il prg. project25 in program5) oppure
occorre copiare la stringa carattere per carattere …
Come? Cfr. diapo seguente! Ma intanto: per la lettura
di tutti i caratteri spazi bianchi compresi, in project25
(leggiora) si usa la funz. del C++ get(char*,...)
collegata al flusso cin ossia cin.get(char*,... ). (In C
cio’ si ottiene con la funz. gets() ).
fond. di informatica 1 parte 4
75
Copiare stringhe: oltre il prg.
project24 ecco la proc. strcp
void strcp(char *s, char *t) /* s, t: puntatori a
carattere e quindi a stringa; la proc. strcp copia
la stringa puntata da t in quella puntata da s */
{ while ((*s=*t) != ‘\0’) /*fintantoche’ il
contenuto di t assegnato alla cella puntata da s
e’ diverso da ‘\0’ (=fine stringa) fai*/
s++; t++}; // + sintetica ?!
{while (*s++=*t++);//perche’ manca !=‘\0’ ??
};
fond. di informatica 1 parte 4
76
Come si scrive una procedura?
L’ esempio precedente vuole mostrare anche
questo: fissati i parametri formali del
sottoprogramma basta scrivere il suo corpo
usandoli in modo corretto e coerente col
progetto logico fatto.
La procedura strcp potra’ essere attivata da
qualunque altro modulo usando come
parametri effettivi o puntatori a stringa o
nomi di vettori contenenti caratteri (cfr. es.)
Visti gli esempi modificare in project24 la proc.
copia in modo simile alla proc. strcp.
fond. di informatica 1 parte 4
77
Esempi
char *ps2,*ps1 = “stringa12”;
char s1[10], str[10]=“abcdefghi”;
strcp(str,ps1);//si puo’ strcp(ps2, s1)? Meglio NO
strcp(s1,str); // strcp(ps1,s1) puo’ dare errore;
Ricordare il significato del nome di un vettore(!)
(sinonimo dell’ indirizzo) e che le array sono sempre
trasmesse tra moduli per indirizzo come indicato nel
programma project24. Nel programma project28
invece si usano vettori nel main e in 2 o 3 procedure:
renderlo tutto modulare!
Attenzione poi al project27 che vuole ampliare array e
produce errore in esecuzione …!
Il più interessante è il project26 che ordina un vettore
di interi: usare lo stesso algoritmo (selezione descritto
nei commenti del programma) per ordinare un vettore
78
di caratteri. E … vedere fondinf5
Array a 2 dimensioni: sono
memorizzate per riga !
Sono sequenze di righe ossia di vettori riga;
il nome della matrice e’ sinonimo dell’ indirizzo
del primo elemento della matrice di indici [0][0]
che e’ anche l’ indirizzo del vettore prima riga;
l’ elemento i-esimo della prima riga e’ trovato dal
compilatore sommando a questo indirizzo la
lunghezza di ogni elemento moltiplicata per i-1 ;
la matrice e’ memorizzata per righe, una riga di
seguito all’ altra: l’ indirizzo del primo elemento
della seconda riga = indirizzo primo elemento della
prima riga + n.o colonne* lungh._elemento.
fond. di informatica 1 parte 4
79
Aritmetica dei puntatori
Meo 1 lez.38
La diapo precedente introduce all’ aritmetica dei
puntatori che viene utilizzata dal compilatore per
trovare un elemento di una matrice. Si noti come
sia necessario al compilatore conoscere la
lunghezza di una riga, ossia il numero delle
colonne, per ritrovare gli elementi delle righe
successive alla prima in modo corretto.
Nei programmi C e C++ pero’ i programmatori
potranno usare le indicazioni tipiche delle matrici
indicandone il nome seguito (tra parentesi quadre)
dagli indici dell’ elemento che vogliono usare. Cosi’
ai,j sara’ indicato con a[i][j], se i e j iniziano da 1,
o da a[i-1][j-1], se i e j iniziano da 0.
fond. di informatica 1 parte 4
80
Esempi di definizione di array
in C++
int a[2][5] array bidimensionale o matrice di 10
componenti intere memorizzabili in 2 righe di a:
prima riga: a[0][0], a[0][1]... a[0][4],
seconda riga: a[1][0], a[1][1]... a[1][4]
float f[2][3] array bidimensionale o matrice
di 2 righe e 3 colonne memorizzabili in:
f[0][0], f[0][1], f[0][2], (tipo base=float)
f[1][0], f[1][1], f[1][2]. Necessari 2 indici: es.
for (int i=0; i<2; i++)
 for (int j=0; j<3; j++) f[i][j]=0.0;
81
Precisazioni ed esercizi
Quando si usa un array a 2 dimensioni in un modulo
deve essere specificato il numero delle colonne
dell’ array (necessario perche’ il compilatore possa
calcolare gli indirizzi di inizio delle varie righe), mentre
il numero delle righe e’ ininfluente e puo’ essere
omesso.
Esempi in Program6: project29 letta una matrice,
esegue qualche calcolo e la passa alla procedura di
visualizzazione, project30 crea la Tavola Pitagorica
della moltiplicazione e la passa alla procedura di
visualizzazione.
Provare a fare procedure per: eseguire il prodotto, la
somma di matrici, data una matrice costruirne la
trasposta … e completare il tema in diapo 3-4.
fond. di informatica 1 parte 4
82
Uno spezzone di project29
 #define Max 8
 ….
 void terscrivi(int [][MAX-5]); //PROTOTIPI

void leggi(int [][MAX-5]);

void attendi();
 /*Il programma legge una matrice di interi e valuta
 la somma totale degli elementi e le somme parziali degli
elementi appartenenti ad ogni riga.
 main()
 {
 int tab[MAX][MAX-5];
 int ir,ic, som_rig, somma_tot;//ir indice di riga, ic di colonna

/* INIZIO Parte esecutiva */
clrscr();

/* Lettura tab */
leggi(tab);

/* Scrittura di tab */
terscrivi(tab);

/* Calcolo somme parziali delle righe e totale */
83

continua project29

somma_tot =0;

for (ir=0; ir<MAX; ir++)

{ som_rig =0;

for (ic=0; ic<MAX-5; ic++)

{ som_rig+=tab[ir][ic];

somma_tot+=tab[ir][ic]; }
 cout<<"\n somma parziale riga "<< ir <<" =
"<<som_rig; }

cout<<"\n somma totale ="<<somma_tot;

attendi(); return (0);
}
fond. di informatica 1 parte 4
84
void terscrivi (int pt[][MAX-5])
 /* pt =nome della matrice punta all' elemento di
testa dell' array di array*/
{/*Inizio terscrivi*/int ic,n; //n indice di riga, ic di colonn
 cout<<"\narray di array:"; cout<<" indirizzo pt
(terscrivi) "; cout<<pt;
printf ("\n valori della tabella per righe (terscrivi) \n");

for (n=0; n<MAX; n++)

{ for (ic=0; ic<MAX-5; ic++)

cout<< pt[n][ic]<<" ";

cout<< "\n"; }
 } /* Fine terscrivi*/
85
void leggi(int m[][MAX-5]) /* m =nome della matrice
in questa procedura
 { /* Inizio leggi */ int ic,n; //n indice di riga, ic di
colonna
cout<<"\n dammi i valori della tabella per righe";
 for (n=0; n<MAX; n++)

{
cout<<"\n dammi i MAX-5 valori di riga n="<< n<<" ";

for (ic=0; ic<MAX-5; ic++)
 cin>> m[n][ic]; /*al primo giro legge m[0][0]
m[0][1] m[0][2] */

}// fine for su ic lettura riga
 }// fine leggi
fond. di informatica 1 parte 4
86
A proposito della variabile logica da usare in
project22…
riprendermo il
discorso
nella parte 5

fond. di informatica 1 parte 4
87
Scarica

Fond4 - UniNa STiDuE