Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- void main(void)
- {int b, c, nc, exp, n10, x, n; /*b indica la base del numero, inizialmente sarà la base del numero di partenza, in seguito lo sovrascrivamo per salvare la base del numero desiderato; nb sarà utilizzato per salvare ciascuna cifra inserita gradualmente del numero iniziale, in seguito serivirà; c1 indica il numero di cifre del primo umero; exp funge da esponente per la base b1, grazie a questo potremo inizialmente convertire il numero in sistema decimale; x sarà uno slot occasionale che affiancherà lo slot 'a' per registrare le risposte di conferma dell'uttilizzatore; nc1 sercirà per tenere conto delle cifre immesse dall'utilizzatore; nc2 cifre del numero desisderato di base b2*/
- char a;
- 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;
- while(x==0)
- {
- printf("la base assegnata è %d, corretto? (s/n) \n",b);
- scanf(" %c",&a);
- switch(a)
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte1;
- break;
- default: printf("carettere inserito non accettato");
- 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("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(" %c",&a);
- switch(a)
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte2;
- break;
- default: printf("carettere inserito non accettato");
- x=0;
- break;
- }
- }
- }
- {/*nella parte3 si ricevono tutte le cifre del numero da convertire. impostando inizialmente nc1, 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; partire con il cercato numero decimale pari a 0, in modo tale da poter sommare progressivamente ogni cifra fornita. in seguito ciascuna cifra viene convertita in numero decimale IN QUANTO L'UNICA SOMMA NOTA AL PC È QUELLA DI BASE DECIMALE*/
- parte3: printf("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*/
- exp=nc-1;/*esponente della base, relativo alla cifra del numero*/
- n10=0;/*il numero viene convertito in base 10*/
- /*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", b, c);
- goto parte3;
- }
- }
- }
- x=0;
- while(x==0)
- {printf("le cifre inserite sono corrette? (s/n) \n");
- scanf(" %c",&a);
- switch(a)
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte3;
- break;
- default: printf("carettere inserito non accettato");
- x=0;
- break;
- }
- }
- }
- {parte4: printf("inserire il numero della nuova base da assegnare al numero\n");
- scanf("%d",&b);
- x=0;
- while(x==0)
- {
- printf("la base assegnata è %d, corretto? (s/n) \n",b);
- scanf(" %c",&a);
- switch(a)
- {case 's':
- case 'S': x=1;
- break;
- case 'n':
- case 'N': x=2;
- goto parte4;
- break;
- default: printf("carettere inserito non accettato");
- x=0;
- break;
- }
- }
- }
- {parte5: exp=0;
- n=0; /*il valore salvato in n avrà un ruolo completamente diverso da quello assunto finora. ottenuta la prima cifra del nuovo numero, salveremo nello slot n la quantità da sottrarre al numero in base decimale 'n10', necessaria ad eliminare la cifra più grande.*/
- c=n10; /*ora utilizzeremo c per salvere ciascuna cifra ottenuta gradualmente*/
- printf("\nil numero desiderato è: \n");
- printf("dammi n10\n");
- x=0;
- nc=1;
- while(c>=b)
- {c=(c-c%b)/b;
- nc=nc+1;
- }
- c=n10;
- n=nc;
- while(n!=0)
- {while(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