Esercizio 1 - Sezione Macchine
Transcript
Esercizio 1 - Sezione Macchine
COMPITO DI FONDAMENTI DI INFORMATICA Allievi Ingegneri Meccanici Lunedì 20 Febbraio 2006 (09.30 – 12.30) Esercizio 1 (punti 12) Il DataBase di figura contiene dati utili per una gestione elementare di un magazzino; le tabelle presenti sono: “Ordini”, “Dettagli”, “Articoli” . Si richiede quanto segue: 1) Indicare sullo schema seguente i tipi di relazioni esistenti tra le tabelle; 2) Scrivere le seguenti interrogazioni (QUERIES), sia utilizzando il formato QBE di Access, sia utilizzando la sintassi del linguaggio SQL: a) Si vuol conoscere il contenuto dell’ordine “001” in termini di “quantità” “codice articolo” e “descrizione”; b) Relativamente al codart “002”, si vuol conoscere il valore della giacenza (costo-unitario x giacenza); c) Visualizzare gli ordini che contengono l’articolo 001. Esercizio 2 (punti 3) Si eseguano le seguenti operazioni rappresentando gli operandi in complemento a due su 12 bit: (a) (181)10 - (1455)10 (b) (747)10 + (1300)10 Si esprimano poi i risultati delle operazioni precedenti nel sistema esadecimale. FORM da seguire per la scrittura delle queries in QBE: Esercizio 3 (punti 15) Sono assegnate le seguenti due curve: y = −x + 2 e y = −x 2 + 4 Scrivere un algoritmo in linguaggio Fortran in grado di calcolare numericamente l’area compresa tra le due curve utilizzando la regola dei trapezi ed un passo ∆x = 0.1. Calcolare poi la stessa area utilizzando un passo pari a ∆x = 0.05 . Visualizzare quindi sullo standard output i valori degli errori percentuali commessi nei due casi, sapendo che il valore analitico dell’area in questione è rappresentato dal numero 10 / 3 . NOTA: per minimizzare l’errore si consiglia prima di calcolare separatamente le due aree comprese tra ciascuna curva e gli assi cartesiani; quindi eseguirne la differenza. Soluzioni Esercizio 1 (12 punti) Query-1 SELECT ordini.[n-ordine], dettagli.quantità, dettagli.codart, articoli.descrizione FROM articoli INNER JOIN (ordini INNER JOIN dettagli ON ordini.[n-ordine] = dettagli.[n-ordine]) ON articoli.codart = dettagli.codart WHERE (((ordini.[n-ordine]) Like "001")); Query-2 SELECT articoli.codart, articoli.giacenza, articoli.[costo-unitario], (articoli![costo-unitario]*[giacenza]) AS [val-giac] FROM articoli GROUP BY articoli.codart, articoli.giacenza, articoli.[costo-unitario] HAVING (((articoli.codart) Like "002")); Query-3 SELECT dettagli.codart, ordini.[n-ordine] FROM ordini INNER JOIN dettagli ON ordini.[n-ordine] = dettagli.[n-ordine] WHERE (((dettagli.codart) Like "001")); Esercizio 2 (3 punti) (a) (b) (101100000110)CA2 = (-1274)10 = (B06)16 (011111111111)CA2 = (2047)10 = (7FF)16 Esercizio 3 (15 punti) Program Are real x1,y1,x2,y2,x3,y3,m1,q1,m2,q2,area,ab,ac,cb c Lettura delle coordinate dei punti dallo STD Input write(*,*) 'digitare il valore dell''ascissa del punto P1' read(*,*) x1 write(*,*) 'digitare il valore dell''ordinata del punto P1' read(*,*) y1 write(*,*) 'digitare il valore dell''ascissa del punto P2' read(*,*) x2 write(*,*) 'digitare il valore dell''ordinata del punto P1' read(*,*) y2 22 write(*,*) 'digitare il valore dell''ascissa del punto P3' read(*,*) x3 write(*,*) 'digitare il valore dell''ordinata del punto P1' read(*,*) y3 if(x1 .EQ. 0. .AND. x2 .EQ. 0.) then write(*,*) 'I punti P1 e P2 giacciono sull''asse delle ordinate' write(*,*) 'Triangolo degenere' stop endif if(y1 .EQ. 0. .AND. y2 .EQ. 0.) then write(*,*) 'I punti P1 e P2 giacciono sull''asse delle ascisse' write(*,*) 'Triangolo degenere' stop endif if(y1 .EQ. y2) then if(y3 .NE. y1) then goto 22 endif write(*,*) 'P1 e P2 giacciono su una retta parallela alle ascisse' write(*,*) 'Quadrilatero; punti coinvolti: (0,0); (0,y3) X (x3,y3), (x3,0)' area=abs(x3*y3) write(*,*) 'area del quadrilatero = ', area stop endif if(x1 .EQ. x2) then if(x3 .NE. x1) then goto 22 endif write(*,*) 'P1 e P2 giacciono su una retta parallela alle ordinate' write(*,*) 'Quadrilatero; punti coinvolti: (0,0); (0,x3) X (x3,y3), (0,y3)' area=abs(x3*y3) write(*,*) 'area del quadrilatero = ', area stop endif c Retta per i punti P1 e P2 m1=(y2-y1)/(x2-x1) q1=-m1*x1+y1 write(*,*) write(*,*)'m1 = ',m1,'q1 = ',q1 write(*,*) y=m1*x3+q1 if(y.NE.y3) then write(*,*) 'P3 non giace sulla retta P1-P2: reimmetterlo;' write(*,*) goto 22 endif c Retta perpendicolare per P3 m2=-1/m1 q2=y3-m2*x3 write(*,*) write(*,*)'m2 = ',m2,'q2 = ',q2 write(*,*) write(*,*) 'caso generale: triangolo' write(*,*) 'punti coinvolti: A=(-q1/m1,0); B=(-q2/m2,0); XC=((q1-q2)/(m2-m1),(m2*(q1-q2)/(m2-m1)+q2))' c Calcolo area: primo metodo ac=sqrt((-q1/m1-(q1-q2)/(m2-m1))**2+(0-(m2*(q1-q2)/(m2-m1)+q2))**2) bc=sqrt((-q2/m2-(q1-q2)/(m2-m1))**2+(0-(m2*(q1-q2)/(m2-m1)+q2))**2) area=abs(ac*bc/2) write(*,*) 'area del triangolo (primo metodo) = ',area c Calcolo area: secondo metodo ab=abs(-q2/m2-(-q1/m1)) !Ipotenusa hc = y3 !Altezza relativa all'ipotenusa area=abs(ab*hc/2) write(*,*) 'area del triangolo (secondo metodo) = ',area stop end c ESEMPI di TEST: quadrilatero1 ==> p1(3,1); p2(3,4); p3(3,-6) c ESEMPI di TEST: quadrilatero2 ==> p1(1,3); p2(2,3); p3(5,3) c ESEMPI di TEST: triangolo ==> p1(3,5); p2(-4,-2); p3(1,3)