|
Cominciano gli esercizi sui codici a rilevazione e correzione di errore. Per prima cosa
calcoliamo la distanza di hamming tra du codici ad 8 bit.
Il testo dell'esercizio è il seguente:
Scrivere un programma C che legga da tastiera due numeri ad 8 bit (tra 0 e 255) e ne calcoli
la distanza di Hamming, vale a dire il numero di bit diversi.
Una possibile soluzione è la seguente:
// Tizio - Pinco - 3°AIN - 08/03/2002
// Calcola la distanza di Hamming tra due char
#include <stdio.h>
#define DIM 8 /* Dimensione del dato - 8 bit */
int disth(int vetA[],int vetB[]);// Conta i 'bit' diversi tra vetA e vetB
void numToBin(int n,int vet[]); // Converte un numero da intero a base 2
void visVet(int []); // visualizza un vettore
void azzera(int []); // azzera un vettore
main()
{
int vetA[DIM], vetB[DIM]; // I due codici da convertiti da confrontare
int a,b; // I due codici inseriti da tastiera
// Inizializza i codici convertiti
azzera(vetA);
azzera(vetB);
// Legge primo codice
do{
printf("A = ");
scanf("%d",&a);
}while(a<0 || a>255); // Verifica che sia nel campo accettabile
// Legge secondo codice
do{
printf("B = ");
scanf("%d",&b);
}while(b<0 || b>255); // Verifica che sia nel campo accettabile
numToBin(a,vetA); // Converte primo codice
numToBin(b,vetB); // Converte secondo codice
visVet(vetA);
visVet(vetB);
// Calcola la distanza di hamming e la stampa
printf("\nDistanza di Hamming: %d\n",disth(vetA,vetB));
}
/* Calcila la distanza di hamming tra i codici, vale a dire
* il numero di bit che cambiano tra l'uno e l'altro
*/
int disth(int vetA[],int vetB[])
{
int i; // Indice del bit
int hamm=0; // Distanza
for(i=0;i<DIM;i++) // Analizza tutti i bit
{
if(vetA[i]!=vetB[i]) // Se i bit sono diversi
{
hamm++; // Conta la differenza
}
}
return hamm;
}
/* 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 numToBin(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
}
}
// 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");
}
void azzera(int vet[])
{
int i; // Indice
for(i=0;i<DIM;i++) // Tutte le cifre
{
vet[i]=0; // Le azzera
}
}
|
Per provare il programma, scaricare il sorgente, compilarlo
con il comando cc disth.c ed eseguirlo con il comando ./a.out.
[Home Page dell'ITIS "Fermi"]
[Indice Terza]
[Precedente]
[Successivo]
© Ing. Stefano Salvi - Released under GPL licence
|