SOLUZIONE 27-09-99 (C)

Questionario cartaceo

  1. 22 in base 5 è    2  X  5 + 2  X  1 = 12.
    11 in base 5 è    1  X  5 + 1  X  1 = 6.
    18 = 2  X  7 + 4  X  1
    e quindi in base 7 è
    24 .

  2. Il programma stamperà
    i = 4, j = 4
    cioò è giustificato dal seguente "cartone animato".
    #include <stdio.h>
    
    int aaa(int *x, int *y)
    { int *a;
      
      a = x;
      /*(B)*/  *a = *y;
      /*(C)*/ *y = *x;  
      /*(D)*/ }
    
    main(){
      int i, j;
      
      i = 3;
      j = 4; 
      /*(A)*/ aaa(&i, &j);
      printf("i = %d, j = %d\n", i, j);
    }
  3. La sintassi dei numeri civici è data dai seguenti diagrammi sintattici.

  4. #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct LL *LISTA;
    struct LL { int NUMERO;
                LISTA SEGUITO; } ;
              
    LISTA TOGLI(LISTA l, int x)
    /*questa funzione elimina ogni occorrenza di x da l,
     l non sara' modificata */
    {
       if(l == NULL) 
           return NULL;
       else  if(l -> NUMERO == x)
                 return TOGLI(l -> SEGUITO,x);
             else{  LISTA l1 = (LISTA)malloc(sizeof(struct LL));
                    
                    l1 -> NUMERO = l -> NUMERO;
                    l1 -> SEGUITO = TOGLI(l -> SEGUITO,x);
                    return l1;
                  };
             
    }

Parte laboratorio

#include <stdio.h>

#define BOOL int
#define TRUE 1
#define FALSE 0

/*gli elementi del tipo INSIEME rappresentano gli insiemi di numeri reali 
la cui cardinalita' e' al piu' 50*/

typedef  struct INSIEME{ int CARD; /*cardinalita' dell'insieme*/
                         float ELEMENTI[50];  /*contiene gli elementi dell'insieme 
                         nelle prime posizioni senza ripetizioni*/
                        };

/* la funzione APPARTIENE controlla se un elemento appartiene ad un insieme */
BOOL APPARTIENE(float x, INSIEME s)
{
    int i;
    
    for(i=0; i < s.CARD; i++)
       if(x == s.ELEMENTI[i]) return TRUE;
    return FALSE;
};

/* la costante VUOTO  rappresenta l'insieme vuoto */
const INSIEME VUOTO = {0, {} };

/* la funzione CARDINALITA ritorna la cardinalita' di un insieme */
int CARDINALITA(INSIEME s)
{
    return s.CARD;
};


/* la funzione ADD ritorna l'insieme s a cui si e' aggiunto x; 
   il parametro oveflow ritorna se vi e' stato o no l'overflow */
INSIEME ADD(float x, INSIEME s, BOOL *overflow)
{
    if(APPARTIENE(x,s)) { *overflow = FALSE;
                          return s; }
    else if(CARDINALITA(s) == 50) { *overflow = TRUE;
                                    return;
                                   }
         else { *overflow = FALSE;
                s.ELEMENTI[s.CARD] = x;
                s.CARD = s.CARD + 1;
                return s;}
};

/* la funzione UNIONE ritorna l'unione di s1 ed s2;
   il parametro oveflow ritorna se vi e' stato o no l'overflow */
INSIEME UNIONE(INSIEME s1, INSIEME s2, BOOL *overflow)
{ 
    int i;

    for(i=0; i < s2.CARD; i++)
       s1 = ADD(s2.ELEMENTI[i],s1, overflow);
    return s1;
};

/* procedura di stampa utilizzata per il testing */
void STAMPA(INSIEME s)
{  int i;

   if(CARDINALITA(s) == 0) printf(" Insieme vuoto ");
   else{  printf(" { ");
          for(i=0; i < CARDINALITA(s); i++)
               printf(" %f ,",s.ELEMENTI[i]);
          printf(" } ");
        }
}


main()
{  
   INSIEME  I1, I2, I3, I4;
   BOOL over;
   
   /* assegnare ad I1 l'insieme vuoto*/
   I1 = VUOTO;
   
   printf("I1 = ");
   STAMPA(I1);
   printf("\n");
   
   /* assegnare ad I2 l'insieme { 3.5, 7.0, 4.0 }*/
   I2 = ADD(3.5, VUOTO, &over);
   I2 = ADD(7.0, I2, &over);
   I2 = ADD(4.0, I2, &over);

   printf("I2 = ");
   STAMPA(I2);
   printf("\n");
   
   /* assegnare ad I3 l'insieme { 3.1, 7.0, 4.4, 8.8 }*/
   I3 = ADD(3.1, VUOTO, &over);
   I3 = ADD(7.0, I3, &over);
   I3 = ADD(4.4, I3, &over);
   I3 = ADD(8.8, I3, &over);
   
   printf("I3 = ");
   STAMPA(I3);
   printf("\n");

   /*controllare se 3.0 appartiene ad  I2 U I3 */
   if(APPARTIENE(3.0, UNIONE(I2,I3,&over)))
      printf("Appartiene\n");
   else printf("Non appartiene\n");
   
   /* stampare la cardinalita' di  I3 U I2 U I1  */
   
   I4= I1;
   I4 = UNIONE(I2,I4,&over);
   I4 = UNIONE(I3,I4,&over);
   printf("I4 = ");
   STAMPA(I4);
   printf("\n");

   printf("Cardinalita di I3 U I2 U I1 = %d\n",CARDINALITA(I4));
}