PDA

Visualizza la versione completa : [C++] Decimale -> Esadecimale


HaCk88
27-09-2005, 18:21
Salve raga, :)
mi serve una funzione in c++ che mi converta automaticamente da decimale a esadecimale.
Grazie :ciauz:

pprllo
27-09-2005, 22:02
Puoi usare le funzioni atoi e itoa della stdlib.
Ponendo di dover convertire un int in stringa hex, puoi fare:


int i;
... //Dai un valore ad i
char *hex = new char(sizeof(int)*2 + 1);
itoa(i, hex, 16);

Se devi convertire una stringa decimale in una esadecimale, puoi fare:


char *dec;
... //Dai un valore a dec che rappresenti un numero
char *hex = new char(sizeof(int)*2 + 1);
itoa(atoi(dec), hex, 16);

HaCk88
28-09-2005, 13:01
Originariamente inviato da pprllo
Puoi usare le funzioni atoi e itoa della stdlib.
Ponendo di dover convertire un int in stringa hex, puoi fare:


int i;
... //Dai un valore ad i
char *hex = new char(sizeof(int)*2 + 1);
itoa(i, hex, 16);

Se devi convertire una stringa decimale in una esadecimale, puoi fare:


char *dec;
... //Dai un valore a dec che rappresenti un numero
char *hex = new char(sizeof(int)*2 + 1);
itoa(atoi(dec), hex, 16);


Non ho capito molto bene :master:
Non sono molto bravo in c++ :messner: infatti questo sarà il mio primo programma.

pprllo
28-09-2005, 15:14
Questo è un codice commentato con vari modi di risolvere il problema. Comunque ti consiglio di iniziare dalle basi e non da programmi più difficili come questo:


#include <stdlib.h> /*Libreria standard del C++, contiene le funzioni "basilari"*/
//Questo è un commento, non viene elaborato dal compilatore
/*Anche questo è un commento,
ma è multilinea*/
#include <stdio.h> /*Libreria standard di I/O, contiene le funzioni fondamentali per
l'input e l'output di dati da file/tastiera/periferiche*/

int main() /*Punto di ingresso del programma, qui comincia l'esecuzione*/
{
int Valore; /*Dichiarazione delle variabili. Le variabili si dichiarano
specificando prima il tipo (in questo caso int) e poi il nome
della variabile. Come tutta la sintassi C++, i nomi delle variabili
sono case-sensitive, ovvero le maiuscole non sono la stessa cosa
delle minuscole.*/
/*Ricorda sempre che le istruzioni devono essere seguite da ;*/

char StringaDecimale[17];
char StringaEsadecimale[17];

/*Queste sono 2 dichiarazioni di array. Gli array sono insiemi di dati
dello stesso tipo. Per esempio un array di int è un insieme di diversi
valori interi, come {1, 2, 4, 6}, per esempio. Gli array si definiscono
così: <tipo array> <nome array> [<numero elementi>]. Le stringhe
sono considerate come array di singoli caratteri (char).*/

printf("Scrivere un numero decimale: ");

/*Funzione standard di output a schermo. Le funzioni si richiamano
in questo modo: <NomeFunzione>(<Argomento1>, <Argomento2>, <...>)
La funzione printf prende come argomenti una stringa (le stringhe
DEVONO essere sempre delimitate da ") e un numero variabile di altri
parametri, in base alla stringa.*/

scanf("%d", &Valore);

/*Funzione standard di input da tastiera. E' il corrispettivo di printf
e anch'essa prende in argomento un numero variabile di argomenti in
base alla stringa. Mette quindi nelle variabili argomento i valori
che riceve dalla tastiera. Il segno & davanti alla variabile serve a
passarla per riferimento. E' un pò complesso come concetto, per ora
ti basti sapere che devi usarla per tutte tranne che per le stringhe.
I diversi simboli di scanf/printf servono a leggere/scrivere diversi
tipi di dati:
%d = tipo di dati int (interi)
%c = tipo di dati char (carattere singolo)
%f = tipo di dati float o double (virgola mobile)
%s = tipo di dati char* o char[] (stringa)
%x = tipo di dati int (in formato esadecimale)*/

printf("In esadecimale il numero che hai digitato e': %X\n", Valore);
/*Con la funzione printf scriviamo il numero in esadecimale.
La X maiuscola comporta che le lettere del valore esadecimale
verranno scritte in maiuscolo. Il carattere '\n' rappresenta
un ritorno a capo ed è una cosiddetta sequenza di escape. Le
sequenze di due caratteri che iniziano per '\' sono appunto
dette sequenze di escape*/

/*Ma ci sono altri modi per risolvere lo stesso problema, per esempio usando le funzioni
da me citate*/

printf("Scrivi un altro numero in formato decimale: ");

scanf("%s", StringaDecimale);
/*Questa volta, invece di prendere in input un numero, scegliamo
di prendere in input una stringa, che conterrà il valore numerico
che abbiamo deciso.*/

Valore = atoi(StringaDecimale);
/*Questo è un nuovo uso di una funzione: usiamo una funzione per dare
un valore ad una variabile. La funzione atoi prende come argomento
una stringa e restituisce come risultato il valore intero espresso
in quella stringa. Noi prendiamo questo valore e, attraverso l'operatore
=, lo assegnamo alla variabile Valore.*/

//A questo punto possiamo seguire 2 strade, te le illustro entrambe

printf("In esadecimale il numero che hai digitato e': %X\n", Valore);

/*Scriviamo in valore in esadecimale, proprio come prima*/

//Ma possiamo ricorrere ad un'altra funzione:

itoa(Valore, StringaEsadecimale, 16);
/*Questa funzione è un pò più complessa: ha ben 3 parametri ! La funzione
serve per trasformare un intero in una stringa che esprima il valore di
quell'intero. Il primo parametro dice alla funzione il valore da convertire.
Il secondo dice alla funzione in quale stringa scrivere il valore convertito.
Infine il terzo valore dice al programma che base utilizzare per la conversione:
base 2, base 3, base 8, base 10, base 16, ecc. ecc.*/

printf("In esadecimale il numero che hai digitato e': %s\n", StringaEsadecimale);
/*A questo punto scriviamo, con printf, la stringa che contiene il valore
esadecimale. In questo caso le lettere sono in minuscolo. Vediamo come
convertirla in maiuscolo (difficile)*/

int i; //Definiamo una variabile intera per usarla come puntatore

for (i = 0; i < 17; i++)
{
/*Utilizziamo un ciclo for. Il for ha questa sintassi:
for(<inizializzazione>; <condizione>; <incremento>)
Esegue l'operazione contenuta in <inizializzazione>, quindi il blocco di codice contenuto
tra parentesi graffe viene eseguito finchè <condizione> è valida. Inoltre ad ogni ripetizione
viene ripetuta l'operazione contenuta in <incremento>. La variabile i viene messa a 0, quindi
l'operazione contenuta tra graffe viene ripetuta finchè i non diventa maggiore o uguale a 17.
i viene incrementata ad ogni ciclo con l'istruzione
i++
che è la notazione abbreviata per
i = i + 1*/

if (StringaEsadecimale[i] >= 'a' && StringaEsadecimale[i] <= 'z')
{
/*Qui utilizziamo un if. L'if ha questa sintassi:
if(<condizione>)
Esegue il codice contenuto all'interno soltanto se <condizione> risulta essere vera.
In questo if abbiamo sfruttato la possibilità di usare le stringhe come array di caratteri.
Accediamo al singolo carattere con
<stringa>[<indice>]
il primo carattere ha indice 0.
Se questo carattere risulta essere "maggiore" di 'a' (i caratteri singoli vanno scritti tra
apici singoli: ') e "minore" di 'z', noi eseguiamo l'operazione contenuta nell'if. Siccome
i cresce ciclo dopo ciclo, noi analizziamo ogni singolo carattere della stringa.*/

StringaEsadecimale[i] -= 32;

/*A questo punto, modifichiamo il valore del carattere che abbiamo trovato essere minuscolo
il valore ASCII delle lettere (http://www.lookuptables.com/) maiuscole è uguale al valore
delle minuscole meno 32. Con questa operazione
(che equivale a StringaEsadecimale[i] = StringaEsadecimale[i] - 32;) noi trasformiamo quindi
le minuscole in maiuscole
*/
}
}

printf("In esadecimale il numero che hai digitato e': %s\n", StringaEsadecimale);
/*Riscriviamo la stringa modificata*/

system("PAUSE"); /*Questa è una particolare istruzione che permette di eseguire
un comando shell da C++, come se lo stessi digitando, appunto,
dalla shell. Questo funziona solo sotto DOS/Windows e fa uscire
una scritta che dice "Premere un tasto per continuare ..." e
attende la pressione di un tasto. Sotto Linux potresti dover
usare un altro sistema. Comunque, se hai problemi, puoi lanciare
il programma dalla shell affinchè l'output rimanga su schermo.*/


return 0; /*Il programma si conclude con questa istruzione*/
}

HaCk88
28-09-2005, 17:26
Originariamente inviato da pprllo
Questo è un codice commentato con vari modi di risolvere il problema. Comunque ti consiglio di iniziare dalle basi e non da programmi più difficili come questo:


#include <stdlib.h> /*Libreria standard del C++, contiene le funzioni "basilari"*/
//Questo è un commento, non viene elaborato dal compilatore
/*Anche questo è un commento,
ma è multilinea*/
#include <stdio.h> /*Libreria standard di I/O, contiene le funzioni fondamentali per
l'input e l'output di dati da file/tastiera/periferiche*/

int main() /*Punto di ingresso del programma, qui comincia l'esecuzione*/
{
int Valore; /*Dichiarazione delle variabili. Le variabili si dichiarano
specificando prima il tipo (in questo caso int) e poi il nome
della variabile. Come tutta la sintassi C++, i nomi delle variabili
sono case-sensitive, ovvero le maiuscole non sono la stessa cosa
delle minuscole.*/
/*Ricorda sempre che le istruzioni devono essere seguite da ;*/

char StringaDecimale[17];
char StringaEsadecimale[17];

/*Queste sono 2 dichiarazioni di array. Gli array sono insiemi di dati
dello stesso tipo. Per esempio un array di int è un insieme di diversi
valori interi, come {1, 2, 4, 6}, per esempio. Gli array si definiscono
così: <tipo array> <nome array> [<numero elementi>]. Le stringhe
sono considerate come array di singoli caratteri (char).*/

printf("Scrivere un numero decimale: ");

/*Funzione standard di output a schermo. Le funzioni si richiamano
in questo modo: <NomeFunzione>(<Argomento1>, <Argomento2>, <...>)
La funzione printf prende come argomenti una stringa (le stringhe
DEVONO essere sempre delimitate da ") e un numero variabile di altri
parametri, in base alla stringa.*/

scanf("%d", &Valore);

/*Funzione standard di input da tastiera. E' il corrispettivo di printf
e anch'essa prende in argomento un numero variabile di argomenti in
base alla stringa. Mette quindi nelle variabili argomento i valori
che riceve dalla tastiera. Il segno & davanti alla variabile serve a
passarla per riferimento. E' un pò complesso come concetto, per ora
ti basti sapere che devi usarla per tutte tranne che per le stringhe.
I diversi simboli di scanf/printf servono a leggere/scrivere diversi
tipi di dati:
%d = tipo di dati int (interi)
%c = tipo di dati char (carattere singolo)
%f = tipo di dati float o double (virgola mobile)
%s = tipo di dati char* o char[] (stringa)
%x = tipo di dati int (in formato esadecimale)*/

printf("In esadecimale il numero che hai digitato e': %X\n", Valore);
/*Con la funzione printf scriviamo il numero in esadecimale.
La X maiuscola comporta che le lettere del valore esadecimale
verranno scritte in maiuscolo. Il carattere '\n' rappresenta
un ritorno a capo ed è una cosiddetta sequenza di escape. Le
sequenze di due caratteri che iniziano per '\' sono appunto
dette sequenze di escape*/

/*Ma ci sono altri modi per risolvere lo stesso problema, per esempio usando le funzioni
da me citate*/

printf("Scrivi un altro numero in formato decimale: ");

scanf("%s", StringaDecimale);
/*Questa volta, invece di prendere in input un numero, scegliamo
di prendere in input una stringa, che conterrà il valore numerico
che abbiamo deciso.*/

Valore = atoi(StringaDecimale);
/*Questo è un nuovo uso di una funzione: usiamo una funzione per dare
un valore ad una variabile. La funzione atoi prende come argomento
una stringa e restituisce come risultato il valore intero espresso
in quella stringa. Noi prendiamo questo valore e, attraverso l'operatore
=, lo assegnamo alla variabile Valore.*/

//A questo punto possiamo seguire 2 strade, te le illustro entrambe

printf("In esadecimale il numero che hai digitato e': %X\n", Valore);

/*Scriviamo in valore in esadecimale, proprio come prima*/

//Ma possiamo ricorrere ad un'altra funzione:

itoa(Valore, StringaEsadecimale, 16);
/*Questa funzione è un pò più complessa: ha ben 3 parametri ! La funzione
serve per trasformare un intero in una stringa che esprima il valore di
quell'intero. Il primo parametro dice alla funzione il valore da convertire.
Il secondo dice alla funzione in quale stringa scrivere il valore convertito.
Infine il terzo valore dice al programma che base utilizzare per la conversione:
base 2, base 3, base 8, base 10, base 16, ecc. ecc.*/

printf("In esadecimale il numero che hai digitato e': %s\n", StringaEsadecimale);
/*A questo punto scriviamo, con printf, la stringa che contiene il valore
esadecimale. In questo caso le lettere sono in minuscolo. Vediamo come
convertirla in maiuscolo (difficile)*/

int i; //Definiamo una variabile intera per usarla come puntatore

for (i = 0; i < 17; i++)
{
/*Utilizziamo un ciclo for. Il for ha questa sintassi:
for(<inizializzazione>; <condizione>; <incremento>)
Esegue l'operazione contenuta in <inizializzazione>, quindi il blocco di codice contenuto
tra parentesi graffe viene eseguito finchè <condizione> è valida. Inoltre ad ogni ripetizione
viene ripetuta l'operazione contenuta in <incremento>. La variabile i viene messa a 0, quindi
l'operazione contenuta tra graffe viene ripetuta finchè i non diventa maggiore o uguale a 17.
i viene incrementata ad ogni ciclo con l'istruzione
i++
che è la notazione abbreviata per
i = i + 1*/

if (StringaEsadecimale[i] >= 'a' && StringaEsadecimale[i] <= 'z')
{
/*Qui utilizziamo un if. L'if ha questa sintassi:
if(<condizione>)
Esegue il codice contenuto all'interno soltanto se <condizione> risulta essere vera.
In questo if abbiamo sfruttato la possibilità di usare le stringhe come array di caratteri.
Accediamo al singolo carattere con
<stringa>[<indice>]
il primo carattere ha indice 0.
Se questo carattere risulta essere "maggiore" di 'a' (i caratteri singoli vanno scritti tra
apici singoli: ') e "minore" di 'z', noi eseguiamo l'operazione contenuta nell'if. Siccome
i cresce ciclo dopo ciclo, noi analizziamo ogni singolo carattere della stringa.*/

StringaEsadecimale[i] -= 32;

/*A questo punto, modifichiamo il valore del carattere che abbiamo trovato essere minuscolo
il valore ASCII delle lettere (http://www.lookuptables.com/) maiuscole è uguale al valore
delle minuscole meno 32. Con questa operazione
(che equivale a StringaEsadecimale[i] = StringaEsadecimale[i] - 32;) noi trasformiamo quindi
le minuscole in maiuscole
*/
}
}

printf("In esadecimale il numero che hai digitato e': %s\n", StringaEsadecimale);
/*Riscriviamo la stringa modificata*/

system("PAUSE"); /*Questa è una particolare istruzione che permette di eseguire
un comando shell da C++, come se lo stessi digitando, appunto,
dalla shell. Questo funziona solo sotto DOS/Windows e fa uscire
una scritta che dice "Premere un tasto per continuare ..." e
attende la pressione di un tasto. Sotto Linux potresti dover
usare un altro sistema. Comunque, se hai problemi, puoi lanciare
il programma dalla shell affinchè l'output rimanga su schermo.*/


return 0; /*Il programma si conclude con questa istruzione*/
}

Una spiegazione molto esauriente :)
Grazie mille!!!! :ciauz:

pprllo
28-09-2005, 19:03
Figurati. :D

Loading