Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà...
-
Upload
letizia-piccinini -
Category
Documents
-
view
219 -
download
0
Transcript of Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà...
Laboratorio di Linguaggi
P R I M O C O M P I T I N O
Marco Tarini
Università dell’Insubria
Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese
Corso di Laurea in Informatica
Anno Accademico 2004/05
con risposte
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Nella maggior parte delle architetture, quanti bytes occupano in memoria le variabili di tipo:
char A)
unsigned int B)
short int C)
double E)
float D)
Domanda 1 (1.5 punti)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Nella maggior parte delle architetture, quanti bytes occupano in memoria le variabili di tipo:
1 A)
4 B)
2 C)
8 E)
4 D)
Domanda 1 (1.5 punti)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 2 (2 punti)
A) Scrivere una funzione " meta_di " che, dato un numero intero, restituisce la sua metà.
B) In questo codice, usarla al posto dei puntiniper dimezzare la variabile x
(sugg: usare un assegnamento: x = ... )int main(){ int x=100; ... }
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 2 (2 punti)
A) -
B) -
int main(){ int x=100; x = meta_di(x);}
int meta_di(int x){ return x / 2;}
(e' una "divisione intera")
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 3 (2 punti)
A) Scrivere una procedura " dimezza " che, data un variabile intera, la dimezza.
B) In questo codice, usarla al posto dei puntiniper dimezzare la variabile x
int main(){ int x=100; ... }
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 3 (2 punti)
A) -
B) -
int main(){ int x=100; dimezza(&x);}
int dimezza(int *x){ *x = *x / 2; }
(e' una "divisione intera")
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 4 (1 punto)
Riscrivere i seguente comandi trovando una maniera più concisa diesprimere il literal a destra di ' = '
double x = 0.0000000000000001;
(sono 15 zeri dopo la virgola)
double y = 0.000000000000333;
(sono 12 zeri dopo la virgola)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 4 (1 punto)
Riscrivere i seguente comandi trovando una maniera più concisa diesprimere il literal a destra di ' = '
double x = 1e-16;
double y = 0.333e-12;
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 5 (1.5 punti)
Nel seguente array:
se la locazione di memoria di base dell'array e' la locazione 12.000, quale sarà la locazione di:
double x[50];
x[2] x[12] A) B)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 5 (1.5 punti)
Nel seguente array:
se la locazione di memoria di base dell'array e' la locazione 12.000, quale sarà la locazione di:
double x[50];
x[2] x[12] A) B)
12.000+sizeof(double)x2 = 12.016
12.000+sizeof(double)x12 = 12.096
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 6 (2.5 punti)
A) Scrivere la definizione di un nuovo tipo record (struct) che si chiama Nave per ogni "nave" si vorrà memorizzare:
• il nome di varo (che e' lungo al max 19 lettere)• il peso in tonnellate (non necessariamente intero)• il numero massimo di persone trasportabili
B) Quale sarà l'offset dell'ultimo campo? cioè la distanza della sua locazione di memoria
dalla locazione di memoria dell'inizio del record
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 6 (2.5 punti)
A) Scrivere la definizione di un nuovo tipo record (struct) che si chiama Nave
B) Quale sarà l'offset dell'ultimo campo?
typedef struct { char nomeVaro[20]; float peso; int maxPersone; } Nave
sizeof(char)x20 + sizeof(float) = 24
(uno spazio in piu' per il terminatore
di stringa '\0')
oppure double
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 7 (1 punto)
Dopo la seguente inizializzazione
di che tipo sono e quanto valgono le seguenti espressioni?
char s[]="pippo";
s[0] s[2] s[5]
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 7 (1 punto)
Dopo la seguente inizializzazione
di che tipo sono e quanto valgono le seguenti espressioni?
char s[]="pippo";
'p' 'p' 0
char char char
oppure '\0'
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 8 (1 punto)
Dato il seguente array
scrivere due assegnamenti per azzerare rispettivamente il primo e l'ultimo elemento
float x[50];
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 8 (1 punto)
Dato il seguente array
scrivere due assegnamenti per azzerare rispettivamente il primo e l'ultimo elemento
float x[50];
x[0]=0f; x[49]=0f;
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 9 (1 punto)
Scrivere la dichiarazione(con inizializzazione)di un array "pippo"di tre numeri che contiene, nell'ordine, i numeri 10, 20 e 40
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 9 (1 punto)
int pippo[]={10,20,40};
int pippo[3]={10,20,40};
oppure:
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 10 (2 punti)
al posto dei puntini, scrivere tre righe in cui:1.si definisce la variabile "x" come puntatore
ad intero2. la si alloca dinamicamente
(servendosi anche del costrutto sizeof )
3.si assegna il valore 10 alla variabile puntata
int main(){ ...}
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 10 (2 punti)
al posto dei puntini, scrivere tre righe in cui:
int main(){ int* x; x = (int*)malloc(sizeof(int)); *x=10; ... free(x);}
opzionale perche' non espicitamente richiesto dal testo
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 11 (3 punti)
00 00 00 0200 00 00 09
00 00 00 05
00 00 00 0500 00 00 08
61 2A 02 1C
00 00 00 07
12 33 A3 D0
Data il seguente stato della memoria e tabella degli identificatori :
0x612A02300x612A022C0x612A02280x612A02240x612A02200x612A021C0x612A02180x612A0214
indirizzo valore
ide. tipo locazione
I
intxx
pp int*
612A0224
612A022C
quanto valgono le seguenti espressioni?
xxA)
&xxB)
ppC)
*ppD) *(pp+1)F)
pp[1]E)
tabella degli identificatori
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 11 (3 punti)
00 00 00 0200 00 00 09
00 00 00 05
00 00 00 0500 00 00 08
61 2A 02 1C
00 00 00 07
12 33 A3 D0
Data il seguente stato della memoria e tabella degli identificatori :
0x612A02300x612A022C0x612A02280x612A02240x612A02200x612A021C0x612A02180x612A0214
indirizzo valore
ide. tipo locazione
I
intxx
pp int*
612A0224
612A022C
quanto valgono le seguenti espressioni?
xxA)
&xxB)
ppC)
*ppD) *(pp+1)F)
pp[1]E)
tabella degli identificatori
&xx
pp
xx*pppp[1] e*(pp+1)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 12 (2.5 punti)
La dichiarazione:costruisce un array di dimensione FISSA
A) Scrivere due righe di codice che, invece,definiscono e allocano un array s di float di dimensione x,dove x è una variabile di tipo intero– sugg: usare i puntatori
B) Come si accede al quinto elemento?– se nei due casi è diverso,
specificare le due sintassi
float s[100];
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 12 (2.5 punti)
La dichiarazione:costruisce un array di dimensione FISSA.
A) -
B) NON FA DIFFERENZA. In entrambi i casi:
float s[100];
float* s;s = (float*)calloc(x,sizeof(float));
s[4] oppure *(s+4)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 13 (1 punto)
Dopo le seguenti dichiarazioni:
scrivere una espressioneche non usi l'identificatore arre che sia equivalente all'espressione:
float arr[100];float *p = arr;
arr[2]
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 13 (1 punto)
Dopo le seguenti dichiarazioni:
scrivere una espressioneche non usi l'identificatore arre che sia equivalente all'espressione:
float arr[100];float *p = arr;
*(p+2) oppure p[2]
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 14 (2.5 punti)
Quanti accessi alla memoria in lettura,e quanti in scrittura,saranno necessari per eseguire i seguenti assegnamenti ?(assumere che gli identificatori rappresentino variabili del tipo corretto)
x = 10;
x = y; *p = x;
*p = 11;A)
B)
C)
D)
*p = x + y;E)
*(*z) = 6;F)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 14 (2.5 punti)
Quanti accessi alla memoria in lettura,e quanti in scrittura,saranno necessari per eseguire i seguenti assegnamenti ?(assumere che gli identificatori rappresentino variabili del tipo corretto)
x = 10;
x = y; *p = x;
*p = 11;A)
B)
C)
D)
*p = x + y;E)
*(*z) = 6;F)
w
rw rrw
rw rrrw
rrw
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 15 (2 punti)
Riempire i puntini nella seguente def di funzione,
che prende in input un parametro di tipo "Pippo",
nel caso che:A) il parametro NON debba essere cambiato dalla
funzione,e occupi poca memoria
B) il parametro NON debba essere cambiato dalla funzione,ma occupi molta memoria
C) il parametro debba essere cambiato dalla funzione
int funz( ... )
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 15 (2 punti)
Riempire i puntini nella seguente def di funzione,
che prende in input un parametro di tipo "Pippo",
nel caso che:A) il parametro NON debba essere cambiato dalla
funzione,e occupi poca memoria
B) il parametro NON debba essere cambiato dalla funzione,ma occupi molta memoria
C) il parametro debba essere cambiato dalla funzione
int funz( ... )
int funz( Pippo p )
int funz( const Pippo *p )
int funz(Pippo *p )
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 16 (1 punto)
Se x e' di tipo double, di che tipo sono le espressioni:
x + 10.0
(int) x
&x
A)
B)
C)
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 16 (1 punto)
Se x e' di tipo double, di che tipo sono le espressioni:
x + 10.0
(int) x
&x
A)
B)
C)
double
int
double*
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 17 (0.5 punti)
Scrivere cosa produce il precompilatorea partire dal seguente programma:
#define TEST x+y
int p(int x, int y){ return TEST * 2;}
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 17 (0.5 punti)
Scrivere cosa produce il precompilatorea partire dal seguente programma:
#define TEST x+y
int p(int x, int y){ return TEST * 2;}
int p(int x, int y){ return x+y * 2;}
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
file "prova.c"
file "settings.h"
Domanda 18 (1 punto)
Scrivere cosa produce il precompilatorea partire dal file "prova.c":
#include "settings.h" void B(){ #if DEBUG if (x < 0) printf("x"); #endif printf(".");}
#define DEBUG 0
int _debug;
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 18 (0.5 punti)
Scrivere cosa produce il precompilatorea partire dal file "prova.c":
file "prova.c"
file "settings.h" #include "settings.h"
void B(){ #if DEBUG if (x < 0) printf("x"); #endif printf(".");}
#define DEBUG 0
int _debug;int _debug; void B(){ printf(".");}
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 19 (1 punto)
Cosa scrive il seguente programma?
#include <stdio.h> int main(){ int x=17; printf("uno: %d\n",x); printf("due: %04d\n",x); printf("tre: %x\n",x);}
M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Domanda 19 (1 punto)
Cosa scrive il seguente programma?
#include <stdio.h> int main(){ int x=17; printf("uno: %d\n",x); printf("due: %04d\n",x); printf("tre: %x\n",x);}
uno: 17due: 0017tre: 11