[C] Conversione da decimale a esadecimale

di il
38 risposte

38 Risposte - Pagina 2

  • Re: [C] Conversione da decimale a esadecimale

    Comunque questa è la soluzione
    #include <stdio.h>
    void main()
    {
    	int i;
    	for (i = 1; i <= 256; i++)
    		printf("%d %o %X\n", i, i, i);
    }
  • Re: [C] Conversione da decimale a esadecimale

    Penso anch'io che chi ha richiesto l'esercizio volesse una cosa del genere, anche se bisogna dire che manca il binario.

    P.S. int main() più che void main().
  • Re: [C] Conversione da decimale a esadecimale

    AldoBaldo ha scritto:


    P.S. int main() più che void main().
    Mi aspettavo questa osservazione da loopunrolling!
  • Re: [C] Conversione da decimale a esadecimale

    Non mi pare una gran soluzione: come segnalato il binario dov'è?
    E, inoltre, "valgono" le funzioni ricorsive?
    E gli "impacchettamenti" fittizi (cioè binari negli interi base 10?)
  • Re: [C] Conversione da decimale a esadecimale

    Non è una questione di essere o no una "gran soluzione".

    +m2+ non riesci a stare sulla terra e limitarti a quello che chiedono i professori agli studenti che stanno iniziando adesso?
  • Re: [C] Conversione da decimale a esadecimale

    oregon ha scritto:


    Non è una questione di essere o no una "gran soluzione".

    +m2+ non riesci a stare sulla terra e limitarti a quello che chiedono i professori agli studenti che stanno iniziando adesso?
    Non è una soluzione.
    Ne grande ne piccola.
    il testo chiede la conversione binaria
    Io ancora non la ho vista.
    Se il professore la chiede è lo studente non la fa c'è poco da disquisire
  • Re: [C] Conversione da decimale a esadecimale

    Ovvio che la conversione binaria deve essere ancora fatta ma non per questo il resto proposto è da giudicare come "grande" o "piccola" soluzione. E' quello che viene richiesto.

    In pratica il professore gli ha detto come fare velocemente per l'ottale e l'esadecimale e si aspetta il codice per il binario.
  • Re: [C] Conversione da decimale a esadecimale

    Sui libri sul C che m'è capitato di leggere ho sempre trovato la "solita" conversione in stringa con rappresentazione binaria di un numero tramite divisione, modulo e successivo rovesciamento della stringa risultante. Non ricordo invece esattamente dove ma sicuramente da qualche parte sul web trovai una soluzione che mi stupì, tanto da indurmi a conservarla. So benissimo che non è adatta come soluzione per l'esercizio proposto (troppo "criptica"), però mi piace proporvela ugualmente perché da eterno principiante l'ho trovata e la trovo ingegnosa:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef unsigned short tipo_n;
    
    char *str_binario( tipo_n n ) {
        static char s[sizeof(tipo_n)*8+1];
        int i, j; // contatori
    
        for( i=0, j=sizeof(tipo_n)*8-1; j>=0 ; i++, j-- )
            s[i] = (1<<j)&n ? '1' : '0'; // appone le cifre 1 e 0
        s[i] = '\0'; // termina la stringa
    
        return s; // restituisce la stringa statica
    }
    
    int main() {
        tipo_n n = 65535;
        printf( "%d = %s\n\n", n, str_binario(n) );
        return 0;
    }
  • Re: [C] Conversione da decimale a esadecimale

    AldoBaldo, io ho cancellato la mia risposta per non confondere l'OP, pertanto credo che sia opportuno che anche tutti gli altri evitino soluzioni non contemplate dalla consegna. Piuttosto aprì un topic in cui chiedi soluzioni più ingegnose al problema oggetto del presente thread.

    Ad ogni modo all'OP non pare interessato perché sembra essere riuscito nel suo intento di avere tra le mani un programmino che "just works". Inutile proseguire.
  • Re: [C] Conversione da decimale a esadecimale

    Mah io il programmino non lo vedo.
    per la conversione binaria ci sono approcci carini
    Senza stringhe
    Ricorsiva
    Con stringhe
    Con duplice conversione con funzione di libreria
    Iterativi
    Con shift
    Con alfabeto dei simboli
    Insomma chi più ne ha ne metta.
    Non so quale predilige il docente.
    Ma se la scuola non è cambiata troppi se ti chiedono un esercizio con 3 risultati uno che ne fornisce due non è una gran soluzione.
  • Re: [C] Conversione da decimale a esadecimale

    @loopunrolling

    Lungi da me l'intenzione di confondere alcuno! Infatti ho specificato in premessa che non si adatta gran che alla richiesta specifica. Mi sembra un procedimento curioso, più che altro nella formulazione, tutto qui.

    @m2

    Con duplice conversione con funzione di libreria
    Con alfabeto dei simboli


    Queste mi mancano! In cosa consistono?

    Ogni cosa in più della quale si parla è qualcosa che se prima non conoscevo, dopo rischio di conoscere un po' di più (o almeno di sapere che esiste).
  • Re: [C] Conversione da decimale a esadecimale

    Prima di tutto chiedo scusa a tutti ma, abbiate pazienza, la mia mente ha eliminato 'binario' dal testo che stavo leggendo e quindi ho semplificato troppo il problema. Detto questo appena avrò accesso ad un pc butterò giù una funzione pet trasformare un intero in una stringa contenente il numero in binario. Buona e serena giornata a tutti
  • Re: [C] Conversione da decimale a esadecimale

    Ecco qui sotto la conversione binaria.
    Nota: per il valore 256 non viene stampata alcuna rappresentazione binaria, volutamente; lascio all'OP capirne il motivo e trovarne una soluzione
    #include <stdio.h>
    #include <string.h>
    
    int IntToBinStr(int valin, char *strout, int dimstr)
    {
    	int i = 0;
    	int len = 0;
    	char c;
    
    	do
    	{
    		if (valin % 2)
    			strout[i] = '1';
    		else
    			strout[i] = '0';
    		valin = valin / 2;
    		i++;
    
    		if (i == (dimstr - 1))	/* verifichiamo di non sforare */
    			break;
    	} while (valin > 0);
    
    	len = i;
    
    	if (valin > 0)	/* se siamo usciti senza poter esprimere tutti i bit*/
    	{
    		strcpy(strout, "");
    		return 0;
    	}
    	else
    	{
    		strout[i] = 0; /* termina stringa */
    		
    		/* invertiamo */
    		for (i = 0; i < len / 2; i++)
    		{
    			c = strout[i];
    			strout[i] = strout[len-i-1];
    			strout[len-i-1] = c;
    		}
    	}
    	
    	return 1;
    }
    
    void main()
    {
    	int i;
    	char binstr[9];
    
    	for (i = 0; i <= 256; i++)
    	{
    		IntToBinStr(i, binstr, 9);
    		printf("%d %o %X %s\n", i, i, i, binstr);
    	}
    }
  • Re: [C] Conversione da decimale a esadecimale

    Personalmente ho optato per una soluzione diversa nella quale, anziché ricorrere alle conversioni di libreria di stdio.h e a una funzione "personalizzata" che si occupa solo della conversione in binario, ho usato una funzione "generica" per convertire un valore int qualsiasi in un sistema di numerazione a base qualsiasi (purché compresa tra 2 e 36, dove 36 e' il massimo delle cifre disponibili usando solo i caratteri alfanumerici). Ho previsto per il valore int una dimensione fino a un massimo di 64 bit, ma è facile modificare la funzione per adattarla a dimensioni maggiori.

    Non che sia meglio o peggio, però a me è venuta in mente così.
    #include <stdio.h>
    #include <string.h>
    
    #define RIGA_VERT   179
    
    const char *int2str( int n, int base );
    
    int main() {
        int n;
    
        printf( " %c  ESADECIMALE  %c  DECIMALE  %c  OTTALE  %c   BINARIO  %c\n",
                RIGA_VERT, RIGA_VERT, RIGA_VERT, RIGA_VERT, RIGA_VERT );
    
        for( n=1; n<=256; ++n ) {
            printf( " %c%8s      ", RIGA_VERT, int2str(n,16) );
            printf( " %c%7s    ",   RIGA_VERT, int2str(n,10) );
            printf( " %c%6s   ",    RIGA_VERT, int2str(n, 8) );
            printf( " %c%10s  ",    RIGA_VERT, int2str(n, 2) );
            printf( "%c\n", RIGA_VERT );
        }
    
        return 0;
    }
    
    /*==============================================================================
    Converte il valore intero n nella sua rappresentazione in forma di stringa,
    secondo la base di numerazione specificata tramite il parametro base.
    Ammette basi di numerazione comprese tra 2 e 36 e dimensioni del tipo int fino
    a 64 bit.
    Se tutto va a buon fine restituisce il puntatore ad uno spazio di memoria
    statica che contiene la stringa risultante dalla conversione.
    Se viene passata una base di numerazione esterna ai limiti previsti restituisce
    il puntatore ad uno spazio di memoria statica che contiene la stringa "(base non
    valida)".
    Se il tipo int ha dimensioni maggiori di 64 bit restituisce il puntatore ad uno
    spazio di memoria statica che contiene la stringa "(dimensioni tipo int
    eccessive)".
    ==============================================================================*/
    
    const char *int2str( int n, int base ) {
        static const char kCifre[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        static char s[72] = ""; // contiene allegramente un binario fino a 64 bit
    
        if( (base>1&&base<37) && (sizeof(int)*8<=64) ) {
            int negativo = n<0; // memorizza il segno
            int i, j;
    
            n = negativo ? -n : n; // valore assoluto
    
            // imposta la stringa secondo la base di numerazione indicata
            // (viene inizialmente creata con le cifre "all'indietro")
    
            for( i=0; n>0; ++i ) {
                s[i] = kCifre[n%base];
                n /= base;
            }
    
            // appone il segno negativo, se necessario
            if( negativo ) s[i++] = '-';
    
            s[i] = '\0'; // termina la stringa
    
            // "rovescia" la stringa
            for( j=0; j<i/2; ++j ) {
                char tmp = s[j];
                s[j] = s[i-j-1];
                s[i-j-1] = tmp;
            }
        }
        else {
            if( base>1 && base<37 )
                strcpy( s, "(base non valida)" );
            else strcpy( s, "(dimensioni tipo int eccessive)" );
        }
    
        return s;
    }
    
  • Re: [C] Conversione da decimale a esadecimale

    AldoBaldo ha scritto:


    Con duplice conversione con funzione di libreria
    
    #include <stdio.h>
    #include <stdlib.h>
    unsigned int ricorsione(unsigned int i_valore) 
    {
        return (!i_valore||!(i_valore-1)?i_valore:((i_valore%2)+10*ricorsione(i_valore/2)));
    }
    void main()
    {
     char convertito[10];
      printf("secondo modo (doppia conversione binaria-10)\n");
      for (unsigned int i=1;i<=256;i++)
          printf("%.03d %.09d\n",i,atoi(itoa(i,convertito,2)));
    
     printf("secondo modo (ricorsivo)\n");
     for (unsigned int i=1;i<=256;i++)
          printf("%.03d %.09d\n",i,ricorsione(i));
    
    }
    
    Con alfabeto dei simboli
    Queste mi mancano! In cosa consistono?
    E' una variante di quella che hai messo proprio tu
    Ogni cosa in più della quale si parla è qualcosa che se prima non conoscevo, dopo rischio di conoscere un po' di più (o almeno di sapere che esiste).
    La mia preferita è la ricorsiva-binaria-decimale, una variazione di quella che ho messo sopra.
    Ovviamente in ambito didattico (o linguaggi funzionali), non certo come metodo "normale".
    Insomma, qualcosa per far "sbavare" i docenti

    Non so dire quale sia più indicata per la domanda, bisognerebbe sapere quale sia l' "impronta" che il docente vuole dare.

    La versione breve è: qualsiasi, basta che il binario salti fuori
Devi accedere o registrarti per scrivere nel forum
38 risposte