Laboratorio di  Programmazione.
AA 2007/08.

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 e le conversioni implicite.

  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 (ricordarsi delle possibilità  di cut&paste):

    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.

  4. 
    #include <stdio.h>
                                                                                    
    int main(void)
    {
    float fa,fb,fc,fd,fe,ff,fg,fh,fi;
    double fl,fm;
    int   ip,iq,ir,is,iu,iw,iz;
    fa=2.0;
    fi=2.777777777777777;
    fl=2.777777777777777;
    fm=2.777777777777777f;
    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("fm=2.777777777777777f; fm e' double , il risultato e' %.15lf \n",fm);
    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));
    iu=2000000000;
    iw=iu/2;
    printf("iu=2000000000; iw = iu/2, iu e iw sono int , la somma  e' %d \n",iu+iw);
    printf(" sizeof(fl-fi) = %d \n",sizeof(fl-fi));
    if( (fl-fi) != 0 )
         printf(" fl-fi = %f \n",fl-fi);
    
    return 0;
    }
    
    
    

    Scopo di questo esercizio NON e' quello di visualizzare l' output sullo schermo ma di capire perche' viene visualizzato quello che si vede.  Prestare particolare attenzione all' ultima linea scritta in output!



  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 2 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. Va anche tenuto presente che la differenza dei convertitori di formato %i e %d  in input (nella function scanf) sta nel fatto che %d  si aspetta un input intero in notazione decimale mentre con %i  è  possibile passare un intero anche in rappresentazione ottale o esadecimale,  utilizzando la convenzione usuale per le costanti ottali ed esadecimali.




  7. Cosa scrivera' la istruzione printf? (Cercare di prevederlo prima di eseguire le stesse in un programma).
    int i,j;
    float f;
    char c;
    j=4;
    i= 2.0/3;
    f = (float) 3/2 ;
    printf("%f \n", f*i );

    E cosa succede se la linea in cui si assegna il valore di f diviene
          f = (float) (3/2);  ?