Libertà vo cercando, ch'è sì cara, come sa chi per lei vita rifiuta

Categoria: programmazione

[Python3.1] Trova la pepita !

Un piccolo gioco in python3.1, giusto per prenderci la mano con la chiamata di funzioni, le doctype e per mettere a frutto un’idea nata nel bus per fornire materiale all’Accademia 🙂

Vai all’ultima versione!

#! /usr/bin/env python3.1
# -*- coding: utf-8 -*-
import sys
import random

def stampaCantiere(campo,pepita=None):
# se passo la pepita allora deve controllare cella per cella
# quale sia quella giusta dove metterla
if pepita != None:
for r in range(campo):
for c in range(campo):
if r == pepita[0] and c == pepita[1]:
print("|X|",end='')
else:
print("|_|",end='')
print()
# altrimenti fai una stampa veloce
# separo i due casi per evitare di eseguire sempre del codice molto pesante
else:
for i in range(campo):
print("|_|"*campo)



def trovaPepita(tent,campo):
"""\nCrea una matrice di dimensione campo*campo dove pone una 'pepita' in modo
casuale attraverso la funzione randomint(), che bisognerà cercare di trovare
per vincere. Se la distanza tra la 'cava' inserita e quella della pepita è di
uno, ci avvertirà della vicinanza.

Puo' essere invocato senza argomenti, nel caso in cui i valori di default
saranno 6 tentativi e una matrice 6x6, altrimenti accetta due numeri dove
il numero dei tentativi deve essere inferiore al numero delle cave."""

if tent>=campo*campo:
exit(" Così non si puo' giocare! ")
print("\n Benvenuto nella miniera di TuxErrante ! \n Sarò lieto di \
condividere con te il mio oro, a patto che tu riesca a trovarlo!\n \
Hai {0} cariche di esplosivo e {1} cave da esplorare. \n \
Sei pronto ? \n Ecco lo schema del cantiere \n".format(tent,campo*campo))
# prendi le coordinate della pepita casualmente tra 0 e la dimensione del campo-1
pepita=[random.randint(0,campo-1),random.randint(0,campo-1)]
stampaCantiere(campo) # stampa il campo vuoto

while tent>0:
bangx = input("\n Inserisci le coordinate in cui vuoi piazzare la mina \
comprese tra [0 ..{}] \n x = ".format(campo-1))
bangy = input(" y = ")
if not bangx.isnumeric() or not bangy.isnumeric():
print(" Inserisci delle coordinate numeriche per favore! \n")
continue
else:
bangx, bangy = int(bangx), int(bangy)
if bangx < 0 or bangx >= campo or bangy < 0 or bangy >= campo:
print(" Per favore inserisci delle coordinate corrette ! \n \
Ricorda che quelli che hai in mano sono esplosivi !! \n")
continue
else: # coordinate inserite ammissibili
if (pepita[0] == bangx) and (pepita[1] == bangy):
# svela dove è la pepita !
print(" coordinate segrete {},{}".format(pepita[0],pepita[1]))
stampaCantiere(campo,pepita)
exit(" Complimenti!! L'hai trovata! Siamo ricchiiiii !!")
else: # dice se si è lontani o meno dalla pepita
tent -=1
if abs(pepita[0] - bangx) == 1 or abs(pepita[1] - bangy) == 1:
print(" Ci sei vicino !!")
else:
print(" No, no, non ci siamo. \n")
if tent >= 1:
print(" Dai ritenta !!")
else:
print(" Peccato che abbia finito l'esplosivo !! \n Ecco dov'era :")
stampaCantiere(campo,pepita)


# chiamata della funzione principale
# se viene chiamata senza argomenti gli verranno passati di default 6 e 6
# chiamare lo script con '-h' per vedere la documentazione
if len(sys.argv) == 3:
trovaPepita(int(sys.argv[1]), int(sys.argv[2]))
elif len(sys.argv) == 2 and sys.argv[1] == '-h':
print (trovaPepita.__doc__)
else:
trovaPepita(6,6)



[PIC 16c57] Contatore a due bit controllato

Progetto per PIC16c57 : contatore controllato da due ingressi : Clear e Jump; dispone di due bit d’uscita.

Se il segnale Clear va ad 1, l’uscita deve azzerarsi e ripartire, se va ad 1 Jump, l’uscita deve portarsi a due stati successivi a quello attuale.
Il segnale Clear è predominante su Jump.

list p=16c57
#include
__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF
; portA(0) = Clock; portA(1) = Clear; portA(2)= Jump
; portB(0) = Out1 portB(1) = Out2


RADIX DEC
CK_PREC EQU 0x08
TEMP EQu 0x09 ; cntrolla indirizzo
CONT EQU 0x0A

ORG 0x7ff
goto START

ORG 0x00
START
CLRW
TRIS PORTB
MOVLW b'111'
TRIS PORTA ; 3 ingressi
CLRF CK_PREC
CLRF CONT

LOOP
BTFSC CK_PREC,0
GOTO UPDATE
BTFSS PORTA,0
GOTO UPDATE
GOTO MAIN

UPDATE
MOVF PORTA,CK_PREC
GOTO LOOP

MAIN
BTFSC PORTA,1 ; CLEAR = ?
GOTO CLEAR ; 1
BTFSC PORTA,2 ; JUMP = ?
GOTO JUMP
INCF CONT,F
GOTO CHECK

CLEAR
CLRF CONT
GOTO STAMPA
JUMP
MOVLW 2
ADDWF CONT,F
GOTO CHECK

CHECK
MOVLW 4
SUBWF CONT,W
BTFSC STATUS,Z ; cont=4 ?
GOTO SET_ONE
MOVLW 5
SUBWF CONT,W
BTFSC STATUS,Z
GOTO SET_TWO
STAMPA
MOVF CONT, PORTB
GOTO LOOP

SET_ONE
MOVLW 1
MOVF W, CONT
GOTO STAMPA
SET_TWO
MOVLW 2
MOVF W,CONT
GOTO STAMPA

END
.inc>

[PIC 16c57] Contatore parcheggio

Progetto per PIC16c57 che monitorizza la situazione di un parcheggio privato.
Il sistema ha 4 ingressi a 1 bit ciascuno: UP, Down, Show e Clock e un’uscita a N bit Q.
Ogni volta che entra una macchina Up va ad 1 per un ciclo di clock, ogni volta che ne esce una va ad uno Down. Quando è attivo Show il sistema deve mostrare in uscita il numero di macchine attuali.
Il parcheggio può contenere al massimo 200 macchine e i segnali d’ingresso non possono mai essere contemporaneamente attivi.

; sistema di controllo parcheggio, max 200 macchine
; per ogni Up incrementa, Down decrementa, Show mostra lo stato (Q)
; 4 entrate: UP, Down, Show, Clock
; 1 uscita da 8 bit
; RA<0> : UP ; RA<1> : DOWN ; RA<2> : SHOW; RC<0> : CK
; l'incremento e il decremento devono essere mutuamente escludenti per un ciclo di ck
list p=16c57
#include

__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF

RADIX DEC
UP EQU 0
DOWN EQU 1
SHOW EQU 2
CK EQU 0 ; sulla porta C
MAX EQU 200
CKP EQU 0x08
Q EQU 0x09

ORG 0x7FF
GOTO START

ORG 0x00
START
CLRW
TRIS PORTB ; output
MOVLW b'0111'
TRIS PORTA ; 3 ingressi
CLRF Q
MOVLW 1
TRIS PORTC ; RC<0> = IN DI CK
MOVF PORTC,W
MOVWF CKP ; salva il CK di partenza (bit 3)

MAINLOOP
BTFSC PORTA,SHOW
GOTO STAMPA ; MOSTRA Q SE SHOW=1
BTFSC PORTA,UP
GOTO INC ; INCREMENTA Q SE UP=1
BTFSC PORTA,DOWN
GOTO DEC
GOTO WAIT

WAIT
MOVF PORTC,W ; metto il ciclo attuale nell'accumulatore
SUBWF CKP,0 ; confronta i due valori di clock
BTFSC STATUS,Z
GOTO WAIT ; se uguali attendi
MOVF PORTC,CKP
GOTO MAINLOOP ; se diversi torna a controllare

STAMPA
MOVF Q,PORTB ; mostra q al pubblico
GOTO WAIT

INC
MOVF MAX,W
SUBWF Q,0
BTFSC STATUS,Z
GOTO WAIT ; parcheggio pieno
INCF Q,1
GOTO WAIT
DEC
BTFSS Q,0
GOTO WAIT; parcheggio già vuoto
DECF Q,1
GOTO WAIT

END

Confronto tra algoritmi di ordinamento

26/04/10 Aggiunto Mergesort e altre modifiche. 

Sottofondo consigliato : Red Sector A – Rush

Un programmino in java che permette di confrontare le differenze d’efficienza (in tempo) tra i più noti algoritmi di ordinamento:

I commenti per la documentazione mandano in palla sia kwrite (da cui ho esportato il codice in formato html) sia source-highligth, vabeh ma mica posso pensare a tutto io! 😉

/*
* Ordinamento.java
*
* Copyright 2010 alessandro
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
/**
* @author Alessandro
* @version 0.1
* @see tuxerrante.blogspot.com
*/

import java.util.Random;
import java.io.IOException;
import java.util.Arrays;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class Ordinamento {

final static int dim=1000000;

private static int[] disordina(int [] array){
Random generator = new Random();
for (int i=0; ilength; i++)
array[i]= generator.nextInt(dim);
return array;
}

public static void stampa(int[] array){
/* stampa */
for (int i=0; ilength; i++)
System.out.print(array[i]+" ");
}


public static void main (String args[]) {

int []array= new int [dim];
int scelta=100;
long start = 0, end=0;
BufferedReader in = new BufferedReader ( new InputStreamReader(System.in));

// randomizza array
array = disordina(array);

do {

System.out.println("\n\n");
// scegli algoritmo
System.out.println("\t ORDINAMENTO ARRAY \n Scegli l'algoritmo: \n");
System.out.println(" 0. rigenera array casuale");
System.out.println("\nO(n²)");
System.out.print(" 1. selectionSort \n");
System.out.print(" 2. insertionSort \n");
System.out.print(" 3. BubbleSort \n");
System.out.println("\nO(nlogn) ");
System.out.print(" 4. QuickSort \n");
System.out.print(" 41. QuickSort del JDK (Bentley-McIlroy)\n");
System.out.print(" 42. MergeSort \n");

System.out.println("\nΘ(logn) ");
System.out.println(" 5. HeapSort ");

System.out.println("\n 8. Stampa ");
System.out.println(" 9. Esci ");
System.out.print(" ==> ");

try {
scelta = Integer.parseInt(in.readLine());
}
catch ( IOException e) {
System.err.println(" ERRORE: : "+ e.getMessage());
}

switch (scelta){

case 0 :
array=disordina(array);
break;

case 1:
start = System.currentTimeMillis();
array = AlgOrdinamento.selectionSort(array);
end = System.currentTimeMillis();
break;

case 2:
start = System.currentTimeMillis();
array = AlgOrdinamento.insertionSort(array);
end = System.currentTimeMillis();
break;

case 3:
start = System.currentTimeMillis();
array = AlgOrdinamento.bubbleSort(array);
end = System.currentTimeMillis();
break;
case 4: // QUICKSORT
start = System.currentTimeMillis();
AlgOrdinamento.quickSort(array, 0, array.length-1 );
end = System.currentTimeMillis();
break;

case 41: // QUICKSORT AT&T jdk
start = System.currentTimeMillis();
Arrays.sort(array);
end = System.currentTimeMillis();
break;

case 42: // MERGESORT
start = System.currentTimeMillis();
AlgOrdinamento.mergesort(array,0,array.length-1);
end = System.currentTimeMillis();
break;

case 5: // HEAPSORT
start = System.currentTimeMillis();
AlgOrdinamento.heapSort(array, array.length);
end = System.currentTimeMillis();
break;

case 8:
stampa(array);
break;

case 9: System.exit(0);
default: System.out.println(" Inserisci un valore adeguato. "); break;
}

System.out.println("\n\n\t Tempo esecuzione : "+(end-start)+" ms");
} while( true);

} //--end main


}
// ___________________________________________________________________________________________

class AlgOrdinamento {

/**
* algoritmo SelectionSort(array a)
* for k=0 to n-2 do
* m = k+1
* for j=k+2 to n do
* if ( A[j][m] ) m=j;
* scambia A[m] con A[k]
*
* ordina in loco n elementi eseguendo al più O(n²) confronti
*/

public static int[] selectionSort(int[] a){
int k=0, m=0, j=0, temp;

for ( k=0; k< (a.length-2); k++){
m = k+1;
for (j=k+2; j j++)
if (a[j]< a[m]) m=j;
temp=a[m];
a[m]=a[k];
a[k]=temp;
}
return a;
}

/**
* algoritmo insertionSort( Array A)
* 1) individua la posizione j del più grande elemento minore di x, se esiste
* 2) altrimenti sarà posto a zero per indicare che x andrà posto all'inizio
* 3) j+1 è la posizione dove sarà inserito x
* ordina in loco n elementi eseguendo al più O(n²) confronti
*/
public static int[] insertionSort(int a[]){
int x, k, j, t;
for ( k=0; k k++){
x = a[k+1];
for ( j=k; j>=0; j--) // 1
if (a[j]<=x) break;
if (j)
for ( t=k; t>j+1; t--)
a[t+1]=a[t];
a[j+1]=x;
}

return a;
}

/**
* bubbleSort
* in ogni scansione vengono confrontate coppie di elementi adiacenti
* che vengono scambiate se non ordinate
* se durante una scansione non vengono effettuati scambi, l'alg termina.*
* F = O(n²)
*/
public static int[] bubbleSort(int[] a){
int i,j,temp;
boolean scambi;
for (i=1; ilength
-1; i++){
scambi=false;
for (j=1; jlength
-i+1; j++)
if( a[j-1] > a[j] ){
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
scambi=true;
}
if (!scambi) break;
}
return a;
}


/** ___________ QUICKSORT
*
*/
public static void quickSort(int []a,int i,int f){
if (i>=f) return;
int m = partiziona(a,i,f);
quickSort(a,i,m-1); // possibile stackOverflow se già ordinato
quickSort(a,m+1,f);

}
private static int partiziona(int []a,int i,int f){
int x = a[i], inf=i, temp;

while (true){

while ( infwhile ( a[f]>x ) f--;
if ( inf temp=a[inf]; a[inf]=a[f]; a[f]=temp;
}
else break;
}
temp=a[i]; a[i]=a[f]; a[f]=temp; // posiziona pivot al centro
return f;
}

/**
* HEAPIFY
* @param h array da ordinare
* @param index indice di scansione
* @return array ordinato secondo la struttura albero binario
*/
private static void heapify( int[] h,int index, int heapSize){
int sin=2*index+1, des=2*index+2, max=0;

if ( sinh[index]) max=sin;
else max=index;

if ( desh[max]) max=des; // confronto il figlio destro con il padre
// nota che il padre potrebbe essere l'ex sin()

if (index!=max) {
swap(h,index,max);
heapify(h,max, heapSize);
}

}

static void heapSort(int A[], int n)
{
int i, HeapSize = n;

for (i= HeapSize/2; i >= 0; i--)
heapify(A,i,HeapSize);

for (i=n-1 ; i>=1; i--) {
swap( A, i, 0 );
HeapSize--;
heapify(A,0,HeapSize);
}
}

private static void swap (int []h, int x, int y){
int sw=h[x];
h[x]=h[y];
h[y]=sw;
}
/** HEAPSORT
* dato un array genera un albero fittizio nello stesso array (heap binario),
* dove il valore di un nodo è sempre maggiore di quello dei suoi figli.
*/
/* public static void heapSort(int[] a){
heapify(a,0); // crea l'heap dall'array su sé stesso
return;
} */

/**_________ MERGESORT
*
*/
public static void mergesort(int []A, int i, int f){
if (i>=f) return;
int m=(i+f)/2;
mergesort(A,i,m);
mergesort(A,m+1,f);
merge(A,i,m,f);
}

private static void merge(int []A, int i1, int f1, int f2){
int []X= new int[f2-i1+1];
int i=0, i2 = f1+1, left=i1;

while (i1<=f1 && i2<=f2){
if ( A[i1]<=A[i2]){
X[i]=A[i1];
i1++;
}
else {
X[i]=A[i2];
i2++;
}
i++;
}

//se i e' minore di center significa che alcuni elementi
//della prima meta' non sono stati inseriti nel vettore
// copia A[i1, f1] alla fine di X
for (; i1<=f1; i1++, i++)
X[ i ]= A[i1];
// copia A[i2, f2] alla fine di X
for (; i2<=f2; i++, i2++)
X[ i ]= A[i2];

for (int k=left; k<=f2; k++)
A[k]=X[k-left];
}

}

Altri confronti.

Animazioni interattive degli algoritmi.

[Assembly] saldo conto bancario

Un semplice programmino in Assembly per pd32, che si occupa di
calcolare il saldo in base ad una serie di movimenti positivi o negativi.


SALDO CONTO BANCARIO
tutti i dati sono a 16 bit; il saldo iniziale è memorizzato in 0000 1b00
i movimenti sono memorizzati in locazioni consecutive a 0000 1f00;
l’ultimo movimento è seguito da una posizione di memoria contente 0

Assunzioni arbitrarie

  • realisticamente il saldo parte da zero;
  • ottimisticamente il saldo termina positivamente.

codice C:

#include 
int main(int argc, char *argv[]){
int saldo=0, i=0;
int mov[]={1,-2,-8,10,20,0};
printf ("saldo = %d \n",saldo);
do{
saldo+=mov[i];
i++;
}while( mov[i]!=0);
printf ("saldo finale= %d \n",saldo);
return 0;
}

che diventa:


org 400h

SALDO equ 1b00h ; indirizzo saldo
MOV equ 1f00H

code
; inserisco movimenti
movl #mov,r0 ; ind movimenti in R0
movw #1,(R0)+
movw #-2,(R0)+
movw #-8,(R0)+
movw #10,(R0)+
movw #20,(R0)+
movw #0,(R0)+ ; fine movimenti

movl #mov,r0 ; r0= indirizzo di MOV
xorw r1,r1 ; azzera r1 (inutile in questo caso)

ADD:
movw (r0)+,r2 ; muovi il valore del mov in r2, incrementa ind. mov
cmpw #0,r2 ; (valore all’indirizzo contenuto in r0) – 0
jz FINE ; se = 0 vai a SAVE

addw r2,r1 ; altrimenti somma movimento a saldo
jmp ADD

FINE:
movw r1,SALDO
halt
end

; risultato 15h = 00010101 = 5+16= 21 😉

codice evidenziato grazie a source-highligth

[Assembly] somma delle righe in una matrice

Un semplice programmino in Assembly per pd32, che si occupa di effettuare delle somme per righe in una matrice data. Ecco le specifiche:

La memoria del PD32 contiene a partire dall’indirizzo DATI dodici valori consecutivi in formato Byte che rappresentano le 12 componenti di una matrice 3 Righe X 4 Colonne.
Calcolare la somma di ciascuna riga trasferendo i tre risultati in formato LongWord a partire dall’indirizzo RISUL.

codice C:

#include 
#define RIGHE 3
#define COL 4

int main(int argc, char *argv[]){
int matrice[RIGHE][COL],i,j,k=0;
int RISUL[RIGHE]={0,0,0};

for (i=0; i<RIGHE; i++) // riempio la matrice 0..11
for (j=0; j<COL; j++, k++)
matrice[i][j]=k;

for(i=0; i<RIGHE; i++){
for (j=0; j<COL; j++)
RISUL[i]+=matrice[i][j];
}
printf (" risultato somme: ");
for (i=0; i<RIGHE; i++) printf(" %d ",RISUL[i]);
return 0;
}

che diventa:

; SOMMA ELEMENTI DELLE RIGHE DI UNA MATRICE 3X4, A PARTIRE DALL'IND. DATI
; E SALVA LE SOMME AGLI INDIRIZZI PUNTATI A PARTIRE DA RISUL
org 400h
; definizione variabili
; ogni indirizzo è da 4 B, quindi 12B mi sposteranno di 2 celle
; (12/4-1 esclusa la 1°) arrivando a 558h
dati equ 550h ; 12 Byte
risul equ 500h
righe equ 3
col equ 4

code

; memorizzo elementi celle
movl #dati,R0 ; qui metto l'indirizzo
xorb R1,R1 ; i
xorb R4,R4
; for(i=0; i<12; i++, r0++) r0=i;
FOR:
cmpb #12,R1
jz ESEGUI
movb R1,(R0)+ ; copia r1 in &R0 e avanza di un byte l'indirizzo puntato
addb #1,R1 ; i++
jmp FOR

; calcolo somma
ESEGUI:
; resetto il puntatore a dati
movl #dati,R0
xorb R1,R1 ; sommaRiga
movl #risul,R2 ; R2=&risul somme
xorb r3,r3 ; i
; sommo prima riga

RIGA:
cmpb #col,r3 ; for (int i=0; i
jz SALVA
addb (r0)+,R1
addb #1,r3
jmp RIGA ; end for

SALVA: ; salva la somma e passa a riga successiva
cmpb #righe,r4
jz FINE
movl r1,(r2)+ ; salva r1 e incrementa &R2
xorb r1,r1 ;resetta la somma(R1)
addb #1,r4 ; incrementa numero riga
xorb r3,r3 ; resetta colonna
jmp RIGA

FINE: halt

end

codice evidenziato grazie a source-highligth

Java: Calcolo del codice di Hamming

Codice di hamming

Il codice di Hamming è semplicemente un metodo di controllo sulla correttezza nella ricezione di una certa quantità di dati.
In particolare questo algoritmo si propone di inserire in determinate posizioni del dato (quelle corrispondenti alle potenze del due: es. 1=2^0, 2=2^1 ecc) un bit che non fa parte dell’informazione inviata, ma che è inserita dal calcolatore per “controllare” alcune cifre successive.
In particolare si occupa banalmente di indicarne la parità o meno.

non badate a commenti bizzarri o di debug 😉
Se notate errori gravi commentate pure.
Il codice non è robusto.



import java.util.*;
import java.lang.Math;


public class Hamming {
/*
* converto le cifre binarie della posizione in un array di char, poi sommo il bit per ogni posizione
* controllata
*/
public static void main (String []args){

Scanner in = new Scanner (System.in);
System.out.println ("\t Calcolo del codice di hamming \n");
System.out.print("Inserisci il numero di bit di controllo (>=3) : ");
int h = Integer.parseInt(in.nextLine().trim());
int length= (int)Math.pow(2, h) -1 ; // dimensione stringa finale num+controlli
System.out.println(" dimensione stringa finale= "+length);
int controllo[]=new int[h]; // array dei codici di controllo
System.out.print(" Posizione codici di controllo : ");
for (int i=0; i controllo[i]=(int) Math.pow(2,i); // posizione dei cod di controllo
System.out.print ( controllo[i]);
}
// ------- INSERIMENTO INFORMAZIONE
System.out.println ("\n con "+h+" caratteri di controllo puoi inserire un'informazione di "+(length-h)+" bit");
System.out.print(" Inserisci i bit: ");
String info= in.nextLine().trim();
// manca controllo inserimento corretto
char arrayInfo[]= info.toCharArray();
//char arrayInfo[]={'0','1','1','0'};

//System.out.println( "dimensione info "+arrayInfo.length);
/*for (int i=0; i
System.out.print( arrayInfo[i]);
*/

// --------- COSTRUZIONE STRINGA
int j=0, k=0;
char [] hamming= new char[length];

System.out.print( " Posizione bit di controllo (stringa invertita!) : ");
for (int i=0; i// se è la posizione di un codice di controllo inserici X
if ( (k//System.out.print(" posizione "+i+" - controllo["+k+"] = "+(controllo[k]-1+" "));
hamming[i]='X'; // ....hammingCode(i,hamming[])
k++;
}
else{
if (j//System.out.print(" Posizione "+i+" = "+arrayInfo[j]+" ");
hamming[i]= arrayInfo[j];
j++;
}
}
System.out.print (hamming[i]);
}

System.out.println();

// ------------- CALCOLO CODICI DI HAMMING
System.out.print ("\n Stringa finale : ");
for (int i=0; i// per ogni x invoca la funzione
if ( hamming[i]=='X' ) hamming[i]=Integer.toString(hammingCode(i,hamming)).charAt(0);
}
// ------------- STAMPA INVERSA STRINGA
for (int i=hamming.length-1; i>=0 ;i--)
System.out.print (hamming[i]);

}

static String toBinario(int num){
// fino a quoziente 0
//int cifre= (int) (Math.log(num+1) / Math.log(2));
String s="";
while ( num != 0 ){
s =num%2+s;
num = num/2;
}
return s; //.toCharArray();
}

static int hammingCode(int i, char[] c){
int cont=0;
//System.out.println(" indice passato = "+i);
if (i==0) {
for (i+=1; i//System.out.println(" c["+(i+1)+"]="+ c[i]+" i%2="+((i+1)%2));
// somma tutti i bit degli indici dispari
if (( (i+1)%2 ==1 ) && ( c[i]=='1' ))
cont++;
}
}
else { // i=1 -> 2^1 ==> controlla 6,7
for (int k=(i+1); kString binario= toBinario(k);
//System.out.println("binario("+k+") = "+toBinario(k)+"-log2("+(i+1)+")= "+(binario.charAt( binario.length() - (int)(Math.log(i+1)/Math.log(2)))));

if (( binario.charAt( binario.length() - (int)(Math.log(i+1)/Math.log(2)) ) == '1') && (c[k]=='1'))
cont++;
}
}
//System.out.println(" risultato hammingcode "+cont+"%2= "+(cont%2) );
return (cont%2);
}

}

Page 2 of 2

Powered by WordPress & Theme by Anders Norén