UNIVERSITÀ DEGLI STUDI DI PERUGIA FACOLTÀ DI INGEGNERIA CORSO DI LAUREA IN INGEGNERIA MECCANICA. Corso di Fondamenti di Informatica prova del 11/12/2006 Esercizio 1 (17 punti) Il file di nome inp.dat contiene un numero imprecisato di numeri reali (uno per ogni riga) di formato XX.YY. Si chiede di realizzare un algoritmo, in linguaggio fortran, in grado di calcolare, per ogni numero del file assegnato, il valore della seguente funzione: y ( x) = ln 2x 1 x 1 Eseguendo tutti i controlli del caso, trascrivere, in ogni riga del file di nome out.dat, in ordine crescente, i valori risultanti della funzione y(x) insieme alla x relativa. I due numeri reali sono di formato XX.YY e separati da due blanks. Infine scrivere sullo standard output e con formato libero, il valore massimo assunto dalla funzione e quello della corrispondente variabile indipendente. Esercizio 2 (13 pnti) Il DB riportato in figura contiene dati relativi ad un club nautico in cui i velisti iscritti possono usare le navi in dotazione al club, prenotandone solo una per un certo giorno e pagandone l affitto come previsto dal tariffario. Sono indicate anche alcune delle relazioni presenti sul DB. Si precisa che: la tabella Anagrafica contiene i dati significativi delle persone coinvolte nelle attività del club; ciascuna barca ha un solo proprietario (che non necessariamente è anche un velista); nessuno è proprietario di più di una barca; in un singolo giorno, una barca può avere una sola prenotazione.
Si specifichino le seguenti interrogazioni, sia utilizzando il linguaggio SQL, sia sotto la forma grafica QBE di Access: A) Quante prenotazioni ha effettuato nel mese di Agosto 2006 ciascun velista con più di trentacinque anni di età? Indicare nome e cognome del velista, e il relativo numero di prenotazioni.
B) Elencare i velisti di Perugia (con codice fiscale, nome e cognome) che sono anche proprietari di una barca rossa C) Elencare gli identificatori delle barche rosse il cui affitto giornaliero è superiore a 450 euro e il cui nome è composto almeno da cinque caratteri.
Esercizio 1 Risposte program logord real x integer cont open(10,file='inp.dat') cont=0 do while(.not.eof(10)) read(10,100) x cont=cont+1 c write(*,*) x!stampa di verifica a video write(*,*) call sorta(cont) close(10) close(20) 100 format(f5.2) end subroutine sorta(cont) integer cont,ind real x(cont),y(cont),num,arg,den,temp,temp2 open(20,file='out.dat') rewind(10) do k=1,cont read(10,100) x(k) c--------- CALCOLO FUNZIONE ------------- ind=0 do i=1,cont if(x(i).ne.1.) then num=2*x(i)-1 den=x(i)-1 arg=num/den if(arg.gt.0.) then ind=ind+1 y(ind)=log(arg) x(ind)=x(i) c write(*,*) y(ind),x(ind) endif endif
write(*,*) c ------------ ORDINA ------------------- do i=1,(ind-1) k=i temp=y(i) temp2=x(i) do j=(i+1),ind If(y(j).LT.temp) then temp=y(j) temp2=x(j) k=j endif y(k)=y(i) y(i)=temp x(k)=x(i) x(i)=temp2 c------------ SCRITTURA --------------------- write(*,*) ' y(x) ',' x' do k=1,ind write(*,*) y(k),x(k) write(20,200) y(k),x(k) write(*,*) write(*,*) 'valore massimo funzione = ',y(ind) write(*,*) 'valore variabile indipendente corrispondente = ',x(ind) 100 format(f5.2) 200 format(f5.2,2x,f5.2) return end
Esercizio 2 A) Query 1 SELECT Anagrafica.nome, Anagrafica.cognome, Count(Prenotazioni.vid) AS [N-prenotazioni] FROM (Anagrafica INNER JOIN Velisti ON Anagrafica.cod_fis = Velisti.v_cod_fis) INNER JOIN Prenotazioni ON Velisti.v_cod_fis = Prenotazioni.vid WHERE (((Anagrafica.età)>35) AND ((Prenotazioni.giorno) Between #8/1/2006# And #8/31/2006#)) GROUP BY Anagrafica.nome, Anagrafica.cognome; Query 1-Bis (Alternativa alla Query 1)
SELECT Anagrafica.nome, Anagrafica.cognome, Count(Prenotazioni.giorno) AS num_pren FROM Anagrafica INNER JOIN Prenotazioni ON Anagrafica.cod_fis = Prenotazioni.vid WHERE (Anagrafica.eta>35) AND (Prenotazioni.giorno BETWEEN #8/1/2006# AND #8/31/2006#) GROUP BY Anagrafica.cod_fis, Anagrafica.nome, Anagrafica.cognome; B) Query2 SELECT Anagrafica.cod_fis, Anagrafica.nome, Anagrafica.cognome FROM ((Anagrafica INNER JOIN Velisti ON Anagrafica.cod_fis = Velisti.v_cod_fis) INNER JOIN Prenotazioni ON Velisti.v_cod_fis = Prenotazioni.vid) INNER JOIN Barche ON Prenotazioni.bid = Barche.b_id WHERE (((Anagrafica.città) Like "Perugia") AND ((Barche.b_colore) Like "rosso"));
Query 2-bis (Alternativa alla Query 2) SELECT Anagrafica.cod_fis, Anagrafica.nome, Anagrafica.cognome FROM (Velisti INNER JOIN Anagrafica ON Velisti.v_cod_fis = Anagrafica.cod_fis) INNER JOIN Barche ON Velisti.v_cod_fis = Barche.cf_proprietario WHERE (Anagrafica.citta="Pisa") AND (Barche.b_colore="rosso"); Nota: Nella riga di SELECT è inutile specificare DISTINCT, in quanto il testo dell esercizio precisa che nessuno è proprietario di più di una barca.
C) Query 3 SELECT Barche.b_id FROM Barche INNER JOIN Tariffe ON Barche.b_classe = Tariffe.classe WHERE (((Tariffe.costo_giornaliero)>450) AND ((Barche.b_colore)="rosso") AND ((Barche.b_nome) Like "?????"));