Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - conversione da base 10 a base 16
Forum - C/C++ - conversione da base 10 a base 16

Avatar
grasszilla (Normal User)
Newbie


Messaggi: 4
Iscritto: 07/02/2013

Segnala al moderatore
Postato alle 21:17
Giovedì, 07/02/2013
buona sera a tutti ragazzi.
frequento il terzo anno di un istituto tecnico e ho quest'anno iniziato a studiare questo linguaggio.
il professore di informatica ha assegnato un problema sulla conversione di un numero decimale in un altra base di numerazione.
io sono riuscito a svolgere un algoritmo ma presenta ancora qualche problema.
Codice sorgente - presumibilmente C#

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <conio.h>
  4. int main()
  5. {
  6.         int n, a, risul=0, p=1, resto, base;
  7.         do
  8.         {
  9.                 printf("inserisci un numero in base 10 intero positivo :");
  10.                 scanf("%d", &n);
  11.         }while (n<=0 || n%1!=0);
  12.         do
  13.         {
  14.                 printf("inserisci una base di numerazione compresa tra 2 e 16 :");
  15.                 scanf("%d", &base);
  16.         }while (n<=0 || n%1!=0);
  17.         a=n;
  18.         do
  19.         {      
  20.                 resto=a%base;
  21.                 a=(int) a/base;
  22.                 risul=(risul+(resto*p));
  23.                 p=p*10;
  24.         }while (a>(base-1));
  25.         if (a!=0) risul=(risul+(a*p));
  26.         printf("\nil valore convertito in base %d equivale a %d ", base,risul);
  27.         getch();
  28.         return 0;
  29. }


il primo è che non converte in base due numeri superiori a 1023 (giustamente perchè l'ho dichiarato come intero... ma per ora non mi importa, l'importante è che funzioni l'algoritmo).
il secondo è che non so come mostrare le cifre della base 16 superiori a 9 come lettere.
voi che modifiche apportereste al codice?
grazie in anticipo per l'aiuto

Ultima modifica effettuata da grasszilla il 07/02/2013 alle 21:27
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:41
Giovedì, 07/02/2013
Ciao!

Una soluzione possibile, è quella di salvare il risultato su una stringa.

Ultima modifica effettuata da Poggi Marco il 07/02/2013 alle 23:55


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 318
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 11:25
Sabato, 09/02/2013
Già se dichiari come intero il numero convertito non potrai mai mettere a,b,c,d,e,f. Ma il prof ha proprio chiesto la base esadecimale? E poi come faresti con le altre basi?

Ultima modifica effettuata da tuttodiMC il 09/02/2013 alle 11:29


Assembly is the way
PM Quote
Avatar
grasszilla (Normal User)
Newbie


Messaggi: 4
Iscritto: 07/02/2013

Segnala al moderatore
Postato alle 13:57
Domenica, 10/02/2013
il prof ha chiesto di convertire un numero decimale nelle basi di numerazione che abbiamo studiato fino ad ora (da 2 a 16) utilizzando la tecnica delle divisioni successive).
per ora per quanto riguarda la gestione dei caratteri abbiamo studiato solo char, e abbiamo introdotto i vettori, ma solo a livello teorico.

PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 318
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 16:04
Lunedì, 11/02/2013
Allora io l'ho creato perciò:

Codice sorgente - presumibilmente Delphi

  1. funzione nome(n)
  2. dichiara vettore
  3. mentre n > 0 fai
  4. resto = n % 16
  5. se n < 10 allora
  6. inserisci in vettore resto
  7. se invece (elseif) n == 10 allora
  8. inserisci in vettore "A"
  9. se invece n == 11 allora
  10. inserisci in vettore "B"
  11. ...
  12. ...
  13. ...
  14. ...
  15. fine se
  16. n = arrotondamento-per-difetto-di(n / 16)
  17. fine while
  18. per i = numero-massimo-elementi-tabella, 1 , -1 (step) fai
  19. scrivi(t[i])
  20. fine per
  21. fine funzione



Questo è un pseudocodifica. Il prossimo l'ho fatto in Lua:

Codice sorgente - presumibilmente VB.NET

  1. function dec2hex(n)
  2.     local t = {}
  3.     while n > 0 do
  4.         resto = n % 16
  5.                 if resto < 10 then
  6.                         table.insert(t, resto)
  7.                 elseif resto == 10 then
  8.                     table.insert(t, "A")
  9.                 elseif resto == 11 then
  10.                     table.insert(t, "B")
  11.                 elseif resto == 12 then
  12.                     table.insert(t, "C")
  13.                 elseif resto == 13 then
  14.                     table.insert(t, "D")
  15.                 elseif resto == 14 then
  16.                     table.insert(t, "E")
  17.                 elseif resto == 15 then
  18.                     table.insert(t, "F")
  19.                 end
  20.                 n = math.floor(n / 16)
  21.         end
  22.         for i = #t, 1, -1 do
  23.             io.write(t[i])
  24.         end
  25. end
  26. io.write("Scrivi il numero da convertire:")
  27. numero = io.stdin:read'*number'
  28. dec2hex(numero)



Spero di averti aiutato. Usa questo genere di algorimo per tutte le basi sopra la 10. A me funziona alla perfezione.



Assembly is the way
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:43
Lunedì, 11/02/2013
Il c non è un linguaggio orientato agli oggetti, di conseguenza bisogna ragionare a basso livello.

Una soluzione potrebbe essere:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void)
  5. {
  6.   printf("Trasformatore di basi\n\n");
  7.   int n=0,base=0,pos,i;
  8.   char numero[30]="";
  9.   const char alfanumeri[]="0123456789ABCDEF"; // definisco una stringa costante
  10.                                                                        // che rappresenta le cifre
  11.   printf("Numero ");
  12.   scanf("%d", &n);
  13.   while (getchar() != '\n') ;
  14.   printf("Base ");
  15.   scanf("%d", &base);
  16.   while (getchar() != '\n') ;
  17.   i=0;
  18.   pos=0;
  19.   while (n>0)
  20.   {
  21.          pos=n % base;
  22.          numero[i++]=alfanumeri[pos];
  23.          n=(int) (n/base);
  24.   }
  25.   numero[i]='\0'; // agguingo il carattere terminatore
  26.   printf("--------------------------\nNumero: ");
  27.   i=strlen(numero); // calcolo la lunghezza della stringa
  28.   while (i>0)
  29.   {
  30.           printf("%c", numero[--i]); // stampo la stringa in ordine inverso
  31.   }
  32.   printf("\n\nFine... ");
  33.   while (getchar() != '\n') ;
  34.   return 0;
  35. }



Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 318
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 21:27
Martedì, 12/02/2013
Ahia ma perché non fate il C++ allora?


Assembly is the way
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:57
Martedì, 12/02/2013
Testo quotato

Postato originariamente da tuttodiMC:

Ahia ma perché non fate il C++ allora?

:-?
Non capisco la domanda. Per assurdo, perché non utilizzare la finzione itoa ?


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 318
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 17:57
Mercoledì, 13/02/2013
Intendevo dire: Perchè non studiano il C++ anzichè il C? Il C++ ha oggetti e classi.


Assembly is the way
PM Quote