grasszilla (Normal User)
Newbie
Messaggi: 4
Iscritto: 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# |
#include <iostream> #include <stdio.h> #include <conio.h> int main() { int n, a, risul=0, p=1, resto, base; do { printf("inserisci un numero in base 10 intero positivo :"); scanf("%d", &n); }while (n<=0 || n%1!=0); do { printf("inserisci una base di numerazione compresa tra 2 e 16 :"); scanf("%d", &base); }while (n<=0 || n%1!=0); a=n; do { resto=a%base; a=(int) a/base; risul=(risul+(resto*p)); p=p*10; }while (a>(base-1)); if (a!=0) risul=(risul+(a*p)); printf("\nil valore convertito in base %d equivale a %d ", base,risul); getch(); return 0; }
|
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 |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
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 |
|
tuttodiMC (Normal User)
Expert
Messaggi: 327
Iscritto: 29/10/2012
|
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 |
|
grasszilla (Normal User)
Newbie
Messaggi: 4
Iscritto: 07/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.
|
|
tuttodiMC (Normal User)
Expert
Messaggi: 327
Iscritto: 29/10/2012
|
Allora io l'ho creato perciò:
Codice sorgente - presumibilmente Delphi |
funzione nome(n) dichiara vettore mentre n > 0 fai resto = n % 16 se n < 10 allora inserisci in vettore resto se invece (elseif) n == 10 allora inserisci in vettore "A" se invece n == 11 allora inserisci in vettore "B" ... ... ... ... fine se n = arrotondamento-per-difetto-di(n / 16) fine while per i = numero-massimo-elementi-tabella, 1 , -1 (step) fai scrivi(t[i]) fine per fine funzione
|
Questo è un pseudocodifica. Il prossimo l'ho fatto in Lua:
Codice sorgente - presumibilmente VB.NET |
function dec2hex(n) local t = {} while n > 0 do resto = n % 16 if resto < 10 then table.insert(t, resto) elseif resto == 10 then table.insert(t, "A") elseif resto == 11 then table.insert(t, "B") elseif resto == 12 then table.insert(t, "C") elseif resto == 13 then table.insert(t, "D") elseif resto == 14 then table.insert(t, "E") elseif resto == 15 then table.insert(t, "F") end n = math.floor(n / 16) end for i = #t, 1, -1 do io.write(t[i]) end end io.write("Scrivi il numero da convertire:") numero = io.stdin:read'*number' dec2hex(numero)
|
Spero di averti aiutato. Usa questo genere di algorimo per tutte le basi sopra la 10. A me funziona alla perfezione.
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Il c non è un linguaggio orientato agli oggetti, di conseguenza bisogna ragionare a basso livello.
Una soluzione potrebbe essere:
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <string.h> int main(void) { printf("Trasformatore di basi\n\n"); int n=0,base=0,pos,i; char numero[30]=""; const char alfanumeri[]="0123456789ABCDEF"; // definisco una stringa costante // che rappresenta le cifre printf("Numero "); scanf("%d", &n); while (getchar() != '\n') ; printf("Base "); scanf("%d", &base); while (getchar() != '\n') ; i=0; pos=0; while (n>0) { pos=n % base; numero[i++]=alfanumeri[pos]; n=(int) (n/base); } numero[i]='\0'; // agguingo il carattere terminatore printf("--------------------------\nNumero: "); i=strlen(numero); // calcolo la lunghezza della stringa while (i>0) { printf("%c", numero[--i]); // stampo la stringa in ordine inverso } printf("\n\nFine... "); while (getchar() != '\n') ; return 0; }
|
|
|
tuttodiMC (Normal User)
Expert
Messaggi: 327
Iscritto: 29/10/2012
|
Ahia ma perché non fate il C++ allora?
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Postato originariamente da tuttodiMC:
Ahia ma perché non fate il C++ allora? |
Non capisco la domanda. Per assurdo, perché non utilizzare la finzione itoa ? |
|
tuttodiMC (Normal User)
Expert
Messaggi: 327
Iscritto: 29/10/2012
|
Intendevo dire: Perchè non studiano il C++ anzichè il C? Il C++ ha oggetti e classi.
|
|