SOLUZIONE 15-07-99 (C)

Questionario cartaceo

  1. 123 in base 7 è 1 × 49 + 2 × 7 + 3 × 1 = 66.
    66 = 7 × 9 + 3 × 1
    e quindi in base 9 è
    73 .

  2. ...1...
    ...2...
    ...4...
  3. typedef struct ALB *ALBERO;
    struct ALB { float ELEM;
                  ALBERO SINISTRO;
                  ALBERO DESTRO;   } ;
              
    BOOL APPARTIENE(ALBERO a, float e)
    
    /*questa funzione controlla se e appartiene all'albero a,
      cioe' se si trova in un nodo */
    {
       if(a == NULL) return FALSE;
       else if(a-> ELEM == e) return TRUE;
       else return(APPARTIENE(a->SINISTRO,e) || APPARTIENE(a->DESTRO,e));
    }
    

Parte laboratorio

#include <stdio.h>

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

/*gli elementi del tipo IMMAGINE rappresentano delle immagine a colori
in modo digitale, ogni elemento della matrice rappresenta un colore
secondo un opportuno meccanismo di codifica */

#define H 5
#define L 7  /*altezza e larghezza delle immagini*/

typedef int IMMAGINE[H][L];

BOOL bande_or(IMMAGINE i);
BOOL righine_ver(IMMAGINE i);
BOOL quadrettini(IMMAGINE i);

/* sottoprogramma che controlla se un'immagine e' a bande orizzontali */
/* per esempio  quella che segue lo e'
   3 3 3 3 3 3 3
   3 3 3 3 3 3 3
   4 4 4 4 4 4 4
   2 2 2 2 2 2 2
   2 2 2 2 2 2 2
   mentre quest'altra non lo e'
   3 3 3 3 3 3 3
   3 3 3 0 3 3 3
   4 4 4 4 4 4 4
   2 2 2 2 2 2 2
   2 2 2 2 2 2 2
*/

BOOL bande_or(IMMAGINE i)
/*basta controllare che gli elementi di ogni riga siano uguali tra loro*/
{
  int x,y, xcol;
  
  for (x=0 ; x<H ; x++)
  {
    xcol = i[x][0];
    for ( y=1 ; y<L ; y++ )
      if ( xcol != i[x][y] ) return FALSE;
  }
  return TRUE;
}

/* sottoprogramma che controlla se un'immagine e' a righine verticali */
/* per esempio  quella che segue lo e'
   3 4 3 4 3 4 3
   3 4 3 4 3 4 3
   3 4 3 4 3 4 3
   3 4 3 4 3 4 3
   3 4 3 4 3 4 3
   mentre quest'altra non lo e'
   3 4 3 3 3 4 3
   3 4 3 3 3 4 3
   3 4 3 3 3 4 3
   3 4 3 3 3 4 3
   3 4 3 3 3 4 3
*/

BOOL righine_ver(IMMAGINE i)
/*basta controllare che tutte le colonne pari siano del colore di  i[0][0]
  e tutte quelle dispari siano del colore di  i[0][1]*/
{
  int x,y, col1, col2;

  col1 = i[0][0];
  col2 = i[0][1];
  for (y=0 ; y<L ; y++)
    if ( y%2 == 0 )
      for ( x=0 ; x<H ; x++ ) { if ( col1 != i[x][y] ) return FALSE; }
    else
      for ( x=0 ; x<H ; x++ ) { if ( col2 != i[x][y] ) return FALSE; }
  return TRUE;
}

/* sottoprogramma che controlla se un'immagine e' a quadretti */
/* per esempio  quella che segue lo e'
   3 0 3 0 3 0 3
   0 3 0 3 0 3 0
   3 0 3 0 3 0 3
   0 3 0 3 0 3 0
   3 0 3 0 3 0 3
   mentre quest'altra non lo e'
   3 3 0 0 0 0 0
   3 3 0 0 0 0 0
   0 0 3 3 3 3 3
   0 0 3 3 3 3 3
   0 0 3 3 3 3 3
*/

BOOL quadrettini(IMMAGINE i)
/*basta controllare che tutti gli eleemnti la cui somma degli indici e' 
  pari siano del colore di  i[0][0]  e tutti quelli la cui somma degli 
  indici e'  dispari siano del colore di  i[0][1]*/
{
  int x,y, col1, col2;

  col1 = i[0][0];
  col2 = i[0][1];
  
  for (x=0 ; x<H ; x++)
    for ( y=1 ; y<L ; y++ )
      if ( (x+y)%2 == 0 )
      {
        if ( col1 != i[x][y] ) return FALSE;
      }
      else
        if ( col2 != i[x][y] ) return FALSE;

  return TRUE;
}

main()
{
   /* testare adeguatamente le procedure definite sopra*/
   /* evitare di definire un sottoprogramma per leggere una matrice */
  IMMAGINE 
    i0 = {{0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0}},
    i1 = {{1,1,1,1,1,1,1},
          {1,1,1,1,1,1,1},
          {1,1,1,1,1,1,1},
          {2,2,2,2,2,2,2},
          {1,1,1,1,1,1,1}},
    i2 = {{1,1,3,4,1,1,1},
          {1,1,3,4,1,1,1},
          {1,1,3,4,1,1,1},
          {1,1,3,4,1,1,1},
          {1,1,3,4,1,1,1}},
    i3 = {{1,0,1,0,1,0,1},
          {1,0,1,0,1,0,1},
          {1,0,1,0,1,0,1},
          {1,0,1,0,1,0,1},
          {1,0,1,0,1,0,1}},
    i4 = {{1,0,1,0,1,0,1},
          {0,1,0,1,0,1,0},
          {1,0,1,0,1,0,1},
          {0,1,0,1,0,1,0},
          {1,0,1,0,1,0,1}};
    
    printf("\nl'immagine tutti zero \n");
    if (!bande_or(i0))  printf("non "); printf("e' a bande orizzontali\n");
    if (!righine_ver(i0)) printf("non "); printf("e' a righine verticali\n");
    if (!quadrettini(i0)) printf("non "); printf("e' a quadrettini\n");

    printf("\nla prima immagine\n");
    if (!bande_or(i1)) printf("non "); printf("e' a bande orizzontali\n");
    if (!righine_ver(i1)) printf("non "); printf("e' a righine verticali\n");
    if (!quadrettini(i1)) printf("non "); printf("e' a quadrettini\n");

    printf("\nla seconda immagine\n");
    if (!bande_or(i2)) printf("non "); printf("e' a bande orizzontali\n");
    if (!righine_ver(i2)) printf("non "); printf("e' a righine verticali\n");
    if (!quadrettini(i2)) printf("non "); printf("e' a quadrettini\n");

    printf("\nla terza immagine\n");
    if (!bande_or(i3)) printf("non "); printf("e' a bande orizzontali\n");
    if (!righine_ver(i3)) printf("non "); printf("e' a righine verticali\n");
    if (!quadrettini(i3)) printf("non "); printf("e' a quadrettini\n");

    printf("\nla quarta immagine\n");
    if (!bande_or(i4)) printf("non "); printf("e' a bande orizzontali\n");
    if (!righine_ver(i4)) printf("non "); printf("e' a righine verticali\n");
    if (!quadrettini(i4)) printf("non "); printf("e' a quadrettini\n");
}