Una sorgente di informazione può produrre 8 diversi simboli con probabilità diverse, e presenta una entropia effettiva di 2.4 bit/simbolo. Quale è il numero medio di byte necessari per contenere un messaggio di 1000 simboli consecutivi generato da questa sorgente? Sol. In media un simbolo è rappresentabile con 2.4 binit il che significa che 1000 simboli occuperanno in media 2400 binit pari a 2400/8=300 bytes.
Una moneta viene lanciata 1000 volte. Su 1000 lanci, per 600 volte esce croce. Quale è la ridondanza presente nella moneta? Sol: assumendo la frequenza come misura della probabilità dei due simboli (T e C) abbiamo: p T =0.4 e p C =0.6; H=-p T log 2 p T -p C log 2 p C = -0.4 log 2 0.4-0.6 log 2 0.6= 0.529 + 0.442 = 0.971 bit/simb H MAX = log 2 2 = 1 bit/simb R = 1-H/H MAX = 1-0.971 = 0.029
Un dado genera i simboli da 1 a 6. Un dado truccato presenta una entropia effettiva di 2.16 bit. Quale è la quantità media di byte necessaria per memorizzare il risultato di 100 lanci? Sol: il numero medio di binit per rappresentare un messaggio di M simboli è N b =M H; se M=100 lanci allora N b =100 H = 100 2.16=216 binit 216 binit=216/8=27 bytes
Un canale di trasmissione può trasmettere 54Kbit al secondo. Quale sarà il tempo minimo di trasmissione di un file di 1 megabyte che presenta entropia effettiva di 4 bit? Il file è equivalente ad una sorgente dove ogni simbolo corrisponde ad un byte. Sol: il file costituisce un messaggio di M=2 20 simboli. Ogni simbolo occupa in media 4 binit per cui in totale avremo N b =M H=4 2 20 binit se la velocità di trasmissione è v t = 54 Kbit/s allora t=n b /v t =4 2 20 /54000=77.672 s
Un Ospedale decide di trasformare in formato digitale l archivio radiografico. Per questo scopo viene utilizzato uno scanner da 600 dpi e 48 bpp. Di quanto spazio di memoria ci sarà bisogno considerando che la dimensione di una radiografia è circa di 11 x 11 pollici. Dimensioni radiografia: orizzontale: 11 600 pixel verticale: 11 600 pixel numero pixel per radiografia:(11 600) 2 =43,560,000 pixel ogni pixel occupa 48/8=6 bytes occupazione radiografia=43,560,000 6=261,360,000 bytes
Un laboratorio fotografico deve digitalizzare una collezione di 100 fotografie a colori di dimensioni A4 (8x11 pollici), ed ha a disposizione, per memorizzare le immagini, un disco da 10 gigabyte. Quale è la risoluzione massima che si potrà utilizzare, in termini di dpi, se si sceglie una profondità di 24 bbp? Calcolare il risultato e spiegare il procedimento.
Soluzione Detta r la risoluzione (uguale in verticale e in orizzontale) in dpi si ha: occupazione foto: 8 r 11 r pixel=88 r 2 pixel ogni pixel occupa 24/8=3 bytes occupazione foto in bytes=88 r 2 3 bytes=264 r 2 bytes 100 foto occuperanno 26400 r 2 bytes tale valore deve essere inferiore a 10Gb: 26400 r 2 <10 2 30 da cui r < (10 2 30 /26400) 1/2 =637.746 dpi
Viene utilizzato uno scanner da 200 dpi e 24 bpp. Usando questo scanner vengono digitalizzate 10 fotografie di 10x15 centimetri che vengono memorizzate senza compressione. Quanto spazio di memoria occuperanno le foto? Calcolare il risultato e spiegare il procedimento. (1 pollice = 2,54 cm)
Soluzione occupazione foto in pixel: 10 15/2.54 2 200 2 pixel=930,001,860 pixel ogni pixel occupa 24/8=3 bytes occupazione foto in bytes=930,001,860 3 bytes=2,790,005,580 bytes 10 foto occuperanno 27,900,055,800 = 26.608 Mb
Con uno scanner da 300 dpi e 24 bpp vengono digitalizzate 11 lastre fotografiche ciascuna delle dimensioni di 6x4 pollici. Le immagini digitali ottenute vengono poi memorizzate con compressione jpeg 1:15. Quanto spazio di memoria occuperanno le immagini? Calcolare il risultato e spiegare il procedimento.
Soluzione occupazione foto in pixel: 6 300 4 300 pixel = 2,160,000 pixel ogni pixel occupa 24/8=3 bytes occupazione foto in bytes=2,160,000 3 bytes=6,480,000 bytes compressione: 6,480,000/15=432,000 bytes 11 foto occuperanno 11 432,000=4,752,000 bytes
Scrivere l'output del seguente programma, prestando attenzione agli indici e ai limiti dell'array e ignorando le istruzioni di stampa illegali (se ci sono). Supporre disattivato il controllo sul valore degli indici degli array. int main(void){ int a[4][4]; int *p,*q; int i,j,k=8,s=1; for(i=0; i<16; i++) a[0][i] = --k * (s=-s); for(i=0; i < 2; i++){ for(j=1; j < 7;j++) printf("%5d",a[i][j]); printf("\n"); }...
... } p = &a[1][1]; printf(" %d\n", a[*p-1][p[2]]); printf(" %d\n", *(p+*(p+5))); printf(" %d\n", *(&p[3]+p[3]-**a)); printf(" %d\n", a[&p[4]-a[2]][2]); printf(" %d\n", *(&p[3]+--*p)); printf(" %d\n", *(&a[0][0]-*(p-3)));
-7 6-5 4-3 2-1 0 1-2 3-4 5-6 7-8 Contenuto della matrice 6-5 4-3 2-1 2-1 0 1-2 3 for(i=0; i < 2; i++){ for(j=1; j < 7; j++) printf("%5d",a[i][j]); printf("\n"); }
-7 6-5 4-3 2-1 0 1-2 3-4 5-6 7-8 Contenuto della matrice -3 1?? -1 p = &a[1][1]; printf(" %d\n", a[*p-1][p[2]]); printf(" %d\n", *(p+*(p+5))); printf(" %d\n", *(&p[3]+p[3]-**a)); printf(" %d\n", a[&p[4]-a[2]][2]); printf(" %d\n", *(&p[3]+--*p)); printf(" %d\n", *(&a[0][0]-*(p-3))); -2 1
Nel gioco del Sudoku le caselle di uno schema di 9 righe 8 6 5 e 9 colonne devono essere riempite con i numeri da 1 a 9 in modo tale che un numero compaia una sola volta per 9 3 4 ogni riga, per ogni colonna e in ciascuno dei 9 quadrati 3 7 1 9 per 3 in cui può essere suddiviso lo schema (vedi figura). 3 9 Ad esempio, considerando lo schema della figura, nella 2 5 7 casella in seconda riga e ottava colonna potrà essere posto 6 o il numero 1 o il numero 6 o il numero 8 in quanto i numeri 9, 3 e 4 compaiono sulla stessa riga, i numeri 2 e 6 8 2 7 compaiono sulla stessa colonna e il numero 5 compare 3 4 nello stesso quadrato della cella in questione. Scrivere una funzione C che ricevuti come parametri: 9 7 6 una matrice 9 x 9 di interi contente uno schema parzialmente riempito (la casella vuota è rappresentata dal numero 0); le coordinate r (riga) e c (colonna) di una casella; un numero x candidato ad occupare la casella di coordinate r e c restituisca un valore di verità falso/vero (0/1) che indichi se il numero x può occupare la casella di coordinate r e c. Scrivere inoltre un main di prova della funzione.
sudoku int main(void){ int a[n][n]; int n,m,r,c,x; leggimatricedafile("datib.txt",a,&n,&m); printf("matrice:\n"); stampamatrice(a,n,m); printf("introduci le coordinate:"); scanf("%d%d",&r,&c); for (x=1; x<=n; x++) if (sudokucheck(a,n,r,c,x)) printf("%d ammissibile\n",x); else printf("%d non ammissibile\n",x); }
sudoku int sudokucheck( int A[N][N], int n, int r, int c, int x){ int k, ammissibile; ammissibile = A[r][c] == 0; for (k=0; k<n && ammissibile; k++) ammissibile = A[r][k]!= x && A[k][c]!= x; ammissibile = ammissibile && quadratoammissibile(a,s,r/s*s,c/s*s,x); } return ammissibile;
sudoku int quadratoammissibile( int A[N][N], int n, int r, int c, int x){ int i,j, ammissibile; ammissibile = 1; for (i=0; i<n && ammissibile; i++) for (j=0; j<n && ammissibile; j++) ammissibile = A[r+i][c+j]!= x; } return ammissibile;
LIFE Scrivere un programma che simuli una zona di spazio popolata da cellule (asterischi) che evolvono di generazione in generazione secondo le seguenti regole di nascita, morte e sopravvivenza: Nascita di una cellula: spazio vuoto circondata da 3 cellule Morte di una cellula: se circondata da meno di 2 o più di 3 cellule Sopravvivenza di una cellula: se circondata da 2 o 3 cellule