Vs ANSI Almerico Murli- a.a. 2003/2004 1 Un esempio per cominciare La somma di 3 numeri PROGRAM SOMMA; VAR A,B,,d:REAL; BEGIN (* Inizializzazione di A,B, *) READLN(); A:=5.; B:=7.; (* alcolo della somma tra A,B e *) d:=a+b+; (* Stampa del risultato *) WRITELN ( SOMMA=,d); END. #include <stdio.h> main() { /* inzio */ float a,b,,d; /* Inizializzazione di a, b, c */ scanf( %f,& ); a=5.; b=7.; /* alcolo della somma tra a,b e */ d=a+b+; printf( SOMMA= %f \ n,d); /* Stampa del risultato*/ } /* fine */ Almerico Murli- a.a. 2003/2004 2
Inizio e fine di un programma L inizio di un programma è determinato da BEGIN La fine di un programma è determinata da END. L inizio di un programma è determinato dalla prima parentesi { La fine di un programma è determinata dall ultima parentesi } main( ) { /* inizio */ } /* fine */ Almerico Murli- a.a. 2003/2004 3 Regole sintattiche Possibilità di scrivere più istruzioni sulla stessa linea; Non c e differenza tra lettere minuscole o maiuscole. Possibilità di scrivere più istruzioni sulla stessa linea; è differenza tra lettere minuscole e maiuscole. Almerico Murli- a.a. 2003/2004 4
I ommenti (* Inizializzazione di A, B,, d *) (* Inizializzazione di A, B,, d *) La linea di commento è racchiusa tra ( * *) oppure { } /* Inizializzazione di a, b, */ /* Inizializzazione di a, b, */ La stringa di caratteri di un commento è racchiusa tra /* */ Almerico Murli- a.a. 2003/2004 5 Dichiarazioni delle variabili VAR A,B, : REAL; VAR A,B, : REAL; VAR I,J : INTEGER; VAR I,J : INTEGER; float a,b,,d; float a,b,,d; int a,b,,d; int a,b,,d; Almerico Murli- a.a. 2003/2004 6
Operazioni di I/O WRITELN( SOMMA=,); Le operazioni di I/O sono eseguite da istruzioni READ();, READLN(); WRITE();,WRITELN( ); printf( SOMMA= %f \n,c); printf( SOMMA= %f \n,c); Le operazioni di I/O sono eseguite da funzioni di libreria scanf( ); printf( ); Almerico Murli- a.a. 2003/2004 7 Assegnazioni A:=5; A:=5; L operazione di assegnazione si effettua attraverso l operatore := a=5; a=5; L operazione di assegnazione si effettua attraverso l operatore = Almerico Murli- a.a. 2003/2004 8
: Utilizzo degli header file Prima dell istruzione main() e presente una direttiva del tipo: #include file.h Per eseguire Operazioni di I/O Per utilizzare Funzioni Matematiche Gestione Stringhe... file.h contiene: specifiche di funzioni; definizioni di strutture di dati; definizioni di parametri;... #include<stdio.h> #include<math.h> #include<string.h> Almerico Murli- a.a. 2003/2004 9 stdio.h int scanf( const char *format,.) Lettura da tastiera; int fscanf(file *strean, const char *format, ) lettura da file ; int printf(const char *format,.) int fprintf(file *strean, const char *format, ) FILE *fopen ( cont char *filename, cost char *mode) FILE *fclose ( FILE * stream ) Stampa a video; Stampa su file; Apertura file; hiusura file; Almerico Murli- a.a. 2003/2004 10
math.h Gli argomenti x ed y sono di tipo double, n è di tipo int e tutte le funzioni restituiscono un double. double sin( x) seno di x; double cos(x) coseno di x; double tan(x) tangente di x; double exp(x) funzione esponenziale e x ; double log(x) logaritmo naturale ln(x), con x>0; double log10(x) logaritmo in base 10 log(x), con x>0; double pow(x,y) potenza x y ; double sqrt(x) radice quadrata di x, con x>0; Almerico Murli- a.a. 2003/2004 11 : operazioni a basso livello 1. Operazioni dirette sui bit 2. Accesso agli indirizzi delle variabili. Almerico Murli- a.a. 2003/2004 12
Problema Verificare se un numero naturale e PARI o DISPARI PROGRAM PARDIS; VAR N,RESTO : INTEGER; BEGIN WRITELN( inserisci numero ); READLN(N); RESTO:=N-(N DIV 2)*2; IF RESTO = 0 THEN WRITELN( NUMERO PARI ) ELSE WRITELN( NUMERO DISPARI ); END. 1 addizione + 2 molt. #include <stdio.h> main() { int n,resto; printf( inserisci numero\ n ); scanf( %d,&n); resto= n & 1; if(resto==0) { printf( numero pari\n );} else { printf( numero dispari\n );} } 1 confonto bit a bit. Almerico Murli- a.a. 2003/2004 13 Operatore & Regole di composizione dell operatore & & 0 0 0 1 0 ESEMPIO 1 (a & 1) 1 0 1 a=65 10 =1000001 2 a & 1 = 1000001 2 & 1 10 =0000001 2 0000001 2 = 0000001 2 a & 1 = 1 ESEMPIO 2 (a & b) a=40 10 =101000 2 a & b = 101000 2 & b=34 10 =011000 2 011000 2 = 001000 2 a & b = 001000 Almerico Murli- a.a. 2003/2004 2 =8 10 14
Qual è il vantaggio di eseguire un operazione bit a bit? Almerico Murli- a.a. 2003/2004 15 La somma di due numeri con mantissa costituita da n bit richiede: 2n confronti Se T confronto = µ e il tempo necessario per un confronto, allora: T addizione 2n µ Il tempo per eseguire un prodotto e sicuramente maggiore di quello per un addizione T prodotto T addizione T addizione +2 T prodotto > nt confronto =n µ T addizione +2 T prodotto > nt confronto =n µ Almerico Murli- a.a. 2003/2004 16
In particolare Nell esempio,n & 1 equivale al resto della divisione di N per 2 R:=N-(N/2)*2; Il resto della divisione per 2 e il bit meno significativo 0 se il numero e pari 1 se e dispari Es. n=12 10 =1100 2 r = n & 1 = 1100 2 & 0001 2 = 0000 2 Es. n=13 10 =1101 2 r = n & 1 = 1101 2 & 0001 2 = 0001 2 r = n & 1 ; & AND bit a bit Almerico Murli- a.a. 2003/2004 17 ALTRE OPERAZIONI bit a bit Divisione di un numero intero N per 2 N := N/2; dividere per due significa spostare di un posto verso destra la rappresentazione binaria Es. n=13 10 =1101 2 n/2=6 10 = 0110 2 n>>1 ; >> SHIFT verso destra Moltiplicazione di un numero intero N per 2 R := N * 2; Moltiplicare per 2 significa spostare di 1 posto verso sinistra la rappresentazione binaria Es. n=13 10 =1101 2 n * 2= 1101 2 * 0010 2 =11010 2 =26 10 inv << 1; << SHIFT verso sinistra Almerico Murli- a.a. 2003/2004 18
: Operatori sui bit & >> << ^ ~ and shift a destra shift a sinistra or inclusivo or esclusivo complemento a 1 si utilizzano solo con operandi di tipo intero e carattere Almerico Murli- a.a. 2003/2004 19 OSSERVAZIONE RESTO:= N- (N DIV 2) * 2 RESTO:= N- (N DIV 2) * 2 Bisogna utilizzare l operatore DIV per effettuare la divisione tra interi l operatore / si utilizza per effettuare la divisione reali /* Inizializzazione di a, b, */ /* Inizializzazione di a, b, */ l operatore / si utilizza per effettuare la divisione di variabili di QUALSIASI tipo Almerico Murli- a.a. 2003/2004 20
( Operatori sui bit ) ( Puntatori ) Almerico Murli- a.a. 2003/2004 21 Memorizzazione di un dato di tipo intero Indirizzi 1 000 1 0 0 1 1 0 1 0 In Memoria 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 y = 2 x = 3 t = 7 1 1 1 1 Almerico Murli- a.a. 2003/2004 22
Memorizzazione di un dato di tipo reale ESEMPIO z = (.1172x10 2 ) 2= (.1011110 x 2 100 ) 2 0 1 0 1 1 1 1 0 0 1 0 0 Segno della mantissa Segno dell esponente Indirizzi In Memoria 1 000 0 1 00 10 10 10 10 0 0 0 1 1 1 0 x = 0 3 1 001 1 1 10 00 10 10 10 0 1 0 1 0 1 1 t = 17 1 010 z =.1172x10 2 h = -.6625x10 1 1 111 0 0 0 0 1 0 0 0 0 0 0 0 q =.8x10 1 Almerico Murli- a.a. 2003/2004 23 I PUNTATORI DEFINIZIONE Il Il puntatore e e una variabile che contiene l indirizzodi di un altra variabile Indirizzi 1 000 1 001 1 010 In Memoria 0 1 00 10 10 10 100 00 1 1 1 0x = 0 3 z =.1172x10 2 1 1 10 00 10 10 100 10 1 0 1 1t = 17 h = -.6625x10 1 1 111 0 0 0 0 0 0 0 0 1 0 0 0 p = 8 Almerico Murli- a.a. 2003/2004 24
ESEMPI x = 3 variabile di tipo intero x = 3 variabile di tipo intero x 0 0 0 0 0 0 1 1 Indirizzo 1 0 1 0 Px contiene l indirizzo di x Px contiene l indirizzo di x Px 0 0 0 0 1 0 1 0 z variabile di tipo floating-point z variabile di tipo floating-point z 0 1 0 1 1 1 1 0 1 0 0 Indirizzo 1 1 1 1 Pz contiene l indirizzo di z Pz contiene l indirizzo di z Pz 0 0 0 0 1 1 1 1 Almerico Murli- a.a. 2003/2004 25 OME SI DIHIARA UN PUNTATORE? type pointer =^integer; var p : pointer; p e e un puntatore ad una variabile intera. type pointer =^real; var p : pointer; p e e un puntatore ad una variabile reale. int *p p e e un puntatore ad una variabile intera. float *p p e e un puntatore ad una variabile float. Almerico Murli- a.a. 2003/2004 26
In Pascal e e possibile accedere alle variabili attraverso il il loro indirizzo. In e e possibile accedere alle variabili attraverso il il loro indirizzo e conoscere l indirizzo stesso. Almerico Murli- a.a. 2003/2004 27 OME SI DEFINISE UN PUNTATORE in? L istruzione: p = &x; assegna l indirizzo di x alla variabile puntatore P (P punta a x) In memoria: 001 0 0 0 0 1 1 0 0 1 1 X 004 0 0 1 P Almerico Murli- a.a. 2003/2004 28
In particolare. Esempio... int x,*p; p=&x; /*Assegnazione dell indirizzo di x a p */ *p=3; /* L istruzione assegna il valore 3 alla variabile x puntata da p */... p x 100 3 010 Indirizzi di Memoria 100 (P punta a x) Almerico Murli- a.a. 2003/2004 29 Operatori sui bit Puntatori Allocazione dinamica Almerico Murli- a.a. 2003/2004 30
Utilizzo degli array PROGRAM XXXX; BEGIN type vet = array[1..n] of integer; puntvet = ^vet; var a : puntvet; var n,x,i : integer; READLN(N); READLN(x); new(a); for i:=1 to n do a(i)= x *i;... despose(a) END. #include <stdio.h> main() { int *a,n,x,i; scanf( %d,&n); scanf( %d,&x); a=(int*)malloc(n*sizeof(int)); for (i=0; i<n; i++) { a[i]= x * i; }... free(a); } Se n = 4 Utilizzo solo solo della memoria necessaria le le dimensioni di di un un arraysono stabilite in in runtime Almerico (ALLOAZIONE Murli- a.a. 2003/2004DINAMIA) 31 In ed in in è possibile allocare dinamicamentela la memoria Almerico Murli- a.a. 2003/2004 32
Allocazione dinamica in (cont.) type vet = array[1..n] of integer; puntvet = ^vet; var a : puntvet; readln(n); new(a); Numero delle locazioni di memoria da allocare n 00100 a Puntatore all area di memoria Almerico Murli- a.a. 2003/2004 33 Allocazione dinamica in (cont.) int *a; a = (int *) malloc (n * sizeof(int)); Lunghezza in byte di ciascuna locazione Numero delle locazioni di memoria da allocare n sizeof(int) 00100 a Puntatore all area di memoria Almerico Murli- a.a. 2003/2004 34
Per deallocare un puntatore dispose(p); La memoria puntata da p e e libera. free(p) La memoria puntata da p e e libera. Almerico Murli- a.a. 2003/2004 35 FINE LEZIONE Almerico Murli- a.a. 2003/2004 36
Problema Dati 2 array di ordine N scambiare il loro contenuto F77 PROGRAM SAMBIO INTEGER A(50),B(50),TMP... DO 10 i=1,50 TMP=A(i) A(i)=B(i) B(i)=TMP 10 ONTINUE... N SAMBI!! #include <stdio.h> main() { int a[50],b[50],*tmp,*pa,*pb;... /* pa e pb contengono indirizzo del primo elemento di a di b */ pa=&a[0]; pb=&b[0]; /* scambio di indirizzi */ tmp=a; a=b; b=tmp;... 1 SAMBIO } Almerico Murli- a.a. 2003/2004 37 In memoria. pa = &a[0] pa 000001 000001 110010 a[0] a[1] a[49] pb = &b[0] pb 110011 110011 110100 b[0] b[1] b[49] Almerico Murli- a.a. 2003/2004 38
Lo scambio. pa 110001 000001 110010 a[0] a[1] a[49] pb 00001 110011 110100 b[0] b[1] b[49] Dopo lo lo scambio :: pb pb contiene l indirizzo di di a[0] pa pa contiene l indirizzo di di b[0] Almerico Murli- a.a. 2003/2004 39 aratteristiche principali del Linguaggio Operatori sui bit I Puntatori Allocazione dinamica Ricorsione Almerico Murli- a.a. 2003/2004 40
La Ricorsione Una funzione si si dice ricorsiva se, assegnato un un valore iniziale, il il proprio valore in in ogni un un punto, si si definisce a partire dal valore precendete a oo se se n=0 a n n =f(a n-1 n-1 ) se se n 0 Almerico Murli- a.a. 2003/2004 41 F77 INTEGER FUNTION FATT(N) INTEGER N FATT==1 5 DO 10 i=2,n FATT=FATT*I 5 ONTINUE RETURN Non e possibile implementare moduli che richiamano se stessi; la ricorsione viene simulata con l iterazion RESTRIZIONI ALL USO DELLA RIORSIONE Problema: alcolo del fattoriale (N!) Factorial(n) int n; { if( n==1) return 1; return n*factorial(n-1); } E possibile che una function richiami se stessa direttamente o indirettamte. IMPLEMENTAZIONE NATURALE DELLA RIORSIONE Almerico Murli- a.a. 2003/2004 42
La Ricorsione Factorial (n) n * Factorial (n-1) Factorial (n-2) Factorial (n-3) altrimenti Almerico Murli- a.a. 2003/2004 43 In è possibileavere informazioni sull indirizzo delle variabili in memoria. In è possibile lavorare a basso livello attraverso i puntatori Almerico Murli- a.a. 2003/2004 44
In memoria In memoria a[0] a[1] a[2] 001 002 003 x = *pa y = *(pa + 1) x 5 007 y 10 008 Almerico Murli- a.a. 2003/2004 45 F 77 PROGRAM SOMMA REAL A(10), B(10),(100) INTEGER n,x,i N=5 X=10 DO 5 I=1,N A(I) =X*I B(I)=X+I 5 ONTINUE DO 10 I=1,N (I)=A(I)+B(I) WRITE(*,*), (I) 10 ONTINUE STOP END Problema: somma di due vettori #include <stdio.h> main() { float a[10];b[10],c[10]; int i,n,x; n=5; x=10; for(i=0; i<n; i++) { a[i]=x*i; b[i]=x+i; } for(i=0; i<n; i++) { c[i]=a[i]+b[i]; printf( %f \n,c[i]); } STESSO UTILIZZO DELLA MEMORIA PER GLI ARRAY (ALLOAZIONE STATIA) } Almerico Murli- a.a. 2003/2004 46
Allocazione statica degli array F77 REAL A(10), B(10),(100) A(1) A(10) gli indici iniziano per default da 1 float a[10],b[10],c[10]; a[0] a[9] gli indici iniziano per default da 0 Almerico Murli- a.a. 2003/2004 47 OME SI DEFINISE UN PUNTATORE IN? L istruzione in fase dichiarativa: P^ = x; assegna l indirizzo di x alla variabile puntatore P In memoria: (P punta a x) 001 0 0 0 0 1 1 0 0 1 1 X 004 0 0 1 P Almerico Murli- a.a. 2003/2004 48
PROGRAM XXXX; Type vet=array[1..100] of integer; VAR n,x: INTEGER; Var a : vet; Begin READLN(n); READLN(x); for i:=1 to n A(i)= x *i end Sprecodi di 96 96 locazioni di di memoria!!!!!! Utilizzo degli array Se n = 4 #include <stdio.h> main() { int *a,n,x,i; scanf( %d,&n); scanf( %d,&x); a=(int*)malloc(n*sizeof(int)); for (i=0; i<n; i++) { a[i]= x * i; }... } Utilizzo solo solo della memoria necessaria le le dimensioni di di un un arraysono stabilite in in runtime (ALLOAZIONE DINAMIA) Almerico Murli- a.a. 2003/2004 49 Array e puntatori Il nome di un array e l indirizzo della prima componente Il nome di un array e l indirizzo della prima componente int a[50]; int *pa; pa = & a[0]; /* Definizione di pa */... 000001 pa 000001 110010 a[0] a[1] a[49] pa contiene l indirizzo del primo elemento di a Almerico Murli- a.a. 2003/2004 50