Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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?
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?
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));
Nell’integrazione dell'oscillatore armonico sia il metodo di Eulero che quello di Eulero-Cromer sono
marginali.
6. Consideriamo un cammino aleatorio in D dimensioni spaziali. Le posizioni finali ad un tempo fisso grande
possono essere sia negative che positive e, soprattutto, i loro valori assoluti non crescono quando il
tempo cresce.
colmare la deficienza di un tipo (type def) aggiungendogli caratteristiche essenziali delle quali il
programmatore ha bisogno.
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 è
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
232
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.
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?
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;
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
Eulero-Cromer
15. Quanto vale la variabile x dopo la seguente assegnazione?
x = (int)((double)4/3+(double)(3/2)+1/2.);
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 {
24
NaN
Le prime due
La terza
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;
}
32
16
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 = 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
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.
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