Sei sulla pagina 1di 4

Prova Scritta di Programmazione e Laboratorio - 11 Giugno 2018 - Compito Pari

Valutazione: 2 punti per ogni risposta esatta; -0.5 punti per ogni risposta errata; 0 punti per non risposta;
Massimo 6 punti per gli esercizi di programmazione;
Per ogni domanda a risposta multipla, marcare la risposta esatta su questo foglio;
E’ possibile usare un foglio aggiuntivo per le risposte di programmazione.
Tempo a disposizione: 2 ore.

Cognome e Nome: Matricola:

Modulo 1
1. A quale dei seguenti numeri esadecimali è uguale la somma dei numeri esadecimali AB e BA
A. ABBA
B. 165
C. CC
D. 43
2. Cosa si intende per “Complessità computazionale” di un algoritmo?
A. Esclusivamente il tempo richiesto dall’esecuzione di un algoritmo
B. Esclusivamente la quantità di memoria richiesta per l’esecuzione di un algoritmo
C. Esclusivamente il tempo richiesto per l’acquisizione (o il trasferimento) dei dati
D. l’impegno di risorse dell’intero sistema di calcolo necessario per la risoluzione di un problema.
3. Quale sarà l’output del seguente codice se si dà come input 400 200 100 0?

void f(int a, int b, int* c, int* d)


{ *c = 0; *d = a;
while(*d >= b)
{ *d -= b;(*c)+=10;}
a = 10; b=20;
}

int main()
{int m, n, p, q;
scanf("%d %d %d %d", &m, &n, &p, &q);
f(m,n,&p,&q);
printf("%d %d %d %d", m, n, p, q);
}
A. 10 20 20 0
B. 10 20 100 0
C. 400 200 20 0
D. 400 200 100 0
4. Quale dei codici che utiizzano il ciclo for corrispondono al seguente codice?

d=10;c=1; do { d -=2*c++;}while(d >= 0)


A. for(d=8,c=1;d>=0;c++,d=d-2*c) printf("%d\n",d);
B. for(d=8,c=1;d>-3;c++,d=d-2*c) printf("%d\n",d);
C. for(d=10,c=1;d>=0;c++,d=d-2*c) printf("%d\n",d);
D. for(d=8,c=1;d>-11;c++,d=d-2*c) printf("%d\n",d);
5. Dato il seguente codice dire qual’è il suo output e se vi sono possibili errori run time.

int main()
{int A[5] ={1,3,5,7,9};
int B[5] ={1,2,4,6,8};
int *q,*p;
p=A;q=B+4;
while((*p+*q)==9)
{printf("%d,",*p+*q);
p++;q--;
}
}

A. 9,9,9,9,10 Possibile errore di puntamento


B. 9,9,9,9,10 Nessun errore
C. 9,9,9,9,9 possibile errore di puntamento
D. 9,9,9,9,10 Nessun errore

6. Si scriva un programma che, data una stringa di caratteri dall’alfabeto italiano compreso di spazi nella
variabile *testo , restituisca in un vettore di stringhe tutte le sottostringhe di *testo terminanti con
la varibile c .
Ad esempio dato testo="viva la mamma ed il papa" e c=’a’ restituisca il vettore
"viva"," la","ma","mma","ed il pa","pa"

Page 2
Modulo 2
1. Per ordinare un array di lunghezza n conviene
A. usare insertion sort ricorsivamente fino a n = 6 e poi mergesort;
B. usare mergesort ricorsivamente;
C. usare insertion sort iterativamente;
D. usare merge sort ricorsivamente fino a n = 6 e poi insertion sort

2. Si consideri un tipo astratto di dati Punto di prima categoria. Quale delle seguenti affermazioni è falsa:
A. un programma client può accedere alle coordinate solo attraverso le funzioni specificate nell’interfaccia
B. un programma client può manipolare diverse istanze di Punto
C. se copio una variabile Punto in un’altra variabile Punto, i valori delle coordinate vengono
copiati dall’una all’altra
D. la rappresentazione dei dati è nascosta nell’implementazione di Punto e non inclusa nell’header
file Punto.h
3. Data la funzione

size_t binarySearch(const int b[], int searchKey, size_t low, size_t high) {
if (low > high) return -1;
size_t middle = (low + high) / 2;
if (searchKey == b[middle]) return middle;
if (searchKey < b[middle])
return binarySearch(b, searchKey, low, middle - 1);
else
return binarySearch(b, searchKey, middle + 1, high);
}

la ricerca della chiave 11 nell’array { 3, 7, 9, 10, 13, 17, 18, 21, 25} termina dopo
A. 5 chiamate a funzione
B. 3 chiamate a funzione
C. 9 chiamate a funzione
D. 8 chiamate a funzione
4. La programmazione dinamica può produrre una soluzione efficiente se
A. si può dividere il problema in sottoproblemi indipendenti
B. il problema è basato su numeri non interi
C. sviluppando il problema in sottoproblemi si individuano sottoproblemi ripetuti
D. si possono arrangiare i dati in array di strutture

5. In un’implementazione con array del ADT Stack, l’operazione push può essere cosı̀ scritta

void push(Item item) {


if ( N >= maxN )
resize(maxN=2*maxN);
s[N++] = item;
}

dove la resize è più convenientemente realizzata mediante

Page 3
A. la funzione calloc che riserva un’area di memoria doppia per s
B. la funzione realloc che estende l’area di memoria allocata a s
C. la funzione malloc che estende l’area di memoria allocata a s
D. una delle funzioni di allocazione della memoria e la copia di maxN/2 elementi

6. Costruire una funzione ricorsiva arrayToDoubleList che, ricevuto in ingresso un array di interi, resti-
tuisca una lista doppiamente concatenata in cui nel campo informativo di ciascun nodo vi sia il cor-
rispondente numero intero dell’array.

Page 4