Newsgroup: it.comp.lang.c++
Titolo: conversione decimale in ottale, binario, esadecimale

Sto facendo l'esercizio 2.53 dei Deitel (Fondamenti di programmazione C++).
L'esecizio mi chiede di scrivere un programma che come output dia una
tabella con i numeri dallo 0 al 256 in base binaria, ottale, esadecimale
Ora io ho pensato di impostare un ciclo FOR con il contatore che va da 0 a
256 e all'interno del ciclo fare la conversione per ogni ciclo.
Soltanto che sono entrato in crisi.
Cioè mi spiego, se io ho ad esempio il numero 6 e lo voglio convertire in
binario, mi scrivo la tabella posizionale in base 2 fino all'ultimo numero
più piccolo di 6 e quindi
4    2    1
Poi inizio a dividere 6 per 4 e ottengo 1 con resto di 2, poi divido 2 per 2
e ottengo 1 con resto di 0 e infine ottengo 0 e il mio binario è
110
Ma in codice come la faccio questa cosa????
Mi fate un esempio di codice?
Infine, quando arrivo agli esadecimali, come gli dico che ad esempio il 10 è
A???
Iniziano i problemi :-((
-- 
Frodo Baggins
Webmaster di Arrampicata.net 
http://www.arrampicata.net
Webmaster di Neverwinter Nights Italia 
http://bebbbo.altervista.org

 
non fare come dici tu ... fai prima a fare test usando gli operatori binari ...
ti do un esempio in pseudo codice poi sta a te' scriverlo.
es:
int a
leggi a
stampo a in base 10 (quindi senza nessuna trasformazione)
stampo a in base 8 (usando i metodi degli ostream appropriati)
stampo a in base 16 (usando i metodi degli ostream appropriati)
// ora la stampa in base 2
shift = sizeof(a)*8;
fai
{
shift--
b = a or (1 << shift)
se b == 0 salvo in buffer[shift] 0
seno' salvo in buffer[shift] 1
}
finche shift diverso da 0
ora stampo la stringa buffer ed ho ottenuto la mia stampa del valore binario in 
modo rapido (piu' rapido che fare sottrazioni successive)
ciao
ps:spero di non aver cannato nulla ... l'ho scritto velocemente ...

stampo a in base 16 (usando i metodi degli ostream appropriati)
Questo esercizio si riferisce al cap. 2 del Deitel e questi operatori che
dici tu, ancora non sono stati spiegati, quindi dovrei riuscire a risolverlo
solo con le cose base che sono state spiegate.
Mi aiuti plz?

 Mi aiuti plz?
per stampare in base 8 senza le conversioni ...
puoi fare
shift = 0
fai questo
{
b = a or ( 7 << shift);
b = (b >> shift);
b += 30;
if b > 39
b += 7;
string[shift/3] = b;
shift += 3;
}
finche non raggiungi la fine del numero ...
per fare la base 16
shift = 0
fai questo
{
b = a or ( 0xF << shift);
b = (b >> shift);
b += 30;
if b > 39
b += 7;
string[shift/3] = b;
shift += 4;
}
finche non raggiungi la fine del numero ...
e cosi hai fatto tutte le conversioni che volevi a mano ...
ricordati di stampare la stringha salvata al contrario ... o scriviti gli 
algoritmi con condizioni inverse dello shift per non dover alla fine rigirare la 
stringa salvata ...
ciao

finche non raggiungi la fine del numero ...
Mammacherobba! E provare almeno a compilare
prima di scrivere nel newsgroup ?
Vedo anche cosi' tanti errori logici che mi
vengono i brividi...
Andrea

 Andrea
bhe finche ti vengono i brividi e non correggi o dai delle risposte piu' 
costruttive, vanno sempre meglio le mie, ed ho pure specificato che non avendole 
provate non posso giurare sulla correttezza ...
pero' vedo che e' facile commentare gli errori degli altri e non proporre mai 
nulla di proprio e' ???
ora ti saluto ... adios

nulla di proprio e' ???
Io avevo scritto in coda al messaggio una routine
completa che faceva la conversione. Prima di fare
il post l'ho rimossa perche' ho pensato che magari
ti saresti offeso e che invece con il post che
semplicemente faceva notare che quel codice era 
tremendo avresti potuto porre rimedio tu direttamente.
Comunque codice piu' o meno equivalente a quello
che intendevi scrivere tu potrebbe essere:
  do {
    cifre[i++] = '0'+(numero & 7);
    numero >>= 3;
  } while (numero);
oppure per l'esadecimale:
  do {
    cifre[i++] = "0123456789ABCDEF"[numero & 15];
    numero >>= 4;
  } while (numero);
Andrea

 tremendo avresti potuto porre rimedio tu direttamente.
io non mela prendo se mi correggono o se migliorano quello che scrivo ... io 
mela prendo se mi commentano pesantemente quello che scrivo senza dare 
alternative di conoscenza e di soluzioni differenti e magari migliori ...
ora che abbiamo visto che la tua pensata e' migliore come forma non posso che 
ringraziare il tuo contributo ...
si vede dal codice che hai una forma mentis da analista (e che hai speso piu' 
tempo di me a pensare la soluzione) e che hai una maggior manualita' con il 
linguaggio usando scorciatoie da codice offuscato ... (questo pero' non so se e' 
un pregio ... uno alle prime armi che ha appena iniziato a leggere il libro non 
lo so se capira' certe peculiarita' del codice e se capira' effettivamente 
quello che hai fatto)
ciao

quello che hai fatto)
Molto piu' leggibile e' invece usare 30 (immagino
intendessi 0x30, non conosco nessuna codifica in
cui la cifra '0' abbia codice 30), fare un test di
superamento della cifra '9' anche nella conversione
ad ottale, usare "or" invece di "and" (anzi di "bitand",
anzi di "&").
L'uso di una stringa per la tabella di decodifica
usata dalla conversione a esadecimale e' la cosa piu'
semplice che mi e' venuta in mente per mantenere la
portabilita' anche a sistemi non-ASCII; se a te viene
in mente di meglio fammi sapere.
Riguardo al pensare prima di scrivere codice, o di
pensare *mentre* si scrive codice, non credo che si
tratti di un cattivo esempio per chi comincia.
Anche fare un minimo di verifica prima di mettere in
bacheca quello che si e' scritto credo sia assolutamente
*doveroso* per rispetto verso gli altri che investono
tempo a leggere questo newsgroup... altrimenti piu'
che un investimento sarebbe solo una perdita di tempo.
Ti sembrero' un rompipalle che si attacca ai puntini
sulle "i" ... pero' sono convinto che per programmare
decentemente (non dico bene... solo decentemente)
i puntini sulle "i" sia necessario metterli.
In particolare in C++.
Andrea