AngoLinux

Somma tra due vettori di 8 cifre binarie

- A cura del Prof. Stefano Salvi -


Riprendiamo gli esercizi sulle operazioni, affrontando questa volta la somma.

Il testo dell'esercizio è il seguente:

Scrivere un programma C che legga da tastiera coppie di numeri tra 0 e 28, li converta in base 2, immagazzinandoli in array da 8 elementi, una cifra in base 2 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 2. Stamperà anche la somma dopo la conversione, in decimale.

Una possibile soluzione è la seguente:
// Tizio - Pinco - 3AIN - 22/02/02 
// Calcola la somma tra due vettori di 8 cifre binarie e la visualizza
#include <stdio.h>
#define DIM 8  /* dimensione di un 1 byte (8 bit) */

void ntob2(int n,int vet[]);	// Converte un numero da intero a base 2
int b2ton(int vetC[]);		// Converte un numero da base 2 a intero
void sommab2(int vetA[],int vetB[],int vetC[]); // Somma due vettori di numeri in base due
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>256);    //256=max valore in base 2 avendo 8 cifre

    do{	                     //256=(2^8)-1
      printf("B: "); scanf("%d",&b);
    }while(b<0 || b>256);
		
    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 2
 *
 * 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%2;	// Estrae la cifra meno significativa e la mette nel vettore   
    n=n/2;		// Divide per la base, eliminando la cifra meno significativa
    ++j;		// Incrementa il contatore
  }
}

/* Somma due vettori di numeri in base due
 *
 * 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%2;		// Mette nella cifra corrente il risultato,
				// troncato a base 2
    r=d/2;			// Mette il 'resto' nel resto
  }
}

/* Converte un numero da base 2 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=128;	// peso: inizialmente 2^8(2=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/2;			// 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 somma1.c ed eseguirlo con il comando ./a.out.


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

© Ing. Stefano Salvi - Released under GPL licence