Sei sulla pagina 1di 12

1. Quale delle seguenti espressioni riserva dinamicamente 100 elementi di tipo double in modo corretto?

x = (double*)malloc(400);

x = (double*)calloc(100 * sizeof(double));

x = (double*)calloc(100, 4);

x = (double*)malloc(100 * sizeof(double));

2. Consideriamo un gas reticolare su un reticolo tridimensionale di lato intero L in cui la posizione delle particelle è
individuata con un numero intero senza segno n compreso tra 0 e L3-1. Quale dei seguenti stralci di codice permette di
derivare correttamente le tre coordinate delle particelle?

x2=(int)(n/(L+L)); x1=(int)((n%(L+L))/L); x0=(int)(n%L);

x2=(int)(n/(L+L)); x1=(int)((n/(L+L))%L); x0=(int)(n%L);

x2=(int)(n/(L*L)); x1=(int)((n/(L*L))%L); x0=(int)(n%L);

x2=(int)(n/(L*L)); x1=(int)((n%(L*L))/L); x0=(int)(n%L);

3. Quale delle seguenti funzioni void itera(int) chiamata una sola volta nel main con l’istruzione itera(17); da origine a
un loop infinito?

void itera(int a){ if (a>0) itera(--a);}

void itera(int a){ if (a>0) itera(a--);}

Nessuna delle altre tre

void itera(int a){ if (a<0) itera(a--);}

4. Quale dei seguenti stralci di codice riserva dinamicamente 100x50 elementi di tipo double in modo corretto?

x = (double*)malloc(100 * sizeof(double *));


for(int i=0; i<=100; i++) x[i]= (double*)malloc(50 * sizeof(double));

x = (double*)malloc(100 * sizeof(double *));


for(int i=0; i<=100; i++) x[j]= (double*)malloc(50 * sizeof(double));

x = (double*)malloc(100 * sizeof(double));
for(int i=0; i<100; i++) x[i]= (double*)malloc(50 * sizeof(double));

x = (double**)malloc(100 * sizeof(double *));


for(int i=0; i<100; i++) x[i]= (double*)malloc(50 * sizeof(double));
5. Quale fra queste affermazioni è vera?

Nell’integrazione dell'oscillatore armonico sia il metodo di Eulero che quello di Eulero-Cromer sono
marginali.

Nessuna delle altre tre.

Nell’integrazione dell'oscillatore armonico il metodo di Eulero è instabile e quello di Eulero-Cromer è


marginale.

Nell’integrazione dell'oscillatore armonico il metodo di Eulero è stabile e quello di Eulero-Cromer è


marginale.

6. Consideriamo un cammino aleatorio in D dimensioni spaziali. Le posizioni finali ad un tempo fisso grande

nessuna fra le altre tre risposte è corretta.

possono essere sia negative che positive e, soprattutto, i loro valori assoluti non crescono quando il
tempo cresce.

sono costanti, non dipendono dal singolo cammino e sono grandi.

sono distribuite secondo una legge gaussiana.

7. Un uso appropriato per l’istruzione typedef è

nessuna fra le altre tre risposte è corretta.

colmare la deficienza di un tipo (type def) aggiungendogli caratteristiche essenziali delle quali il
programmatore ha bisogno.

assegnare un nome diverso, aggiuntivo, ad un tipo già esistente.

definire nuovi tipi di variabile, come per esempio matrici di rotazione tre per tre, e permettere quindi
di definire nuove operazioni fra questi nuovi tipi.

8. La soglia di percolazione è

nessuna fra le altre tre risposte è corretta.

il valore della probabilità di occupazione dei siti di un reticolo per il quale si crea per la prima volta
un cluster esteso.

il valore della probabilità di occupazione dei siti di un reticolo per il quale la probabilità che un sito
sia occupato è minore di 0.686

il valore della probabilità di occupazione dei siti di un reticolo per il quale la probabilità che un sito
sia occupato è maggiore di 0.5
9. Se ad una variabile di tipo unsigned int di 64 bit il cui valore decimale è 33 si applica l'operatore di shift a sinistra di
31 posizioni si ottiene

232-1

nessuna delle tre altre risposte è giusta

232

10. Quale di queste affermazioni è vera?

Il C è un linguaggio ricorsivo, e nel linguaggio C una struct può essere definita avendo come
componenti anche puntatori che puntano a una struttura dello stesso tipo.

Il C non è un linguaggio ricorsivo, ma nel linguaggio C una struct può essere definita avendo come
componenti anche puntatori che puntano a una struttura dello stesso tipo.

Il C è un linguaggio ricorsivo, ma nel linguaggio C una struct non può essere definita avendo come
componenti anche puntatori che puntano a una struttura dello stesso tipo, perché al momento della
definizione la struct non è ancora definita e non può quindi essere indirizzata.

Nessuna delle altre tre affermazioni.

11. La seguente funzione dovrebbe stampare tempo e posizione di un random walk unidimensionale con N passi.
1.void rw(int N, int seed){
2. int x, i;
3. double ran;
4. x=0;
5. for(i=0;i<N;i++){
6. printf(“%d %d\n”, i, x);
7. srand48(seed);
8. ran=drand48();
9. if (ran>0.5) x++;
10. else x--;
11. }
12. printf(“%d %d\n”,i,x);
13.}
Una riga è nel posto sbagliato. Quale?

Nessuna delle altre opzioni

riga 7

riga 12

riga 6
12. Come definisco un nuovo tipo di variabile chiamato studente, corrispondente ad una struttura composta da una
variabile stringa di lunghezza 20 chiamata “cognome” e da una variabile intera chiamata “voto”?

struct studente{
char cognome[20];
int voto;
};

struct stru_studente{
char cognome[20];
int voto;
} studente;

Nessuna delle altre opzioni è corretta

struct stru_studente{
char cognome[20];
int voto;
};
typedef struct stru_studente studente;
13. Quale di questi codici implementa il generatore lineare congruenziale puramente moltiplicativo minimal standard che
ha parametri m=2147483647 e a=16807?

#define a 16807
#define m 2147483647
unsigned long long int myrand;
unsigned long long int minimal_standard(void) {
myrand+=a%m;
return myrand;
}

#define a 16807
#define m 2147483647
unsigned long long int myrand;
unsigned long long int minimal_standard(void) {
myrand=(myrand+a)%m;
return myrand;
}

#define a 16807
#define m 2147483647
unsigned long long int myrand;
unsigned long long int minimal_standard(void) {
myrand=(myrand*m)%a;
return myrand;
}

#define a 16807
#define m 2147483647
unsigned long long int myrand;
unsigned long long int minimal_standard(void) {
myrand=(myrand*a)%m;
return myrand;
}

14. Sapendo che la funzione acc(x) restituisce l’accelerazione nel punto x, quale algoritmo di integrazione dell’equazione
d2x/dt2=acc(x) stanno implementando le seguenti righe di codice:
x = x0; v = v0;
for (i=0; i<numSteps; i++) {
v += acc(x) * dt;
x += v * dt;
}

Eulero

Leapfrog o del mezzo passo

Runge-Kutta del secondo ordine

Eulero-Cromer
15. Quanto vale la variabile x dopo la seguente assegnazione?
x = (int)((double)4/3+(double)(3/2)+1/2.);

nessuno degli altri valori

16. Le seguenti righe dovrebbero implementare l’algoritmo di Runge-Kutta al secondo ordine per integrare le equazioni
dell’oscillatore armonico, ma contengono un errore. Indicare in quale riga si trova l’errore.
1. for (t=1; t<=numSteps; t++) {
2. x_tmp=x+0.5*dt*v;
3. v_tmp=v-0.5*dt*omega2*x;
4. x += v_tmp*dt;
5. v += -omega2*x*dt;
6. }

riga 5

riga 2

riga 3

riga 4

17. Le seguenti righe di codice vorrebbero implementare l’algoritmo per simulare un random walk unidimensionale che
ad ogni passo si muove verso destra con il 40% di probabilità e verso sinistra con il 30% di probabilità. Una riga è
stata cancellata. Scegliete quella giusta tra quelle proposte.
x = 0;
for (t=1; t<numSteps; t++) {
if ((ran = drand48()) < 0.3) {
x--;
--- RIGA MANCANTE ---
x++;
}
}

} else {

} else if (drand48() < 0.4) {

} else if (drand48() > 0.6) {

} else if (ran > 0.6) {


18. La funzione swap deve eseguire lo scambio degli elementi h[i] e h[j] dell’array h[ ] che è stato dichiarato globalmente.
Dire quali delle seguenti definizioni della funzione swap è quella corretta, considerando anche il modo in cui la
funzione viene chiamata.

swap(double * p1, double * p2) {


double tmp=*p1;
*p1=*p2;
*p2=tmp;
}

chiamata con il comando swap(h+i, h+j)

swap(double x1, double x2) {


double tmp=x1;
x1=x2;
x2=tmp;
}

chiamata con il comando swap(h[i], h[j])

swap(int i1, int i2) {


int tmp=i1;
h[tmp] = h[i2];
h[i1] = h[tmp];
}

chiamata con il comando swap(i, j)

Nessuna delle altre tre

19. Data la seguente funzione:


unsigned int FF(unsigned int n) {
unsigned int temp;
if ( n==0) {
temp = 1;
} else {
temp = n*FF(n-1);
}
return temp;
}
Quale valore restituisce la chiamata FF(4)?

24

NaN

Nessuno degli altri valori


20. Il seguente script di gnuplot deve prendere una tabella ordinata di valori contenente 3 colonne da un file chiamato
“data.dat” ed esportare un grafico in formato pdf su un file chiamato “plot.pdf”. Il plot deve mostrare sull’asse delle
ascisse (chiamato “tempo”) la prima colonna e sull’asse delle ordinate (chiamato “distanza”) la terza colonna.

set xlabel 'tempo'


set ylabel 'distanza'
set term png
plot 'data.dat' u 1:2 with l
set output 'plot.pdf'

Le prime due

La terza

Nessuna delle altre opzioni

La terza e l'ultima

21. Il seguente codice dovrebbe utilizzare un array di struct, estrarre un numero random intero k compreso fra 0 e L e
azzerare la componente x della k-esima struct dell'array.

struct position{
int x;
int y;
};
int main(void) {
int L=10;
struct position PP[L*L+1];
k= ((double) rand()) / RAND_MAX;
PP[k].x -> 0;
}

Il codice però contiene una o più righe sbagliate, quali?

La dichiarazione della struct e la terza riga del main.

La terza riga del main.

Le ultime due righe del main.

La dichiarazione della struct e le ultime due righe del main.

22. Quanto vale 1<<5?

32

16

Nessuno degli altri valori


23. Il seguente pezzo di codice dovrebbe fare la media in diretta di una serie di 100 numeri random uniformemente
distribuiti fra 0 e 1:

double r, av=0.0;
int i, N=100;
for (i=0; i<N; i++) {
r = drand48();
-- RIGA MANCANTE --
}
av = av / N;

Al codice manca però una riga. Come deve essere completata la riga mancante?

av = r*av;

av += r;

av = av+1;

av = (av+r)/N;

24. Si vuole riservare/allocare memoria per un array di 100 double chiamato “av” ed inizializzarlo a zero. Quale di queste
è la sintassi corretta?

double av = malloc(100*double);

double *av = calloc(100, sizeof(double));

int *av = calloc(100, double);

double av = malloc(100*double)=0;

25. In un codice che implementa la simulazione di un gas reticolare di M particelle su reticolo quadrato regolare in 2
dimensioni di lato L con condizioni periodiche al bordo salvate le coordinate di ogni particella in una struttura del
seguente tipo

struct pos {
unsigned int x, y;
} particle[M];

Assumete che la “destra” sia caratterizzata da valori della coordinata x crescenti e la “sinistra” da valori della
coordinata x decrescenti.
Indicate quali delle seguenti linee di codice implementa correttamente lo spostamento della i-esima particella di un
passo verso sinistra.

particle[i].x = (particle[i].x-1)%L;

particle[i-1] = particle[i];

particle[i].x = (particle[i].x-1+L)%L;

particle[i].x--;
26. Quale tra le seguenti istruzioni seleziona i 6 bit meno significativi della variabile k di tipo unsigned long long int?

k&6

k & ((1ULL<<6) - 1)

~(k << 6)

(k >> 6) << 6

27. Un algoritmo di integrazione è instabile se

l’algoritmo amplifica una piccola perturbazione cui il sistema è stato sottoposto o un piccolo errore
nella condizione iniziale.

l’algoritmo fornisce risultati casuali che però, in media, ricostruiscono il corretto scenario fisico.

l’algoritmo a volte amplifica e a volte riduce, in modo che non è possibile prevedere, una piccola
perturbazione che ha influenzato il sistema.

Nessuna delle altre tre.


28. Nella bella città di Formaggiopoli ci sono regole alimentari molto strette. I (numerosi) negozi di formaggio per ogni
formaggio devono specificare, nei loro potenti computer, il nome del formaggio (che non può essere più lungo di 37
caratteri), il suo costo al chilo, il numero di calorie che un chilo del formaggio contiene, arrotondato all’intero (nel
gustoso mondo di Formaggiopoli formaggi molto grassi possono contenere anche più di 1000 calorie al chilo), e un
valore che vale zero per i formaggi considerati “leggeri” e 1 per quelli considerati “grassi”. Una possibile buona
definizione di una struct che possa aiutare in questo compito è:

struct myCheese {
char cheeseName[38];
double cheeseCost;
int cheeseCal;
char cheeseType;
};

struct myCheese {
char cheeseName[36];
double cheeseCost;
int cheeseCal,
char cheeseType;
};

struct myCheese {
char cheeseName[38];
double cheeseCost;
int cheeseCal;
char cheeseType;
}

struct myCheese {
char cheeseName[38]:
double cheeseCost;
char cheeseCal;
char cheeseType;
};

29. La funzione f() restituisce valori interi e pari compresi tra -10 e 20 (inclusi sia -10 che 20). Dovendo generare un
istogramma dei valori restituiti da f(), volete salvare i relativi conteggi in un array h[ ]. Quale deve essere la lunghezza
minima dell’array h[ ] e quale comando potete usare per riempirlo correttamente?

16 valori, h[(int)(f()+10/2)]++;

15 valori, h[(int)(f()+10/2)]++;

15 valori, h[(int)((f()+10)/2)]++;

16 valori, h[(int)((f()+10)/2)]++;
30. Data la funzione:
int MM(int A, int B)
{
if (B < 0) {
return MM(A, -B);
}
int ret = A % B;
if (ret < 0)
ret += B;
return ret;
}
Quanto vale MM(7,-5)?

-1.4

1.4

Nessuno degli altri valori

Potrebbero piacerti anche