Перевод чисел из одной системы счисления в другую - C (СИ) (76430)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Нужна помощь, имеется программа по переводу чисел из одной системы счисления в другую. Программа написана на С.Всего 6 функций, 4 из них работают, остальные же две я попытался сделать на основе прошлых, но ничего не получилось. Это первое. Второе, функции без проблем переводят целые числа, с дробными же беда, быть может еще дополнить что то нужно? Помогите пожалуйста, сроки поджимают, последний день сегодня, быть может кто-нибудь уже сталкивался с программами перевода чисел!
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. //#include <graphics.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7.  
  8. void sys2to8(){
  9. char *res,*in, *s;
  10. int i, l, r, e, minus;
  11. gets(s);
  12. strcpy(res,"");
  13. if (s[0]=='-') { minus=1; strcat(res,"-"); }
  14. else minus=0;
  15. for(l=0; (s[l]) && (s[l]!='.'); l++){}
  16. r=(l-minus) % 3;
  17. switch (r) {
  18. case 0: strcpy(in,s+minus); break;
  19. case 1: strcpy(in+2,s+minus); in[1]='0'; in[0]='0'; break;
  20. case 2: strcpy(in+1,s+minus); in[0]='0'; break;
  21. }
  22. for(l=0; (in[l]) && (in[l]!='.'); l++){}
  23. for(i=0; i<l ;i+=3){
  24. if (in[i]=='1') r=4;
  25. else r=0;
  26. if (in[i+1]=='1') r+=2;
  27. if (in[i+2]=='1') r+=1;
  28. r+=48;
  29. e=strlen(res);
  30. res[e]=r;
  31. res[e+1]=0;
  32. }
  33. puts(res);
  34. }
  35. void sys2to16(){
  36. char *res, *in, *s;
  37. int i, l, e, minus;
  38. char r;
  39. printf("Ievadiet skaitli");
  40. gets(s);
  41. strcpy(res,"");
  42. if (s[0]=='-') { minus=1; strcat(res,"-"); }
  43. else minus=0;
  44. for(l=0; (s[l]) && (s[l]!='.'); l++){}
  45. r=(l-minus) % 4;
  46. switch (r) {
  47. case 0: strcpy(in,s+minus); break;
  48. case 1: strcpy(in+3,s+minus); in[2]='0'; in[1]='0'; in[0]='0'; break;
  49. case 2: strcpy(in+2,s+minus); in[1]='0'; in[0]='0'; break;
  50. case 3: strcpy(in+1,s+minus); in[0]='0'; break;
  51. }
  52. for(l=0; (in[l]) && (in[l]!='.'); l++){}
  53. for(i=0; i<l ;i+=4){
  54. if (in[i]=='1') r=8;
  55. else r=0;
  56. if (in[i+1]=='1') r+=4;
  57. if (in[i+2]=='1') r+=2;
  58. if (in[i+3]=='1') r+=1;
  59. if (r<10) r+=48;
  60. else r+=55; // 65..70
  61. e=strlen(res);
  62. res[e]=r;
  63. res[e+1]=0;
  64. }
  65. printf("\nRezultats ir");
  66. puts(res);
  67. }
  68. void sys8to2(){
  69. char *res, *one, *s;
  70. int i, r, j, minus;
  71. printf("Ievadiet skaitli");
  72. gets(s);
  73. strcpy(res,"");
  74. if (s[0]=='-') { minus=1; strcat(res,"-"); }
  75. else minus=0;
  76. for(i=minus; s[i] ;i++){
  77. strcpy(one,"");
  78. r=s[i]-48;
  79. for(j=0; j<3; j++){
  80. if ( (r % 2 )==1 ) strcat(one,"1");
  81. else strcat(one,"0");
  82. r=r/2;
  83. }
  84. strrev(one);
  85. strcat(res,one);
  86. }
  87. if (minus) res++;
  88. for(; res[0]=='0'; res++){}
  89. if (minus) {
  90. res--;
  91. res[0]='-';
  92. }
  93. if (strcmp(res,"")==0) strcpy(res,"0");
  94. puts(res);
  95. }
  96. void sys8to16(){
  97. char *res, *in, *s;
  98. printf("Ieadiet skaitli");
  99. gets(s);
  100. strcpy(in,sys8to2(s));
  101. strcpy(res,sys2to16(in));
  102. puts(res);
  103. }
  104. void sys16to2(){
  105. char *res, *one, *s;
  106. int i, l, r, j, minus, dot;
  107. printf("Ievadiet skaitli");
  108. gets(s);
  109. strcpy(res,"");
  110. if (s[0]=='-') { minus=1; strcat(res,"-"); }
  111. else minus=0;
  112. for(i=minus; s[i] ;i++){
  113. strcpy(one,"");
  114. if (s[i]<=58) r=s[i]-48; // 1..9
  115. else r=s[i]-55; // A..F
  116. for(j=0; j<4; j++){
  117. if ( (r % 2 )==1 ) strcat(one,"1");
  118. else strcat(one,"0");
  119. r=r/2;
  120. }
  121. strrev(one);
  122. strcat(res,one);
  123. }
  124. if (minus) res++;
  125. for(; res[0]=='0'; res++){}
  126. if (minus) {
  127. res--;
  128. res[0]='-';
  129. }
  130. if (strcmp(res,"")==0) strcpy(res,"0");
  131. puts(res);
  132. }
  133.  
  134. void sys16to8(){
  135. char *res, *in, *s;
  136. printf("Ievadiet skitli");
  137. gets(s);
  138. strcpy(in,sys16to2(s));
  139. strcpy(res,sys2to8(in));
  140. puts(res);
  141. }
  142.  
  143. void ShowMenu()
  144. {
  145. clrscr();
  146. printf("Menu: \n");
  147. printf("1. No 2 uz 8 \n");
  148. printf("2. No 2 uz 16 \n");
  149. printf("3. No 8 uz 2 \n");
  150. printf("4. No 8 uz 16 \n");
  151. printf("5. No 16 uz 2 \n");
  152. printf("6. No 16 uz 8 \n");
  153. }
  154.  
  155. void main()
  156. {
  157. ShowMenu();
  158.  
  159. i=getch();
  160. switch (i)
  161. {
  162. case 49: sys2to8(); break;
  163. case 50: sys2to16(); break;
  164. case 51: sys8to2(); break;
  165. case 52: sys8to16(); break;
  166. case 53: sys16to2(); break;
  167. case 54: sys16to8(); break;
  168. }
  169. getch();
  170. }

Решение задачи: «Перевод чисел из одной системы счисления в другую»

textual
Листинг программы
  1. void kalk5(int e)
  2. {
  3.     int j,a,c,f,g;
  4.     double x=0;
  5.     double d=8;
  6.     j=0;
  7.     a=1;
  8.     c=2;
  9.     f=e/100;
  10.     if ((e/10<=0,7)&(e<8)) {x=e*pow(d,j);}
  11.     else
  12.         if ((e/10>=1)&(e%10<8)&(e/10<8)) {x=e/10*pow(d,a)+e%10*pow(d,j);}
  13.         else
  14.         if ((e/10>=10)&(e%10<8)&((e-100*f)/10<8)) {x=f*pow(d,c)+(e-100*f)/10*pow(d,a)+e%10*pow(d,j);}
  15.         else cout<<"nekorrektno->";
  16. cout<<x;
  17. }

Объяснение кода листинга программы

  1. В функции объявлены следующие переменные:
    • j (указатель на количество разрядов числа)
    • a (коэффициент для определения разрядов числа)
    • c (коэффициент для определения разрядов числа)
    • f (коэффициент для определения разрядов числа)
    • g (не используется в коде)
  2. Переменная j инициализируется значением 0.
  3. Переменная a инициализируется значением 1.
  4. Переменная c инициализируется значением 2.
  5. Переменная f вычисляется как результат деления e на 100.
  6. Затем проверяется условие: если e/10 меньше или равно 0,7 и e меньше 8, то x вычисляется как результат умножения e на d в степени j.
  7. Если условие не выполняется, то проверяется следующее условие: если e/10 больше или равно 1 и e mod 10 меньше 8 и e/10 меньше 8, то x вычисляется как результат умножения e/10 на d в степени a, плюс результат умножения e mod 10 на d в степени j.
  8. Если и это условие не выполняется, то проверяется последнее условие: если e/10 больше или равно 10 и e mod 10 меньше 8 и ((e-100f)/10) меньше 8, то x вычисляется как результат умножения f на d в степени c, плюс результат умножения (e-100f)/10 на d в степени a, плюс результат умножения e mod 10 на d в степени j.
  9. Если ни одно из условий не выполняется, то выводится сообщение nekorrektno.
  10. В конце функции выводится значение x.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы