Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #define NCHARS 100
- void main(void)
- {int b, c, nc, exp, n10, x, n; /*per utilizzare il programma è necessario utilizzare almeno sette variabili numeriche, pian piano verranno spiegate le modalità di utilizzo per ciascuna*/
- char str[NCHARS]; /*la variabile alfabetica permette invece di avviare i processi di conferma per l'utilizzatore*/
- printf("per utilizzare il programma bisogna tener conto delle seguenti condizioni:\n<non è possibile inserire tutte le cifre del numero da convertire in una volta;>\n<per numeri dotati di base superiore al dieci bisogna indicare la cifra in base alla sua posizione meno 1 (es. se avessimo base 20 e volessimo elencare tutte le possibili cifre, allora avremo: 0,1,2,...,18,19, per un totale di 20 differenti caratteri).>\n\n");
- {/*nella parte1 si chiede di inserire la base di partenza del numero. il comando while permette di iterare il processo finchè non si riceva una risposta accetabile*/
- parte1: printf("<dammi la base del numero di partenza>\n");
- scanf(" %d",&b);/*base di partenza*/
- x=0; /*la variabile permette al programma di elaborare la risposta*/
- while(x==0)
- {
- printf("<la base assegnata è %d, corretto? (s/n)>\n",b);
- scanf(" %s",str);
- switch(str[0])
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte1;
- break;
- default: printf("<carettere inserito non accettato>\n");
- x=0;
- break;
- }
- }
- }
- {/*nella parte2 si chiede di inserire il numero di cifre del numero. il comando while permette di iterare il processo finchè non si riceva una risposta accetabile*/
- parte2: printf("\n<dammi il numero di cifre del numero>\n");
- scanf("%d",&nc);/*numero di cifre del numero di partenza*/
- x=0;
- while(x==0)
- {
- printf("<il numero delle cifre è %d, corretto? (s/n)>\n",nc);
- scanf(" %s",str);
- switch(str[0])
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte2;
- break;
- default: printf("<carettere inserito non accettato>\n");
- x=0;
- break;
- }
- }
- }
- {/*nella parte3 si ricevono tutte le cifre del numero da convertire. impostando inizialmente n, exp e n10 pari a 0, si permette al programma di: tenere il conto delle cifre inserite (inzialmente 0); avere come fattore per le unità una certa potenza della base; iniziare il processo di conversione del numero dato convertendolo in sistema decimale.
- infatti avremo che convertendo ogni cifra in numero decimale sarà possibile effetuare la somma delle stesse: L'UNICA SOMMA NOTA AL PC È QUELLA DI BASE DECIMALE*/
- parte3: printf("\n<ora verrà richiesto di inserire le singole cifre partendo dalla cifra maggiore e scendendo fino alle unità. in caso di errore di digitazione dovrete immettere comunque il numero per intero. fatto ciò potrete eventualmente ripetere dall'inizio l'immisione del numero\nP.S.: SE IMMETTERAI UNA CIFRA NON COMPATIBILE CON LA BASE DI PARTENZA DOVRAI REINSERIRE TUTTE LE CIFRE DA CAPO>\n");
- n=0;/*tiene il conto del numero di cifre inserite (inizialmente 0)*/
- exp=nc-1;/*esponente della base, relativo alla cifra del numero, ricordiamo che tale esponente può variare da 0 a (nc-1)*/
- n10=0;/*il numero viene convertito in base decimale che aumenta di valore all'aumentare del numero di cifre immesse*/
- /*qui è stata introdotta una parte superflua, infatti la presenza di if-else permette di scrivere una frase diversa per la prima cifra rispetto a quella per le successive, giusto per avere una massima chiarezza. così, nel caso in cui l'utente fosse riportato alla parte3, avrà un quadro più chiaro della situazione*/
- while(n<nc)
- {if(n==0)
- {printf("<dammi la prima cifra>\n");
- scanf("%d",&c);/*salvataggio per ciascuna cifra*/
- {if(c<b)
- {printf("la cifra immessa è <%d>\n",c);
- n=n+1;
- n10=n10+c*(pow(b,exp));
- exp=exp-1;
- }
- else
- {printf("<un numero di base %d non può avere %d come cifra!!! riscrivi TUTTE le cifre da capo>\n", b, c);
- goto parte3;
- }
- }
- }
- else
- {printf("<dammi la cifra successiva>\n");
- scanf("%d",&c);
- if(c<b)
- {printf("la cifra immessa è <%d>\n",c);
- n=n+1;
- n10=n10+c*(pow(b,exp));
- exp=exp-1;
- }
- else
- {printf("<un numero di base %d non può avere %d come cifra!!! riscrivi TUTTE le cifre da capo>\n\n", b, c);
- goto parte3;
- }
- }
- }
- x=0;
- while(x==0)
- {printf("<le cifre inserite sono corrette? (s/n)>\n");
- scanf(" %s",str);
- switch(str[0])
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte3;
- break;
- default: printf("<carettere inserito non accettato>\n");
- x=0;
- break;
- }
- }
- }
- {/*ora verrà richiesto di inserire la base del nuovo numero*/
- parte4: printf("\n<inserire il numero della nuova base da assegnare al numero>\n");
- scanf("%d",&b);/*da qui in poi, molto spesso, sovrascriveremo i vecchi valori ad eccezione di n10*/
- x=0;
- while(x==0)
- {
- printf("<la base assegnata è %d, corretto? (s/n)>\n",b);
- scanf(" %s",str);
- switch(str[0])
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte4;
- break;
- default: printf("<carettere inserito non accettato>\n");
- x=0;
- break;
- }
- }
- }
- {parte5: exp=0;
- n=0; /*il numero n permetterà al programma di capire quale potenza affianca ciscun numero. se non si procedesse così nel caso di cifre nulle si potrebbero riscontrare diversi problemi*/
- printf("\nil numero desiderato è: \n");
- x=0; /*in numero x non ci servirà più come complementare di a, infattii non ha iù senso richiedere o meno all'esecutore conferme. ottenuta una cifra del nuovo numero, salveremo nello slot x la quantità da sottrarre al numero in base decimale 'n10' necessaria ad eliminare tutte le cifre finora inserite*/
- nc=1; /*indica il numero di cifre che avrà il risultato*/
- for(c=n10;c>=b;c=(c-c%b)/b,nc=nc+1);
- c=n10;
- n=nc;
- while(n!=0)
- {for(;exp<n-1;exp=exp+1,c=(c-c%b)/b);
- printf("%d ",c);
- x=x+c*pow(b,exp);
- c=n10-x;
- exp=0;
- n=n-1;
- }
- }
- printf("\n");
- END: printf("ciao, alla prossima!\n\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement