Advertisement
Guest User

convertitore base numerica

a guest
Mar 26th, 2019
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #define NCHARS 100
  4.  
  5. void main(void)
  6. {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*/
  7. char str[NCHARS]; /*la variabile alfabetica permette invece di avviare i processi di conferma per l'utilizzatore*/
  8.  
  9. 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");
  10.  
  11. {/*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*/
  12. parte1: printf("<dammi la base del numero di partenza>\n");
  13. scanf(" %d",&b);/*base di partenza*/
  14. x=0; /*la variabile permette al programma di elaborare la risposta*/
  15. while(x==0)
  16. {
  17. printf("<la base assegnata è %d, corretto? (s/n)>\n",b);
  18. scanf(" %s",str);
  19. switch(str[0])
  20. {case 's':
  21. case 'S': x=1;
  22. break;
  23. case 'n':
  24. case 'N': x=2;
  25. goto parte1;
  26. break;
  27. default: printf("<carettere inserito non accettato>\n");
  28. x=0;
  29. break;
  30. }
  31. }
  32. }
  33.  
  34. {/*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*/
  35. parte2: printf("\n<dammi il numero di cifre del numero>\n");
  36. scanf("%d",&nc);/*numero di cifre del numero di partenza*/
  37. x=0;
  38. while(x==0)
  39. {
  40. printf("<il numero delle cifre è %d, corretto? (s/n)>\n",nc);
  41. scanf(" %s",str);
  42. switch(str[0])
  43. {case 's':
  44. case 'S': x=1;
  45. break;
  46. case 'n':
  47. case 'N': x=2;
  48. goto parte2;
  49. break;
  50. default: printf("<carettere inserito non accettato>\n");
  51. x=0;
  52. break;
  53. }
  54. }
  55. }
  56.  
  57. {/*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.
  58. 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*/
  59. 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");
  60. n=0;/*tiene il conto del numero di cifre inserite (inizialmente 0)*/
  61. exp=nc-1;/*esponente della base, relativo alla cifra del numero, ricordiamo che tale esponente può variare da 0 a (nc-1)*/
  62. n10=0;/*il numero viene convertito in base decimale che aumenta di valore all'aumentare del numero di cifre immesse*/
  63.  
  64. /*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*/
  65. while(n<nc)
  66. {if(n==0)
  67. {printf("<dammi la prima cifra>\n");
  68. scanf("%d",&c);/*salvataggio per ciascuna cifra*/
  69. {if(c<b)
  70. {printf("la cifra immessa è <%d>\n",c);
  71. n=n+1;
  72. n10=n10+c*(pow(b,exp));
  73. exp=exp-1;
  74. }
  75. else
  76. {printf("<un numero di base %d non può avere %d come cifra!!! riscrivi TUTTE le cifre da capo>\n", b, c);
  77. goto parte3;
  78. }
  79. }
  80. }
  81. else
  82. {printf("<dammi la cifra successiva>\n");
  83. scanf("%d",&c);
  84. if(c<b)
  85. {printf("la cifra immessa è <%d>\n",c);
  86. n=n+1;
  87. n10=n10+c*(pow(b,exp));
  88. exp=exp-1;
  89. }
  90. else
  91. {printf("<un numero di base %d non può avere %d come cifra!!! riscrivi TUTTE le cifre da capo>\n\n", b, c);
  92. goto parte3;
  93. }
  94. }
  95. }
  96.  
  97. x=0;
  98. while(x==0)
  99. {printf("<le cifre inserite sono corrette? (s/n)>\n");
  100. scanf(" %s",str);
  101. switch(str[0])
  102. {case 's':
  103. case 'S': x=1;
  104. break;
  105. case 'n':
  106. case 'N': x=2;
  107. goto parte3;
  108. break;
  109. default: printf("<carettere inserito non accettato>\n");
  110. x=0;
  111. break;
  112. }
  113. }
  114. }
  115.  
  116. {/*ora verrà richiesto di inserire la base del nuovo numero*/
  117. parte4: printf("\n<inserire il numero della nuova base da assegnare al numero>\n");
  118. scanf("%d",&b);/*da qui in poi, molto spesso, sovrascriveremo i vecchi valori ad eccezione di n10*/
  119. x=0;
  120. while(x==0)
  121. {
  122. printf("<la base assegnata è %d, corretto? (s/n)>\n",b);
  123. scanf(" %s",str);
  124. switch(str[0])
  125. {case 's':
  126. case 'S': x=1;
  127. break;
  128. case 'n':
  129. case 'N': x=2;
  130. goto parte4;
  131. break;
  132. default: printf("<carettere inserito non accettato>\n");
  133. x=0;
  134. break;
  135. }
  136. }
  137.  
  138. }
  139.  
  140. {parte5: exp=0;
  141. 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*/
  142. printf("\nil numero desiderato è: \n");
  143. 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*/
  144. nc=1; /*indica il numero di cifre che avrà il risultato*/
  145. for(c=n10;c>=b;c=(c-c%b)/b,nc=nc+1);
  146. c=n10;
  147. n=nc;
  148. while(n!=0)
  149. {for(;exp<n-1;exp=exp+1,c=(c-c%b)/b);
  150. printf("%d ",c);
  151. x=x+c*pow(b,exp);
  152. c=n10-x;
  153. exp=0;
  154. n=n-1;
  155. }
  156. }
  157. printf("\n");
  158. END: printf("ciao, alla prossima!\n\n");
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement