300 likes | 510 Views
Lo stato. Il riuso dei componenti. Una critica. L’impostazione funzionale e’ sempre costruttiva. Ma si puo’ sempre solo creare?
E N D
Lo stato Il riuso dei componenti AN Fondam98 Controllo
Una critica • L’impostazione funzionale e’ sempre costruttiva. Ma si puo’ sempre solo creare? • Perche’ creare una versione nuova di un accumulatore ad ogni passo iterativo, visto che l’elaboratore di Von Neumann permette la modifica del contenuto di una cella di memoria? AN Fondam98 Controllo
Una proposta • E’ possibile riusare una stessa parte-dati senza bisogno di crearne una nuova ad ogni passo computazionale? • Ci sono controindicazioni? AN Fondam98 Controllo
Parte dati e parte controllo • Data una unita’ operativa prefissata (ad es. una unita’ artimetico-logica) e’ possibile dare soluzione a problemi diversi riusando la stessa parte operativa? • Algoritmi=dati + controllo AN Fondam98 Controllo
Stile imperativo Assegnamento e costrutti di controllo AN Fondam98 Controllo
Un componente con stato interno boolean fa(boolean a,boolean b){ boolean s = mfn(a,b,r); //inizializzazione r= sfn(a,b,r); //assegnamento return s; } • La variabile r e’ non locale • La funzione fornisce risultati diversi per coppie uguali di valori AN Fondam98 Controllo
Variabili nei linguaggi imperativi • Rappresentano astrazioni delle celle di memoria di un elaboratore piuttosto che sinonimi di dati • Sono associate a due diverse informazioni: • l'indirizzo di una cella di memoria (o della prima cella di un blocco di celle) • il contenuto AN Fondam98 Controllo
3.22 a x Variabili nei linguaggi imperativi la corrispondenza tra la variabile x e il valore 3.22 puo' venire rappresentata come segue: a si dice l-value di X 3.22 si dice r-value di X AN Fondam98 Controllo
Assegnamento int X=3; X = X + 1; • calcola il valore (v) dell’espressione X+1 • assegna il valore v al blocco di celle di indirizzo X.l-value • restituisce il valore v AN Fondam98 Controllo
Assegnamento int X=3; int Y; Y = X = X + 1; calcola il valore (v) dell’espressione X+1 • assegna il valore v al blocco di celle di indirizzo X.l-value • assegna il valore v al blocco di celle di indirizzo Y.l-value • restituisce il valore v AN Fondam98 Controllo
L’operatore ++ (postfisso) int X=3; X++; • calcola il valore (v) dell’espressione X • assegna il valore v+1 al blocco di celle di indirizzo X.l-value • restituisce v AN Fondam98 Controllo
L’operatore ++ (prefisso) int X=3; ++X; • calcola il valore (v) dell’espressione X+1 • assegna il valore v al blocco di celle di indirizzo X.l-value • restituisce v AN Fondam98 Controllo
Comandi • notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno del programma o quello del mondo circostante. • Le strutture di controllo (if,-then-else, while-do, for, repeat-unitl, switch, etc.) permettono di aggregare comandi semplici in macrocomandi AN Fondam98 Controllo
Procedure • costrutti che permettono di attribuire un nome ad un macrocomando e renderlo parametrico if( x == 3 ) return 2+x*sin(0.75); elsereturn x; double f1(double x ){ if( x == 3 ) return 2+x*sin(0.75); elsereturn x; } AN Fondam98 Controllo
Istruzioni di controllo Scelte e cicli AN Fondam98 Controllo
Espressioni ... int f( int n,int i,int v ){ //inizialmente v = 1 //invariante di ciclo: v=i! return (i==n)?v:f(n,i+1,(i+1)*v); } Chiamata: …f(n,0,1) AN Fondam98 Controllo
… istruzioni ... int f( int n,int i,int v ){ //inizialmente v = 1 //invariante di ciclo: v=i! if(i==n) return v; else return f(n,i+1,(i+1)*v); } AN Fondam98 Controllo
Istruzioni di controllo: while int f( int n ){ //inizialmente v = 1 int v=1; int i=0; //invariante di ciclo: v=i! while (i<n){ i = i + 1 ; //v=(i-1)! v = i * v ; //v/i=(i-1)! => v=i! } //v=i! and i==n => v=n! return v; } Fondamenti 97 AN Fondam98 Controllo
Istruzioni di controllo: for int f( int n ){ //inizialmente v = 1 int v=1; //invariante di ciclo: v=i! for( int i=1;i<n;i++) v = i*v; return v; } Fondamenti 97 AN Fondam98 Controllo
Problemi • Dato un array di 10 interi: • determinarne il valore minimo • determinare la posizione del minimo • determinare la somma dei valori negativi e dei valori positivi • determinarne una rappresentazione in forma di stringa • scriverne i valori in senso crescente AN Fondam98 Controllo
Minimo di un array di interi int min( int a[], int n ){ //n = indice ultima componente di a PROGETTO RICORSIVO • se n==0 il minimo vale a[0] • se n>0, detto minR il minimo di a da 1 a n, il minimo e’ il minore tre a[0] e minR AN Fondam98 Controllo
Minimo di un array di interi PROGETTO ITERATIVO int min(int a[],int n,int i,int m){ //n = indice ultima componente di a //m e’ il minimo delle componenti di a da 0 a i • se i==n il minimo vale m • se n>i, il risultato e’ dato da: min(a,n,i+1,(a[i+1]<m)?a[i+1]:m) AN Fondam98 Controllo
Minimo di un array di interi int min(int a[],int n){ //n = indice ultima componente di a int i=0; int m = a[0]; //m e’ il minimo delle componenti di a da 0 a i while (i<n){ i=i+1; if( a[i]<m ) m=a[i]; }//m e’ il minimo delle componenti di a da 0 a i and i=n return m; } AN Fondam98 Controllo
Posizione del Minimo int min(int a[],int n){ //n = indice ultima componente di a int i=0; int m = 0; //m e’ la posizione del minimo delle componenti di i a da 0 a i while (i<n){ i=i+1; if( a[i]<m ) m=i; }//m e’ la posizione del minimo di a da 0 a i and i=n return m; } AN Fondam98 Controllo
Da array a stringa String arToS( int a[],int n){ String s=“[ ”; for(int i=0;i<n;i++) s = s+a[i]+” “; s = s + “ ]” return s; } int[] a={3,4}; String s=arToS(a,a.lentgh); [ 3 4 ] AN Fondam98 Controllo
Programmi imperativi: struttura Leggi le informazioni di ingresso Elabora Scrivi le informazioni in uscita AN Fondam98 Controllo
Un programma Java publicclass programma{ public static void main(String[] args){ int x,y; x = System.in.read(); y = x*x; System.out.println( y ); } } AN Fondam98 Controllo
Un programma Java: gli argomenti publicclass programma{ public static void main(String[] argv){ for(int i=0; i<argv.length; i++) System.out.println( argv[i] ); } } AN Fondam98 Controllo
Un programma C void main(){ int x,y; scanf(“%d”,&x); y = x*x; printf(“%d\n”, y ); } AN Fondam98 Controllo
Un programma C: gli argomenti void main(int argc, char* argv[] ){ int i; for(i=0;i<argc;i++) printf("%s\n",argv[i]); } AN Fondam98 Controllo