Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [C] Conversione esadecimale a decimale

    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:

    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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]
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ok, come?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Usando buffer[i] come carattere !

    char c;

    c=buffer[i];
    ...

    e il codice ASCII ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Ma buffer[i] non è già un char di per se? Non capisco l'utilità di salvarlo in un altro char..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Per comodità e ottenere il suo valore numerico da utilizzare per il calcolo ...

    codice:
    c=buffer[i]-'0':
    if(c>9) c -= 7;
    valore += c*(pow(16,len-1));
    E sarebbe anche meglio non utilizzare la pow ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    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..

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    codice:
    #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");
    }

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La variabile

    valore

    deve partire da 0
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.