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)