Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAugostino Costantini Modificato 11 anni fa
1
fond. di informatica parte 41 fondamenti di informatica parte 4 appunti per la laurea in Ingegneria Civile, Edile, Ambientale a.a. 2005-2008 di anna maria carminelli gregori carmin@units.it Ancora linguaggio C & C++
2
fond. di informatica parte 42 Esercizi proposti zOra che le frasi più importanti del C e C++ … zcalcolo del M.C.D. e del m.c.m. di 2 interi; z//calcolo del M.C.D. di 2 numeri interi con z//algoritmo di Euclide: leggi 2 interi dei quali uno maggiore dellaltro e inizializza resto =1; z// Fintantochè il resto è diverso da 0 fai: z// { dividi il più grande (dividendo) per il più piccolo z (divisore) z// analizza il resto della divisione z// assegna al dividendo il valore del divisore ed al z divisore il valore del resto } z// Il divisore dell ultima divisione è il M.C.D.
3
fond. di informatica parte 43 Prima di proseguire zancora qualche riflessione utile. zE 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). zSe 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.
4
fond. di informatica parte 44 Tema del 17.10.2000 zScrivere in C++ un programma, strutturato in sottoprogrammi, che letti da tastiera 3 dati numerici, positivi e ciascuno <1 z_ ne valuti il minimo e il massimo; z_ 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; z(segue)
5
fond. di informatica parte 45 Tema... z_ visualizzi sul video o i dati modificati, z o la stringa Non occorre modificare i valori letti; z_ (memorizzi in una tabella in Memoria Centrale e) visualizzi sul video i dati originali. zN.B. E' SCONSIGLIATO L' USO DI VARIABILI GLOBALI. zL uso delle tabelle sara mostrato +oltre quindi nell ultima domanda attualmente e considerata solo la richiesta di visualizzazione.
6
6 Considerazioni e... zI 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 ! zPer valutare il minimo occorre considerare una variabile dello stesso tipo dei dati, chiamarla per esempio min ed inizializzarla a…?. Per il massimo la variabile dello stesso tipo sara max. zLa rivalutazione del minimo implica un procedimento iterativo che si puo realizzare con una funzione contenente la frase while.
7
fond. di informatica parte 47 zNella 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
8
fond. di informatica parte 48 Il discorso quindi zsi apre verso una nuova direzione che e la logica, trattata da molteplici studiosi ed autori gia nel periodo greco-romano (1 es. Aristotele) zLa 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 logico- matematico molto importante e George Boole che nel 1847 publico un trattato di logica matematica che da lui prese il nome di Algebra di Boole. zA questo tipo di algebra ci introducono anche:...
9
fond. di informatica parte 49 Gli operatori logici del C e C++ : zNegazione not ! zProdotto logico and && zSomma logica or || zIl 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 lì si usa e simile alla seguente:
10
fond. di informatica parte 410 && = and e inoltre zif (car>=a) z{if (car<=z) putchar (car-a +A) } zelse putchar (car); zSignificato: se car e compreso nellintervallo a-z allora scrivi car dopo averlo convertito in maiuscolo se no scrivilo cosi come e. (Remember: A=65 10, a=97 10 in pratica è una traslazione nella scala dei codici.) Con gli operatori logici la frase puo essere cosi riscritta: zif ((car>=a) && (car<=z)) putchar (car+A-a) zelse putchar (car); // 65=A________90=Z__97=a________121=z zcome è in project23. Si deduce dunque che: …
11
fond. di informatica parte 411 il collegamento tra espressioni relazionali zpuo avvenire con operatori logici in modo da costruire espressioni logiche. zPreciso significato logico dell operatore && di collegamento nellesempio precedente: zse car >a e inoltre car < z allora convertilo. zL 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 variabili logiche. Vedere project71 in programm2 dove ripeti è stata dichiarata variabile logica ossia bool ripeti;
12
fond. di informatica parte 412 Il significato zdegli operatori logici del C e C++ e il seguente: zNegazione not ! opposto di zProdotto logico and && e inoltre zSomma logica or || oppure zLe 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 z#define True 1 z#define False 0 zQueste definizioni appaiono nei prg. per compatibilità col C
13
fond. di informatica parte 413 Come tradurre costanti ed operazioni dell A.d.B. in C++ zPer 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: z#define True 1 // in C basta che sia positiva 0 z#define False 0 zStabilito che True = 1 si capisce il significato del ciclo infinito while(1) ed anche alcune condizioni del tipo: if (ripeti) cout<< ch; …. zO NO ? Se NO cfr. programm1 e provare
14
fond. di informatica parte 414 True e False zsono le 2 uniche costanti logiche dell algebra di Boole con valori: False=0 True 0 posta = 1 zLe 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. Basandosi su questi 2 valori False e True si introducono le 3 operazioni basilari dell algebra di Boole.
15
fond. di informatica parte 415 Algebra di Boole zL 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!) zAd 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.
16
fond. di informatica parte 416 Operazioni di base dell algebra booleana sono: zil prodotto logico o congiunzione = and, zla somma logica o disgiunzione = or, zla complementazione o negazione = not. zLa 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.
17
fond. di informatica parte 417 Tabellina di Prodotto (congiunzione = and ) zX Y X Y con X e Y var. indipend. e X Y var. dipend. z0 0 0 z1 0 0 z0 1 0 z1 1 1 Tabellina di Somma (disgiunzione = or ) zX Y X+Y con X e Y var. indipend. e X+Y var. dipend. z0 0 0 z1 0 1 ARITMETICA ELEMENTARE, MA PARTICOLARE z0 1 1 perche 1 e il tetto oltre il quale non si va !!! z1 1 1
18
fond. di informatica parte 418 Tabellina di negazione e … funzioni elementari ! zA not (A)=Ā con A var. indipend. e not(A) var. dipend. z0 1 not (A) e indicata anche con A barrato z1 0 ossia A negato o -A zOgni operazione puo essere considerata come una funzione elementare di 1 o 2 variabili zG.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.
19
fond. di informatica parte 419 Significato logico delle operazioni booleane (esempi) zOperazione logica congiunzione = and =. = e inoltre zPiove Ho soldi Prendo taxi z X Y X Y (come in algebra e omesso il. ) z 0 0 0 z 1 0 0 z 0 1 0 z 1 1 1 zOper. logica complementazione Fa freddo Non Fa freddo zse la var. vale 1 il risultato e 0 A not (A)=Ā z 0 1 0 1 z 1 0
20
fond. di informatica parte 420 Operazioni algebriche ==> operazioni logiche zOperazione logica disgiunzione inclusiva = or = + = oppure zPiove Fa fresco Metto impermeabile z X Y X + Y z 0 0 0 z 1 0 1 z 0 1 1 z 1 1 1 zAltro esempio: sia b = oggi piove ed e tempo brutto; z c = oggi e tempo bello; zse b = true (=1) deve essere c = false (=0) e viceversa, e poi non puo essere che sia b=c=true z
21
fond. di informatica parte 421 Conclusioni: z1 a conclusione: l A.d.B. definisce operazioni di tipo matematico che permettono di interpretare operazioni logiche; z2 a conclusione: gli operatori dell A.d.B. possono effettuare automaticamente le proposizioni logiche tipiche dell intelligenza umana … primo passo verso la programmazione logica (Prolog); z3 a conclusione: data la semplicita dell A.d.B. e possibile l automazione dei suoi calcoli con circuiti elettronici.
22
fond. di informatica parte 422 Gli operatori logici del C e C++ z(come gia visto) collegano le variabili logiche o le espressioni relazionali e permettono di ottenere cosi un espressione logica. zComplementazione not ! zProdotto logico and && zSomma logica or || zEs. di uso in project23 di programm4. zCon 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.)
23
fond. di informatica parte 423 A proposito della variabile logica da usare in project22… riprendermo il discorso, ma non in parte 4 z
24
fond. di informatica parte 424 A.d.B. e dualita zL 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. za) l elemento 0 si dice duale dell elemento 1, l operatore + duale dell operatore. e vale la seguente legge di dualita: zb) 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.
25
fond. di informatica parte 425 c) proprieta delle operazioni logiche: si dimostrano con ztabelline dette tabelle di verita e si possono estendere a n variabili. z1) associativa della somma: z (A+B)+C = A+(B+C) zNOTA: la somma di 2 o piu variabili assume il valore 0 solo se tutte la var. sono 0 e assume 1 negli altri casi z2) associativa del prodotto: z (A B)C = A(BC) zNOTA: il prodotto di 2 o piu variabili assume il val. 1 solo se tutte la var. sono 1 e assume 0 negli altri casi
26
fond. di informatica parte 426 Proprieta delle operazioni dell Algebra di Boole z3) doppia negazione: z not (not A) = A z4) distributiva del prodotto: z A (B+C) = AB + AC z5) distributiva della somma: z A+(BC) = (A+B)(A+C) (piove o (ce vento e inoltre fa freddo) = (piove o ce vento) e inoltre (piove o fa freddo)) z6) assorbimento z AA = A A+A = A z7) proprieta del complemento: A+Ā =1
27
fond. di informatica parte 427 Proprieta fondamentali & Legge di de Morgan: znot (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) zduale: not(AB) = not(A) + not(B) zFa 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: zif ( !(stato== Belgio || stato==Francia) ) invia(p); zif (!(stato== Belgio) && !(stato==Francia))inv(p); zAltro esempio in project233 programm4 e di seguito.
28
fond. di informatica parte 428 zmain () z{ /* Inizio programma */ zchar car; zcout<<"\ndammi un carattere:"; zwhile ((car = getchar()) != EOF) z{ //not( A + B ) //if (( car >= 'f') && ! ((car >= 't')||(car == 'h')))putchar(car); zif (( car >= 'f')&& !(car >= 't')&& !(car == 'h')) z putchar(car); //not A and not B z } z return 0; z} /* Fine programma */
29
fond. di informatica parte 429 Saltare fino a 30 compresa de Morgan (continua) zLegge di de Morgan estesa: (chiarisce la dualita ) zse in un espressione booleana si sostituisce ogni variabile col suo complemento, ogni operatore + con loperatore prodotto, ogni operatore prodotto con loperatore + si ottiene il complemento dell espressione data.
30
fond. di informatica parte 430 Applicazione alla zlegge di de Morgan duale che e: znot(AB) = not(A) + not(B) (il negato del prodotto = somma dei negati) zSe in not(AB) (1 o menbro) si sostituisce zA con not(A), B con not(B) e l operatore. con + si ottiene: znot(not(A) + not(B)) ossia il complemento di not(A) + not(B) (2 o menbro) che e uguale a not(AB)!! quindi il complemento di not(AB)=AB, zo come si indichera tra 2 diapo, nand(AE) = (Ā+Ē).
31
fond. di informatica parte 431 Operazioni algebriche ==> circuiti logici zCome 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. zE per ciascuna di queste tabelle di verita' esiste il corrispondente circuito elementare …=>Importanza delle tabelle di verita
32
fond. di informatica parte 432 Tabelle di verita delle Operazioni fondamentali zche sono: not z or z and zed anche: xor or esclusivo (o piove o è bello) z nand and negato z nor or negato zPer le relative tabelle ed i corrispondenti circuiti elementari (detti porte logiche = gate) vedere la diapo seguente tratta dal Bishop. zMeo 1 lez.9 e seg.
33
fond. di informatica parte 433
34
fond. di informatica parte 434 Realizzazione circuitale del calcolo binario zPer rappresentare grandezze binarie si usa di norma la tensione elettrica come grandezza di riferimento con valori convenzionali: alto =1 basso =0. zUn 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.
35
fond. di informatica parte 435 Grafici dei circuiti elementari = porte zI simboli dei circuiti elementari (porte) riportati in diapo 33 sono tratti dal Bishop. zIn ogni circuito elettronico di E.E. sono utilizzate le porte. zI circuiti logici ottenuti combinando le porte logiche corrispondono a funzioni dell A.d.B. e si dicono circuiti combinatori. z SALTARE FINO A DIAPO 42 compresa
36
fond. di informatica parte 436 Funzioni di variabili booleane Saltare fino a DIAPO 42 compresa zCon 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. zPer esempio siano 2 variabili booleane A, E col significato di: zA = oggi piove; E = ho l' ombrello; la funzione f(A,E) (col significato di: f(A,E) = esco in auto), si potra' scrivere cosi: zA E f(A,E) z0 0 0 oggi piove=ho lombrello=esco in auto=falso z1 0 1 vero falso vero z0 1 0 etc. z1 1 1
37
fond. di informatica parte 437 Tabelle di verita' delle f(x,y) zLa 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. zNell 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.
38
fond. di informatica parte 438 L espressione booleana di f ze quindi: f(A,E) = AĒ + AE = A(Ē+E) = A zQuesto e il modo di costruire l espressione booleana di una qualunque funzione f(X,Y,Z …) dove X, Y, Z… sono variabili booleane z(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).
39
fond. di informatica parte 439 Semplificazione zL 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. zSi 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.
40
fond. di informatica parte 440 Esempio: zA E U f z0 0 0 1 z0 0 1 1 z0 1 0 0 z0 1 1 0 z1 0 0 0 z1 0 1 1 z1 1 0 0 z1 1 1 1 z A parole: z 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.
41
fond. di informatica parte 441 Semplificazione zL' espressione booleana corrispondente e: zf= ĀĒŪ + ĀĒU + AĒU + AEU 1 a espressione da semplificare z1 o passo ĀĒŪ + ĀĒU = ĀĒ (Ū+U) = ĀĒ proprieta dist. del prodotto e del complemento (U+ Ū)=1 z2 o passo AĒU + AEU = AU(E+Ē) = AU proprieta dist. del prodotto e del complemento (E+Ē)=1 zQuindi: zf= ĀĒ + AU zfzf z...
42
fond. di informatica parte 442 Il circuito corrispondente z(molto piu semplice di quello relativo all espressione non semplificata) e elementare: zi 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).
43
fond. di informatica parte 443 Conclusioni: zi 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 può semplificare 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: zA+A = A; AA = A zo le leggi di de Morgan, di dualita … tutte le leggi dell A.d.B.
44
fond. di informatica parte 444 Circuiti logici Combinatori: smemorati zI Circuiti logici Combinatori che si ottengono combinando le porte logiche, corrispondono a funzioni dell' algebra booleana ed hanno la caratteristica di essere "smemorati": zi valori di uscita sono funzione dei soli valori di ingresso in un dato istante.
45
fond. di informatica parte 445 Altro tipo di circuiti logici sono i circuiti sequenziali zcon memoria: i valori di uscita sono funzione dei valori di ingresso e dello Stato del circuito. zPer Stato di un sistema si intende in generale il valore della situazione in cui il sistema si trova. zEsempio del prof. Mezzalama e il sistema "apriporta a 2 Stati: porte aperte-porte chiuse e relativi comportamenti diversi. zEsempio tipico di Circuiti Combinatori e il Decodificatore; Esempio tipico di Circuiti Sequenziali ze il Registrino di Memoria detto Flip-Flop. zTutti questi Circuiti si trovano in E.E. zSALTARE FINO A DIAPO 55 compresa
46
fond. di informatica parte 446 Decodificatori SALTARE FINO A DIAPO 55 compresa zPer la conversione dei dati da un formato all' altro sono necessari appositi DECODIFICATORI. zUn 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.
47
fond. di informatica parte 447 L esempio di decodificatore zpresentato appare inizialmente come una scatola nera qui sotto rappresentata che per ogni segnale di input ha un segnale di output. z A _____ ______0_ z ______1_ z E _____ ______2_ z ______3_
48
fond. di informatica parte 448 Sui morsetti di ingresso si scrive un codice con: zsegnale su: A E z 0 0 basso su A basso su E z 0 1 " " " alto " " z 1 0 alto " " basso " " z 1 1 " " " alto " " zDei morsetti di uscita solo uno deve essere attivo in un certo istante. zIl circuito attua quattro funzioni booleane distinte.
49
fond. di informatica parte 449 Per ciascuna funzione booleana di uscita zsi puo scrivere una tabella di verita. Per es. per l'uscita 0 si ha: A E USC.0 z 0 0 1 z 0 1 0 z 1 0 0 z 1 1 0 zDalla 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).
50
fond. di informatica parte 450 Sintesi di circuiti zSi 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)
51
fond. di informatica parte 451 Perche ? zLispezione 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 2 N (num. di combinazioni diverse) ossia di tipo esponenziale e quindi al crescere di N (= 10, 20, 30...) si deve usare un altro metodo.
52
fond. di informatica parte 452 Flip-Flop Set-Reset = FF_SR zCircuito elementare di memoria che memorizza un BIT = BInary digiT = cifra binaria => informazione elementare zE realizzato con 2 porte nor retroazionate come si vede nel grafico di Meo-Mezzalama dove Q indica lo stato attuale del circuito. zE detto anche multivibratore bistabile … zDomanda: che tipo di circuito e ? Sequenziale!
53
fond. di informatica parte 453 Q= STATO del SISTEMA circuito FF_SR : o 0 o 1 zSe in ingresso S = R = 0 risulta z se Q=0 allora not(Q)=1 e z Q restera 0 z in uscita z se Q=1 allora not(Q)=0 e z Q restera 1 zIl 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
54
fond. di informatica parte 454 Altre situazioni: z Se in ingresso S = 1 (SET) e R = 0 risulta: zse attualmente Q=0 allora nor(Q S)=0=not(Q) z quindi Q = nor(not(Q) R) diventa 1; z 0 0 zinvece se Q=1 allora nor(Q S) = 0 = not(Q) z quindi Q = nor(not(Q) R) resta 1. z Se in ingresso S = 0 e R =1 (RESET) risulta: zse 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:... z 0 1
55
fond. di informatica parte 455 FF_SR: 8 situazioni possibili = 4 input X 2 stati attuali (Q_ora) zX Y nor(X+Y) z0 0 1 z1 0 0 z0 1 0 z1 1 0 z S R Q_ora Q_poi z 0 0 0 0 S=R=0 no modifiche z 0 0 1 1 Q_poi=Q_ora z z 1 0 0 1 S=1 forza Q_poi a 1 z 1 0 1 1 z 0 1 0 0 R=1 forza Q_poi a 0 z 0 1 1 0 z 1 1 0 0 o 1 Ambiguita da z 1 1 1 0 o 1 togliere con modifiche nella struttura (FF tipo D o JK)
56
fond. di informatica parte 456 La Dipendenza dal tempo zdeve 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. zEs. 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.
57
fond. di informatica parte 457 Memorie zI Flip-Flop vengono usati negli elementi di memoria di E.E. ossia nella RAM e nei registri della CPU. zLa 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). zTC = intervallo tra la richiesta di un dato da parte della CPU e la fine della risposta della memoria che torna allo stato di ricezione.
58
fond. di informatica parte 458 SRAM e DRAM: zsono 2 tipi di circuiti. z TC < 10 nsec zSRAM = Static RAM C << C(DRAM) z + veloci, ma + costose e. + voluminose z z TC < 50 nsec zDRAM = Dinamic RAM C 20 Milioni di bit / chip z + usate zL egenda: il chip e … il nostro centopiedi
59
fond. di informatica parte 459 ROM (Read Only Memory) zCircuiti con informazione memorizzata in modo permanente z 1) programmabili 1 sola volta in fabbrica zTipi 2) dall utente z 3) cancellabili e riprogrammabili. +volte z1) ROM, 2) PROM, 3) EPROM
60
fond. di informatica parte 460 Emulazione della C.M. qui zDella 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 ! zProblema1: sua emulazione con un programma in C e C++. zProblema2: memorizzare le tavole dell A.d.B. zSoluzione: utilizzo di tabelle o array o altro ?
61
61 Array zE un tipo di variabile composta, strutturata zImportante perche permette di: zmantenere in memoria un insieme di elementi omogenei (dello stesso tipo, detto tipo base); ztutti presenti contemporaneamente, posti in memoria consecutivamente a partire da un indirizzo iniziale, ma accessibili in modo diretto usando la loro posizione; zaccessibili +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); zRichiede un opportuna definizione in cui sia dichiarata al compilatore la sua dimensione.
62
62 Esempi di definizione di array o tabelle a + dimensioni in C++ zint a[5] array monodimensionale o vettore di 5 componenti intere memorizzabili in: za[0], a[1], a[2], a[3], a[4]. Necessario 1 indice per individuare la componente i esima a[i] zfloat f[2][3] array bidimensionale o matrice di 2 righe e 3 colonne memorizzabili in: zf[0][0], f[0][1], f[0][2], (tipo base=float) zf[1][0], f[1][1], f[1][2] Necessari 2 indici per individuare la componente i,j esima f[i][j] zint c[2][3][4] array tri dimensionale di tipo intero (4 matrici di 2 righe e 3 col.: necess. 3 indici).
63
fond. di informatica parte 463 Possibili inizializzazioni: zIn fase di compilazione: zfloat f[5] = {0.0, 1.0, 2.0, 3.0, 4.0}; zint g[100] = {7}; // si inizializza solo g[0]=7; zint 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. zIn fase di esecuzione con cicli a ripetizione notare: zes. for (i=0; i<5; i++) f[i] = (float) i ; z for (i=0; i<100; i++) g[i] = 0; // g azzerata
64
fond. di informatica parte 464 Creazione-stampa di vettori zIl primo esempio duso 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; zin tutti i sottoprogrammi il passaggio di vettori (e array in generale) e fatto per indirizzo.
65
fond. di informatica parte 465 Uno spezzone di project24 z#define MAX 2 z// Dichiarazione dei Prototipi dei MODULI usati zvoid attendi(); void scrivi(int*); void leggi (int []); z void copia (int [],int []); z main() /* Inizio Modulo principale */ z { int n, tab[MAX], cop[MAX]; /* definizione vettori senza inizializzazione e INIZIO Parte esecutiva */ clrscr(); zfor (n=0; n<MAX; n++) //creazione di tab z tab[n] = MAX-n; zcout<<"\nho costruito tab e vado a scriverla"<<endl; zscrivi(tab); // tab inizializzata
66
fond. di informatica parte 466 continua zcout<<"\nnon ho costruito cop ma vado a scriverla"<<endl; zscrivi(cop); // cop non inizializzata zcout<<"\nora vado a leggere cop"<<endl; leggi (cop); z cout<<"\nora vado a copiare cop in tab"<<endl; zcopia(tab,cop); // tab=cop z cout<<"\nho copiato cop in tab e vado a scriverla"<<endl; z scrivi(tab);attendi(); return (0);
67
67 Il nome del vettore o tabella e zsinonimo dell indirizzo del primo elemento del vettore => Si puo scrivere: float ris[10]; zfloat *p; p=ris; /*oppure*/ p=&ris[0]; zris e un puntatore, ma costante perche sigillato a puntare sempre allo stesso vettore. zEs. 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. zNon si puo mai invece modificare l indirizzo in ris, il contenuto SI !!! zMeo 1 lez. 37
68
fond. di informatica parte 468 Allocazione in memoria di tabelle zSia: int tab[3] = {25, 53, 64}; ztab nome ed indirizzo ziniziale della tabella; tab ztab è sinonimo di z10000; z25 và in tab[0] z53 tab[1] z64 tab[2] zda 1000C c è altro. z Central Memory z 10000 z 10004 z 10008 z 1000C z 11111 z25 z53 z64 zaltro
69
fond. di informatica parte 469 Esempi di vettori in...program5 zPROBLEMA: calcolare la frequenza di caratteri alfabetici contenuti in una frase terminante col punto. Alla fine: visualizzare tutte le frequenze !=0 zProgetto logico: n. o caratteri alfabeto ingl. =26; zn. o contatori di frequenza=26=n. o elementi vett. da inizializzare a zero; int freq[26]={0,0,… 0}; zlettura 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.
70
fond. di informatica parte 470 Progetto logico: continua zCome si puo trovare questo elemento? zNel vettore freq[26] si trova tramite l indice intero corrispondente nel codice ASCII al carattere letto, ma: zA=65; … Z=90; a=97; … z= 122 zOccorre fare una traslazione nella scala dei codici ossia riportare i valori dei codici ASCII nell intervallo 0-25 z=> per i caratteri minuscoli basta fare: car_letto - a; e poi incrementare il contatore freq[car_letto- a]++; zinvece 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).
71
fond. di informatica parte 471 La visualizzazione zSi puo fare con un for dove la var. di controllo e ancora il codice ASCII del carattere: zfor (char ch = a; ch<=z; ch++) zif (freq(ch- a) != 0) // sempre traslare! zcout << \nIl car.<< ch<< ha la frequenza: << freq[ch- a]; zCon questo progetto logico zfare il programma monoblocco prima e poi strutturato a moduli.
72
fond. di informatica parte 472 Non confondere stringhe costanti con tabelle di caratteri zLa 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. zDovendo 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.
73
fond. di informatica parte 473 programma leggiora (prj25) z/*Il programma lavora con stringhe. z 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'; z poi usa un puntatore a stringa che permette di visualizzare la stringa, ma non il suo numero di caratteri; z poi ancora in leggi chiede la stringa che deve leggere nell' array ora.*/ z/* Variabili del main*/ char ora[15]; int n; char* ps ="bello"; z clrscr(); n = (int)sizeof("IO"); z cout<<"Numero di caratteri della stringa: "<<n<<endl; z n= (int)sizeof(*ps); z cout<<"Stringa puntata da ps: "<< ps z <<" Numero di car. della stringa puntata da ps: "<<n; z leggi(ora); z scrivi(ora); z attendi(); zreturn (0);
74
fond. di informatica parte 474 z z z void leggi(char time[]) z /* Legge una stringa con l'ora sulla riga: zvariabile utilizzata che esce definita: time */ z { /*Inizio leggi */ z int i; zprintf ("\n srivimi l' ora: "); z// in Csi scriverebbe gets(time), in C++ z cin.get(time,15); /* procedura del C++ per leggere tutti i caratteri spazi bianchi compresi*/ z cout<<"\n sono in leggi: "; z for (i=0; time[i]!='\0'; i++) // si noti la fine del for !!! z cout<<(time [i]); z } /* Fine leggi */
75
fond. di informatica parte 475 Es. char riga[40]; zOgni elemento della tabella riga e di tipo char e quindi disponibile a contenere un carattere. zPer 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 … zCome? 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() ).
76
fond. di informatica parte 476 Copiare stringhe: oltre il prg. project24 ecco la proc. strcp zvoid 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 */ z{ while ((*s=*t) != \0) /*fintantoche il contenuto di t assegnato alla cella puntata da s e diverso da \0 (=fine stringa) fai*/ z{ s++; t++}; // + sintetica ?! } z{while (*s++=*t++);//perche manca !=\0 ?? z};
77
fond. di informatica parte 477 Come si scrive una procedura? zL 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. zLa 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.) zVisti gli esempi modificare in project24 la proc. copia in modo simile alla proc. strcp.
78
78 Esempi zchar *ps2,*ps1 = stringa12; zchar s1[10], str[10]=abcdefghi; zstrcp(str,ps1);//si puo strcp(ps2, s1)? Meglio NO zstrcp(s1,str); // strcp(ps1,s1) puo dare errore; zRicordare 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! zAttenzione poi al project27 che vuole ampliare array e produce errore in esecuzione …! zIl più interessante è il project26 che ordina un vettore di interi: usare lo stesso algoritmo (selezione descritto nei commenti del programma) per ordinare un vettore di caratteri. E … vedere fondinf5
79
fond. di informatica parte 479 Array a 2 dimensioni: sono memorizzate per riga ! zSono sequenze di righe ossia di vettori riga; zil 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; zl elemento i-esimo della prima riga e trovato dal compilatore sommando a questo indirizzo la lunghezza di ogni elemento moltiplicata per i-1 ; zla 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.
80
fond. di informatica parte 480 Aritmetica dei puntatori zLa 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. zNei 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 a i,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. zMeo 1 lez.38
81
fond. di informatica parte 481 Esempi di definizione di array in C++ zint a[2][5] array bidimensionale o matrice di 10 componenti intere memorizzabili in 2 righe di a: zprima riga: a[0][0], a[0][1]... a[0][4], zseconda riga: a[1][0], a[1][1]... a[1][4] zfloat f[2][3] array bidimensionale o matrice di 2 righe e 3 colonne memorizzabili in: zf[0][0], f[0][1], f[0][2], (tipo base=float) zf[1][0], f[1][1], f[1][2]. Necessari 2 indici: es. zfor (int i=0; i<2; i++) z for (int j=0; j<3; j++) f[i][j]=0.0;
82
fond. di informatica parte 482 Precisazioni ed esercizi zQuando 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. zEsempi 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. zProvare 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.
83
83 Uno spezzone di project29 z#define Max 8 z…. zvoid terscrivi(int [][MAX-5]); //PROTOTIPI z void leggi(int [][MAX-5]); void attendi(); z/*Il programma legge una matrice di interi e valuta zla somma totale degli elementi e le somme parziali degli elementi appartenenti ad ogni riga. zmain() z { zint tab[MAX][MAX-5]; zint ir,ic, som_rig, somma_tot;// ir indice di riga, ic di colonna z/* INIZIO Parte esecutiva */ clrscr(); z/* Lettura tab */ leggi(tab); z/* Scrittura di tab */ terscrivi(tab); z/* Calcolo somme parziali delle righe e totale */ z
84
fond. di informatica parte 484 continua project29 zsomma_tot =0; z for (ir=0; ir<MAX; ir++) z { som_rig =0; zfor (ic=0; ic<MAX-5; ic++) z{ som_rig+=tab[ir][ic]; z somma_tot+=tab[ir][ic]; } z cout<<"\n somma parziale riga "<< ir <<" = "<<som_rig; z } z cout<<"\n somma totale ="<<somma_tot; z attendi(); return (0); z }
85
fond. di informatica parte 485 zvoid terscrivi (int pt[][MAX-5]) z /* 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 z cout<<"\narray di array:"; cout<<" indirizzo pt (terscrivi) "; cout<<pt; printf ("\n valori della tabella per righe (terscrivi) \n"); zfor (n=0; n<MAX; n++) z { for (ic=0; ic<MAX-5; ic++) z cout<< pt[n][ic]<<" "; z cout<< "\n"; } z } /* Fine terscrivi*/
86
fond. di informatica parte 486 zvoid leggi(int m[][MAX-5]) /* m =nome della matrice in questa procedura z { /* Inizio leggi */ int ic,n; //n indice di riga, ic di colonna zcout<<"\n dammi i valori della tabella per righe"; z for (n=0; n<MAX; n++) z { cout<<"\n dammi i MAX-5 valori di riga n="<< n<<" "; zfor (ic=0; ic<MAX-5; ic++) z cin>> m[n][ic]; /*al primo giro legge m[0][0] m[0][1] m[0][2] */ z }// fine for su ic lettura riga z }// fine leggi
87
fond. di informatica parte 487 A proposito della variabile logica da usare in project22… riprendermo il discorso nella parte 5 z
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.