C Fondmenti di Informtic Ingegneri Meccnic, Elettric, Gestionle Pro scritt del 13 Aprile 004 NOME MATRICOLA Esercizio 1 Dto il segente progrmm in lingggio C: #inclde <stdio.h> #inclde <stdli.h> oid min (oid) int n,z,i,c; scnf( %d,&n); for (i=1;i<=n;i++) z = 1; c = 0; while (c <= ) if ((i%z)==0) c++; if (c <= ) printf( %d \n, i); Disctere, in fnzione di n, qli lori sono stmpti dl comndo printf. Si sppong n 0. Solzione: per n > 0 ll prim iterzione del ciclo (i=1) z=1 c=0 while ( c ) if ((i%z)==0) c++; il ciclo è esegito esttmente 3 olte, finché c iene incrementto incrementto fino 3 i%z=0 è sempre er, perché il resto dell diisione con z=1 è sempre sempre 0. Printf non iene esegit, perché c non pò essere dopo il ciclo Anlogmente per le sccessie iterzioni s i fino d n Per n=0 i=1 Flso Non entr nel ciclo, printf non è esegit Non stmp niente
Esercizio Dto n ettore di interi, di 10 componenti: int [10]; scriere n fnzione in lingggio C che implementi n lgoritmo di ordinmento del ettore. Si sppongno note le componenti del ettore. Solzione: Procedr di scmio di de elementi di n ettore oid scmi (tipoelem *, *y) tipoelem ; =*; *=*y; *y=; Er sfficiente implementre no degli lgoritmi qi sotto riportti insieme ll precedente procedr di scmio degli elementi. Selection_sort oid selection_sort (ett z, int n); int i,j,imin; for (i=0; i<n-1; i++) imin=i; for (j=i+1; j<n; j++) if (z[j]<z[imin]) imin = j; scmi(&z[i], &z[imin]); Blesort oid lesort (ett z, int n); int i,j; oolen fine; i = 0 do i++; fine = TRUE; for (j=n-1; j>=i; j--) if (z[j]<z[j-1]) scmi(&z[j], &z[j-1]); fine = FALSE; while (!fine && i!=n-1)
Qicksort oid qicksort (ett z, int n) int sin,des, i,j; tipoelem ; tipolist lis; /*sppongo l'esistenz di n tipo list s de lori interi, con fnzioni ins e estr. Nell list engono memorizzte le coppie di indice minimo e mssimo dei sotto-ettori ncor d ordinre*/ ins (&lis, 0, n-1); while (!listot(lis)) estri (&lis, &sin,&des); i=sin; j=des+1; =z[sin]; while(i<j) do j--; while(z[j]>); do i++; while(z[i]<= && i!=j); if (i<j) scmi(&z[i], &z[j]); if (sin!=j) scmi(&z[sin], &z[j]); if (sin<j-1) ins (&lis, sin,j-1); if (des>i) ins (&lis, i,des);
Esercizio 3 Dti i nmeri interi negtii n1 = -(303) 8 n = -(4AFD) 16 rppresentrli in complemento de s 16 it ed effettrne l somm, operndo in complemento de. Solzione: lorndo pcchetti: se 8 pcchetti di 3 it 3=011 0=000 =010 lorndo pcchetti: se 16 pcchetti di 4 it A=1010 F=1111 D=1101 4=0100 (303) 8 =(011 000 010 010 011) 15 it ggingo n it s 0 011 000 010 010 011 (4AFD) 16 =(0100 1010 1111 1101 ) 16 it Essendo nmeri negtii ed essendo richiest espressmente il clcolo in complemento de occorre complementre i de nmeri inri troti n1=0 011 000 010 010 011 n=0100 1010 1111 1101 complemento di n1= 1100111101101101 complemento di n= 1011010100000011 esego l somm fr i de complementi 1 1100111101101101 + 1011010100000011 = 1 1000010001110000 L somm non prodce oerflow perché gli ltimi de riporti sono concordi. Un ltr ripro è che il it più significtio (il 16 ) è ncor pri 1, qindi il risltto (dto dll somm di de nmeri negtii) è ncor n nmero negtio.
Esercizio 4 Dimostrre, tilizzndo le regole e i teoremi dell lger oolen (proprietà degli opertori AND, OR, NOT e i teoremi di De Morgn), l eqilenz logic delle segenti fnzioni: f (, y) = (( y )OR NOT ( AND y)) AND NOT ( NOT (y)) g (, y) = y AND ( ) Solzione: Notzioni: y = AND y + y = OR = NOT y = XOR y y = IMPLICA y f (, y) = (( y) + z) y = (( + y) + + y) y = ( + y + + y) y = y + y y + y + y y = = y + 0 + y + 0 = y + y = y( + ) = y 1 = y g (, y) = y ( ) = y 1 = y Not: ( ) È sempre er Un tle proposizione si chim TAUTOLOGIA.
Esercizio 5 Dti i segenti interi nsigned s 16 it: = 0001100010111010 y = 0000010101110011 ltre l espressione: (( + 18) + y) 4 operndo in ritmetic inri ed tilizzndo solo l opertore di ddizione e gli opertori di spostmento. Solzione: 4 è necessrio semplificre il 4 col poiché esegendo l diisione medinte semplice shift 4 si perdereero cifre significtie = 4 = 00001100010111010 shift d di 1 posto ggingo 0 dl lto opposto ( 18 ) = (0000000010000000 10 ) 0000110001011101 + 0000000010000000 + 0000010101110011 = 0001001001010000 (1010011000110) = (4688) 10 6330 (( + 18) + y) = ( + 18 + y) = + 18 + 1395 = 4688 4
Esercizio 6 Dire qli lori stmp l segente fnzione C, ) qndo i lori di s e t sino rispettimente 10 e 7; ) qndo i lori di s e t sino rispettimente 10 e ; oid pnttori(int s, t) int,; int *,*; = (s - t); = (s \ t); = &; = &; if ((* % 5) == 0) * = (* - t); * = (* + s); else = ; = &; printf("%d %d %d %d\n",,,*,*); Solzione ) s=10 t=7 oid pnttori(int s, t) int,; int *,*; 3 = (s - t); 10-7 = 3 = (s / t); 10/7 = 1 1 3 = &; = &; 1 if ((* % 5) == 0) * = (* - t); * = (* + s);
else = ; = &; 3 1 printf("%d %d %d %d\n",,,*,*); 3, 1, 1, 3 ------------------------------------------------------------------------------------------------ ) s=10 t= oid pnttori(int s, t) int,; int *,*; 8 = (s - t); 10- = 8 = (s / t); 10/ = 5 5 8 = &; = &; 5 if ((* % 5) == 0) 5%5=0 * = (* - t); * = 8- = 6 8 6 * = (* + s); * = 6+10 = 16 else = ; = &; printf("%d %d %d %d\n",,,*,*); 16, 6, 16, 6 16 6