AngoLinux

Somma tra due vettori di 8 cifre in base 3

- A cura del Prof. Stefano Salvi -


Lavoriamo adesso sulla scrittura di programmi facilmente modificabili. In particolare, per generalizzare, riprenderemo l'esercizio precedente, ma eseguendo la somma in base 3.

Il testo dell'esercizio è il seguente:

Scrivere un programma C che legga da tastiera coppie di numeri tra 0 e 38, li converta in base 3, immagazzinandoli in array da 8 elementi, una cifra in base 3 in ogni elemento del vettore.
Il programma calcolerà la somma di ogni coppia di numeri, immagazzinandola in un terzo vettore, quindi la convertirà in formato intero e li stamperà la coppia di numeri e la somma in base 3. Stamperà anche la somma dopo la conversione, in decimale.
Scriver eil programma in modo da poterlo facilmente modificare per altre basi.

Una possibile soluzione è la seguente:
// Tizio - Pinco - 3AIN - 22/02/02 
// Calcola la somma tra due vettori di 8 cifre in base 3 e la visualizza

#include <stdio.h>
#define DIM 	8  	/* dimensione di un 1 byte (8 cifre) */
#define BASE 	3	/* Base del conteggio */

void ntob2(int n,int vet[]);	// Converte un numero da intero a base 3
int b2ton(int vetC[]);		// Converte un numero da base 3 a intero
void sommab2(int vetA[],int vetB[],int vetC[]); // Somma due vettori di numeri in base tre
void visVet(int vet[]);		// visualizza un vettore
  
main()
{
int vetA[DIM];		// Vettore che conterra' il primo numero  
int vetB[DIM];		// Vettore che conterra' il secondi numero 
int vetC[DIM];		// vettore che conterra' la somma dei due numeri
int a,b,j,exit;

  do {
    // azzera i vettori
    for(j=0;j<DIM;j++)
    {
      vetA[j]=0;
      vetB[j]=0;
      vetC[j]=0;	
    }
		
    do{
      printf("A: "); scanf("%d",&a);
    }while(a<0 || a>6560);   //6560=max valore in base 3 avendo 8 cifre

    do{	                     //6560=(3^8)-1
      printf("B: "); scanf("%d",&b);
    }while(b<0 || b>6560);
		
    printf("\n\n");

    // converte il primo numero 
    ntob2(a,vetA);
    visVet(vetA);

    // converte il secondo numero
    ntob2(b,vetB);
    visVet(vetB);

    // esegue la somma bit a bit
    sommab2(vetA,vetB,vetC);
    visVet(vetC);

    printf("\nSomma: %d\n\nEsc per terminare, ",b2ton(vetC));
		
    exit=getchar();

  }while(exit!=27);
  printf ("\n");
}

/* Converte un numero da intero a base 3
 *
 * Il numero viene passato nel parametro 'n'.
 * Il vettore 'vet' viene riempito con le singole cifre del numer convertito, a partire
 * dall'ultimo elemento ( vet [DIM-1]) che conterra' la cifra meno significativa.
 * Quando il numero immesso e' esaurito, le restanti cifre del vettore non vengono 
 * inizializzate
 */
void ntob2(int n,int vet[])
{
int j=0;	// Contatore
  while(n!=0)
  {                       
    vet[DIM-1-j]=n%BASE;// Estrae la cifra meno significativa e la mette nel vettore
    n=n/BASE;		// Divide per la base, eliminando la cifra meno significativa
    ++j;		// Incrementa il contatore
  }
}

/* Somma due vettori di numeri in base tre
 *
 * I numeri di partenza sono immagazzinati nei due vettori vetA e vetB,
 * con la cifra piu' significativa nel primo elemento.
 * Il risultato viene messo nel vettore vetC, con la stessa convenzione.
 * Se c'e' un riporto in uscita, viene trascurato.
 * I numeri sono considerati senza segno
 */
void sommab2(int vetA[],int vetB[],int vetC[])
{
int i;		// Indice della cifra
int r=0;	// Resto corrente
int d=0;	// Valore temporaneo per la cifra corrente

  for(i=DIM-1;i>=0;i--)	// Tutte le cifre, dalla meno significativa
  {
    d=vetB[i]+vetA[i]+r;	// Somma le due cifre ed il resto precedente
    vetC[i]=d%BASE;		// Mette nella cifra corrente il risultato,
				// troncato a base 3
    r= d/BASE;			// Mette il 'resto' nel resto
  }
}

/* Converte un numero da base 3 a intero
 * Il numero da convertire viene passato nel vettore 'vetC', con
 * la cifra piu' significativa nel primo elemento
 * Il numero convertito viene ritornato come valore di ritorno
 */
int b2ton(int vetC[])
{
int i=0;	// Indice
int dec=0;	// Risultato della conversione
int k=2187;	// peso: inizialmente 3^8(3=base; 8=n°di bit)
  for(i=0;i<DIM;i++)	// Tutte le cifre, dalla piu' significativa
  {
    dec = dec+vetC[i]*k;	// Aggiunge al risultato la cifra corrente
				// moltiplicata per il suo peso
    k=k/BASE;			// Divide il peso per la base, per passare alla 
				// cifra successiva
  }
  return dec;
}

// visualizza un vettore
void visVet(int vet[])
{
int i;	// Indice
  for(i=0;i<DIM;i++)	// Tutte le cifre, dalla piu' significativa
  {
    printf("%2d",vet[i]);	// Stampa la cifra corrente
  }
  printf("\n");
} 

Per provare il programma, scaricare il sorgente, compilarlo con il comando cc somma.c ed eseguirlo con il comando ./a.out.


[Home Page dell'ITIS "Fermi"] [Indice Terza] [Precedente] [Successivo]

© Ing. Stefano Salvi - Released under GPL licence