PDA

View Full Version : [C] Cambio di base


Manugal
05-11-2005, 10:58
Ciao a tutti........ :D

Sono di fronte a questo problema:

Scrivere un programma che dato in input un numero n in base 10 e un base b
maggiore o uguale di 2, converte n in base b.

Io avevo fatto una cosa del genere, però ho visto che non va:



#include <stdio.h>

int main(void){

int num,base,i=0,val=0;

printf("Inserisci numero: ");
scanf("%d", &num);
printf("Inserisci la base: ");
scanf("%d", &base);

for( ; num>0; num/=base, ++i)
if(num%base)
val+=pow(base,i);

printf("%d", val);

return 0;
}



Potete darmi qualche dritta??? Grazie :)

cionci
05-11-2005, 11:37
Il programma deve convertire secondo un alfabeto di cifre...ed il numero convertito non può che essere un vettore di interi (o al limiti sfruttando un alfabeto ongi intero può essere convertito in un carattere)...con ogni intero che rappresenta una cifra del numero convertito...

Manugal
05-11-2005, 11:44
Ehm non ho capito molto :what:

Cioè l'algoritmo che ho usato io non va bene. A me interessa sapere anche quello, perché se devo convertire da base 10 a una base maggiore di 10 mi serve un certo algoritmo mentre se è minore me ne serve un altro.

cionci
05-11-2005, 11:56
Cioè l'algoritmo che ho usato io non va bene. A me interessa sapere anche quello, perché se devo convertire da base 10 a una base maggiore di 10 mi serve un certo algoritmo mentre se è minore me ne serve un altro.
No...serve sempre lo stesso algoritmo...

Le cifre che ottieni dalla conversione non puoi rimetterle in un intero... O te le stampi volta volta oppure le metti in un vettore di interi...

Il numero di cifre che servono per rappresentare un numero naturale N in base Beta è pari all'intero superiore di logaritmo in base Beta di N...

Manugal
05-11-2005, 12:19
Quindi l'algoritmo che ho usato io va bene solamente che devo rappresentare ogni cifra nell' i-esima posizione di un vettore. Giusto?=

cionci
05-11-2005, 13:01
In generale il tuo algoritmo non va bene ;)

int exp = log(numero) / log(base);
int max = pow(base, exp);

while(max > 0)
{
cifra[exp] = numero / max;
numero %= max;
exp--;
max /= base;
}

Manugal
05-11-2005, 15:24
Grazie ancora non vedo lo spoiler :) vorrei riuscirci da solo...

Ho provato a buttare giù questo:



#include <stdio.h>

#define N 32

int main(void){

int num,base,i;
int a[N]={0};

printf("Inserisci numero: ");
scanf("%d", &num);
printf("Inserisci la base: ");
scanf("%d", &base);

for(i=N; num>0, i>0; --i){
a[i]=num%base;
num/=base;
}

printf("La rappresentazione in base %d è: ", base);
for(i=0; i<N; ++i)
printf("%d", a[i]);

return 0;
}



Però non mi viene bene. Non è che ho sbagliato l'algoritmo? Eppure ho visto che l'algoritmo per convertire da base 10 a base N è che devo ripetutamente dividere il num per N e prendere i resti al contrario.

cionci
05-11-2005, 15:34
int a[N]={0};

Questo non azzera il vettore...

Manugal
05-11-2005, 15:42
Si si ho provato personalmente. Non mettendo niente mi vengono tutti numeri strani. Se lo metto invece mi visualizza correttamente tutti 0. Anche sul mio libro c'è scritto che per azzerarlo si usa quell'istruzione. Il problema è un altro è che credo che non mi calcoli correttamente il valore nella base b.

cionci
05-11-2005, 15:45
Si si ho provato personalmente. Non mettendo niente mi vengono tutti numeri strani. Se lo metto invece mi visualizza correttamente tutti 0. Anche sul mio libro c'è scritto che per azzerarlo si usa quell'istruzione.
Strano, non mi torna molto... Che libro usi ?

cionci
05-11-2005, 15:51
Funziona, ma io suppongo che dipenda dall'implementazione del compilatore...
Ad esempio se scrivi:

int a[10] = {5};

non ti inizializza tutti gli elementi a 5, ma solo giustamente il primo. gli altri a 0...

Manugal
05-11-2005, 15:51
C - Didattica e Programmazione di Al Kelley e Ira Pohl. COnforme allo standard ANSI C.

Ma perché pensi sia questo il problema?

Manugal
05-11-2005, 15:52
Infatti dipende dal compilatore (per quanto riguarda gli array automatici come questo)

cionci
05-11-2005, 15:52
No, non penso che sia quello il problema, ma mi interessava questo aspetto...

Manugal
05-11-2005, 15:54
Ma l'algoritmo che ho usato è giusto? A me sembra di si. Però se provo ad esempio a dargli come numero 13 e poi a dargli come base 2 mi da 110 :confused:

cionci
05-11-2005, 15:57
Aspetta...guardo meglio...

cionci
05-11-2005, 16:05
Prova con altre, ad esempio 1548 in base 16....

Manugal
05-11-2005, 16:17
Ho provato ora mi viene 60

cionci
05-11-2005, 16:20
Questo perchè inizializzi i a N invece di N-1... Controlla ora...

Manugal
05-11-2005, 16:23
E' vero ora tornano i risultati :)

E perché dovevo inizializzarlo a N-1 se devo partire dall'ultima posizione dell'array?

cionci
05-11-2005, 16:25
Perchè gli indici di un array di N elementi vanno da 0 a N-1...
Comunque riprova 1548 in base 16, che ti ricordo è 0x60C...

Manugal
05-11-2005, 16:28
Ho capito grazie ;)

Il fatto è che devo mettere una condizione per dirgli che quando sta trattando la base 16 deve stampare il numero in notazione esadecimale, cioè anche con le lettere. Come faccio a dirgli questo?

cionci
05-11-2005, 16:29
Scordati di questo, ci pensi dopo ed è banale...l'algoritmo è sbagliato...
Dovrebbe fare male il calcolo per 1548...

Manugal
05-11-2005, 16:33
1548 in base 16 mi viene 6012.

cionci
05-11-2005, 16:40
Ok perfetto torna...

Ora ti spiego come si fa a fare un alfabeto...

cionci
05-11-2005, 16:43
Ecco un indizio:

char alfabeto[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

Con questo alfabeto potresti arrivare a base 62... Come fai a convertire ogni cifra ?

Manugal
05-11-2005, 16:44
Ok però facendo riferimento a questo alfabeto devo cambiare tutto l'algoritmo.

cionci
05-11-2005, 16:49
Assolutamente no.. E' un passaggio talmente semplice che non ti immagini nemmeno...

Manugal
05-11-2005, 16:53
Non riesco a capire come fare a dirgli che se numero%base è uguale a 10 allora devo prendere la A, se è uguale a 11 la B e così via.....

cionci
05-11-2005, 16:57
Prova a pensare cosa è 11 all'interno della stringa rispetto alla lettere B...

Manugal
05-11-2005, 17:03
11 corrisponde alla posizione dove è B nell'array. Però questo non mi dice nulla. :what:

cionci
05-11-2005, 17:05
Tu cosa hai nel vettore di interi alla fine della conversione se 11 è l'indece di B ?

Manugal
05-11-2005, 17:11
Alla fine della conversione devo avere B. Ma come faccio a farlo corrispondere....

cionci
05-11-2005, 17:17
Che ti viene in mente se ti scrivo alfabeto[a[i]] ?

Manugal
05-11-2005, 17:22
Aaaah ecco. Embè che se po fa così? :D

Però il problema rimane perché a[i]=numero%base. Ma numero%base se viene ad esempio 0 come faccio a dirgli che deve prendere lo 0 dall'alfabeto?

cionci
05-11-2005, 17:23
Sì...nella stampa...

Manugal
05-11-2005, 17:25
Però il problema rimane perché io ho a[i]=numero%base, ma numero%base se viene ad esempio 0 come faccio a dirgli che deve prendere lo 0 dall'alfabeto?

P.S: Ho provato ad esempio a fare 1548 in base 16 e mi vengo tutti 48484848

cionci
05-11-2005, 17:32
Se a[i] = 0, alfabeto[a[i]] è '0'...

Metti il modificatore di stampa %c e togli %d...

Manugal
05-11-2005, 17:35
Hai perfettamente ragione ora ho capito e funziona tutto ;)

Grazie mille per la tua disponibilità sempre molto gentile :)

Ciao.