PDA

View Full Version : [C++/intero come lettera in output] - Conversione tra binario e esadecimale


unslee
08-07-2008, 11:20
Ciao a tutti,
sto completando un esercizio che mi richiede la conversione di numeri binari in numeri esadecimali.

Sono riuscito ad analizzare le singole quartine del numero binario, adesso sto mettendo su una tabella di conversione per convertire ogni singola quartina nella cifra esadecimale corrispondente.

Mi sono bloccato nel momento in cui cerco di indicare al programma che se la quartina è pari a 1010 (che io vedo come int) in output voglio una "A".

Come posso risolvere?

Ringrazio tutti ancitipatamente per l'aiuto!

Unslee

gugoXX
08-07-2008, 12:05
puoi usare la sprintf, indicando come parametro di uscita che vuoi un numero esadecimale (se non sbaglio e' %X)

puoi comunque scrivere la parte centrale di tutto l'esercizio in 2 righe.

la prima con strtol, per trasformare una stringa (anche binario) in un long.
la seconda con sprintf, per avere l'output esadecimale del long prima ottenuto.

http://www.cplusplus.com/reference/clibrary/cstdlib/strtol.html

unslee
08-07-2008, 12:11
Ciao,
innanzitutto grazie per la risposta. Sono alle prime armi ... se andato un pò troppo veloce!

Allora la situazione attuale è questa: ho una variabile in numerica del tipo 1000. Devo dire al programma che quando trova questa variabile mi deve restituire in output (con un cout) ad esempio la lettera F!

Come posso risolvere?

Grazie aticipatamente,

Unslee

gugoXX
08-07-2008, 12:13
Non ho capito.
Tu hai un intero che vale 1010 (ovvero MilleEDieci in decimale)
oppure un intero che vale 10 (ovvero MilleEDieci in binario)

unslee
08-07-2008, 12:42
Ciao,
cerco di spiegarmi meglio.

Poniamo per esempio che io abbia un intero 10100. Vorrei far si che il 10100 venga trasformato ad esempio in "B".

Come posso fare?

Grazie,

Unslee

Albi89
08-07-2008, 13:08
Ciao,
cerco di spiegarmi meglio.

Poniamo per esempio che io abbia un intero 10100. Vorrei far si che il 10100 venga trasformato ad esempio in "B".

Come posso fare?

Grazie,

Unslee

Ciao, allora prima di tutto... confesso che mi sono un po' perso.
Fino a prova contraria B equivale a 11 in decimale, e dunque 1011 in binario :D

Per il resto, vorrei capire perchè stai svolgendo questo lavoro: se si tratta di un esercizio in cui applicare un algoritmo preciso, o se devi soltanto ottenere rappresentazioni diverse di un intero.

La prima cosa che sarebbe utile sapere è come memorizzi questi numeri: come interi, array di cifre, di caratteri...?

Se ad esempio puoi utilizzare le singole cifre, potresti semplicemente moltiplicarle per le successive potenze di 2 in modo da ottenere una rappresentazione decimale del valore.

Poi attraverso il modificatore di output hex
cout << hex << n;
puoi stampare il valore in forma esadecimale.

Un'altra tecnica potrebbe essere quella di creare una array di caratteri e associare ad ogni possibile combinazione di 4 bit un valore esadecimale, per poi memorizzarli nella posizione opportuna dell'array: in questo modo otterresti una stringa che rappresenta il valore.

unslee
08-07-2008, 13:36
Per un attimo dimentichiamoci il binario! Ho una variabile int pari a 7; come posso trasformare questo 7 in "A".

Cerco di spiegarti il perche di tutto questo !!!!

COn il libro di c++ ho studiato fino al capitolo 5 (istruzioni di sequenza, selezione, iterazione) ed in pratica ho studiato teoricamente il pensiero ad oggetti e praticamente sintassi e istruzioni. Il modificatore di output non posso usarlo perché non l'ho studiato ancora (anche se sicuramente sarebbe tutto più semplice!).

Nell'esercizio mi viene chiesto di rappresentare i primi 256 numeri decimali con a fianco la rappresentazione binaria, esadecimale, ottale.

Da decimale a binario ho risolto. Poi mi si è posto il problema di rappresentare l'esadecimale ed ho deciso di partire dal valore binario ottenuto.

Siccome la trasformazione da binario in esadecimale si fa valutando le quartine del binario da dx a sx e confrontanto con la scala di valori dell'esadecimale da 1 a F, ho messo su un ciclo che mi scompone ogni binario in quartine; per ogni quartina, da dx a sx ho una variabile.

Se provo ad eseguire il programma per il decimale 256 mi restituisce in binario 100.000.000. Dal binario il ciclo mi tira fuori 3 quartine (variabili) e cioè: 0, 0, 1.

L'idea è quella adesso di prendere ogni quartina e confrontarla con la tabella di conversione binario - esadecimale e dopo comporre l'esadecimale con un semplice cout << variabile1 << variabile2 << variabile3.

Ora il problema si pone quando devo imbastire la corrispondenza tra una quartina 1010 ed il corrispondente esadecimale "A" ( una quartina 1011 ed il corrispondente "B" e via di seguito). Io ho una variabile int pari a 1010 (me lo restituisce il ciclo) e non so come posso far uscire in cout "A".

Spero di essere stato un pò più chiaro. La logica di questi esercizi è proprio l'allenamento sui cicli anche se, imparata la programmazione, una conversione del genere si fa con due righe di programma!

Albi89
08-07-2008, 14:06
...

Se hai il decimale, non c'è niente di più facile: se lo tieni memorizzato in una variabile, che chiameremo dec, basterà:
cout << hex << dec;

Costruire un algoritmo ti richiede di lavorare o sui singoli bit o su una tabella di associazioni: mi sembrano comunque soluzioni molto poco eleganti.
edit: ovviamente parlo di bit in senso lato: intendo i singoli '0' e '1' ;)

unslee
08-07-2008, 14:21
Sicuramente è poco elegante ... ma è quello che mi viene chiesto!

Ritorno al quesito principale:
se io ho una variabile int a = 7 ma voglio che nell'output con un cout mi venga restituita una lettera dell'alfabeto, ad esempio P, qual'è il sistema?

Grazie dell'aiuto,

Unslee

variabilepippo
08-07-2008, 14:38
se io ho una variabile int a = 7 ma voglio che nell'output con un cout mi venga restituita una lettera dell'alfabeto, ad esempio P, qual'è il sistema?

Non ti basta un cast a char?

#include <iostream>

using namespace std;

int main(void){
int a = 69;
cout << (char) a << endl;
return 0;
}

Conosci la tabella ASCII (http://www.asciitable.com/)?

Albi89
08-07-2008, 14:38
Sicuramente è poco elegante ... ma è quello che mi viene chiesto!

Ritorno al quesito principale:
se io ho una variabile int a = 7 ma voglio che nell'output con un cout mi venga restituita una lettera dell'alfabeto, ad esempio P, qual'è il sistema?

Grazie dell'aiuto,

Unslee

Aspetta aspetta, prima parlavamo di esadecimale, ora stai parlando di P... cosa intendi? :fagiano:
7 in esadecimale è 7, e se usi il modificatore di stream che ti ho scritto prima, ti sarà scritta in esadeciale come, appunto, 7.

unslee
08-07-2008, 14:42
Grazie per l'aiuto variabilepippo! Ci stiamo avvicinando alla soluzione !
Per alibi89: lasciamo stare il binario e la sua trasformazione in esadecimale.

Per variabilepippo:
Conosco gli ascii.
Come memorizzo "P" nella variabile che prima conteneva il numero (o anche in un'altra variabile creata ex-novo)?

L'esempio concreto potrebbe essere:

a) Il programma assegna un valore numerico alla mia variabile a

b) Condizione:
se a = 10;
a = 3
output di a: 3.


invece

se a = 11
a = "P"
output di a = "P"

variabilepippo
08-07-2008, 14:47
Se continui a cambiare le carte in tavola in merito al problema non si arriverà mai ad una soluzione! :rolleyes:

Non mi è chiaro cosa intendi con "Come memorizzo "P" nella variabile che prima conteneva il numero (o anche in un'altra variabile creata ex-novo)?".

Vuoi fare una cosa del genere?


#include <iostream>

using namespace std;

int main(void){
int a = 69;
char b = (char) a;
cout << b << endl;
return 0;
}

unslee
08-07-2008, 15:06
Ok :confused: ,
credo che la cosa migliore sia postare il codice. Come inserisco il codice nel riquadro (è un pò lunghetto!)?

marko.fatto
08-07-2008, 15:14
utilizzando i tag code :stordita:

unslee
08-07-2008, 15:32
Ci sono riuscito!
L'indicazione era corretta. Mi sono creato delle variabili di comodo (alfa, beta e gamma) per portarmi le lettere in CHAR (utilizzando la trasposizione dell'ascii).

Credo che con il codice sarà tutto più chiaro a tutti voi che avete cercato di darmi una mano! Considerate che ho iniziato da poco lo studio del c++ e che la creazione specifica dell'algoritmo era espressamente prevista negli esercizi. Qualsiasi consiglio sarà veramente benaccetto!

// Esercizio 518.cpp : definisce il punto di ingresso dell'applicazione console.
//

#include "stdafx.h"

#include <iostream>
using std::cout;
using std::endl;

#include <iomanip>
using std::setw;

#include <string>
using std::string;

int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

int main()
{
int a;
int b;
int num;
int counter2;

int num2;
int diviso;


cout << setw(8) << "Numero" << setw(12) << "Binario" << setw(15) << "Esadecimale" << endl;

for (int counter = 256; counter > 0; counter--)
{
a = 1;
num = 0;
counter2 = counter;

for (; counter2 != 0; counter2 /= 2)
{
b = counter2 % 2;
num = num + (b * a);
a *= 10;
}

a = 1;
diviso = num;
int alfa = 0;
int beta = 0;
int gamma = 0;
char epsilon = 0;
char delta = 0;
char zeta = 0;

int counter3;

counter3 = num;

for (; counter3 != 0;)
{
alfa = 0;
beta = 0;
gamma = 0;

for (int c = 4; c > 0; c--)
{num2 = counter3 % 10;
counter3 = counter3 / 10;
alfa = alfa + (num2 * a);
a = a * 10;}

a = 1;

for (int d = 4; d > 0; d--)
{num2 = counter3 % 10;
counter3 = counter3 / 10;
beta = beta + (num2 * a);
a = a * 10;}

a = 1;

for (int e = 4; e >0; e--)
{num2 = counter3 % 10;
counter3 = counter3 / 10;
gamma = gamma + (num2 * a);
a = a * 10;}

a = 1;
}

switch ( alfa )
{
case 0:
alfa = 0;
break;
case 1:
alfa = 1;
break;
case 10:
alfa = 2;
break;
case 11:
alfa = 3;
break;
case 100:
alfa = 4;
break;
case 101:
alfa = 5;
break;
case 110:
alfa = 6;
break;
case 111:
alfa = 7;
break;
case 1000:
alfa = 8;
break;
case 1001:
alfa = 9;
break;
case 1010:
alfa = 65;
epsilon = (char)alfa;
break;
case 1011:
alfa = 66;
epsilon = (char)alfa;
break;
case 1100:
alfa = 67;
epsilon = (char)alfa;
break;
case 1101:
alfa = 68;
epsilon = (char)alfa;
break;
case 1110:
alfa = 69;
epsilon = (char)alfa;
break;
case 1111:
alfa = 70;
epsilon = (char)alfa;
break;
}

switch ( beta )
{
case 0:
beta = 0;
break;
case 1:
beta = 1;
break;
case 10:
beta = 2;
break;
case 11:
beta = 3;
break;
case 100:
beta = 4;
break;
case 101:
beta = 5;
break;
case 110:
beta = 6;
break;
case 111:
beta = 7;
break;
case 1000:
beta = 8;
break;
case 1001:
beta = 9;
break;
case 1010:
beta = 65;
zeta = (char)beta;
break;
case 1011:
beta = 66;
zeta = (char)beta;
break;
case 1100:
beta = 67;
zeta = (char)beta;
break;
case 1101:
beta = 68;
zeta = (char)beta;
break;
case 1110:
beta = 69;
zeta = (char)beta;
break;
case 1111:
beta = 70;
zeta = (char)beta;
break;
}

switch ( gamma )
{
case 0:
gamma = 0;
break;
case 1:
gamma = 1;
break;
case 10:
gamma = 2;
break;
case 11:
gamma = 3;
break;
case 100:
gamma = 4;
break;
case 101:
gamma = 5;
break;
case 110:
gamma = 6;
break;
case 111:
gamma = 7;
break;
case 1000:
gamma = 8;
break;
case 1001:
gamma = 9;
break;
case 1010:
gamma = 65;
delta = (char)gamma;
break;
case 1011:
gamma = 66;
delta = (char)gamma;
break;
case 1100:
gamma = 67;
delta = (char)gamma;
break;
case 1101:
gamma = 68;
delta = (char)gamma;
break;
case 1110:
gamma = 69;
delta = (char)gamma;
break;
case 1111:
gamma = 70;
delta = (char)gamma;
break;
}

if ( alfa < 39 && beta < 39 && gamma < 39 )
cout << setw(8) << counter << setw(12) << num << setw(15) << gamma << beta << alfa<< endl;
else
if (alfa > 39 && beta < 39 && gamma < 39 )
cout << setw(8) << counter << setw(12) << num << setw(15) << gamma << beta << epsilon << endl;
else
if (alfa > 39 && beta > 39 && gamma < 39)
cout << setw(8) << counter << setw(12) << num << setw(15) << gamma << zeta << epsilon << endl;
else
if (alfa > 39 && beta < 39 && gamma > 39)
cout << setw(8) << counter << setw(12) << num << setw(15) << delta << beta << epsilon << endl;
else
if (alfa < 39 && beta > 39 && gamma > 39)
cout << setw(8) << counter << setw(12) << num << setw(15) << delta << zeta << alfa << endl;
else
if (alfa >39 && beta > 39 && gamma > 39)
cout << setw(8) << counter << setw(12) << num << setw(15) << delta << zeta << epsilon << endl;


}

return 0;

}

unslee
08-07-2008, 18:54
Vi posto l'esercizio completo. La richiesta recitava così: scrivere un programma che mostri per tutti i numeri da 1 a 256 le relative corrispondenze nelle numerazioni decimale, binaria, esadecimale, ottale. Il programma prevede la costruzione di tutti gli algoritmi.

Ho scritto parte dei commenti. Domani finisco.

Accetto consigli, migliorie, correzioni e ringrazio tutte le persone che mi hanno aiutato sopportando le mie spiegazioni poco chiare :mbe:

// Esercizio 518.cpp : definisce il punto di ingresso dell'applicazione console.
//

#include "stdafx.h"

#include <iostream>
using std::cout;
using std::endl;

#include <iomanip>
using std::setw;



int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

int main()
{
int a; // Variabile che prende valore a = a * 10 - Serve come moltiplicando per il calcolo dei binari
int b; // Serve come moltiplicando per il calcolo dei binati
int num; // Numeri binari
int counter2; // Necessario per il calcolo di numeri binari

int num2; // Necessario come moltiplicando per i numeri esadecimali
int num3;

//Facciamo apparire l'intestazione della tabella
cout << setw(8) << "Decimale" << setw(16) << "Binario" << setw(17) << "Esadecimale" << setw(14) << "Ottale" << endl;

//Dovendo calcolare le corrispondenze per 256 numeri creiamo un ciclo che si ripete 256 volte
for (int counter = 256; counter > 0; counter--)
{
a = 1;
num = 0;
counter2 = counter;

for (; counter2 != 0; counter2 /= 2)
{
b = counter2 % 2;
num = num + (b * a);
a *= 10;
}

a = 1;


int alfa = 0;
int beta = 0;
int gamma = 0;
char epsilon = 0;
char delta = 0;
char zeta = 0;

int counter3;

counter3 = num;

for (; counter3 != 0;)
{
alfa = 0;
beta = 0;
gamma = 0;

for (int c = 4; c > 0; c--)
{num2 = counter3 % 10;
counter3 = counter3 / 10;
alfa = alfa + (num2 * a);
a = a * 10;}

a = 1;

for (int d = 4; d > 0; d--)
{num2 = counter3 % 10;
counter3 = counter3 / 10;
beta = beta + (num2 * a);
a = a * 10;}

a = 1;

for (int e = 4; e >0; e--)
{num2 = counter3 % 10;
counter3 = counter3 / 10;
gamma = gamma + (num2 * a);
a = a * 10;}

a = 1;
}

switch ( alfa )
{
case 0:
alfa = 0;
break;
case 1:
alfa = 1;
break;
case 10:
alfa = 2;
break;
case 11:
alfa = 3;
break;
case 100:
alfa = 4;
break;
case 101:
alfa = 5;
break;
case 110:
alfa = 6;
break;
case 111:
alfa = 7;
break;
case 1000:
alfa = 8;
break;
case 1001:
alfa = 9;
break;
case 1010:
alfa = 65;
epsilon = (char)alfa;
break;
case 1011:
alfa = 66;
epsilon = (char)alfa;
break;
case 1100:
alfa = 67;
epsilon = (char)alfa;
break;
case 1101:
alfa = 68;
epsilon = (char)alfa;
break;
case 1110:
alfa = 69;
epsilon = (char)alfa;
break;
case 1111:
alfa = 70;
epsilon = (char)alfa;
break;
}

switch ( beta )
{
case 0:
beta = 0;
break;
case 1:
beta = 1;
break;
case 10:
beta = 2;
break;
case 11:
beta = 3;
break;
case 100:
beta = 4;
break;
case 101:
beta = 5;
break;
case 110:
beta = 6;
break;
case 111:
beta = 7;
break;
case 1000:
beta = 8;
break;
case 1001:
beta = 9;
break;
case 1010:
beta = 65;
zeta = (char)beta;
break;
case 1011:
beta = 66;
zeta = (char)beta;
break;
case 1100:
beta = 67;
zeta = (char)beta;
break;
case 1101:
beta = 68;
zeta = (char)beta;
break;
case 1110:
beta = 69;
zeta = (char)beta;
break;
case 1111:
beta = 70;
zeta = (char)beta;
break;
}

switch ( gamma )
{
case 0:
gamma = 0;
break;
case 1:
gamma = 1;
break;
case 10:
gamma = 2;
break;
case 11:
gamma = 3;
break;
case 100:
gamma = 4;
break;
case 101:
gamma = 5;
break;
case 110:
gamma = 6;
break;
case 111:
gamma = 7;
break;
case 1000:
gamma = 8;
break;
case 1001:
gamma = 9;
break;
case 1010:
gamma = 65;
delta = (char)gamma;
break;
case 1011:
gamma = 66;
delta = (char)gamma;
break;
case 1100:
gamma = 67;
delta = (char)gamma;
break;
case 1101:
gamma = 68;
delta = (char)gamma;
break;
case 1110:
gamma = 69;
delta = (char)gamma;
break;
case 1111:
gamma = 70;
delta = (char)gamma;
break;
}

a = 1;

int x = 0;
int y = 0;
int w = 0;
int z = 0;
char m = 0;
char n = 0;
char o = 0;

int counter5;

counter5 = num;

for (; counter5 != 0;)
{
x = 0;
y = 0;
w = 0;

for (int c = 3; c > 0; c--)
{num3 = counter5 % 10;
counter5 = counter5 / 10;
x = x + (num3 * a);
a = a * 10;}

a = 1;

for (int d = 3; d > 0; d--)
{num3 = counter5 % 10;
counter5 = counter5 / 10;
y = y + (num3 * a);
a = a * 10;}

a = 1;

for (int e = 3; e >0; e--)
{num3 = counter5 % 10;
counter5 = counter5 / 10;
w = w + (num3 * a);
a = a * 10;}

a = 1;

}

switch ( x )
{
case 0:
x = 0;
break;
case 1:
x = 1;
break;
case 10:
x = 2;
break;
case 11:
x = 3;
break;
case 100:
x = 4;
break;
case 101:
x = 5;
break;
case 110:
x = 6;
break;
case 111:
x = 7;
break;
}

switch ( y )
{
case 0:
y = 0;
break;
case 1:
y = 1;
break;
case 10:
y = 2;
break;
case 11:
y = 3;
break;
case 100:
y = 4;
break;
case 101:
y = 5;
break;
case 110:
y = 6;
break;
case 111:
y = 7;
break;
}

switch ( w )
{
case 0:
w = 0;
break;
case 1:
w = 1;
break;
case 10:
w = 2;
break;
case 11:
w = 3;
break;
case 100:
w = 4;
break;
case 101:
w = 5;
break;
case 110:
w = 6;
break;
case 111:
w = 7;
break;
}



if ( alfa < 39 && beta < 39 && gamma < 39 )
if (gamma ==0)
cout << setw(8) << counter << setw(16) << num << setw(15) << " " << beta << alfa << setw(12) << w << y << x << endl;
else
cout << setw(8) << counter << setw(16) << num << setw(15) << gamma << beta << alfa << setw(12) << w << y << x << endl;
else
if (alfa > 39 && beta < 39 && gamma < 39 )
if (gamma == 0)
cout << setw(8) << counter << setw(16) << num << setw(15) << " " << beta << epsilon << setw(12) << w << y << x << endl;
else
cout << setw(8) << counter << setw(16) << num << setw(15) << gamma << beta << epsilon << setw(12) << w << y << x << endl;
else
if (alfa > 39 && beta > 39 && gamma < 39)
if (gamma == 0)
cout << setw(8) << counter << setw(16) << num << setw(15) << " " << zeta << epsilon << setw(12) << w << y << x << endl;
else
cout << setw(8) << counter << setw(16) << num << setw(15) << gamma << zeta << epsilon << setw(12) << w << y << x << endl;
else
if (alfa > 39 && beta < 39 && gamma > 39)
if (delta == 0)
cout << setw(8) << counter << setw(16) << num << setw(15) << " " << beta << epsilon << setw(12) << w << y << x << endl;
else
cout << setw(8) << counter << setw(16) << num << setw(15) << delta << beta << epsilon << setw(12) << w << y << x << endl;
else
if (alfa < 39 && beta > 39 && gamma > 39)
if (delta == 0)
cout << setw(8) << counter << setw(16) << num << setw(15) << " " << zeta << alfa << setw(12) << w << y << x << endl;
else
cout << setw(8) << counter << setw(16) << num << setw(15) << delta << zeta << alfa << setw(12) << w << y << x << endl;
else
if (alfa >39 && beta > 39 && gamma > 39)
if (delta == 0)
cout << setw(8) << counter << setw(16) << num << setw(15) << " " << zeta << epsilon << setw(12) << w << y << x << endl;
else
cout << setw(8) << counter << setw(16) << num << setw(15) << delta << zeta << epsilon << setw(12) << w << y << x << endl;

}

return 0;
}

WarDuck
09-07-2008, 11:31
Mmm non si capisce molto bene cosa dovresti fare, nel senso, come implementarlo...

Cioè non ho capito se devi partire dal numero decimale ed effettuare conversioni nelle altre basi, oppure creare un metodo per ogni tipologia di conversione.

Nel senso: se io ho un numero decimale, devo convertirlo in ottale, binario e esadecimale, oppure devo anche fare

Binario -> Ottale
Ottale -> Esadecimale
Esadecimale -> Binario

E così via... perché altrimenti partendo sempre dal formato decimale è molto semplice implementare la conversione.

Edit: ho tolto i codici che c'erano un po' di errori/orrori :p ora vedo di correggerli.
Edit2: eccoli, sono 3 metodi in Java, a parte alcune cose il principio è del tutto identico a come si farebbe in c++, spero di non aver fatto castronerie:

public static String decToBin(int n) {
if (n==0) return "0";
if (n==1) return "1";
return decToBin(n/2)+(n%2);
}

public static String decToOct(int n) {
if (n<9) return String.valueOf(n);
return decToOct(n/8)+(n%8);
}

public static String decToHex(int n) {
if (n<10) return String.valueOf(n);
int resto = n%16;
if (resto>9 && resto<16) {
char c = (char) ('A' + (resto - 10));
return decToHex(n/16)+c;
}
return decToHex(n/16)+resto;

}