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 >
Text File  |  1999-05-10  |  4KB  |  180 lines

  1. Quiz su programmazione C:
  2.  
  3. Scopo: una serie di domande per riuscire non solo a scrivere 
  4. programmi ma anche a capire quelli degli altri. 
  5. Nel seguito troverete esempi con errori (logici)
  6. e programmi che a prima vista possono trarre in inganno (ad esempio 
  7. indentazione che non segue il significato intuitivo), questo per
  8. stimolarvi a scrivere programmi (possibilemente corretti ;) che siano
  9. anche di facile lettura (sempre nei limiti della difficolta' dell'algoritmo). 
  10.  
  11. Suggerimento: ovviamente il tutto ha senso seárispondete senza ausilio del 
  12. calcolatore (..da usare solo come verifica per le risposte).
  13.  
  14. 1) Ambiguita' dell'istr. if:
  15.  int a,b;
  16.  ....
  17.  if (a>0) 
  18.    if (b>0) printf("ok"); 
  19.  else printf("ok");
  20.  
  21. Discutere l'effetto dell'esecuzione di tale istruzione al variare di a e b.
  22.  
  23. 2) Cicli annidati.
  24.  
  25. Siano i,j,r tre variabili int, N una costante, e cond(i,j) una
  26. condizione booleana su i e j.
  27. Modificate il ciclo:    
  28.  
  29.  for(i=0;i<N;i++)
  30.   for(j=0;j<N;j++) 
  31.     r=cond(i,j);
  32.  
  33. in modo che: 
  34.  i)  se cond(i,j) e' soddisfatta (si valuta in 1): 
  35.      si esce  dal "for" piu' interno ma non da quello piu esterno.
  36.  ii) si esce da entrambi i cicli "for". 
  37.  
  38. 3) Siano "a" e "b" due stringhe (i.e., char a[N],b[N];)
  39.   considerate il seguente frammento di programma:
  40.  
  41.   for(i=0;a[i];i++) b[i]=a[i];
  42.   b[i]='\0';   
  43.  
  44.   i)   Cosa fa?
  45.   ii)  Utilizzate l'istruzione "while" per ottenere lo stesso 
  46.        risultato; 
  47.   iii) Utilizzate l'istruzione "do..while()" per ottenere lo stesso 
  48.        risultato ( do istr while (cond); esegue "istr" fino a che 
  49.        "cond" diventa falsa).  
  50.  
  51. 4) L'operatore aritmetico % restituisce il resto di una divisione.
  52.    Cosa fa il seguente frammento di programma?
  53.     
  54.     int i=0;
  55.     while(i<50)
  56.       if (i%2) printf("%d",i);
  57.       i++; 
  58.  
  59. 5)  Cosa fa il seguente frammento di programma?
  60.     
  61.     int i;
  62.     for(i=0;i<50;i++);
  63.       if (i%2) printf("%d",i);
  64.  
  65. 6) Considerate il seguente ciclo for:
  66.  
  67.    int a[N];
  68.    int i;
  69.  
  70.    for(i=0; i<N && a[i] && a[i]!=4 ; i++) printf("%d",a[i]);
  71.  
  72.    Scrivete una versione equivalente senza utilizzare && e ||.
  73.  
  74. 7) In C esiste un tipo particolare di espressione: la lista di espressioni:
  75.    e1,e2,...,en. Le espressioni vengono valutate in sequenza da sinistra  
  76.    a destra. Il valore di tutta l'espressione e1,...en corrisponde 
  77.    al valore di "en" al momento della sua valutazione. 
  78.   Siano x,y,z variabili  int:
  79.   Qual e' l'effetto delle assegnazioni:
  80.  
  81.   i)  x=(y=0,z=0);
  82.   ii) x=(y=0,z=y+1,z+1);   
  83.  
  84. Oss: Le liste di istruzioni vengono spesso utilizzate nei cicli for
  85.    (e.g. inizializzazioni multiple) vedi es. 5;
  86.  
  87. 8) Considerate il seguente frammento di programma:
  88.   
  89.   char a[N];
  90.   char temp;
  91.   int i,j;
  92.  
  93.   for (i=0,j=1 ;  a[i] && a[j] ; i++,j++ )
  94.    { 
  95.      temp=a[i];   
  96.      a[i]=a[j];
  97.      a[j]=temp;
  98.    }
  99.    
  100.   i)   Cosa fa? 
  101.   ii)  Scrivete una versione piu' efficiente (cioe' con meno operazioni);  
  102.  
  103. 9) Descrivere il significato del seguente programma:
  104.  
  105. int p(int x,int n) {return(x-n);}  /* funzione */
  106. main()
  107.  {
  108.    int x;
  109.    while (p(x++,4)) printf("% d",x); 
  110.  }
  111.  
  112. 10) Trovate esempi di utilizzo per i casi limite del''istruzione "for",
  113.    cioe':
  114.    
  115.    i)   for(e; ; ) istr;     dove "e" e' una qualche espressione  
  116.    ii)  for( ;e; ) istr;    
  117.    iii) for( ; ;e) istr;      
  118.  
  119.  Oss: se non c'e la condizione il for assume 1 (vero).
  120.  
  121. 11) Verificate che data "a" costante che denota un array (e.g., char a[10]), 
  122.    allora "&a" equivale ad "a"  (ricordatevi che "a" e' un puntatore). 
  123.    (ad es. usate scanf con "%s"). 
  124.  
  125. 12) Short circuit. Definamo la seguente funzione: 
  126.   
  127.    int cond(){ return cond(); }
  128.  
  129.    i) Cosa succede all'istruzione
  130.             if ((a>0) && cond()) printf("ciao");
  131.       al variare di "a"? 
  132.  
  133.    ii) Cosa succede all'istruzione
  134.             if (cond() && (a>0)) printf("ciao");
  135.       al variare di "a"? 
  136.    
  137.  
  138. 13) Il seguente programma mostra un uso scorretto delle stringhe. 
  139.    Individuate i punti critici:
  140.   
  141.    int i;
  142.    char a[]="abcd";
  143.    char b[10]="do";
  144.    
  145.    for(i=0;b[i];i++) b[i]=a[i];
  146.  
  147.  
  148. 14) Cosa fa il seguente programma?
  149.  
  150.    int x;
  151.    void f(int x){x++;}
  152.  
  153.    void main()
  154.     { 
  155.       f(x++);
  156.       printf("%d",x);  
  157.     }
  158.  
  159. 15) Cosa fa il seguente programma?
  160.  
  161.    int x[10]={1,2,3,4,5,6,7,8,9,10};   
  162.    void f(int *x){x++;}
  163.    void main()
  164.     { 
  165.       f(x);
  166.       printf("%d",*x);  
  167.     }
  168.  
  169. 16) Cosa fa il seguente programma?
  170.  
  171.    int x[10]={1,2,3,4,5,6,7,8,9,10};
  172.    void main()
  173.     { 
  174.       int *p;
  175.  
  176.       printf("%d",*p++);  
  177.     }
  178.  
  179.  
  180.