SOLUZIONE 22-06-99 (C)

Questionario cartaceo

  1. Vero; infatti i numeri in base 3 rappresentabili con 20 cifre decimali sono 3 elevato alla 20 (più di 3 elevato alla 10 = 59049),
    mentre quelli in base 5 rappresentabili con 5 cifre sono 3125.

  2. (Notare che tutti i parametri delle varie funzioni sono parametri valore)
    2.3   7.8 
    2.3   7.8
  3. Un disco rigido oppure un CD.

  4. typedef struct LIST *LISTA;
    struct LIST { type ELEM;
                  LIST * SUCCESSIVO; } ;
              
    void INIZIALIZZA(LISTA l, type e)
    /*questa procedura modifica la lista l in modo che alla fine tutti i suoi 
      elementi avranno la componente ELEM uguale ad e*/
    {
       if(l != NULL){
          l -> ELEM = e;
          INIZIALIZZA(l -> SUCCESSIVO);
    }

Parte laboratorio

#include <stdio.h>
#define MAX 100  /*massimo grado dei polinomi*/

typedef int POLI[MAX+1];
/*gli elementi del tipo POLI rappresentano i polinomi in una variabile
  di grado massimo MAX con coeficceinti interi
  notare che i coefficcenti sono al più 101*/

/*si assume che i valori di tutti i coefficenti devono essere fissati
  quindi 3.0 e rappresentato dall'array dove il primo coefficente e' 
  uguale a 3 e tutti gli altri sono uguali a 0*/

void STAMPA(POLI p)
/*questa procedura stampa p sul file di output standard*/
{
   int i;
   
   for(i=MAX; i>1; i--)
      if(p[i]>0.0) printf("+%dX^%-d ",p[i],i);
      else if(p[i]<0.0) printf("%dX^%-d ",p[i],i);
  
      if(p[1]>0.0) printf("+%dX ",p[1]);
      else if(p[1]<0.0) printf("%dX ",p[1]);

      if(p[0]>0.0) printf("+%d",p[0]);
      else if(p[0]<0.0) printf("%d ",p[0]);
}

void SOMMA(POLI p1, POLI p2, POLI p3)
/*questa procedura ritorna in p3 la somma di p1 e di p2*/
{
   int i;
   
   for(i=MAX; i>=0; i--)
      p3[i] = p1[i] + p2[i];
}

void DERIVA(POLI p1, POLI p2)
/*questa procedura ritorna in p2 la derivata prima di p1*/
{
   int i;
   
   for(i=0; i<MAX; i++)
      p2[i] = p1[i+1]*(i+1);
   p2[MAX]=0;
}

main()
{
   POLI P1, P2, P3;
   int i;
   
   /*assegnare a P1 il polinomio  3 X3 + 7 x - 8*/
   for(i=0;i<MAX+1;i++)
      P1[i]=0;
   P1[3]=3;
   P1[1]=7;
   P1[0]=-8; 
   
   /*assegnare a P2 il polinomio  2 X2 - 7 x + 18*/
   for(i=0;i<MAX+1;i++)
      P2[i]=0;
   P2[2]=2;
   P2[1]=-7;
   P2[0]=18;

   STAMPA(P1);
   printf("\n");
   STAMPA(P2);
   printf("\n");  
   
   /* stampare la somma di P1 e di P2*/
   SOMMA(P1,P2,P3);
   STAMPA(P3);
   printf("\n");  
    
   /* stampare la derivata di P1*/
   DERIVA(P1,P3);
   STAMPA(P3);
}
Altra soluzione che utilizza l'informazione esplicita del grado del polinomio.
#include <stdio.h>
#define MAX 100  /*massimo grado dei polinomi*/

typedef struct{int COEF[MAX+1];
               int GRADO;     /*il grado del polinomio*/
              } POLI;
              
/*gli elementi del tipo POLI rappresentano i polinomi in una variabile
  di grado massimo MAX con coeficceinti interi
  notare che i coefficcenti sono al più 101
  si assume che tutti i coefficenti fino al grado del polinomio sono 
  definiti*/

void STAMPA(POLI p)
/*questa procedura stampa p sul file di output standard*/
{
   int i;
   
   for(i = p.GRADO; i>1; i--)
      if(p.COEF[i]>0.0) printf("+%dX^%-d ",p.COEF[i],i);
      else if(p.COEF[i]<0.0) printf("%dX^%-d ",p.COEF[i],i);
  
      if(p.COEF[1]>0.0 && p.GRADO >= 1) printf("+%dX ",p.COEF[1]);
      else if(p.COEF[1]<0.0) printf("%dX ",p.COEF[1]);

      if(p.COEF[0]>0.0) printf("+%d",p.COEF[0]);
      else if(p.COEF[0]<0.0) printf("%d ",p.COEF[0]);
}

POLI SOMMA(POLI p1, POLI p2)
/*questa funione ritorna la somma di p1 e di p2*/
{
   int i;
   POLI somma;
   
   for(i=0; i <=(p1.GRADO > p2.GRADO ? p2.GRADO : p1.GRADO); i++)
      somma.COEF[i] = p1.COEF[i] + p2.COEF[i];
   if(p1.GRADO > p2.GRADO)
      for(i=p2.GRADO+1; i <=p1.GRADO; i++)
         somma.COEF[i] = p1.COEF[i];
   else
      for(i=p1.GRADO+1; i <=p2.GRADO; i++)
         somma.COEF[i] = p2.COEF[i];
 
   somma.GRADO = (p1.GRADO > p2.GRADO ? p1.GRADO : p2.GRADO);
   while(somma.COEF[somma.GRADO]==0)
      somma.GRADO--;
   return somma;
}

POLI DERIVA(POLI p)
/*questa funzione ritorna la derivata prima di p*/
{
   int i;
   POLI der;
   
   der.GRADO = p.GRADO -1; 
   for(i=0; i<= der.GRADO; i++)
      der.COEF[i] = p.COEF[i+1]*(i+1);
   return der;
}

main()
{
   POLI P1, P2;
    
   /*assegnare a P1 il polinomio  3 X3 + 7 x - 8*/
   P1.GRADO = 3;
   P1.COEF[3]=3;
   P1.COEF[2]=0;
   P1.COEF[1]=7;
   P1.COEF[0]=-8; 
   
   /*assegnare a P2 il polinomio  2 X2 - 7 x + 18*/
   P2.GRADO = 2;
   P2.COEF[2]=2;
   P2.COEF[1]=-7;
   P2.COEF[0]=18;

   STAMPA(P1);
   printf("\n");
   STAMPA(P2);
   printf("\n");  
   
   /* stampare la somma di P1 e di P2*/
   STAMPA(SOMMA(P1,P2));
   printf("\n");  
    
   /* stampare la derivata di P1*/
   STAMPA(DERIVA(P1));
}