Newsgroup: it.comp.java
Titolo: conversione in binario

Ciao a tutti. Ho scritto un programma che converte un intero in binario:
public class conversione_binaria
{
    public static void main(String[] args)
    {
     int numero_iniziale;
     int binario[];
     binario=new int[50];
     int i=0;
     System.out.println(" ");
     numero_iniziale=Console.readInt("inserisci un intero da convertire in 
binario: ");
      if(numero_iniziale>1)
      {
       System.out.println(numero_iniziale + " in binario e': ");
       while(numero_iniziale>=1)
       {
        System.out.println("N vale:"+numero_iniziale);
        if(numero_iniziale%2==0) //se non ho resto allora riporto 0 come 
cifra binaria
        {
         System.out.println("resto vale:"+numero_iniziale%2);
         binario[i]=0;
        }
        else if(numero_iniziale%2==1)
        {
         System.out.println("resto vale:"+numero_iniziale%2);
         binario[i]=1;
        }
         i++;
        numero_iniziale=numero_iniziale/2; //divido numero per 2
       }//chiusura while
       //chiusura for
       System.out.println(" ");
       //lettura con ciclo
      while(i>=0)
      {
       System.out.print(binario[i]);
       i--;
      }
     }else System.out.println(numero_iniziale + " in binario e': 1");
    }//chiusura void
}//chiusura classe
La conversione è corretta, ma nella visualizzazione mi compare anche uno 
zero all'inizio. Sapete dirmi perchè? Senz'altro è una cosa banalissima, ma 
al momento mi sfugge. Grazie in anticipo. 

 al momento mi sfugge. Grazie in anticipo.
Se ho visto giusto, ti basta sostituire questo...
while(i>=0)
{
System.out.print(binario[i]);
i--;
}
...con questo:
while(--i>=0)
{
System.out.print(binario[i]);
}
Visto che nel primo while incrementi il valore di i anche se la
condizione del ciclo non permette di continuare, allora e' giusto che
nel seocndo while tu ne decrementi subito il valore per compensare
quell' i++ di troppo.
Comunque l'algoritmo non funziona bene lo stesso, se gli dai in input
0 lui ti risponde 1, a giudicare dal contenuto dell'ultimo else
Domanda: perche' non usi Integer.toBinaryString() ?

Il Sun, 05 Oct 2008 14:47:32 +0200, dragonet ha scritto:
[cut]
Ci sono tanti piccoli errori di programmazione in questo codice. 
Innanzitutto dovresti ripensare l'algoritmo, in maniera da renderlo piu' 
leggibile.
Prima regola: isola il codice di conversione in un metodo della classe. 
Nel main richiama solamente il metodo passandogli l'intero.
La gestione della console (System.in e System.out) continua pure a farla 
all'interno del main.
Tutti quegli if e cicli, sono sintomo di una cattivo algoritmo, almeno 
dal punto di vista della leggibilità. Sicuro che servono? 
Cerca di cogliere l'essenza dell'algoritmo che vai ad implementare, 
invece che stendere codice a caso e poi aggiustarlo con piccole 
correzioni qua e là. Il tuo codice è sicuramente il risultato di 
un'operazione del genere.
Testa il tuo codice in maniera automatica. Questo non viene solitamente 
insegnato nei corsi di programmazione di base, ma è un errore non farlo 
(e sopratutto una perdita di tempo per te). 
Per una funzione così semplice ti sarà sufficiente eseguire un test del 
genere:
public static void testAll() {
  for (int i = 0; i < 1000; ++i) {
     String v1 = conversione_binaria.converti(n);
     String v2 = Integer.toBinaryString(n);
     if (!v1.equals(v2)) {
        throw new IllegalStateException("errore in intero " + n + ": " + 
v1 + " invece di " + v2);
     }
   }
}
Questo codice mettilo all'inizio del main, finche sei in fase di sviluppo 
(un testing fatto in maniera professionale è sicuramente ben altra cosa, 
ma per ora questo è meglio di niente).

 Domanda: perche' non usi Integer.toBinaryString() ?
Non lo uso...perchè non ho idea di cosa sia!!! L'anno scorso ho studiato C 
(sono al quarto anno di perito informatico) e quest'anno ho appena iniziato 
Java, ma per ora stiamo ancora studiando la programmazione imperativa. 
Grazie per l'aiuto. 

Grazie per i suggerimenti, ma adesso per me sono arabo! L'anno scorso ho 
studiato C (sono al quarto anno di perito informatico) e quest'anno ho 
appena iniziato Java, ma per ora stiamo ancora studiando la programmazione 
imperativa. Il controllo automatico del codice non so cosa sia, sei troppo 
avanti per me, grazie comunque.


 avanti per me, grazie comunque.
Rimane che il tuo codice va ripensato. Quanto segue non e' testato e
probabilmente non e' completamente corretto, ma fa piu' o meno quello
che fai tu in 20 righe:
public String converti(int n) {
  StringBuilder risultato = new StringBuilder();
  do {
    bit = n % 2;
    n = (n - bit) / 2;
    risultato.append(bit);
  } while(n > 0);
  return risultato.reverse().toString();
}