Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] cambio di base

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87

    [C] cambio di base

    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....... 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..

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        int i,j,grado,graux,Nelem,rest,result,a,mult,B1,B2,count;
        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;
    }

    ...... odio i cambi di base

  2. #2
    Utente di HTML.it L'avatar di ace.
    Registrato dal
    Oct 2013
    Messaggi
    6
    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ù

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quote Originariamente inviata da Satiro88 Visualizza il messaggio
    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.
    codice:
    do {
         mult=mult*B1;
         graux--;
    } while(graux!=0); 
    graux=grado;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    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!
    Ultima modifica di Satiro88; 27-10-2013 a 20:52

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    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......
    Ultima modifica di Satiro88; 28-10-2013 a 16:19

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    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
    Ultima modifica di Satiro88; 28-10-2013 a 20:15

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.