Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "convercoes.h"
  5. #include "verificacoes.h"
  6.  
  7. #define N 51
  8.  
  9. int main(void){
  10.  
  11. char num[N], num_convert[N], numX[N]; // Variavies necessárias
  12. int b_origem, b_destino, num_digitos, num_char[N], i, k, baseX;
  13. int ponto, tem_sinal, verif_origem, verif_destino, tem_valor, verif_num;
  14. double fracionaria; //flags
  15. unsigned long long int inteira;
  16.  
  17. while (1){ // loop infinito para inserir as entradas e repeti-las caso
  18. // não estejam de acordo.
  19. // verificação feita por meio de funções com o auxilio de flags.
  20.  
  21. setbuf(stdin, NULL);
  22. scanf("%s%d%d", num, &b_origem, &b_destino);
  23.  
  24. num_digitos = strlen(num);
  25.  
  26. tem_valor = verificaValor(num, num_digitos);
  27. if (num[0] == '+' && tem_valor == 0 && b_origem == 0 && b_destino == 0)
  28. break;
  29.  
  30. if (num_digitos > 50)
  31. fprintf(stderr, "Insira um valor com menos de 50 dígitos...\n");
  32.  
  33. tem_sinal = verificaSinal(num);
  34. if (tem_sinal == 0){
  35. fprintf(stderr, "Insira o sinal antes do valor...\n");
  36. }
  37.  
  38. ponto = verificaPonto(num, num_digitos);
  39. if (ponto == 0){
  40. fprintf(stderr, "Insira o '.' separando a parte inteira da fração...\n");
  41. }
  42.  
  43. verif_num = verificaNumero(num, b_origem, ponto, num_digitos);
  44. if (verif_num == 0)
  45. fprintf(stderr, "Este valor não pertence a base %d...\n", b_origem);
  46.  
  47. verif_origem = verificaOrigem(b_origem);
  48. if (verif_origem == 0){
  49. fprintf(stderr, "Digite novamente a base de origem...\n");
  50. }
  51.  
  52. verif_destino = verificaDestino(b_destino);
  53. if (verif_destino == 0){
  54. fprintf(stderr, "Digite novamente a base de destino...\n");
  55. }
  56.  
  57. if(tem_sinal == 1 && verif_origem == 1 && verif_destino == 1){
  58. if (tem_valor == 1 && ponto != 0 && verif_num == 1 && num_digitos <= 50){
  59.  
  60. if (b_origem == -1 || b_destino == -1){
  61. FILE *fp;
  62. fp = fopen("arquivo_baseX", "r");
  63. if (fp == NULL){
  64. fprintf(stderr, "Erro na abertura do arquivo.\n");
  65. exit(1);
  66. }
  67. for (k=0, baseX=0;; k++){
  68. numX[k] = fgetc(fp);
  69. if (numX[k] == EOF)
  70. break;
  71. if (numX[k] == '\n')
  72. baseX++;
  73. }
  74. fclose(fp);
  75. }
  76.  
  77. if (b_origem == -1){
  78. inteira = intBaseXpara10(k, baseX, ponto, numX, num);
  79. fracionaria = fracBaseXpara10(k, baseX, ponto, numX, num);
  80. }
  81.  
  82. else {
  83.  
  84. for (i=1; i<num_digitos; i++)
  85. num_char[i] = transformaChar(num[i]);
  86.  
  87. inteira = inteiroParaBase10(num, b_origem, ponto, num_char);
  88. fracionaria = fracaoParaBase10(num, b_origem, ponto, num_digitos, num_char);
  89. }
  90.  
  91. if (b_destino == 10){
  92.  
  93. if (fracionaria == 0)
  94. printf("%c%llu.\n", num[0], inteira);
  95. else
  96. printf("%c%g\n", num[0], inteira + fracionaria);
  97. } //"%g" para remover os zeros a direita da fração.
  98.  
  99. else {
  100.  
  101. for (i = ponto -1;; i--){
  102. if (b_destino == -1)
  103. num_convert[i] = inteiroParaBaseX(&inteira, baseX);
  104. else
  105. num_convert[i] = inteiroParaBaseX(&inteira, b_destino);
  106. if (inteira == 0)
  107. break;
  108. }
  109. k = i; // guarda o valor de i, pois precisará dele futuramente.
  110.  
  111. num_convert[ponto] = '.';
  112. for (i = ponto + 1;; i++){
  113. if (b_destino == -1)
  114. num_convert[i] = fracaoParaBaseX(&fracionaria, baseX);
  115. else
  116. num_convert[i] = fracaoParaBaseX(&fracionaria, b_destino);
  117. if (fracionaria == 0)
  118. break;
  119. }
  120.  
  121. while (1){
  122. if (num_convert[i] != 0)
  123. break;
  124. i--; // guarda a posição em que termina os 0's a direita
  125. }
  126.  
  127. printf("%c", num[0]); //imprime o sinal
  128. for (; k <= i; k++){
  129. if (b_origem == -1)
  130.  
  131. else
  132. printf("%c", transformaInt(num_convert[k]));
  133. }
  134. printf("\n");
  135. }
  136. }
  137. }
  138. }
  139. }
  140.  
  141. //baseXpara10(k, baseX, numX, num)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement