PDA

Visualizza la versione completa : [C] cambio di base


Satiro88
27-10-2013, 18:57
Ciao a tutti,dovrei realizzare un programma che,come da titolo,cambi la base di un certo numero intero,per esempio in base 10,in un'altra base compresa tra 1 e 9.
Sono un pò confuso perchè si stanno presentando degli errori strani.
Iniziavo assegnando ad un vettore i vari resti,quindi stampo col for per vedere cosa mi ha calcolato e mi stampa i valori al contrario,inverto il for e mi stampa gli stessi identici valori.
Allora provo a mettere una printf prima all'interno del do-while e ora dentro al vettore ci sono solo zeri.
Quindi ho ripristinato il for e ora mi stampa solo zero.......:dhò: che caspita sta succedendo?ho scoperto una dimensione alternativa?
Il codice,ancora in fase di costruzione è qua sotto.
Il secondo if è anche peggio,non capisco perchè quando entra in quell'if,precisamente quando raggiunge il do-while il processore inizia a lavorare come un pazzo e non conclude nulla.
Ho provato con il classico pezzo di carta e matita ma a me sembra che i calcoli siano corretti......
Non so che pesci pigliare sinceramente....
Grazie mille a tutti..




#include <stdio.h>
#include <stdlib.h>


int main()
{
int i,j,grado,graux,Nelem,rest,result,a,mult,B1,B2,cou nt;
int vect[20]={0};

printf("\n\n indicare base del numero scelto\n");
scanf("%d",&B1);

printf("\n\n indicare base in cui convertire il numero scelto \n\n");
scanf("%d",&B2);

if(B1>B2)
{
printf("\n\n inserire numero scelto \n\n");
scanf("%d",&a);

i=0;
count=0;
do
{
rest=a%B2;
vect[i]=rest;
a=a/B2;
i++;
count++;
printf("%d",rest);
}
while(a!=0);
for(j=0;j<count;j++)
{
printf(" %d ",vect[i]);
}
}
if(B1<B2)
{
printf("\n\n quante cifre contiene? \n\n");
scanf("%d",&Nelem);
grado=Nelem-1;
graux=grado;

printf("\n\n inserire cifre\n\n");
for(i=0;i<Nelem;i++)
{
scanf("%d",&vect[i]);
}

for(i=0;i<Nelem;i++)
{
mult=1;
do
{
mult=mult*B1;
graux--;
}
while(graux!=0);

vect[i]=vect[i]*mult;
}

result=0;
for(i=0;i<Nelem;i++)
{
result=result+vect[i];
}

}

system("pause");
return 0;
}





......:cry: odio i cambi di base

ace.
27-10-2013, 19:34
così a prima vista direi che per il primo problema hai sbagliato a scrivere l'indice del vettore nel for che non è "i" ma "j". Inoltre in quel modo stampi normalmente il vettore quindi o lo riempi al contrario oppure lo stampi al contrario riempiendolo normalmente. Poi sono inutili 2 contatori, puoi tranquillamente togliere "count" e utilizzare al suo posto "i". (tutto questo per quanto riguarda il primo if)

Ora non posso provare il codice ma appena ne avrò la possibilità spero di saperti dire di più :)

shodan
27-10-2013, 19:39
Il secondo if è anche peggio,non capisco perchè quando entra in quell'if,precisamente quando raggiunge il do-while il processore inizia a lavorare come un pazzo e non conclude nulla.

Devi reinizializzare graux altrimenti per uscire dal do while devi aspettare che la cpu calcoli 8 miliardi e rotti di interi.


do {
mult=mult*B1;
graux--;
} while(graux!=0);
graux=grado;

Satiro88
27-10-2013, 19:41
che pirla devo essere fuso,count di solito lo tengo anche se è inutile perchè quando costruisco voglio tenermi largo XD poooi si pensa all'ottimizzazione.Comunque grazie,non l'avrei mai notato, se c'è altro spara pure senza peli sulla lingua.Grazie anche per il do-while,il mio cervello impazzisce a fare due cose contemporaneamente...imbarazzante...grazie!

Satiro88
28-10-2013, 15:12
risolto,purtroppo è solo una piccola parte del programma perchè devo fare un programma che mi permetta di passare prima da una base qualsiasi compresa tra 2 e 9 a una qualsiasi sempre compresa tra 2 e 9 e penso di avere un'idea,per esempio se voglio passare da base 3 a base 7 potrei metterlo prima in base 10 e poi in base 7 senza quasi aggiungere calcoli a quello che ho scritto.Il poblema viene con la versione estesa del programma ovvero passare da una base qualsiasi ad un'altra,senza limiti......esiste qualche barbatrucco?tipo metterlo in una base "più semplice" e poi calcolare...Premetto che non posso usare funzioni o procedure......

Satiro88
28-10-2013, 19:09
ora ho un problema anche più grosso.... se l'utente per esempio vuole passare da esadecimale a decimale, come si fa con le lettere?cioè se uno mette 12B come faccio a far capire al pc che B=11?

nuovo record,due pomeriggi per 3/4 di programma.. non sono degno di questo forum faccio pietà

cmq, pensavo, se uno inserisce una lettera e questa lettera la faccio finire in un vettore di interi.. questa dovrebbe convertirsi automaticamente (un cast non proprio esplicito) nel corrispondente intero ascii.A quel punto forse potrei inserire all'interno del vettore il seguente calcolo (presumendo che qualcuno inserisca c minuscola)

b=99 -> 99-97=2 ->10+2=12 -> vect[i]=12

oregon
28-10-2013, 20:41
Per l'input di un valore esadecimale devi usare un array di char e fare una semplice conversione dall'ASCII facendo dei test su ogni carattere per capire se sono nel range 0 ... 9 oppure A ... F

Scara95
28-10-2013, 20:55
Un metodo più semplice è chiedere la base di partenza, partire con una variabile impostata a 0, leggere una cifra alla volta moltiplicando la variabile per la base e aggiungendo la cifra. Così, terminata la lettura, avrai già il numero in decimale e ti basta implementare l'altra conversione...

Loading