|
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
|