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

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

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

бьюсь над задачей, но компилятор выдаёт ошибки в строчках return strdec(107) и return strout(91) не понимаю почему. если сможете, помогите исправить без того трудную задачу...
Листинг программы
  1. /* Преобразование строкового представления чисел из одной
  2. * системы исчисления в другую */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. #include <conio.h>
  8. #define LENSTR 80
  9. char *Invert(char *); //Переворачивает строку, т.е. "123" = "321"
  10. char *ToDec(int , char *); //Переводит число из любой системы счисления в десятиричную
  11. char *ToOut(int , char *); //Переводит число из десятиричной в любую систему счисления
  12. int CharToInt(char ); //Символ от 0-f переводит в числовой вид от 0-15 соответственно
  13. char IntToChar(int ); //Обратно функции CharToInt
  14. int Pow(int , int ); //Возведение в степень
  15. /* Тело программы */
  16. int main(int argc, char *argv[])
  17. {
  18. int in = 0, out = 0;
  19. char strin[LENSTR], strdec[LENSTR], strout[LENSTR];
  20. if (argc == 4) /*проверяем есть ли данные в командной строке
  21. если есть считываем их и выводим на экран*/
  22. {
  23. strcpy(strin, argv[1]);
  24. in = atol(argv[2]);
  25. out = atol(argv[3]);
  26. printf("::\n", in, out, strin);
  27. }
  28. if (!((in >= 2 && in <= 16) && (out >= 2 && out <= 16)))
  29. /*если командная строка пуста просим ввести значения от руки*/
  30. do {
  31. printf(": ");
  32. scanf("%d %d %s", &in, &out, strin);
  33. } while ((in >= 2 && in <= 16) && (out >= 2 && out <= 16));
  34. strcpy(strdec, ToDec(in, strin)); //переводим число в десятиричную систему счисления из исходной
  35. strcpy(strout, ToOut(out, strdec)); //переводим число из десятиричной системы счисления в целевую
  36. printf("ђҐ§г«мвв: %s\n", strout);
  37. _getch();
  38. return 0;
  39. }
  40. char *Invert(char *str)
  41. {
  42. char tmp;
  43. for (int i = 0; i < strlen(str)/2; i++)
  44. {
  45. tmp = str[i];
  46. str[i] = str[strlen(str) - (i + 1)];
  47. str[strlen(str) - (i + 1)] = tmp;
  48. }
  49. return str;
  50. }
  51. int Pow(int osn, int step)
  52. {
  53. int result = 1;
  54. while(step > 0)
  55. {
  56. result = result * osn;
  57. step--;
  58. }
  59. return result;
  60. }
  61. char *ToDec(int in, char *dig)
  62. {
  63. int res = 0, index = 0, tmp;
  64. char strdec[LENSTR];
  65. Invert(dig);
  66. for (int i = 0; i < strlen(dig); i++)
  67. {
  68. tmp = Pow(in, i);
  69. res = CharToInt(dig[i])*tmp + res;
  70. }
  71. while (res > 0)
  72. {
  73. strdec[index++] = IntToChar(res % 10);
  74. res = res / 10;
  75. }
  76. strdec[index] = 0;
  77. Invert(strdec);
  78. return strdec;
  79. }
  80. char *ToOut(int out, char *dig)
  81. {
  82. int dec = atol(dig), index = 0;
  83. char strout[LENSTR];
  84. while (dec >= out)
  85. {
  86. strout[index++] = IntToChar(dec % out);
  87. dec = dec / out;
  88. }
  89. if (dec > 0)
  90. strout[index++] = IntToChar(dec);
  91. strout[index] = 0;
  92. Invert(strout);
  93. return strout;
  94. }
  95. int CharToInt (char c)
  96. {
  97. int res;
  98. c = tolower(c);
  99. switch (c)
  100. {
  101. case '0': res = 0; break;
  102. case '1': res = 1; break;
  103. case '2': res = 2; break;
  104. case '3': res = 3; break;
  105. case '4': res = 4; break;
  106. case '5': res = 5; break;
  107. case '6': res = 6; break;
  108. case '7': res = 7; break;
  109. case '8': res = 8; break;
  110. case '9': res = 9; break;
  111. case 'a': res = 10; break;
  112. case 'b': res = 11; break;
  113. case 'c': res = 12; break;
  114. case 'd': res = 13; break;
  115. case 'e': res = 14; break;
  116. case 'f': res = 15; break;
  117. }
  118. return res;
  119. }
  120. char IntToChar (int c)
  121. {
  122. char res;
  123. switch (c)
  124. {
  125. case 0: res = '0'; break;
  126. case 1: res = '1'; break;
  127. case 2: res = '2'; break;
  128. case 3: res = '3'; break;
  129. case 4: res = '4'; break;
  130. case 5: res = '5'; break;
  131. case 6: res = '6'; break;
  132. case 7: res = '7'; break;
  133. case 8: res = '8'; break;
  134. case 9: res = '9'; break;
  135. case 10: res = 'a'; break;
  136. case 11: res = 'b'; break;
  137. case 12: res = 'c'; break;
  138. case 13: res = 'd'; break;
  139. case 14: res = 'e'; break;
  140. case 15: res = 'f'; break;
  141. }
  142. return res;
  143. }

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

textual
Листинг программы
  1. char *ToDec(int in, char *dig)
  2. {
  3. int res = 0, index = 0, tmp;
  4. char *strdec;
  5. strdec=(char *)malloc (LENSTR * sizeof (char));
  6. Invert(dig);
  7. for (int i = 0; i < strlen(dig); i++)
  8. {
  9. tmp = Pow(in, i);
  10. res = CharToInt(dig[i])*tmp + res;
  11. }
  12.  
  13. while (res > 0)
  14. {
  15. strdec[index++] = IntToChar(res % 10);
  16. res = res / 10;
  17. }
  18. strdec[index] = 0;
  19. Invert(strdec);
  20.                                   return strdec;
  21. }

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

  1. Функция ToDec принимает два аргумента: целое число in и строку dig
  2. Строка dig содержит цифры, которые представляют число в некоторой системе исчисления
  3. Функция преобразует строку dig в десятичное число res
  4. В процессе преобразования, для каждой цифры dig[i] функция вычисляет степень in и умножает результат на tmp, затем добавляет результат к res
  5. Затем функция преобразует res в строку, используя функцию IntToChar для каждой цифры, и сохраняет результат в strdec
  6. Функция возвращает strdec как результат
  7. Если в процессе преобразования происходит ошибка, например, in равно 0 или dig не содержит цифр, функция может вернуть NULL или сгенерировать исключение
  8. В коде не обрабатываются ошибки, поэтому предполагается, что входные данные корректны
  9. Временная переменная tmp используется для вычисления степени числа in
  10. Функция Invert используется для инвертирования порядка цифр в строке dig и в конечном результате в strdec
  11. Функция CharToInt преобразует символы в десятичные числа
  12. Функция IntToChar преобразует десятичные числа в символы
  13. В цикле while происходит добавление цифр результата в строку strdec
  14. Результат res делится на 10, чтобы получить следующую цифру результата
  15. Переменная index используется для отслеживания позиции следующей цифры в строке strdec
  16. В конце функции, функция Invert применяется к strdec, чтобы получить исходный порядок цифр
  17. Функция malloc используется для выделения памяти для строки strdec
  18. В конце функции, strdec возвращается как результат
  19. Если память не может быть выделена, функция может вернуть NULL или сгенерировать исключение
  20. Предполагается, что функция Invert и CharToInt определены и работают корректно

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


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

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

15   голосов , оценка 4.267 из 5

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

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

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