Laboratorio di Informatica I: Programmazione.
AA 2003/04.

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 ed esplicite e semplici costrutti for e if / 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()
    {
    float a,b,c,d,e,f,g,h,i;
    int p,q,r,s,u,w,z;
    a=2.0;
    b=1;
    c=3.9;
    p=2;
    q=3;
    z=c;
    d=a/b+c;
    e=b/c+a;
    f=p/q;
    g=p/q*q/p;
    r=a/c*c/a;
    u=(a/c)*(c/a);
    s=(p/q)*(q/p);
    w=c*(1/2);
    h= (a*c < p*q);
    printf("a=2.0; a e' float , il risultato e' %f \n",a);
    printf("b=1; b e' float , il risultato e' %f \n",b);
    printf("c=3.9; c e' float , il risultato e' %f \n",c);
    printf("p=2; p e' int , il risultato e' %d \n",p);
    printf("q=3; q e' int , il risultato e' %d \n",q);
    printf("z=c; z e' int , c e' float, il risultato e' %d \n",z);
    printf("d=a/b+c; d e' float , il risultato e' %f \n",d);
    printf("e=b/c+a; e e' float , il risultato e' %f \n",e);
    printf("f=p/q; f e' float , il risultato e' %f \n",f);
    printf("g=p/q*q/p; g e' float , il risultato e' %f \n",g);
    printf("r=a/c*c/a; r e' int , il risultato e' %d \n",r);
    printf("u=(a/c)*(c/a); u e' int , il risultato e' %d \n",u);
    printf("s=(p/q)*(q/p);s e' int , il risultato e' %d \n",s);
    printf("w=c*(1/2); w e' int , il risultato e' %d \n",w);
    printf("h= (a*c < p*q); h e' float , il risultato e' %f \n",h);

    return 0;
    }

    Prima di compilare il programma ed eseguirlo, scrivere su un foglio le previsioni su cosa verra' visualizzato sulla schermo. Quindi compilare, (gcc -ansi -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 3 dell' esercitazione n.2 per ottenere il codice decimale ASCII dei caratteri { 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 nel' espressione e poi viene eseguita l' operazione di incremento o decremento. Cosa  verra' scritto dal seguente programma ?
    #include 

    int main()
    {
    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. Cosa scrive il seguente frammento di programma se x=10 e y=25 ? (verificare)

    if (x > 12)
    if(y > 20)
    printf(" Hello \n");
    else
    printf(" Hi! \n");
  11. Il seguente programma calcola la somma dei primi 50 interi ? Verificare. (Il risultato esatto e'  1275).
    #include <stdio.h>
    #define MAX 50
    int main()
    {
    int i=1;
    int total = 0;
    for (i=1; i < MAX; i++)
    total += i;
    printf("%d \n",total);
    return 0;

    }
  12. Scrivere un programma che legga 10 interi positivi non nulli e ne stampi la somma ed il prodotto. Il programma deve essere in grado di controllare se un numero immesso è negativo o nulllo e chiedere un altro input (in modo che in totale ci siano sempre dieci addendi e fattori).
  13. Scrivere un programma che dia le  soluzioni reali dell' equazione generica di secondo grado a coefficienti reali a x2 + b x + c = 0.

    Se si include, oltre a stdio.h anche il file math.h e si compila con l' opzione -lm di gcc ( gcc -ansi -pedantic -lm -o nomefile.x nomefile.c) si può utilizzare la funzione di libreria sqrt(x) per calcolare la radice quadrata di x.