La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Fond. di informatica1 parte 51 fondamenti di informatica parte 5 appunti per la laurea in Ingegneria Civile, Edile, Ambientale a.a. 2005-2008 di anna maria.

Presentazioni simili


Presentazione sul tema: "Fond. di informatica1 parte 51 fondamenti di informatica parte 5 appunti per la laurea in Ingegneria Civile, Edile, Ambientale a.a. 2005-2008 di anna maria."— Transcript della presentazione:

1 fond. di informatica1 parte 51 fondamenti di informatica parte 5 appunti per la laurea in Ingegneria Civile, Edile, Ambientale a.a di anna maria carminelli gregori Approfondimenti

2 fond. di informatica1 parte 52 Tema del 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)

3 fond. di informatica1 parte 53 Tema... z_ visualizzi sul video o i dati modificati, z o la stringa Non occorre modificare i valori letti; e (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 ormai è noto e quindi nell ultima domanda va considerata la richiesta di visualizzazionee di memorizzazione in array.

4 fond. di informatica1 parte 54 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 e chiamarla per esempio min. 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.

5 fond. di informatica1 parte 55 … svolgimento: zIl main deve leggere i 3 valori, attivare una funzione che calcoli il minimo, un altra che calcoli il massimo, se il minimo e inferiore a 0.25 deve attivare una funzione che rivaluti minimo e massimo, e poi ce la memorizzazione e la visualizzione: zmain() z{/* Inizio Modulo principale*/ float a, b, c, min, max, v[3]; z/*Parte esecutiva*/ clrscr(); cout <\n dammi i 3 float: ; zcin >> a >> b >> c; zmin = minimo(a, b, c); // passaggio per valore zmax = massimo(a, b, c); // zif(min<0.25){max=rivaluta(&min, &a, &b, &c); // indirizzi ! zvisual(a,b,c);} else memovis (a,b,c,v); cin >> " "; zreturn 0;}

6 fond. di informatica1 parte 56 … e la funzione minimo ? zEccola … (e analoga sara la funzione massimo:) zfloat minimo(float x, float y, float z) z{float mi; // si puo usare min ?!? zcout<<\nCon i dati: <

7 fond. di informatica1 parte 57 Alla funzione rivaluta i parametri sono passati per indirizzo quindi: zfloat rivaluta (float *m, float *x1, float *y1, float *z1) // m, x1, y1, z1 sono puntatori a float: per lavorare sui valori puntati occorre usare l operatore * z{ float ma=0;//var. locale usata per restituire il massimo zwhile (*m < 0.25) z{*x1= unoeun*(*x1); *y1= unoeun*(*y1); z*z1=unoeun*(*z1); *m=minimo(*x1,*y1,*z1);} z ma=massimo(*x1, *y1, *z1); // *x1,… valori !!! z return ma;}

8 8 CAPIRE BENE E completare zil programma con le direttive al precompilatore (per es. z#define unoeun 1.1), ed zi prototipi dei sottoprogrammi, la funzione massimo, la procedura visual che mancano, le costanti … zfarlo girare; zcon l introduzione delle tabelle realizzare anche la procedura memovis che memorizza in una tabella (= vettore v) i dati originali. zFarlo per martedì prossimo! per domani costruire una matrice mat[5][4] di valori float ottenuti con: zmat[i][j]= (float) i*(j+1)

9 fond. di informatica1 parte 59 z void scambia(float *a, float *b) z /* Esegue lo scambio del valore float puntato da a con il valore puntato da b moltiplicato per w che tramite un #define vale 2.0 */ z { /* Inizio scambia */ z float com; /* variabile LOCALE di comodo per fare lo scambio */ zcom = *a; /* pone il valore numerico puntato da a in com */ z *a = w*(*b); /* sovrappone il valore numerico puntato da b moltiplicato per w nel posto di memoria puntato da a.....! NON DA ERRORI!!!*/ z *b = com; /* sovrappone il valore numerico assunto da com nel posto di memoria puntato da b: scambio effettuato! */ z } /*Fine scambia */

10 fond. di informatica1 parte 510 E per emulare la memoria? zprima di fare nuovi discorsi, occorrono precisazioni sull uso di array, sulla sinteticita del C e C++, su errori comuni …. e altro! E bene ricordare le 2 versioni della procedura: zvoid strcp(char *s, char *t) /* 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*/ { s++; t++}; // + sintetica ?! while (*s++=*t++); // dove manca != \0 !! z}

11 fond. di informatica1 parte 511 Frasi sintetiche zQuesto tipo di sintesi e normale nei programmi in C o in C++ ed e utile conoscerla ed abituarcisi per poter leggere programmi C e C++ in circolazione; zsi tratta di compattare alcuni tipi di frasi in una sola. zEs. lettura e calcolo indicate nel progetto logico posto in parte 4 diapo 69: fintantoche il carattere letto non è il punto, aggiungi 1 all elemento che indica la frequenza del carattere letto… ma come si scrive in C o C++ sintetic … ?

12 fond. di informatica1 parte 512 Sinteticamente … ? zNon e in linea con la sintesi leggere la sequenza di caratteri in un array di char e poi analizzare il vettore... Sarebbe comunque corretto farlo se fosse necessario tenere memoria della sequenza di caratteri per altri scopi per es. per successive analisi. In tal caso occorre dimensionare l array con il numero di caratteri +1 per salvare un posto dove posizionare.. Se invece l analisi e solo quella indicata allora: zwhile( (cin >> ch) /* fintantoche ce un ch (carattere) da leggere*/ && ( ch !=.) ) /* e inoltre questo ch e diverso da punto FAI */...

13 fond. di informatica1 parte 513 In definitiva zil significato di queste considerazioni riguarda l utilizzo di matrici e/o vettori. zE bene usarli quando richiesto e/o esiste la necessita di tenere memoria dei valori calcolati o letti: se tali condizioni sono false, allora usare il valore corrente (per es. appena letto) per i calcoli ad esso relativi e passare ad altro valore (per es. il successivo). zE poi bisogna essere attenti ad errori ed a esigenze comuni come indicato nel seguito.

14 fond. di informatica1 parte 514 Funzioni e procedure predefinite zdel C, C++, MATLAB, di tutti i liguaggi di programmazione, sono comode,ma non voglio presentarvele …troppe. zPerchè? zPuò capitare che cambiando compilatore cambino in qualcosina, non tanto, ma qualcosina può essere diversa. Così preferisco darvi i concetti logici che devono essere realizzati ed indicarvi come farlo in C++. zComunque qualche funzione é standard, comoda e ve la indico qui di seguito

15 fond. di informatica1 parte 515 Attenzione al fallimento dell input ! zIn iostream.h del C++ esiste una funzione collegata al flusso cin ossia cin.fail() che restituisce il valore true se l input fallisce, per es. se si ha: zint x,y; zwhile(true) z{cin>>x; if ( cin.fail() ) break; zelse { y= x; z…. } zIl fallimento dell input può avvenire per esempio per un errore di battitura attribuendo ad x un carattere

16 fond. di informatica1 parte 516 Attenzione alla fine file ! zIn iostream.h del C++ esiste una funzione collegata al flusso cin ossia cin.eof() che restituisce il valore true se si incontra EOF. Nell es. precedente si analizzerà la fine file solo dopo il fallimento dell input: zint x,y; zwhile(true) z{ cin>>x; if ( cin.fail() ) {if ( cin.eof()) break ;} zelse {x--; …. }

17 fond. di informatica1 parte 517 Attenzione alle condizioni di confronto! zRicordarsi le codifiche Fixed e Floating point(!!!) quando si devono confrontare i numeri in virgola mobile che hanno precisione limitata. zPer es. avendo: zdouble r= sqrt(2.0); zif (r*r == 2.0) cout << il quadrato di sqrt(2) è 2\n; zelse { cout<< il quadrato di sqrt(2) NON è 2, ma << r*r<

18 fond. di informatica1 parte 518 Attenzione alle richieste di dati z Quale può essere la risposta implementativa ad una richiesta di un valore float <1.0 ? Le seguenti 3 frasi: z{ float val; zcin >> val; zif (val > 1.0) cin >>val; } zsono una soluzione valida? … zNO! PERCHé ripete la lettura solo una volta e invece deve essere ripetuta fintantochè é errata, quindi: zwhile (val > 1.0) cin >> val;

19 19 Attenzione ai dimensionamenti errati come nel project27 che vuole zampliare array e produce errore in esecuzione …! zvoid riscrivamplia (int t[]) //attivata con: riscrivamplia(tab); (e tab[MAX]) z { int i; /* Inizio riscrivamplia */ z cout<<"\nin riscriviamplia t = vettore tab ampliata"; z for( i= 0; i

20 fond. di informatica1 parte 520 Break e altro La frase break si può usare anche in cicli while, do… while, for: vedere project di programm4 dove si esce con un break da un ciclo infinito come qui riportato CON : bool attiva = false; yforever y{ yswitch (menu(!attiva)) y{ case 1: cout <<"\nnumero 1 e ris: "; y ris = elabora(menu(attiva)); cout <

21 fond. di informatica1 parte 521 … e dove la funzione int menu(bool); è: zint menu(bool attua) z { /* Inizio menu che mostra anche come da una funzione se ne puo' attivare un' altra */ zstatic int c; // c e' var. locale di menu' zif (attua) leggi(&c); // passaggio per indirizzo: c da inizializzare zreturn( c); // ritorma sempre il valore letto con attua=TRUE z } /* Fine menu */

22 22 A proposito della variabile logica da usare in project22… riprendiamo qui il discorso zOssevare i project 21 e 22. Quando la funzione menu() viene attivata nella frase switch e giusto che richiami la funzione leggi(n) in quanto n deve dirottare il controllo al caso ennesimo; invece quando la funzione menu() viene attivata nelle 2 funzioni di elaborazione non occorrera una nuova lettura purche n sia ancora disponibile. Questo e il punto: n e ancora disponibile? NO se menu() è richiamata come in project21 ed al suo interno non si dichiara: static int n;

23 fond. di informatica1 parte 523 Significato delle variabili automatiche e statiche zIn C e C++ ogni variabile e caratterizzata oltre che dal tipo dalla sua classificazione rispetto alla sua allocazione in memoria ed alla sua durata. Le variabili finora trattate sono dette automatiche perche iniziano ad esistere (sono allocate in memoria) quando la funzione in cui sono definite e attivata e spariscono all uscita dalla funzione. Non conservano il loro valore tra una attivazione e l altra della funzione. Per conservarlo devono essere dichiarate static: senza questo attributo sono automatiche. zMeo 1 lez.33

24 fond. di informatica1 parte 524 Static => protezione zTutte la variabili (locali o globali) definite static sono create ed inizializzate prima che il main inizi l esecuzione e sono distrutte solo al termine dell esecuzione del main program: la loro inizializzazione e eseguita una sola volta, se manca sono inizializzate a 0. zAnche una var. globale (o esterna) puo essere dichiarata static: in tal caso diventa visibile e usabile solo all interno delle funzioni definite nello stesso file sorgente in cui essa e definita, ma diventa invisibile ad altri file: è un tipo di protezione.

25 fond. di informatica1 parte 525 Conclusione per menu() zPer salvare il valore di n letto solo la prima volta bisogna dichiarare n static (non solo int) e quindi scrivere menu cosi (come in project22): zint menu (bool attiva) /* attiva param. formale di tipo logico che deve essere True solo al primo richiamo e False ai richiami successivi in cui si potrà usare il suo duale senza cambiarlo */ z{static int n; // n inizializzata a 0 zif (attiva) leggi(&n) /*se attiva = True in n va il valore digitato che resta immutato fino a nuova lettura che non si verifica se attiva = False */ zreturn n; }

26 26 Attenzione a leggere e scrivere matrici z void leggi(int m[][MAX-5]) /* m è una matrice di MAX righe e MAX-5 colonne */ z { /* Inizio leggi */ z int ic,n; z cout<<"\n dammi i valori della tabella per righe"; zfor (n=0; n> m[n][ic]; z }// fine lettura riga ennesima z }// fine righe

27 27 Ancora un esempio sui giochi sempre più importanti … zNell ultimo convegno su Vita Artificiale e Computazione Evolutiva é stata presentata da ricercatori dell Un. Urbino, un Applicazione di algoritmi genetici a contesti videoludici dove per limplementazione dei giochi evolutivi è stato sviluppato un package Java. zCome esempio del funzionamento del package è stato utilizzato lo sviluppo di un semplice gioco evolutivo il cui protagonista è un topolino che si muove in uno spazio bidimensionale quadrato (MATRICE!!!) popolato da un cane (che si muove in modo casuale) e da un gatto (che si muove nel tentativo di mangiare il topo e di tenersi alla larga dal cane). Il topolino si muove in base ad un istinto dettato dal suo genotipo (descrittore del suo DNA….) …

28 28 Senza parlare di genotype vediamo il gioco delle 3 carte … zo, per semplicità dei 3 interi positivi. zIl main attiva una procedura Giocatore che legge 3 lettere, le modifica in interi, li memorizza come static, e visualizza solo l intervallo in cui si trovano (0-500 per es.); zil main cerca di indovinare i numeri che non vede: per farlo apre un ciclo, legge o calcola un intero nell intervallo (tra 0 e 500) con un certo criterio, lo memorizza in un vettore ed attiva di nuovo la procedura Giocatore passandole l intero letto; zla procedura esegue i confronti e se il numero è uguale ad uno dei 3, visualizza OKEY ed il numero, altrimenti visualizza NOT OKEY ed il main deve riprovare con un altro numero diverso dal precedente fino a scoprire i 3 numeri. zSono concessi 3 tentativi: al terzo tentativo sbagliato il main perde.

29 29 Volendo complicare il gioco dalla scoperta dei 3 numeri a quella delle 3 carte, zsarebbero stati necessari 2 vettori cards e namecards con: z_ inizializzazione del vettore cards con 54 interi, da 1 a 54, corrispondenti alle carte da gioco secondo la seguente corrispondenza: 1 corrisponde all' Asso di Picche, 2 al Due di Picche, al 10 di Picche, 11 al Fante di Picche, 12 alla Donna di Picche, 13 al Re di Picche, 14 all' Asso di Cuori, etc. etc. fino al 52 che corrisponde al Re di Fiori, mentre 53 e 54 corrispondono ai 2 jolly. La corrispondenza e' effettuata ponendo nel vettore namecards 54 stringhe di caratteri con i nomi suddetti; z_ attivazione della procedura estrai che estrae una carta a caso: per far ciò, occorre utilizzare la funzione int random(num) -Random number generator- e usare il valore da essa restituito, che é un numero casuale compreso tra 0 e num-1. zIn particolare per utilizzare la funzione random(num) in un programma in C occorre premettere le seguenti frasi: z#include e #include ze poi in estrai: zrandomize(); /* inizializza il generatore di numeri casuali ed usare int indice_casuale= random (55); */ )

30 fond. di informatica1 parte 530 E…per tornare al problema del SORT zSi riprende il project26 che ordina un vettore di interi con lalgoritmo di selezione o scelta diretta con il quale l ordinamento di una tabella di n elementi si ottiene in n-1 passi come indicato nella diapo seguente. z

31 fond. di informatica1 parte 531 SORT & Algoritmo di Scelta diretta. Con questo metodo l'ordinamento di una tabella di N elementi si ottiene in N-1 passi. Al passo 1 si ricerca il minimo tra gli N elementi con N confronti (il CONFRONTO è l operazione dominante!) e trovatolo si scambia (di posto) col primo elemento; al passo 2 si ricerca il minimo tra gli N-1 elementi (dal secondo all'ennesimo con N-1 confronti ) e trovatolo si scambia (di posto) col secondo elemento ; cosi' di seguito fino al passo N-1 quando si potranno scambiare di posto l' elemento N-1 con l'elemento N. Ad ogni passo #confronti N #passi N #operazioni effettuate dall'algoritmo è dell' ordine di N*N... QUINDI da usare se N < 10.

32 32 void ordina(int x[], int n) /* x è orlata cioè l elemento x[0] è trascurato. Effettua l' ordinamento di x (tabella di n elementi) con Alg. Scelta Diretta. Variabili locali usate: i,j,k,min Parametri in ingresso: n,x; per es. n=3, x[1] =3, x[2] = 4 x[3] =1 Parametri che escono definiti: x; x[1] =1, x[2] = 3, x[3] = 4 */ { int i,j; /* var. di controllo cicli */ int k; /* indice del minimo */ int min; /* var. contenente il minimo */ /* Inizio parte esecutiva di ordina */

33 fond. di informatica1 parte 533 zfor (i = 1; i <= n-1; i++) z { min = x[i]; k = i; // se i=1 allora min = 3 e k =1 z for (j = i+1; j <= n; j++) //ciclo ricerca minimo z { if (x[j] < min) /* solo per j=3 questa condizione è vera (1<3) */ z { k= j; min = x[j]; /*per i=1 si ha: k=3 e z min= 1 se i=2 k=3 e min= 3*/ } z }// fine del for su j z x[k] = x[i]; /* per i=1 scambio tra x[3] e x[1] ottenendo 1, 4, 3 e tra x[3] e x[2] ottenendo 1, 3, 4 per i=2 */ z x[i] = min; /* per ricerche del min. senza successo queste due frasi non hanno effetto */ z } //fine del for su i }/* fine di ordina */

34 fond. di informatica1 parte 534 E… vedere +oltre z…cercare altri algoritmi di SORT per esempio da pag. 503 del testo di Franco Crivellari: Elementi di programmazione con il C++, Franco Angeli; (primo riferimento in Bibliografia) dove sono descritti zMETODI ( Algoritmi) DI ORDINAMENTO come: z1) selezione (per minimi successivi) z complessita =O(n 2 ) z2) scambi (bubble sort) z complessita =O(n 2 ) z3) inserzione z complessita = O(n 2 ) z4) ad albero: doppio indice (quicksort) z heap-sort z5) distribuzione e fusione o MergeSort zPer la Complessità diapo seguente zcomplessita = zO(n log(n))

35 fond. di informatica1 parte 535 La complessità computazionale zdi un ALGORITMO A ne indica il COSTO come numero di operazioni eseguite per arrivare al risultato desiderato: fornisce una misura del running time t del Programma realizzato con A; zil COSTO é funzione del tipo di elaborazione ( scansione lineare ? doppio ciclo o ciclo al quadrato ? è una funzione logaritmica ?…), e del tipo e dimensione n dei dati di ingresso: COSTO= f(n). zInteressa soprattutto il Costo per n ELEVATO COSTO ASINTOTICO lim f(n) z n ze NEL CASO PEGGIORE (meno spesso nei casi migliore e medio!) zQuindi il Costo si indica con la notazione O(f(n))

36 fond. di informatica1 parte 536 NO Saltare 3 diapo Altro metodo di ORDINAMEN. CON DOPPIO INDICE (quicksort) se N 10 1) algoritmo di separazione: scelto nell array un elemento X come perno (o elemento di separazione), si effettuano spostamenti nell array in modo da ripartirlo in due parti: sinistra (ps) e destra (ds) che, rispetto a X (elemento di separazione), siano: elementi ps X elementi ds 2) Si ripete ricorsivamente lalgoritmo di separazione per ps e ds fino all'ordinamento completo

37 fond. di informatica1 parte 537 ALGORITMO DI SEPARAZIONE _ si sceglie un valore dell array (p.e. il mediano) come elemento di separazione X _ si cerca da sinistra il primo elemen. > X e lo si sposta a destra di X se c' e un elem. _ si cerca da destra il primo elemen. < X e lo si sposta a sinistra di X se c' e un elem. _ si prosegue da sinistra e da destra per gli elementi successivi finche la ricerca di sinistra non si "incrocia" con quella di destra z Si ottiene: zelementi ps X elementi ds z

38 fond. di informatica1 parte 538 ESEMPIO ALGORITMO SEPARAZIONE con N=10 LISTA SIN. X LIS. DESTRA s d 1 ø riordinamento s d 2ø riordinamento d s s e d si "incrociano": separaz. Finita #operaz. fatte <= n; #passi da fare log 2 n se le liste sono sempre divise a metà altrimenti n

39 fond. di informatica1 parte 539 COMPLESSITA' QUICKSORT Caso peggiore: n 2 (liste sbilanciate, per es. ps di 2 termini ds di n-2 termini) Caso medio: n log 2 n (liste sempre divise a metà) non richiede extra memoria si realizza facilmente con una procedura ricorsiva

40 fond. di informatica1 parte 540 La ricorsione zChe cosa è ? la sua definizione appare immediata dalla figura successiva tratta dal testo Algorithm + Data Structure = Programs di N. Wirth creatore del linguaggio Pascal; zla definizione di un oggetto in modo ricorsivo si avvale dell uso di versioni più semplici dell oggetto stesso. zSi pensi alla definizione ricorsiva di numero naturale: z1 è un numero naturale; zil successore di un numero naturale è un numero naturale con successore(n)=n+1.

41 fond. di informatica1 parte 541

42 fond. di informatica1 parte 542 Algoritmi ricorsivi zUsano una funzione che si definisce attraverso se stessa. zVantaggi della forma ricorsiva: zformulazione naturale di problemi matematici definiti in termini di se stessi; zprogrammi +facili da leggere. zSvantaggi della forma ricorsiva: zattenzione a non entrare in cicli senza fine: occorre porre un limite alla definizione ricorsiva di un oggetto! zTalvolta può essere utile una soluzione di tipo iterativo!

43 fond. di informatica1 parte 543 Ricorsione in C e C++ zUn sottoprogramma ricorsivo e attivato ricorsivamente con un SOLO richiamo per ogni attivazione. zCome esempio illustrativo si considera il fattoriale di n che si può definire in 2 modi: 1.n! = n. (n-1). (n-2)… (produttoria) 2.n! = n. (n-1)! (forma ricorsiva) Occorre porre un limite alla definizione ricorsiva della funzione fattoriale(n) limite dato dalla matematica che stabilisce: n>0 e 0!=1. Quindi la funzione ricorsiva fattoriale di n è la seguente:

44 fond. di informatica1 parte 544 int fattoriale (int n) /* funzione che calcola il fattoriale di n in modo ricorsivo: se n>0 si autoattiva con n-1 ponendo in risultato il valore di n * fattoriale (n-1)… continua così finchè n diventa 0. A quel punto ritorna 1, ma a chi ? A chi l ha attivata l ultima volta ossia a se stessa... */ { int risultato; if (n <= 0) return 1; //CONDIZIONE INDISPENSABILE!!! else { risultato = n * fattoriale (n-1); //Autoattivazione con n-1 return risultato; }

45 fond. di informatica1 parte 545 In programm7 zsi trovano sia il programma per il calcolo del fattoriale con una funzione ricorsiva, sia la procedura di ordinamento che usa l algoritmo Quick descritto precedentemente e che segue… zA voi il compito di fare una funzione ricorsiva per calcolare i numeri di Fibonacci! Ricordare: Fib 0 = 0; Fib 1 = 1; Fib n+1 = Fib n + Fib n-1 con n>0 (In Programm7 project33 risolve il problemino…., mentre il project32 ordina una tabella col metodo ricorsivo del Quik-Sort … qui di seguito NO saltare)

46 46 Quick-Sort zvoid ordina(int x[],int sin, int des) z /* Effettua l' ordinamento di x (tabella di n elementi) z col metodo Quick da sin a des z Parametri in ingresso: sin, des, x; z Parametri che escono definiti: x; z Variabili locali usate: i,j,k,w,perno; */ { int i,j,k; /* var. di controllo */ int w; /* var. di comodo */ int perno; /* var. col perno */ z /* Inizio parte esecutive di ordina */ i = sin; j = des; z k= (sin +des)/2; perno= x[k]; z while (x[i]

47 fond. di informatica1 parte 547 L emulazione della menoria introduce il ritorno all hardware zcon lo scopo di parlare del linguaggio di E.E. zSi ricordi: zC.M. & CPU: indirizzo di ogni locazione di C.M. => in registri della CPU ( es. registro P =Punta- tore, registro I.C.= Instruction Counter...); zContenuto di ogni locazione di C.M. => in altri registri della CPU (per es. A = Accumulatore...); zC.M. (RAM): scandibile e rintracciabile per es. col Registro P : Indirizzi Memoria Registro P; zCPU = Unita Centrale = Unita Elaborativa = MicroProcessore per Personal Computer Mezzalama 2 lez. 18 & seg. Vai a pag. 31 Mezzalama 2 lez. 18 & seg. Vai a pag. 31

48 fond. di informatica1 parte 548 Si ricordi anche la struttura funzionale di EE gia vista: zTemporizzator e zUnita Centrale di Controllo Unita Aritmetico - Logica zUnita di controllo di I/O zMemoria Centrale zPeriferiche zMemorie di massa z CPU z Registri Flag

49 fond. di informatica1 parte 549 La CPU controlla tutte le operazioni di E.E. zLe operazioni possono essere: zinterne alla CPU (per es. Somma i contenuti di 2 Registri); zesterne come trasferimenti di dati verso la (o dalla) C.M. o verso le (o dalle) interfacce (Controller Unit) dei dispositivi periferici. zNotare: la CPU non invia i dati al dispositivo, ma alla sua interfaccia!

50 fond. di informatica1 parte 550 La CPU lavora zin stretto contatto con la C.M. e per svolgere i suoi compiti usa i registri, i Flag (indicatori di stato) e inoltre le Unita di Controllo e Aritmetico-Logica (A.L.U.). I registri piu usati sono: zRegistri P e I.C. (Istruction Counter) per tenere gli Indirizzi, zRegistri tipo Accumulatore (A, B, C … ed anche Reg. 1, Reg. 2...) per tenere i Dati, zRegistro Istruzione (I.R.) per tenere le Istruzioni del linguaggio della macchina.

51 fond. di informatica1 parte 551 CPU: funzionamento ciclico nell esecuzione di un programma zOgni ciclo della CPU si compone di 3 fasi: fase di fetch ( = prelievo) dell istruzione, zfase di decodifica dell istruzione, zfase di esecuzione dell istruzione. zIn ogni fase sono usati alcuni Registri. zLe operazioni relative ad ogni fase sono indicate alla diapo seguente, ma zSALTARE 13 diapo, riprendere dai BUS, diapo65.

52 fond. di informatica1 parte 552 Prelievo e decodifica saltare 13 diapo zfase di fetch ( = prelievo: uso dei Reg. IC e IR): z1) Esame del Reg. I.C.; z2) Accesso alla locazione di C.M. indirizzata da I.C.; z3) Trasferimento del contenuto della locazione di C.M. in I.R.; zfase di decodifica: (uso del Reg. IR): z4) Interpretazione del contenuto di I.R.; z5) SE non e un' istruzione ALLORA segnalazione ERRORE e STATO DI ATTESA

53 fond. di informatica1 parte 553 Esecuzione istruzione z… altrimenti fase di esecuzione: zSE si tratta di un istruzione di salto alla locazione di memoria di indirizzo xyzv allora I.C.= xyzv ed il controllo delle operazioni passa a xyzv e da qui si prosegue in sequenza; zALTRIMENTI: l' istruzione viene eseguita ed e incrementato I.C.= I.C.+(lunghezza istruz.) per passare all istruzione successiva. zSi noti: in assenza di istruzioni di salto esiste un ordinamento sequenziale tra le istruzioni.

54 54 Accesso alla Memoria: zper estrarre info. = leggere dalla Memoria; zper deporre info. = scrivere in Memoria; zOperazioni realizzabili: z a Hardware con codici propri della CPU z a Software con istruzioni di un Linguaggio Artificiale, tradotte nei codici della CPU (ossia nelle Istruzioni del linguaggio della macchina) dal programma traduttore. zEsempio fase di esecuzione con uso del reg.P (e non I.C. per brevità di scrittura) zSia: Istruzione = Leggi un dato dal disco e ponilo in C.M. all' indirizzo

55 fond. di informatica1 parte 555 Registro P di 4 bit =>16 byte indirizzabili (qui la freccia sintetizza il contenuto di P) z CPU = Ragnetto z REG. P. z Central Memory z z z 1111 z Registro P.= Pointer Accumulat.

56 fond. di informatica1 parte 556 Esempio: continua zC.P.U. pone nel Registro P cioe P= (cfr. grafico precedente) e passa il controllo all Unita di Controllo della Periferica disco. zQuesta, attivato il lettore che legge il dato (per es. 3.14), lo pone in un proprio registro: da qui C.P.U. lo preleva e lo trasferisce nell Accumulatore ossia A = 3.14 zInfine C.P.U. trasferisce il contenuto di A nella Memoria indirizzata da P ossia Mem(P)=A (cfr. grafico seguente)

57 fond. di informatica1 parte 557 Registro P di 4 bit => 16 byte indirizzabili z CPU = Ragnetto z REG. P. z Central Memory z 0000 z 0001 z 1111 z Registro P.= Pointer Accumulat. 3.14

58 fond. di informatica1 parte 558 Ancora esempi zAnalogo comportamento se Istruzione = Visualizza un dato su video … Se poi Istruzione = Somma i dati delle locazioni di indirizzo e e metti il risultato in C.M. all' indirizzo allora C.P.U. effettua le operazioni seguenti (dove => significa sposta e il registro B A) z => P zMem(P) => A (per es => A) z => P Mem(P) => B (per es => B) zA+B => A (per es => A) z => P zA => Mem(P)

59 fond. di informatica1 parte 559 Deduzioni logiche zCosa vogliono evidenziare i precedenti esempi? z1) ogni accesso in C.M. avviene con il deposito in un registro di CPU (I.C., P, …) dell indirizzo della locazione (cella, byte, voce …) di C.M; z2) ogni insieme di istruzioni (ossia ogni programma) per essere eseguito deve risiedere in C.M. z3) se un salto rimanda ad un indirizzo dove non ce un istruzione, ma un dato: ERRORE!

60 fond. di informatica1 parte 560 Le istruzioni zdel linguaggio macchina sono praticamente comandi in codice. Il codice e quello capito dalla CPU di E.E. con comandi indicati qui con sigle simboliche, da immaginare in binario. zPer es. somma avra il codice ADD z poni in memoria STORE z carica in un registro LOAD z salta (branch) B zsalta e torna indietro(back) BB zconfronta (compare) avra il codice CMP zetc.

61 61 Il formato delle istruzioni zdel linguaggio della macchina varia da C.P.U. a C.P.U. col vincolo che ogni istruzione deve poter stare nel registro I.R. della C.P.U. per essere decodificata e poi eseguita. Il numero dei bit di I.R. varia da C.P.U. a C.P.U…. zSe per es. IR ha 32 bit allora si potrebbero usare: 8 bit per il codice operativo (leggi, scrivi, somma …), 4 bit indicare il supporto, 4 bit il tipo di indirizzamento ( immediato, diretto, indiretto ) e 16 bit per indirizzare la memoria o altro. zSegue un esempio in un ipotetico linguaggio macchina, non usando però codici binari, ma mnemonici. SALTARE 3 diapo.

62 fond. di informatica1 parte 562 Come fare la somma S= i = 5 in linguaggio macchina ? zIn C++ o C {int S = 0, i; zfor ( i=0; i<8; i=++) S+ = 5;} zIn ling.macchina le addizioni si fanno in A=Acc. e per gli indici si usano i Reg. i e cosi a parole: z Azzera A e Carica in Reg. 1 0 zCOME Confronta Reg. 1 con 8 z Se sono uguali salta a VIA z (se no) Aggiungi ad A 5 z Incrementa Reg. 1 di 1 z Salta a COME zVIA Memorizza A in S (A => Mem S )

63 fond. di informatica1 parte 563 E quindi: z CLEAR A z LOAD R 1 #0 (#indica dato immediato) zCOME CMP R 1 #8 ( se il compare da 0 Flag Zero =1 ) z BZ VIA (salta a VIA se Flag Zero =1) z ADD A #5 z INC R 1 (incrementa di 1 R 1 ) z B COME zVIA STORE A ADDR S (--> ADDR S => P e inoltre A => Mem(P))

64 fond. di informatica1 parte 564 o anche e meglio (con 1 giro ed 1 istruzione in meno): z CLEAR A z LOAD R 1 #7 zCOME ADD A #5 z DEC R 1 (decrementa di 1 R 1 : quando R 1 = 0. Flag Zero =1) z BZ VIA (salta a VIA se Flag Zero =1) z B COME zVIA STORE A ADDR S

65 fond. di informatica1 parte 565 BUS zTra le unita di E.E. viaggiano dati e indirizzi … z DOVE? Nei BUS ! zBUS = l' insieme dei collegamenti (cavi e connettori) tra C.P.U. e le altre componenti su cui sono trasferiti le informazioni in parallelo a pacchetti di n bit zBUS indirizzi => n da 16 a 20 bit e zBUS dati => n da 16 a 64 zAttualmente si usano 2-3 livelli di BUS per accelerare i trasferimenti. z

66 66 Memoria di massa : zFunzione: uguale a quella della C.M. (memorizzare !!!), ma tecnologia di tipo magnetico... zCaratteristica: permanenza delle informazioni (come la ROM !!!), ma il Tempo di accesso che dipende dal tipo, msec. Enorme divario con la C.M. !!! Questo divario deve essere compensato con operazioni di input/output che scambino un notevole numero di informazioni in ogni accesso (vedere tra 5 diapo) zSupporto: disco fisso, floppy, nastro, C.D., unità esterna collegabile tramite USB... zLettura/scrittura: Unita di Lettura/scrittura dotata di una testina apposita o di raggio laser.

67 fond. di informatica1 parte 567 Tipo di accesso: zsequenziale e, per dischi (hard e floppy), diretto o casuale (= random) tramite gli indirizzi di settore e traccia creati (cfr.parte 2) con la formattazione che divide il disco in tracce ed ogni traccia in settori a partire da punti di riferimento. RICORDARE che la Formattazione annulla il contenuto preesistente! PERICOLO! zCapacita dei dischetti: da 1200 Kbyte in su zCapacita dei dischi: da 10 Gigabyte zCapacita dei C.D.-D.V.D.: oltre 1 Gigabyte ; zCapacita dei nastri: variabile secondo il tipo di unita

68 fond. di informatica1 parte 568 Unita periferiche: sistema video zE costituito da un display e da una scheda grafica ed ha 2 modalita di funzionamento: alfanumerica (p.e. 25righe x 80colonne di testo) e grafica con necessita di un software pilota (=driver) della scheda grafica che permette diverse modalita, risoluzioni … num. di colori; zelemento base: PIXEL (PIcture ELement) in un raster o matrice (griglia) di PIXEL (1280x1024; …) usabili singolarmente in alta risoluzione, a gruppi in bassa risoluzione.

69 fond. di informatica1 parte 569 Comunicazioni tra elaboratori zSi basano su strumenti Hard./Soft. che permettono di collegare elaboratori di vari tipi in reti locali (LAN) e geografiche (WAN); zoccorrono dispositivi di interfaccia tra elaboratori (per es. schede di rete) e protocolli (regole) di comunicazione; zsi puo anche usare la rete telefonica con l uso di dispositivi che permettono di convertire il segnale analogico (voce) a segnale digitale (bit) e viceversa.

70 fond. di informatica1 parte 570 E inoltre … zparlando di comunicazioni, il mezzo piu semplice per trasferire qualunque informazione sia da C.M. a memoria di massa sia tra Elaboratori di tipo diverso resta il file tipo testo sequenziale memorizzato su memoria di massa. zNel file tipo testo i byte sono interpretati come caratteri ASCII (in altri file, quelli binari, ogni byte e considerato come 8 bit di un dato binario, per es. float); zI file tipo testo possono essere usati in lettura, scrittura e aggiornamento.

71 fond. di informatica1 parte 571 Come si costruisce un file tipo testo in C, C++ ? zOccorre usare le librerie e le funzioni giuste … ma comunque sempre le informazioni al / dal file sequenz. sono trasferite a blocchi, 1 blocco per volta, da / a una zona di C.M. che funge da tampone o buffer (= interfaccia tra i 2 tipi di memoria) e da qui smistate ( Cfr. parte2, file & C.M. ) zIl C e C++ considerano un file sequenziale come un flusso (stream) o successione continua di byte proveniente da/inviata a memoria di massa (analogia con cin e cout). Per gestirlo pero usano procedure diverse.

72 72 Tipi di File zI file si distinguono in sequenziali e ad accesso diretto o casuale (random qui non trattati). zLa differenza sta nella struttura del file: zconcettualmente il file sequenziale si puo assimilare ad una successione di informazioni dove per raggiungere l informazione i-esima occorre leggere le precedenti i-1; il file ad accesso diretto si puo assimilare ad una tabella dove per mezzo di un indice si puo raggiungere qualunque informazione direttamente. Proprio a causa dell uso di un indice si dicono indexed file.

73 73 Gestione di file sequenziali in C++ zA differenza del C (che usa funzioni i cui prototipi sono dichiarati in stdio.h), il C++ usa le funzioni con prototipi dichiarati in fstream.h dove sono anche definiti nuovi tipi di dati che usano la classe fstream con sottoclassi, come per es. il flusso di input e il flusso di output (ifstream, ofstream) da/a un file. zIl discorso completo sarà ripreso subito dopo l introduzione delle classi. zSALTARE 2 diapo.

74 fond. di informatica1 parte 574 NO Gestione di file sequenziali in C zIl C usa le funzioni i cui prototipi sono dichiarati in stdio.h e una struttura FILE anche definita in stdio.h e accessibile con puntatori definiti nel programma-utente. (La struttura FILE - visionarla!- contiene al suo interno anche puntatori al buffer.) Il collegamento con il file fisico si ottiene con la funzione fopen che associa il nome del file al puntatore a FILE dichiarato nel programma utente: lo definisce. I nomi delle altre funzioni utilizzate sono: fscanf, fprintf (analoghe a scanf e printf) per leggere e registrare info. Dove ?

75 fond. di informatica1 parte 575 NO …dove ? zLettura e registrazione avvengono (tramite il buffer) sul file aperto dalla fopen e identificato da un puntatore a FILE dichiarato dall utente; fopen definisce tale puntatore collegandolo al file fisico; fscanf, fprintf usano tale puntatore come primo argomento. Il collegamento e terminato dalla fclose che lo chiude quando il file non serve piu. zVedere i programmi in C che usano le funzioni prototipate in stdio.h per costruire un file (mat2 mat2pro e strutt) ed i programmi per leggerlo (fileper, filequa) tutti in program8.

76 76 E … per emulare la memoria? zLe matrici non bastano: per i dati occorrerebbe una zona a dimensione variabile (che si puo ottenere con luso di funzioni come malloc o new) di int ove porre valori interi e poi un altra zona di float, una di char …; una per gli indirizzi e le istruzioni in linguaggio macchina e poi ancora occorrerebbe un altra zona per gli interi unsigned, etc. Insomma un contenitore di elementi di tipo diverso, non omogenei ed anche a dimensione variabile. zUn tipo di variabile strutturata che permette di mantenere in memoria un insieme fisso di elementi non omogenei e la struct del C e C++ simile al record del Pascal.

77 fond. di informatica1 parte 577 Esempio di struct in C e C++ zstruct studente z{char nome[20]; zchar cognome[25]; zint eta; zfloat peso; zfloat altezza; z}; Concettualmente con la keyword struct si definisce un tipo di tabella non omogenea con elementi di vari tipi che in C e C++ possono essere anche funzioni: cosi fatta la struct puo servire a introdurre la class del C++…ma questa e un altra storia che inizia con…

78 fond. di informatica1 parte 578 Il paradigma O.O. (Object Oriented) zSi tratta di un modello che mette in luce l aspetto dell astrazione dei tipi di dati. zI dati sono spesso di tipo complesso composti per esempio da suoni, immagini oltre che da valori numerici e alfanumerici. Occorre scrivere software adeguato alla loro gestione. Si raggiunge questo obiettivo con la definizione di nuovi tipi di dati che si dicono tipi di dati astratti e si distinguono da quelli predefiniti come int, float… Come i predefiniti sono gestiti con proprie funzioni (per es. operazioni aritmetiche intere per il tipo int) anche i tipi di dati astratti sono gestibili solo con proprie funzioni dette metodi.

79 79 Un esempio: il tipo pila zE un esempio semplice, ma che ha tanti esemplari nel mondo reale: pila di pratiche, pila di piatti, pila di parentesi, pila di registri di memoria…. zSi puo realizzare considerando una struttura sequenziale di valori in cui le inserzioni ed i prelievi avvengono allo stesso estremo: la cima o TOP della pila zil primo entrato A è l ultimo ad uscire: questo è il criterio di gestione della pila: LIFO Last In First Out CBACBA

80 fond. di informatica1 parte 580 Tipi di dati astratti zCome si definisce un Tipo di dato astratto ? per esempio il tipo pila? La definizione del tipo pila si chiarisce con la sua struttura e con lindicazione dell algoritmo LIFO di gestione tipico della pila z per un Tipo di dato astratto e importante definire: zla struttura dati (proprietà statiche); zle proprietà dinamiche (gli algoritmi usati per la relativa gestione) ossia le funzioni associate al tipo detti metodi. zQuindi il Tipo astratto e definito sia in senso statico con la sua struttura che dinamico con i suoi metodi che lo possono (loro soltanto!!!) manipolare. Al Tipo astratto è associata una classe di Oggetti ciascuno con il proprio Valore.

81 fond. di informatica1 parte 581 ed in C++ ? zLa class del C++ permette la definizione e la costruzione di tipi di dati astratti che si definiscono per gestire oggetti complessi e da proteggere come la memoria, la pila, lo studente, il tempo, il punto… zIl tipo pila diventa la class pila che può avere una tabella per memorizzare i suoi elementi ed i metodi impila per inserirci nuovi elementi ed espila per estrarre elementi: ad altre procedure sarà vietato l accesso alla pila. zSi realizza così anche la protezione di oggetti!

82 82 Sintassi d uso! zIn qualunque oggetto del C++ il punto. collega l oggetto alle sue caratteristiche. Per il tipo pila un oggetto p della class pila avrà p.tab[n] come struttura statica e come metodi p.impila(), p.espila(). zDefinita la class pila un oggetto p appare come una variabile di tipo pila: pila p; zLa progettazione-costruzione di nuovi tipi di oggetti (di cui un esempio è in program7 project 92 e qui di seguito) non è elementare, anche perché prevede una sintassi particolare. zNon è difficile invece utilizzare oggetti già progettati e che si ritrovano nelle librerie del C++ … e questo proveremo a fare.

83 fond. di informatica1 parte 583 prima però: PROGRAM contator z/*Il programma contator.cpp deve: zmostrare come si usano le classi in C++ con una classe di contatori. zViene definito Contatore come class con i tipi dei suoi dati e le relative funzioni. Queste funzioni (e solo loro) permettono di lavorare con oggetti della classe: con esse si azzera, si incrementa, si decrementa, si interroga un contatore. Esaminare il main qui di seguito !Esaminare le definizioni di Contatore e delle sue funzioni (metodi). zFar girare il prg. project92 e alla fine chiuderlo !

84 84. z#include "iostream.h" //"Libreria richiesta I-O C++ z#include "conio.h" // " " I/O speciale (clrscr) z#define MAX 9 z/* seguono la dichiarazione dellaclasse contatore (nuovo tipo) e del prototipo della funzione attendi */ zclass contatore z{unsigned int valore; zpublic: zvoid azzera(); zvoid incrementa(); zvoid decrementa(); zunsigned int contenuto(); z}; zvoid attendi(); zmain() z/* Inizio Modulo principale */ z{ int n; z contatore c1,c2; z/* INIZIO Parte esecutiva */ clrscr(); z/* Azzeramento*/ c1.azzera(); c2.azzera(); z/* Incremento */ for (n=0; nvalore = 0; return; } ….

85 85 Oggetti zIn C++ oggetti sono: le stringhe, i flussi di input/ouput, i pixel o in generale i punti… definiti come oggetti delle relative class zCominciamo con i flussi di informazioni e con la gestione di file sequenziali in C++ (rimasta in sospeso). zC++ gestisce i file sequenziali con le funzioni i cui prototipi sono dichiarati in fstream.h dove sono anche definiti nuovi tipi di dati che usano la classe fstream (flusso) con sottoclassi, come per es. il flusso di input e il flusso di output (ifstream, ofstream) da/a un file. zIncluso fstream.h nel programma si deve definire una variabile di tipo flusso e poi collegarla zo con un file fisico presente su disco (quindi da leggere) zo col file da creare (registrare) su disco o da aggiornare.

86 86 Apertura del file zQuesta operazione di collegamento si chiama apertura del file e richiede: zo l indicazione sul tipo di gestione del file: lettura, scrittura, aggiornamento ? zoppure l uso delle sottoclassi che il C++ fornisce ossia ifstream come tipo di flusso di input e ofstream come tipo di flusso di output (seguono esempi); per l aggiornamento si usa invece un altra specifica qui non trattata. zSi noti che anche cin è un oggetto della classe iostream con cin.fail, cin.eof(), cin.get(char*,... ) … sue funzioni… o metodi !

87 fond. di informatica1 parte 587 Lettura file sequenziale in C++ zPer leggere il file numeri.txt si puo scrivere: z… int n, elabora(int); zifstream fi;//fi=var. tipo flusso input (analogia con cin) zfi.open(numeri.txt); /* si richiede di aprire il file numeri.txt collegandolo al flusso fi */ zif (!fi) // se fi = 0 l apertura e fallita z{cout<> n; /* finche non trovi EOF, leggi, poni in n e visualizza n e il risultato*/ zcout <<\n n=;<

88 fond. di informatica1 parte 588 Un esempio della lettura zdi un file di struct è project43 in program7 in cui viene letto un file tipo testo (infdat.txt) e sono visualizzate le informazioni in esso contenute insieme ad altre calcolate. zIn project43 viene richiesta la registrazione di tutte le informazioni in un nuovo file. A voi provare usando le informazioni della diapo seguente.

89 fond. di informatica1 parte 589 Costruzione file sequenziale zPer registrare nel file risult.ati una sequenza di interi in C++ si puo per esempio scrivere : z… int i, elabora(int), n [100]; /* si pensi ad inizializzare il vettore n con un for... */ zofstream fa; // fa=var. tipo flusso output (…cout) zfa.open(risultati.txt); /* si richiede di aprire il file risultati.txt e di collegarlo al flusso fa */ zif (fa) // se fa = true il file gia esiste zcout<

90 90 Continuiamo con un cenno agli oggetti grafici zLa grafica è un capitolo importante della programmazione, ma qui solo un accenno indicativo: vedere e capire project39 (Grafica1) che è un applicazione VISUAL e disegna 2 linee, un rettangolo ed un ellisse. zSono tutti oggetti che si ricavano dall oggetto grafico fondamentale che è il punto. z(…comunque per fare semplicemente un disegno in C++ della Borland: aprire un applic. visual che apre una finestra form1 con i Pixel in evidenza; trasportarci col mouse il botton OK a cui dare il nome Run e associarlo al funzionamento; andare nella guida, cercare Tpoint, Canvas (tela) e vedere gli esempi …

91 fond. di informatica1 parte 591 Gli esempi In programm7 il project43 usa una tabella di struct definita come variabile locale del main. zSi noti come il passaggio alla procedura visualizza avviene per indirizzo usando semplicemente il nome della struct da passare. zAnche per le struct il nome è sinonimo dell indirizzo che si può anche porre in un puntatore, ma questo è un modo di utilizzo meno elementare. zIl project 92 fa un esempio di class. zIl project39 fa un ellisse e 2 linee: per usare punti vedere gli esempi in tpoint (tipo punto) zIl project 30 in program6 risponde alla domanda di ieri e cerca un elemento nella tavola pitagorica. I suoi obbiettivi sono:

92 fond. di informatica1 parte 592. z/*Il programma deve: costruire la tavola pitagorica della moltiplicazione e visualizzarla per righe e ricercarvi un elemento con la funz. int ricerca(...) che restituisce o il valore trovato, o 99 e gli indici del valore trovato: poi il main lesamina e se il valore restituito é 99 dice che la ricerca é fallita. seguono: prototipo, attivazione nel main e funz. ricerca*/ z int ricerca (int [][MAX], int, int*, int*); z… zcout<<"dammi un intero "; z cin >>ricercato; z cout<

93 fond. di informatica1 parte 593. zint ricerca (int t[][MAX], int v, int* p1, int* p2) z { /* Inizio ricerca che cerca in t il valore v e z se lo trova lo pone in reso e pone in *p1 e in *p2 i suoi indici */ z int reso =99, ir, ic; z for (ir=1; ir

94 fond. di informatica1 parte 594 Argomenti del main zPer trasmettere ad un programma C o C++ informazioni (per es. il nome del file di lavoro dati.per) si usano i parametri della main function che finora era sempre scritta main(). La main function ha 2 forme di intestazione: zint main() zint main(int argc, char* argv[]) zdalle quali si nota che il valore di ritorno e int (come quello indicato nella frase return (0) !!), ma spesso int è omesso.

95 fond. di informatica1 parte 595 main zNella seconda forma si notano: int argc che e il numero di parametri trasmessi, char* argv[] che e un vettore di puntatori a stringhe= nomi dei parametri trasmessi. zIn argv[0] c e il puntatore al nome del programma, primo argomento presente sulla linea di attivazione del programma stesso; nei successivi ci sono puntatori alle stringhe che sono gli altri argomenti presenti sulla linea di attivazione del programma stesso.

96 fond. di informatica1 parte 596 … Ancora esempi zAvendo scritto la frase main cosi: zmain(int argc, char *argv[]) zla linea di attivazione potra essere cosi fatta: fileper.exe dati.per zdove il file di dati da leggere (dati.per) e fornito in argv[1], in argv[0] va fileper (nome del programma) e argc viene posto =2. zTutto questo deve servire da guida, ma per imparare occorre FARE e poi provare e riprovare con pazienza! zfine … anzi no, prima ecco un regalino!

97 fond. di informatica1 parte 597 S A T O R A R E P O T E N E T O P E R A R O T A S zE una formula (magica ?) che é incisa nella parete esterna sinistra (gurdando la facciata) del Duomo di Siena. zEra usata nella realizzazione di opere importanti come buon augurio. zSi legge in tutti i sensi … ma cosa significa?

98 fond. di informatica1 parte 598 Il Significato sembra il seguente: Il Seminatore Tiene con l Opera le Ruote dell Aratro (Arepo dal greco Arotron) zche però potrebbe essere anche un nome magico come Aleppe (in Dante: Pape Satan, Pape Satan Aleppe). Permutando tutte le lettere del quadro magico si ottiene: P z A z T z E z R z P A T E R N O S T E R z O z S z T z E z R un esempio di permutazione che vi lascio da fare con un programma in C++!!! FINE !

99 fond. di informatica1 parte 599 Appendice a): perplessita 1 zRICORDARSI: l operatore >> preleva un dato dal un flusso di input: che tipo di dato? Il tipo che e stato dichiarato: char, int, float,... z2) RICORDARSI: non abusare di matrici e/o vettori; usarli solo quando esiste la necessita di tenere memoria dei valori calcolati o letti: se tale necessita manca allora usare il valore letto per i calcoli necessari e passare al successivo valore da leggere.

100 fond. di informatica1 parte 5100 Appendice a): perplessita 2-1 zRicordare che gli indici di un array sono SEMPRE di tipo discreto, MAI floating- pont!!! zNON CONFONDERE INDICE CON CONTENUTO DI UN ELEMENTO !!! zEd ancora array e strutture sono passati a procedure per indirizzo, ma il loro indirizzo è rappresentato dal loro NOME e NON da &nome o da *nome!!!

101 fond. di informatica1 parte 5101 Ancora su array: perplessita 2-2 zse si vuole fare una ricerca in un array ad una dimensione (vettore) si può usare il metodo lineare esaminando un elemento dopo l altro con un for oppure il metodo della bisezione (dividendo il vettore a metà e poi a metà delle metà e così via) accelerando la ricerca. zIn array a 2 dimensioni (matrici) il modo più semplice da usare è il metodo lineare: si esamina una riga alla volta e dentro ogni riga un elemento dopo l altro con 2 for nidificati.

102 fond. di informatica1 parte 5102 Appendice a): perplessita 2 z3) La funzione elabora usata in tanti esempi di programmi indica col suo nome una elaborazione di tipo generale. Quando l elaborazione e di un tipo specificato e meglio usare nomi di funzioni pertinenti, come fatto nell esempio sulla valutazione del minimo e del massimo (parte 4) dove si usavano nomi come minimo, massimo, rivaluta e memovis. Cosi il programma diventa +comprensibile e -generico Come ulteriore esempio, se in un programma...

103 fond. di informatica1 parte 5103 Appendice a): perplessita 3 z… se in un programma e richiesto di leggere una matrice di valori interi e ricercarvi un certo valore (letto anchesso da tastiera) le funzioni da usare e costruire saranno: zleggi(matrice); cin>> valore; zif (ricerca(valore, matrice, &riga, &colonna)) visualizza(\ntrovo valore in, riga,colonna); zelse cout<< \nIl valore non ce !<

104 fond. di informatica1 parte 5104 Appendice a): GIA FATTO perplessita 4 z4) RICORDARE: la codifica F.P. normalizzata fa riferimento alla base 2 e quindi il valore dell esponente riguarda la base 2. Col metodo delle moltiplicazioni successive ogni moltiplicazione per la base isola una nuova cifra nella nuova base. Per es. = avra 11 2 come parte intera e come parte decimale. Normalizzando E+10 2 con S=0, M= , E=010 2.

105 fond. di informatica1 parte 5105 Appendice a): perplessita 5 z5) RICORDARSI di fare attenzione alle specifiche di progetto di un programma: IN PARTICOLARE alle specifiche di progetto del programma da costruire all esame che stanno nelle relative richieste. Analizzarle e riflettere! zUN CONSIGLIO per l esame: scrivere il programma in modo semplice e chiaro, con qualche commento, ma senza fronzoli, badando a rispondere a tutte e sole le richieste. Privilegiare la sostanza ! Se resta tempo aggiungere … i fiorellini !

106 106 Appendice a): perplessita 6 6)RICORDARE quanto detto in fondinf3 diapo 48 e seg. Primo motivo per l' introduzione dei sottoprogrammi: Si inserisce una sola volta il codice del sottoprogramma (per es. la printf ….) Se si devono leggere 10 matrici si scrive una procedura di lettura di una matrice generica e si richiama 10 volte per leggere le 10 matrici una alla volta!!! NON scrivere una procedura con la lettura di 10 matrici … (e capita anche che qualcuno la richiami 10 volte!!!)

107 fond. di informatica1 parte 5107 Appendice a): perplessita 7 zAttenzione al significato del while che è: zfin tanto che, per tutto il tempo che è vera la condizione tra parentesi zE NON: fino al momento in cui diventerà vera!!! zSe si deve leggere un valore <0 si scriverà: zcin>> comodo; z while (comodo >=0) cin>> comodo; zed anche, se A e B sono array: z if (tot

108 fond. di informatica1 parte 5108 Appendice a): continua perplessita 7 zed inoltre: usare il while appropriatamente! zNON si deve scrivere: zcin>> comodo; z while (comodo >=0) z{ } zva in loop !!!

109 fond. di informatica1 parte 5109 Ancora ricordare: znella provetta non sarà richiesto l uso di file che invece potranno essere richiesti nei temi d esame dove potranno essere anche domande su algoritmi ricorsivi, sul funzionamento della CPU, sui tipi di dati astratti, sugli argomenti del main … insomma su quello che si trova in quest ultima dispensa. zCome appare dal file Notifica.doc sono ammessi alla seconda provetta TUTTI E SOLI gli studenti che hanno fatto la prima provetta, NON ALTRI. zPresentarsi alla provetta con il libretto da RITIRARE alla fine della provetta.

110 fond. di informatica1 parte 5110 Iscrizione agli esami zPer gli esami occorre ISCRIVERSI, nel foglio che si troverà sulla porta del mio studio. zSono valide le iscrizioni fatte fino a 2 giorni prima dello scritto. zNON SI POSSONO FARE 2 APPELLI CONSECUTIVI !!! zPresentarsi all esame scritto col libretto da ritirare alla fine dello scritto.

111 fond. di informatica1 parte 5111 Appendice b): esempi di temi desame del 2000: simili saranno anche nel 2006 zFondamenti di Informatica 1 z TEMPO = 1 ORA e 1/2, z NON AMMESSI TESTI, APPUNTI, CALCOLATRICI. z1) Conversioni di base (punteggio =2) z Esprimere in base 10 l' intero positivo piu' grande rappresentabile con 6 bit in base 2. z Scrivere la rappresentazione binaria normalizzata di 3/4 z2) (punteggio =1) z Come sono effettuate le divisioni per 2 dei numeri interi dall' Unita' Aritmetico-Logica? z

112 fond. di informatica1 parte 5112 Appendice b; continua 2 z3) (punteggio =2) NO z In un circuito logico a 3 ingressi (V,X,Y) la funzione Z vale 1 quando la combinazione di ingresso e dispari: scrivere la funzione Z. z4) (punteggio =5) zScrivere in C o C++ un programma strutturato in sottoprogrammi che provveda a costruire in Memoria Centrale una matrice F di N*M elementi float. Ogni elemento di F deve contenere il valore della funzione zf = 0.5*x2 +1.5*y +1 zper x variabile con passo dx=0.5 nell' intervallo 0.0 x 2.0 e y variabile con passo dy=0.1 nell' intervallo 0.0 y 0.3 (Estremi inclusi!)

113 fond. di informatica1 parte 5113 Appendice b; continua 3 z(SI NOTI che N ed M vanno calcolati in funzione degli intervalli di definizione di x e y e dei passi dx e dy sopra specificati). zDopo la costruzione della matrice F, il programma deve: zvisualizzare su video i valori N e M e la matrice F per righe. zN.B. E' SCONSIGLIATO L' USO DI VARTIABILI GLOBALI zFondamenti di Informatica 1 z TEMPO = 1 ORA e 1/2, z NON AMMESSI TESTI, APPUNTI, CALCOLATRICI. z1) Conversioni di base (punteggio =2) z Dare la forma normalizzata binaria Floating Point con 1 bit per S, 3 bit per E, 4 bit per M del valore X=1/4 in base 10.

114 fond. di informatica1 parte 5114 Appendice b; continua 4 zDare la rappresentazione binaria in complemento a 2 con 8 bit di X = z2) (punteggio =1) Indicare quante sono e quali sono le fasi di cui si compone il ciclo della CPU (Unita' Centrale di Elaboraz.) z3) (punteggio =2) Indicare sinteticamente come lavora un Sistema operativo multiprogrammato e dove si trovano i "molti" programmi da essere eseguiti. z4) (punteggio = 5) Scrivere in C++ un programma strutturato in sottoprogrammi che faccia le seguenti azioni tramite apposite procedure o funzioni: z _ costruire in Memoria Centrale un vettore (tabella) di 10 elementi interi ordinati dove ogni elemento e' divisibile per 3 e per 5 ossia 15, 30, 45, 60,... e visualizzarlo

115 fond. di informatica1 parte 5115 Appendice b; continua 5 z_ chiedere all' utente 2 valori interi (non compresi tra quelli posti nel vettore); z_ aggiungere nel vettore i 2 valori letti posizionandoli nei posti voluti dall' ordinamento e visualizzare il vettore cosi' modificato. (Se per esempio i valori letti sono 7 e 31 il vettore modificato risultera': 7, 15, 30, 31, 45, 60,... ) z N.B. E' SCONSIGLIATO L' USO DI VARTIABILI GLOBALI zFondamenti di Informatica 1 z TEMPO = 1 ORA e 1/2, z NON AMMESSI TESTI, APPUNTI, CALCOLATRICI. z1) Conversioni di base (punteggio =2) z Usando l' aritmetica binaria e la notazione in complemento a 2

116 fond. di informatica1 parte 5116 Appendice b; continua 6 z calcolare: la differenza tra e ; z il valore di un registro a 4 bit contenente z z2) (punteggio =1) Indicare la funzione del linker e quando e' usato. z3) (punteggio =2) NO !Indicare come viene realizzata la dipendenza dal tempo nei circuiti elementari di memoria FF_SR utilizzati per memorizzare i bit. Indicare anche la loro struttura. z4) (punteggio =5) Scrivere in C++ un programma strutturato in sottoprogrammi che in Memoria Centrale utilizzi 3 matrici bidimensionali di interi e di dimensione 3x3, A, B, C, e dotato di un programma principale consistente dei passi seguenti: z

117 fond. di informatica1 parte 5117 Appendice b; continua 7 z P1. init (A); init (B); z P2. C = A*B; z P3. stampa(A), stampa(B), stampa(C). zNOTE: Le matrici A e B devono essere opportunamente inizializzate tramite una procedura di lettura da tastiera, con prototipo del tipo: void init(X) dove X e' una matrice 3x3 che in uscita da init contiene i valori letti; zLe 2 matrici A e B cosi' inizializzate, devono essere moltiplicate tramite la procedura: void product(....) con tre parametri (matrice C in uscita, matrici A e B in ingresso), ossia il risultato di product(...) e': C = A*B (ricordando che un elemento C[i][j] e' dato dalla sommatoria in k di A[i][k] * B[k][j] );

118 fond. di informatica1 parte 5118 Appendice b; continua 8 zLe matrici A, B, C devono essere visualizzate tramite la procedura void stampa(X) che visualizza per righe sul display la matrice X di dimensioni 3x3. zN.B. E' SCONSIGLIATO L' USO DI VARTIABILI GLOBALI. zFondamenti di Informatica 1 z TEMPO = 1 ORA e 1/2, z NON AMMESSI TESTI, APPUNTI, CALCOLATRICI z1) Conversioni di base (punteggio =2) zda base 2 in forma Floating Point normalizzata con Segno = 0, zEsponente= Mantissa Normalizzata= a base 10 =? zda base 10 a base 16: = ?

119 fond. di informatica1 parte 5119 Appendice b; continua 9 z2) (punt. =1) Indicare la differenza tra file e directory del DOS. z3) (punteggio =2) In cosa consistono le fasi di Fetch (prelievo) e decodifica di un' istruzione in linguaggio macchina ? chi le attua ? z4) (punteggio = 5) Scrivere in C++ un programma strutturato in sottoprogrammi che: zlegga da tastiera un insieme di valori interi da memorizzare in T array monodimemnsionale (vettore) di al massimo 99 elementi; zattivi una procedura Conta che esamini T e restituisca 2 valori e cioe': il numero degli elementi effettivamente presenti in T, e il numero degli elementi che hanno un valore non divisibile per 2 ne' per 3 e visualizzi sul video tali numeri. zN.B. E' SCONSIGLIATO L' USO DI VARTIABILI GLOBALI

120 120 Esempio di provetta: esame del Scrivere un programma strutturato in sottoprogrammi che in Memoria Centrale utilizzi 3 matrici bidimensionali di interi e di dimensione 3x3, A, B, C, e dotato di un programma principale consistente dei passi seguenti: z P1. (punteggio =3) init (A); init (B); z P2. (punteggio =3) C = A*B; z P3. (punteggio =2) stampa(A), stampa(B), stampa(C). zNOTE: zLe 2 matrici A e B devono essere (inizializzate tramite una procedura che genera numeri casuali compresi tra 0 e 8, escludendo però 3 ed i suoi multipli) lette da tastiera per righe; zle 2 matrici A e B cosi' inizializzate, devono essere moltiplicate tramite una procedura che ne effettua il prodotto e lo pone in C. (Ricordare che un elemento C[i][j] e' dato dalla sommatoria per k che varia da 0 a 2 di A[i][k] * B[k][j] ); zLe matrici A, B, C devono essere visualizzate tramite apposita procedura che visualizza per righe sul display una matrice di dimensioni 3x3. zLa soluzione è in program6, project35 e di seguito z

121 fond. di informatica1 parte 5121 /* Dichiarazione dei Prototipi dei MODULI usati */ void scrivi(int [][MAX], char); /*si dichiara di usare una mat. di MAX colon. e con un carattere che sarà il nome della mat. */ void attendi(); void leggi(int [][MAX]); void prodotto(int [][MAX],int [][MAX],int [][MAX]); //3 mat. main() {/* Inizio Modulo principale */ int A[MAX][MAX],B[MAX][MAX],C[MAX][MAX]; /* INIZIO Parte esecutiva */ leggi (A); leggi(B); prodotto(A,B,C); clrscr(); scrivi(A, 'A'); scrivi(B, 'B'); scrivi(C, 'C'); attendi(); return(0); } /* Fine Modulo principale */

122 fond. di informatica1 parte 5122 void scrivi (int t[][MAX], char nome) /* t =nome della matrice */ { /* Inizio scrivi */ int ic,n; cout<<"\nMatrice "<

123 fond. di informatica1 parte 5123 void prodotto(int a[][MAX],int b[][MAX],int c[][MAX]) //i nomi sono minuscoli !!! { /* Inizio prodotto */ int i,j,k; //var. di controllo for (i=0; i


Scaricare ppt "Fond. di informatica1 parte 51 fondamenti di informatica parte 5 appunti per la laurea in Ingegneria Civile, Edile, Ambientale a.a. 2005-2008 di anna maria."

Presentazioni simili


Annunci Google