Soluzione temi d'esame 2017 Aprile Luglio
Anteprima
ESTRATTO DOCUMENTO
#include <stdio.h>
#include <stdlib.h>
int verifica(int a[100]){
int i;
int primomin, secondomin, terzomin;
primomin = a[1];
secondomin = a[1];
terzomin = a[1];
for(i=0;i<100;i++){
if(a[i]<primomin) primomin=a[i];
}
for(i=0;i<100;i++){
if(a[i]<secondomin && a[i] != primomin) secondomin=a[i];
}
for(i=0;i<100;i++){
if(a[i]<terzomin && a[i] != primomin && a[i] != secondomin) terzomin=a[i];
}
if (primomin != secondomin && primomin != terzomin && secondomin != terzomin) return 1;
else return -1;
} 8
int main(){
int x[100];
int y[20];
int i;
int j=0;
int risultato;
do{ for(i=0;i<100;i++) scanf("%d", &x[i]);
risultato = verifica(x);
if (risultato <0){
y[j]=risultato;
j=j+1;
}
} while(j<20);
system("PAUSE");
return 0;
} 9
Esercizio 2 (4 punti)
Descrivere un algoritmo codificato in linguaggio C/C++ che:
1. definisce due vettori: il primo di nome a contenente 1000 numeri interi ed il secondo di nome b
contenente 1000 numeri interi;
2. modifica il vettore a inserendo in ogni sua posizione un valore letto da standard input;
3. successivamente al punto due, modifica il vettore b inserendo i valori presenti nel vettore a
aumentati del valore minimo presente nel vettore a.
#include <stdio.h>
#include <stdlib.h>
int main(){
int a[1000];
int b[1000];
int i;
int min;
for(i=0;i<1000;i++) scanf("%d", &a[i]);
min=a[1];
for(i=0;i<1000;i++){
if(a[i]<min) min=a[i];
}
for(i=0;i<1000;i++){
b[i]=a[i]+min;
} 10
system("PAUSE");
return 0;
}
Esercizio 3 (9 punti)
Il sistema informatico di una nota azienda elettrica utilizza un database per gestire le fatture emesse. Nel
database sono presenti le seguenti relazioni:
Forniture (ID, CF, Indirizzo)
Fatture(NumeroFornitura, Data, Importo, Periodo)
Forniture ID Fatture
dove nella relazione l'attributo è la chiave primaria. Nella relazione gli attributi
NumeroFornitura Periodo NumeroFornitura
e formano la chiave primaria e l'attributo è chiave
Forniture. Fatture
esterna per la relazione Ogni tupla della relazione elenca le fatture emesse, in
Data Periodo
ogni tupla l'attributo rappresenta la data di pagamento della fattura e l'attributo
2015'
rappresenta il periodo di riferimento della fattura ad esempio 'I indica il primo trimestre del 2015
2013'
mentre 'IV indica il quarto trimestre del 2013.
data la seguente interrogazione SQL spiegare l’errore logico in essa contenuto (la query ha
1. sicuramente un errore):
SELECT NumeroFornitura, SUM(Importo)
FROM Fatture;
2. scrivere l'istruzione SQL che visualizza il codice fiscale (CF) degli utenti che hanno esattamente due
forniture;
3. scrivere l'istruzione SQL che visualizza l’importo totale delle fatture emesse nel 2016;
CF
4. scrivere l'istruzione SQL che visualizza i dei clienti che nel 2016 hanno un importo complessivo
di fatture maggiore della media degli importi delle fatture del 2016;
5. scrivere l'istruzione SQL che traduce la seguente espressione dell’algebra relazionale: prodotto
Forniture
cartesiano fra la tabella e quella che si ottiene attraverso un'operazione di
COUNT(*) Fatture.
proiezione dell'operatore dalla relazione
Query 1
Nella seguente query manca un raggruppamento in base al quale effettuare la sommatoria. La versione
corretta sarebbe:
SELECT NumeroFornitura, SUM(Importo)
FROM Fatture
GROUP BY NumeroFornitura 11
Query 2
SELECT CF
FROM Fatture, Forniture
WHERE NumeroFornitura=ID
GROUP BY CF
HAVING COUNT(*)=2
Query 3
SELECT SUM(Importo)
FROM Fatture
WHERE Data BETWEEN ‘01/01/2016’ AND ‘31/12/2016’
Query 4
SELECT CF
FROM Forniture, Fatture
WHERE NumeroFornitura = ID AND Data BETWEEN ‘01/01/2016’ AND ‘31/12/2016’
GROUP BY CF
HAVING SUM(Importo) > ( SELECT AVG(Importo)
FROM Forniture, Fatture
WHERE NumeroFornitura = ID AND Data BETWEEN ‘01/01/2016’ AND
‘31/12/2016’
GROUP BY CF ) X
Query 5
SELECT *
FROM Forniture, ( SELECT COUNT(*)
FROM Fatture) X 12
Esame Informatica Generale 06/07/2017 – Fila B
Quesito 1 (punteggio 2)
Si considerino le seguenti dichiarazioni di variabili e la seguente istruzione di assegnamento:
double x[10];
int y;
y = compra(&x[1], x[9], x); /* versione puntatori */
y = compra (x[1], x[9], x) /* versione riferimenti */
elabora. riferimenti
definite il prototipo (intestazione) della funzione Nella versione la funzione
x[1].
dovrà modificare la variabile
Int compra (double *, double, double []);
Quesito 2 (punteggio 2)
Descrivere la funzione del gestore dei file di un sistema operativo.
Quesito 3 (punteggio 2)
Scegliere uno dei seguenti algoritmi codificati in linguaggio C/C++ e scrivere la tabella di esecuzione (trace
table): Puntatori Riferimenti
int g(int x, double* y) int g(int x, double& y)
{ {
x = x + 1; x = x + 1;
*y = *y + x; y = y + x;
return x - 2; return x - 2;
} }
int main() int main()
{ { 13
double x; double x;
int y; int y;
y = 1; y = 1;
x = 2.4; x = 2.4;
while (x > 0) while (x > 0)
{ {
y = g(y, &x); y = g(y, x);
x = x - 3; x = x - 3;
} }
return 0; return 0;
} }
Main
X Y
- -
- 1
2.4 1 G(1, &x)
2.4 1 X Y
2.4 1 1 &x
2.4 1 2 &x
4.4 1 2 &x
0
1.4 0 G(0,&x)
1.4 0 X Y
1.4 0 0 &x
1.4 0 1 &x 14
2.4 0 1 &x
-1
2.4 -1
-0.6 -1
Quesito 4 (punteggio 2)
Dati i seguenti schemi di relazione con le rispettive istanze:
Aziende(PIVA,Denominazione)
PIVA Denominazione
111 Pirelli
222 Zucchetti
Consulenti(PIVA,CF, dataAss, Ret)
PIVA CF dataAss Ret
111 AAAAAA 22-11-2009 1000
222 AAAAAA 22-11-2009 2000
222 BBBBBB 28-10-2009 5000
111 CCCCCC 30-12-2007 1000
222 CCCCCC 30-12-2007 2000
stabilire il risultato della seguente query scrivendo le tabelle intermedie:
SELECT C.CF, T.M, COUNT(*)
FROM Consulenti C, (SELECT AVG(Ret) AS M FROM Consulenti GROUP BY PIVA) T
GROUP BY C.CF, T.M
HAVING SUM(Ret) > T.M 15
TABELLA T
M
1000
4500
TABELLA C X T
PIVA CF dataAss Ret M
111 AAAAAA 22-11-2009 1000 1000
222 AAAAAA 22-11-2009 2000 1000
222 BBBBBB 28-10-2009 5000 1000
111 CCCCCC 30-12-2007 1000 1000
222 CCCCCC 30-12-2007 2000 1000
111 AAAAAA 22-11-2009 1000 4500
222 AAAAAA 22-11-2009 2000 4500
222 BBBBBB 28-10-2009 5000 4500
111 CCCCCC 30-12-2007 1000 4500
222 CCCCCC 30-12-2007 2000 4500
TABELLA FINALE
C.CF T.M COUNT(*)
AAAAAA 1000 2
BBBBBB 1000 1
BBBBBB 4500 1
CCCCCC 1000 2 16
Esercizio 1 (9 punti)
Descrivere un algoritmo codificato in linguaggio C/C++ che:
check3
3. definisce la funzione con parametri:
int;
a di tipo vettore di 100
int.
b di tipo puntarore/riferimento ad una variabile di tipo
La funzione deve scrivere nell'area di memoria puntata/riferita da b il valore 1 se nel vettore a sono
presenti 3 valori diversi tra loro; in caso contrario la funzione deve scrivere nell'area di memoria
puntata/riferita da b il valore -1.
main
4. nella funzione x
IV. dichiarare un vettore di nome contenente 100 numeri interi;
V. ripetere le seguenti operazioni fino a quando due esecuzioni separate della funzione
check3 restituiscono i valori 1 e -1: x,
a. inserire 100 valori letti da standard input nel vettore
check3 x
b. eseguire la funzione applicata al vettore scrivendo il risultato nella
variabile t. 17
#include <stdio.h>
#include <stdlib.h>
void check3(int a[100], int *b){
*b=-1;
int i,j;
int conta=0;
for(i=0;i<100;i++){
for(j=0;j<100;j++){
if(a[i]!=a[j]) conta++;
}
}
if (conta>=3) *b=1;
}
int main(){
int x[100];
int i;
int t;
int conta1=0;
int contameno=0;
do{ for(i=0;i<100;i++) scanf("%d", &x[i]); 18
check3(x, &t);
if (t=1) conta1++;
else contameno++;
}while( conta1<1 && contameno<1);
system("PAUSE");
return 0;
}
Esercizio 2 (4 punti)
Descrivere un algoritmo codificato in linguaggio C/C++ che:
1. definisce un vettore di nome a contenente 1000 numeri interi;
2. modifica il vettore a inserendo in ogni sua posizione un valore letto da standard input;
3. successivamente al punto due, modifica il vettore a diminuendo ogni suo valore per il valore
massimo presente nel vettore a.
#include <stdio.h>
#include <stdlib.h>
int main(){
int a[1000];
int i;
int max;
for(i=0;i<1000;i++) scanf("%d", &a[i]);
max=a[1]; 19
for(i=0;i<1000;i++){
if(a[i]>max) max=a[i];
}
for(i=0;i<1000;i++) a[i]=a[i]-max;
system("PAUSE");
return 0;
}
Esercizio 3 (8 punti)
Il sistema informatico dell'azienda che gestisce i Telepass utilizza un database per gestire il transito dai
caselli. Nel database sono presenti le seguenti relazioni:
Apparati (ID, CF, Indirizzo)
Transito(CodiceTelepass, CodiceCasello, Data, Velocità)
Apparati ID Transito
dove nella relazione l'attributo è la chiave primaria. Nella relazione gli attributi
CodiceTelepass, CodiceCasello Data
e formano la chiave primaria e l'attributo
CodiceTelepass Transito. Transito
è chiave esterna per la relazione Ogni tupla della relazione
Velocità
elenca i passaggi dai caselli autostradali; in ogni tupla l'attributo rappresenta la velocità con cui
il veicolo è transitato dal casello.
data la seguente interrogazione SQL spiegare l’errore logico in essa contenuto (la query ha
1. sicuramente un errore):
SELECT *
FROM Apparati
WHERE ID IN (SELECT CodiceTelepass, Data FROM Transito)
2. scrivere l'istruzione SQL che visualizza, per gli utenti che hanno transitato almeno una volta in un
casello, il codice fiscale (CF) e la massima velocità a cui hanno transitato;
3. scrivere l'istruzione SQL che visualizza per ogni casello il numero totale di passaggi nel 2016;
4. scrivere l'istruzione SQL che visualizza i caselli che hanno registrato il maggiore numero di transiti
nel 2016;
5. scrivere l'istruzione SQL che traduce la seguente espressione dell’algebra relazionale: prodotto
Apparati
cartesiano fra la tabella e quella che si ottiene attraverso un'operazione di proiezione
MIN(Data) Transito.
dell'operatore dalla relazione 20
Query 1
Nella query interna dovrebbe essere estratto solo CodiceTelepass e non anche la data che non è
confrontabile con l’ID.
La versione corretta sarebbe:
SELECT *
FROM Apparati
WHERE ID IN (SELECT CodiceTelepass FROM Transito)
Query 2
SELECT CF, MAX(Velocità)
FROM Apparati, Transito
WHERE ID = CodiceTelepass
GROUP BY CF
Query 3
SELECT CodiceCasello, COUNT(*)
FROM Transito
WHERE Data BETWEEN ‘01/01/2016’ AND ‘31/12/2013’
GROUP BY CodiceCasello
Query 4
SELECT CodiceCasello
FROM Transito
WHERE Data BETWEEN ‘01/01/2016’ AND ‘31/12/2013’
GROUP BY CodiceCasello
HAVING COUNT(*)>= (SELECT MAX(Conteggio)
FROM (SELECT COUNT(*) AS Conteggio
FROM Transito
GROUP BY CodiceCasello) A ) B 21
Query 5
SELECT *
FROM Apparati, (SELECT MIN(Data)
FROM Transito) X 22
Esame Informatica Generale 15/06/2017 – Fila A
Quesito 1 (punteggio 2)
Si consideri il seguente frammento di programma in linguaggio C:
while (i <= j) {
i = i + a;
j = j / 2;
} do-while,
utilizzando il ciclo scrivere un frammento di programma equivalente.
Do{ I=i+a;
j=/2;
}while(i<=j);
Quesito 2 (punteggio 2)
Descrivere la funzione della memoria centrale. 23
Quesito 3 (punteggio 2)
Scegliere uno dei seguenti algoritmi codificati in linguaggio C/C++ e scrivere la tabella di esecuzione (trace
table) Puntatori Riferimenti
int f(int* y) { int f(int& y) {
*y = *y + 1; y = y + 1;
return *y + 1; return y + 1;
} }
int G(int* y) { int G(int& y) {
int x; int x;
x = 1 + f(y); x = 1 + f(y);
*y = *y + 1; y = y + 1;
return *y + x; return y + x;
} }
int main() { int main() {
int x, y; int x, y;
x = 0; x = 0;
y = G(&x) - 1; y = G(x) - 1;
return 0; return 0;
} } 24
Main
X Y
- -
0 - G(&x)
0 - Y X
0 - &x - F(&x)
0 - &x - Y
0 - &x - &x
1 - &x - &x 2
1 - &x 3
2 - &x 3
5
2 4 25
Quesito 4 (punteggio 2)
Dati i seguenti schemi di relazione con le rispettive istanze:
Aziende(PIVA, Denominazione)
PIVA Denominazione
111 Pirelli
222 Zucchetti
Consulenti(PIVA,CF, dataAss, Ret)
PIVA CF dataAss Ret
111 AAAAAA 22-11-2009 1000
222 AAAAAA 28-10-2009 2500
222 BBBBBB 22-11-2009 5000
111 CCCCCC 30-12-2007 1000
222 CCCCCC 28-10-2009 2500
scrivere il risultato della seguente query scrivendo tutte le tabelle intermedie:
SELECT B.K, COUNT(*), SUM(B.K)
FROM ( SELECT Ret, COUNT(DISTINCT dataASS) AS K
FROM Consulenti
GROUP BY PIVA, Ret
) A,
( SELECT PIVA, COUNT(*) AS K
FROM Consulenti
GROUP BY PIVA, Ret
) B
WHERE B.K <> A.K
GROUP BY B.K 26
TABELLA A
Ret K
1000 2
2500 1
5000 1
TABELLA B
PIVA K
111 2
222 2
222 1
TABELLA A X B
Ret A.K PIVA B.K
1000 2 111 2
2500 1 111 2
5000 1 111 2
1000 2 222 2
2500 1 222 2
5000 1 222 2
1000 2 222 1
2500 1 222 1
5000 1 222 1 27
TABELLA FINALE
B.K COUNT(*) SUM(B.K)
2 4 8
1 1 1
Esercizio 1 (9 punti)
Scrivere un algoritmo codificato in linguaggio C/C++ che:
Maggiori
5. definisce la funzione con parametri:
a int;
di tipo vettore di 500
b int;
di tipo vettore di 500
d int.
di tipo puntatore/riferimento ad un d
Scrivere nell’area di memoria puntata/riferita da la posizione di un qualsiasi elemento del
a b.
vettore maggiore di ogni elemento del vettore Se tale elemento non esiste, la funzione deve
d
scrivere nell’area di memoria puntata riferita da il numero
-1. main
6. nella funzione x e z int.
VI. dichiara due vettori di 500
t int;
VII. dichiara una variabile di tipo x
VIII. inserisce in tutte le posizioni del vettore dei numeri interi letti da standard input.
IX. ripete le seguenti istruzioni che devono terminare quando l’esecuzione della funzione
Maggiori () t
inserisce nella variabile il valore -1: z
a. inserisce in tutte le posizioni del vettore dei numeri interi letti da standard
input. Maggiori () x z
b. eseguire la funzione applicata al vettore al vettore inserendo
t;
il risultato nella variabile 28
#include <stdio.h>
#include <stdlib.h>
void Maggiori(int a[500], int b[500], int *d){
*d=-1;
int conta=0;
int pos=1000;
int i,j;
for(i=0;i<500; i++){
conta=0;
for(j=0;j<500;j++){
if(a[i]>b[j]) conta++;
}
if(conta=500) pos=i;
}
if (pos != 1000) *d=pos;
}
int main(){
int x[500];
int z[500];
int i;
int t; 29
for(i=0;i<500;i++) scanf("%d", &x[i]);
do{ for(i=0;i<500;i++) scanf("%d", &z[i]);
Maggiori(x,z,&t);
}while(t != -1);
system("PAUSE");
return 0;
} 30
Esercizio 2 (4 punti)
Scrivere un algoritmo, codificato in linguaggio C/C++, che:
vett[100] int;
1. dichiara un vettore di vett
2. inserisce in tutte le posizioni del vettore dei numeri interi letti da standard input
vett
3. scambia tutti i valori di posti pari del vettore con quelli di posto dispari (considerare 0 come
posto pari).
#include <stdio.h>
#include <stdlib.h>
int main(){
int vett[100];
int i;
int pari=0, dispari=1;
int temp;
for(i=0; i<100; i++) scanf("%d", &vett[i]);
do{ temp=vett[pari];
vett[pari]= vett[dispari];
vett[dispari]=temp;
} while(pari<99 && dispari <100);
system("PAUSE");
return 0;
} 31
Esercizio 3 (9 punti)
Una azienda di intrattenimento utilizza un base di dati per gestire il servizio di streaming. Nella base di dati
sono presenti le seguenti tabelle:
Film (ID, Durata)
Visionati (IDC, IDF, Data, Ora, DurataStream)
FILM ID Visionati IDC,
dove nella relazione l’attributo è una chiave. Nella relazione gli attributi
IDF, Data Ora IDF Film.
e formano una chiave e l’attributo chiave esterna per la relazione In ogni
Film Durata
tupla della relazione l’attributo memorizza la durata (in minuti) del film. Le tuple della
Visionati IDC, Data,
relazione servono per memorizzare i film visionati dai clienti, gli attributi e
Ora sono rispettivamente il codice del cliente, la data e l’orario di inizio visione del film, mentre l’attributo
DurataStream memorizza (in minuti) per quanto tempo il cliente ha visionato il film, questo valore
potrebbe essere inferiore alla durata del film quando un cliente interrompe lo streaming prima della
conclusione del film.
Scrivere l'istruzione SQL che: Visionati DurataStream
1. elimina le tuple della relazione il cui valore dell’attributo è uguale
a 0.
2. visualizza una sola volta i codici dei clienti che, per almeno un film, hanno interrotto la visione
prima della conclusione del film.
3. visualizza i codici dei film che non sono mai stati visionati.
4. per i film che sono stati visionati almeno una volta, visualizza il codice del film, il numero di volte
che è stato visionato ed il numero totale di ore che è stato visionato;
5. traduce la seguente espressione dell’algebra relazionale: operazione di prodotto cartesiano tra la
Film IDC, Data
relazione e la relazione ottenuto da un’operazione di proiezione degli attributi
DurataStream Visionati.
e sulla relazione
Query 1
DELETE FROM Visionati
WHERE DurataStream = 0
Query 2
SELECT DISTINCT(IDC)
FROM Film, Visionati
WHERE ID = IDF and DurataStream < Durata 32
Query 3
SELECT ID
FROM Film
WHERE ID NOT IN (SELECT IDF
FROM Visionati) X
Query 4
SELECT IDF, COUNT(*), SUM(DurataStream)/60
FROM Visionati
GROUP BY IDF
Query 5
SELECT *
FROM Film, (SELECT IDC, Data, DurataStream
FROM Visionati) X 33
Esame Informatica Generale 15/06/2017 – Fila B
Quesito 1 (punteggio 2)
Si consideri il seguente frammento di programma in linguaggio C:
do{ i = i + a;
j = j / 2;
} while (i <= j)
while,
utilizzando il ciclo scrivere un frammento di programma equivalente.
While (i<=j){
I = i + a;
j = j/2;
}
Quesito 2 (punteggio 2)
Descrivere la funzione della CPU. 34
Quesito 3 (punteggio 2)
Scegliere uno dei seguenti algoritmi codificati in linguaggio C/C++ e scrivere la tabella di esecuzione (trace
table) Puntatori Riferimenti
int f(int* y) { int f(int& y) {
*y = *y - 1; y = y - 1;
return *y - 1; return y - 1;
} }
int G(int* y) { int G(int& y) {
int x; int x;
x = 1 - f(y); x = 1 - f(y);
*y = *y - 1; y = y - 1;
return *y - x; return y - x;
} }
int main() { int main() {
int x, y; int x, y;
x = 1; x = 1;
y = G(&x) + 1; y = G(x) - 1;
return 0; return 0;
} } 35
Main
X Y
- -
1 - G(&x)
1 - Y x
1 - &x - F(&x)
1 - &x - y
1 - &x - &x
0 - &x - &x -1
0 - &x 2
-1 - &x 2
-3
-1 -2 36
I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher cassy14 di informazioni apprese con la frequenza delle lezioni di Informatica generale e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Milano Bicocca - Unimib o del prof Avellone Alessandro.
Acquista con carta o conto PayPal
Scarica il file tutte le volte che vuoi
Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato