Laboratorio di  Programmazione.
AA 2004/05.

Esercitazione n. 3

Scopo di questa  sessione  è di far pratica con le dichiarazioni di tipo, l' uso degli operatori, le regole dell' aritmetica per i vari tipi dati, le conversioni implicite e semplici costrutti for e if e if-else .

  1. Creare una directory di nome Labo3  e ridefinirla come directory di default  (comando cd, v. esercitazione n.1).

  2.  
  3. Nella directory Labo3  creare mediante l' editor un file con il seguente programma C (occorre riscrivere tutto da tastiera ?):
  4. #include <stdio.h>

    int main(void)
    {
    float fa,fb,fc,fd,fe,ff,fg,fh,fi;
    double fl;
    int ip,iq,ir,is,iu,iw,iz;
    fa=2.0;
    fi=2.777777777777777;
    fl=2.777777777777777;
    fb=1;
    fc=3.9;
    ip=2;
    iq=3;
    iz=fc;
    fd = fa/fb + fc;
    fe=fb/fc + fa;
    ff=ip/iq;
    fg=ip/iq*iq/ip;
    ir=fa/fc*fc/fa;
    iu=(fa/fc)*(fc/fa);
    is=(ip/iq)*(iq/ip);
    iw=fc*(1/2);
    fh= (fa*fc < ip*iq);
    printf("fa=2.0; fa e' float , il risultato e' %f \n",fa);
    printf("fb=1; fb e' float , il risultato e' %f \n",fb);
    printf("fc=3.9; fc e' float , il risultato e' %f \n",fc);
    printf("fi=2.777777777777777; fi e' float , il risultato e' %f \n",fi);
    printf("fl=2.777777777777777; fl e' double , il risultato e' %.15lf \n",fl);
    printf("ip=2; ip e' int , il risultato e' %d \n",ip);
    printf("iq=3; iq e' int , il risultato e' %d \n",iq);
    printf("iz=fc; iz e' int , fc e' float, il risultato e' %d \n",iz);
    printf("fd=fa/fb+fc; fd e' float , il risultato e' %f \n",fd);
    printf("fe=fb/fc+fa; fe e' float , il risultato e' %f \n",fe);
    printf("ff=ip/iq; ff e' float , il risultato e' %f \n",ff);
    printf("fg=ip/iq*iq/ip; fg e' float , il risultato e' %f \n",fg);
    printf("ir=fa/fc*fc/fa; ir e' int , il risultato e' %d \n",ir);
    printf("iu=(fa/fc)*(fc/fa); iu e' int , il risultato e' %d \n",iu);
    printf("is=(ip/iq)*(iq/ip);is e' int , il risultato e' %d \n",is);
    printf("iw=fc*(1/2); iw e' int , il risultato e' %d \n",iw);
    printf("fh= (fa*fc < ip*iq); fh e' float , il risultato e' %f \n",fh);
    printf(" sizeof(int) = %d \n",sizeof(int));
    printf(" sizeof(1) = %d \n",sizeof(1));
    printf(" sizeof(char) = %d \n",sizeof(char));
    printf(" sizeof('1') = %d \n",sizeof('1'));
    printf(" sizeof(double) = %d \n",sizeof(double));
    printf(" sizeof(float) = %d \n",sizeof(float));
    printf(" sizeof(1.2) = %d \n",sizeof(1.2));
    printf(" sizeof(fl-fi) = %d \n",sizeof(fl-fi));
    if( (fl-fi) != 0 )
    printf(" fl-fi = %f \n",fl-fi);

    return 0;
    }

    Prima di compilare il programma ed eseguirlo, scrivere su un foglio le previsioni su cosa verra' visualizzato sulla schermo. Quindi compilare, (gcc -std=c99  -pedantic nomefile.c -o nomefile.x ), eseguire ( ./nomefile.x ) e verificare se le proprie predizioni erano corrette. 

    Scopo di questo esercizio NON e' quello di visualizzare l' output sullo schermo ma di capire perche' viene visualizzato quello che si vede. 



  5. Per scrivere con printf un carattere rappresentandolo mediante la codifica numerica ASCII (decimale) è sufficiente usare il descrittore di formato %u invece di %c. Modificare il programma al punto 4 dell' esercitazione n.2 per ottenere il codice decimale ASCII dei caratteri  che rappresentano le parentesi graffe (  {   e    }  )    immessi da tastiera. 


  6. Il programma di cui al punto precedente puo' essere facilmente trasformato in un convertitore tra rappresentazioni degli interi decimale, ottale ed esadecimale modificando il tipo dati della variabile input  da char a int  e usando opportunamente  i convertitori di formato %d (interi decimali)  %o (ottale) e %x (esadecimale)   per leggere in una rappresentazione e scrivere nell' altra.


  7. Il seguente frammento di codice dovrebbe calcolare la somma dei primi 10 interi ma contiene un errore di programmazione. Inserirlo in un programma C, compilarlo, eseguirlo e trovare l' errore. Modificare il programma in modo che calcoli e stampi la somma dei primi 15 quadrati di interi.
    int somma=0, i;
    for(i=0;i<=10;i=i+1);
    somma = somma + i;

  8. Le istruzioni del tipo i=i+1, somma=somma+i,   in cui cioe'  il valore di una variabile viene ridefinito come il valore precedente combinato ad un altro dato attraverso un operatore  aritmetico, sono cosi' frequenti che in C c'e' un modo compatto per scriverle:
    i += 1  (al posto di i = i + 1)
    somma += i (al posto di somma = somma + i)
    la stessa sintassi puo' essere usata con tutti gli altri operatori aritmetici. Inoltre, per il caso particolare di incrementi o decrementi unitari ci sono due operatori unari (++ e --) utilizzabili prima (forma prefissa) o dopo (forma suffissa) del nome della variabile:
    i += 1   equivale a    ++i o i++ 

    La differenza tra forma suffissa (i++, i--) e prefissa (++i, i--) e' che se gli operatori sono in forma prefissa la variabile viene prima incrementata o decrementata e poi viene usata nell' espressione; se sono in forma suffissa, prima viene utilizzato il valore nell' espressione e poi viene eseguita l' operazione di incremento o decremento. Cosa  verra' scritto dal seguente programma ?
    #include <stdio.h>

    int main(void)
    {
    int i=0,j=0;
    printf(" %d %d \n", i++, ++j );
    return 0;
    }

    E se l' istruzione fosse: printf(" %d %d %d, %d, \n", i++, ++j , i++, j++); ?


  9. Quanto vale x alla fine di ciascuno dei seguenti tre costrutti ?

    1) if ( x >= 10 )
    x = x + 6;
    if ( x >= 16 )
    x = x % 16;

    2)
    if ( x <= 10 )
    x = x - 5;
    if ( x <= 5 )
    x = x - 5;

    3)
    if ( x >= 10 )
    x = 10 + x % 10;
    if ( x > 20 )
    x = x / 16;

    Verificare le previsioni compilando ed eseguendo un programma che implementi i 3 costrutti e scriva il valore di x (variabile intera) per un numero adeguato di valori di x. Verificare poi se non sia possibile semplificare il confronto usando un unica condizione per ciascuno dei tre.
      

  10. Il seguente programma calcola la somma dei primi 50 interi ? Verificare. (Il risultato esatto e'  1275).
    #include <stdio.h>

    int main(void)
    {
    int i=1;
    int total = 0;
    for (i=1; i < 50; i++)
    total += i;
    printf("%d \n",total);
    return 0;

    }
    Un semplice modo per comprendere quello che succede nel ciclo for è di inserire nel corpo del for un' istruzione printf per farsi scrivere i valori delle variabili rilevanti ad ogni iterazione. Attenzione a mettere le parentesi graffe per raggruppare le istruzioni che vanno iterate.

  11. Scrivere un programma che legga 10 interi  e ne stampi la somma ed il prodotto. 

  12. Cosa scriverà  il seguente frammento di programma ?  Usare la ridirezione dell' output  per scrivere i risultati su un file. <>int ip,iq;
    char s=0;

    for (ip=0;ip<=300;ip++)
    {
    s=ip;
    iq=s;
    printf(" %d \n",iq);
    }
  13. Cosa scrive il seguente frammento di programma se x=10 ? (verificare)

    if (x > 12)
    printf(" x e' maggiore di 12 \n");
    else
    printf(" x non e' maggiore di 12 \n");

  14. Cosa scrive il seguente frammento di programma se x=10 e y=25 ? (verificare)

    if (x > 12)
    if(y > 20)
    printf(" A \n");
    else
    printf(" B \n");