home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
CataniaB
/
teach-act
/
esercizi
/
quiz.txt
< prev
next >
Wrap
Text File
|
1999-05-10
|
4KB
|
180 lines
Quiz su programmazione C:
Scopo: una serie di domande per riuscire non solo a scrivere
programmi ma anche a capire quelli degli altri.
Nel seguito troverete esempi con errori (logici)
e programmi che a prima vista possono trarre in inganno (ad esempio
indentazione che non segue il significato intuitivo), questo per
stimolarvi a scrivere programmi (possibilemente corretti ;) che siano
anche di facile lettura (sempre nei limiti della difficolta' dell'algoritmo).
Suggerimento: ovviamente il tutto ha senso seárispondete senza ausilio del
calcolatore (..da usare solo come verifica per le risposte).
1) Ambiguita' dell'istr. if:
int a,b;
....
if (a>0)
if (b>0) printf("ok");
else printf("ok");
Discutere l'effetto dell'esecuzione di tale istruzione al variare di a e b.
2) Cicli annidati.
Siano i,j,r tre variabili int, N una costante, e cond(i,j) una
condizione booleana su i e j.
Modificate il ciclo:
for(i=0;i<N;i++)
for(j=0;j<N;j++)
r=cond(i,j);
in modo che:
i) se cond(i,j) e' soddisfatta (si valuta in 1):
si esce dal "for" piu' interno ma non da quello piu esterno.
ii) si esce da entrambi i cicli "for".
3) Siano "a" e "b" due stringhe (i.e., char a[N],b[N];)
considerate il seguente frammento di programma:
for(i=0;a[i];i++) b[i]=a[i];
b[i]='\0';
i) Cosa fa?
ii) Utilizzate l'istruzione "while" per ottenere lo stesso
risultato;
iii) Utilizzate l'istruzione "do..while()" per ottenere lo stesso
risultato ( do istr while (cond); esegue "istr" fino a che
"cond" diventa falsa).
4) L'operatore aritmetico % restituisce il resto di una divisione.
Cosa fa il seguente frammento di programma?
int i=0;
while(i<50)
if (i%2) printf("%d",i);
i++;
5) Cosa fa il seguente frammento di programma?
int i;
for(i=0;i<50;i++);
if (i%2) printf("%d",i);
6) Considerate il seguente ciclo for:
int a[N];
int i;
for(i=0; i<N && a[i] && a[i]!=4 ; i++) printf("%d",a[i]);
Scrivete una versione equivalente senza utilizzare && e ||.
7) In C esiste un tipo particolare di espressione: la lista di espressioni:
e1,e2,...,en. Le espressioni vengono valutate in sequenza da sinistra
a destra. Il valore di tutta l'espressione e1,...en corrisponde
al valore di "en" al momento della sua valutazione.
Siano x,y,z variabili int:
Qual e' l'effetto delle assegnazioni:
i) x=(y=0,z=0);
ii) x=(y=0,z=y+1,z+1);
Oss: Le liste di istruzioni vengono spesso utilizzate nei cicli for
(e.g. inizializzazioni multiple) vedi es. 5;
8) Considerate il seguente frammento di programma:
char a[N];
char temp;
int i,j;
for (i=0,j=1 ; a[i] && a[j] ; i++,j++ )
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
i) Cosa fa?
ii) Scrivete una versione piu' efficiente (cioe' con meno operazioni);
9) Descrivere il significato del seguente programma:
int p(int x,int n) {return(x-n);} /* funzione */
main()
{
int x;
while (p(x++,4)) printf("% d",x);
}
10) Trovate esempi di utilizzo per i casi limite del''istruzione "for",
cioe':
i) for(e; ; ) istr; dove "e" e' una qualche espressione
ii) for( ;e; ) istr;
iii) for( ; ;e) istr;
Oss: se non c'e la condizione il for assume 1 (vero).
11) Verificate che data "a" costante che denota un array (e.g., char a[10]),
allora "&a" equivale ad "a" (ricordatevi che "a" e' un puntatore).
(ad es. usate scanf con "%s").
12) Short circuit. Definamo la seguente funzione:
int cond(){ return cond(); }
i) Cosa succede all'istruzione
if ((a>0) && cond()) printf("ciao");
al variare di "a"?
ii) Cosa succede all'istruzione
if (cond() && (a>0)) printf("ciao");
al variare di "a"?
13) Il seguente programma mostra un uso scorretto delle stringhe.
Individuate i punti critici:
int i;
char a[]="abcd";
char b[10]="do";
for(i=0;b[i];i++) b[i]=a[i];
14) Cosa fa il seguente programma?
int x;
void f(int x){x++;}
void main()
{
f(x++);
printf("%d",x);
}
15) Cosa fa il seguente programma?
int x[10]={1,2,3,4,5,6,7,8,9,10};
void f(int *x){x++;}
void main()
{
f(x);
printf("%d",*x);
}
16) Cosa fa il seguente programma?
int x[10]={1,2,3,4,5,6,7,8,9,10};
void main()
{
int *p;
printf("%d",*p++);
}