PDA

Visualizza la versione completa : [C] Conversione esadecimale a decimale


Javino89
15-05-2013, 22:57
Premessa: Non sono pratico di programmazione in C. Il problema posto è molto comune MA in questo caso non si possono usare funzioni particolari come itoa o atoi, niente puntatori. Solo int, char, while, for.

Ho scritto questo codice:



#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {

int valore; //conterrà il valore decimale finale

/*
* La conversione esadecimale --> decimale avviene
* moltiplicando ogni valore del numero esadecimale
* per 16^posizione.
* Esempio, per convertire in decimale il numero FFB
* facciamo: (F*16^2) + (F*16^1) + (B*16^0) che
* corrisponde a (15*16^2) + (15*16^1) + (11*16^0).
*/

char buffer[256]; //contiene il valore esadecimale inserito dall'utente

printf("Inserisci il numero esadecimale da convertire in decimale: ");
scanf("%s", buffer); //acquisisco il numero

int len = strlen(buffer); //calcolo la lunghezza del numero inserito

int i = 0; //indice usato per lo scorrimento nel while

while(buffer[i] != '\0') {
if(strcmp(buffer[i],"1")==0) {
valore += 1*(pow(16,len-1));
}
if(strcmp(buffer[i],"2")==0) {
valore += 2*(pow(16,len-1));
}
if(strcmp(buffer[i],"3")==0) {
valore += 3*(pow(16,len-1));
}
if(strcmp(buffer[i],"4")==0) {
valore += 4*(pow(16,len-1));
}
if(strcmp(buffer[i],"5")==0) {
valore += 5*(pow(16,len-1));
}
if(strcmp(buffer[i],"6")==0) {
valore += 6*(pow(16,len-1));
}
if(strcmp(buffer[i],"7")==0) {
valore += 7*(pow(16,len-1));
}
if(strcmp(buffer[i],"8")==0) {
valore += 8*(pow(16,len-1));
}
if(strcmp(buffer[i],"9")==0) {
valore += 9*(pow(16,len-1));
}
if(strcmp(buffer[i],"A")==0) {
valore += 10*(pow(16,len-1));
}
if(strcmp(buffer[i],"B")==0) {
valore += 11*(pow(16,len-1));
}
if(strcmp(buffer[i],"C")==0) {
valore += 12*(pow(16,len-1));
}
if(strcmp(buffer[i],"D")==0) {
valore += 13*(pow(16,len-1));
}
if(strcmp(buffer[i],"E")==0) {
valore += 14*(pow(16,len-1));
}
if(strcmp(buffer[i],"F")==0) {
valore += 15*(pow(16,len-1));
}

i = i + 1;
len = len - 1;
}

printf("\nIl numero decimale corrispondente è: %d", valore);
system("PAUSE");
}


Ma il programma crasha appena si inserisce un numero esadecimale e si preme invio.
Suggerimenti? Grazie :)

oregon
15-05-2013, 23:38
Non devi usare la strcmp perché devi solamente considerare il carattere

buffer[i]

E non devi fare tutte le if ma ottenere il valore da moltiplicare da buffer[i]

Javino89
16-05-2013, 00:07
Ok, come? :confused:

oregon
16-05-2013, 00:14
Usando buffer[i] come carattere !

char c;

c=buffer[i];
...

e il codice ASCII ...

Javino89
16-05-2013, 00:39
Ma buffer[i] non è già un char di per se? Non capisco l'utilità di salvarlo in un altro char..

oregon
16-05-2013, 00:46
Per comodità e ottenere il suo valore numerico da utilizzare per il calcolo ...



c=buffer[i]-'0':
if(c>9) c -= 7;
valore += c*(pow(16,len-1));


E sarebbe anche meglio non utilizzare la pow ...

Javino89
16-05-2013, 11:00
Ho provato il codice, ma non mi trova il valore esatto, sfalla di qualche numero.
Ho provato con FFB che in decimale corrisponde a 4091, mentre il programmino tira
fuori 4093.
Ho provato con 103C che in decimale corrisponde a 4156, ma il programmino tira
fuori 4158.
Sembra tirar fuori numeri più grandi di 2 unità.
Comunque, vorrei capire bene la logica se non chiedo troppo :)

c = buffer[i] - '0';

c è un carattere e dunque contiene il codice ascii della cifra che rappresenta.
'0' corrisponde a 48 in decimale, quindi di fatto sottrai 48 a buffer[i] ed il risultato
viene salvato in c che ora conterrà il valore numerico esatto.
Non capisco perché per ottenere il valore corrispondente alle lettere si sottrae
ulteriormente 7.
Per me il codice ascii è stato sempre un casino xD

Ps: A me la fa corrispondere a 12, B a 13, C a 14, D a 15, E a 16 ed F a 17..

oregon
16-05-2013, 11:31
Il codice ASCII è una banale tabella di equivalenza tra simboli e valori numerici ...

Per la parte delle cifre hai compreso cosa fa la sottrazione, per quanto riguarda i simboli alfabetici basta tenere presente che il codice ASCII della 'A' è 65

Quindi, nel caso della 'A' i semplici calcoli saranno

65-48 ---> 17

dato che 17 è >9 allora 17-7 ---> 10

e 10 sarà il valore della A.

Ovviamente vale la stessa regola per le altre lettere.

Per i problemi che incontri bisognerebbe vedere il codice modificato che esegui.

Javino89
16-05-2013, 12:13
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {

/*
* La conversione esadecimale --> decimale avviene
* moltiplicando ogni valore del numero esadecimale
* per (16 elevato alla posizione) e facendo la somma
* dei risultati.
* Esempio, per convertire in decimale il numero FFB
* facciamo: (F*16^2) + (F*16^1) + (B*16^0) che
* corrisponde a (15*16^2) + (15*16^1) + (11*16^0) = 4091.
*/

int valore; //conterrà il valore decimale finale

char buffer[256]; //contiene il valore esadecimale inserito dall'utente

printf("Inserisci il numero esadecimale da convertire in decimale: ");
scanf("%s", buffer); //acquisisco il numero

int len = strlen(buffer); //calcolo la lunghezza del numero inserito

int i = 0; //indice usato per lo scorrimento nel while

char c; //carattere di appoggio

while(buffer[i] != '\0') {
/*Per raggiungere il mio scopo utilizzo il codice ASCII.
* La variabile c contiene il codice ASCII di una cifra. Facendo
* c - '0', sto sottraendo al codice ASCII di c il valore 48.
* Esempio:
* c = '7'. Il codice ASCII di '7' è 55, quindi di fatto quello
* che accade è c = 55 - 48 = 7. Se c è un codice ASCII che
* rappresenta delle lettere (controllo dell'if), allora
* sottraggo ulteriormente 7 a c per ottenere il loro valore
* decimale corrispondente. Ad esempio la lettera A in ASCII
* corrisponde a 65. 65 - 48 = 17. Ma la A in decimale è
* pari a 10, quindi sottraiamo ulteriormente 7. Lo stesso
* vale per le altre lettere fino ad F.
*/
c = buffer[i]-'0';
if(c > 9) c-=7;
valore += c*(pow(16,len-1));
i = i + 1;
len = len - 1;
}

printf("\nIl numero decimale corrispondente e': %d\n", valore);
system("PAUSE");
}

oregon
16-05-2013, 12:18
La variabile

valore

deve partire da 0

Loading