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

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

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

бьюсь над задачей, но компилятор выдаёт ошибки в строчках return strdec(107) и return strout(91) не понимаю почему. если сможете, помогите исправить без того трудную задачу...
/* Преобразование строкового представления чисел из одной
* системы исчисления в другую */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
 
#define LENSTR 80
 
char *Invert(char *); //Переворачивает строку, т.е. "123" = "321"
char *ToDec(int , char *); //Переводит число из любой системы счисления в десятиричную
char *ToOut(int , char *); //Переводит число из десятиричной в любую систему счисления
int CharToInt(char ); //Символ от 0-f переводит в числовой вид от 0-15 соответственно
char IntToChar(int ); //Обратно функции CharToInt
int Pow(int , int ); //Возведение в степень
 
/* Тело программы */
int main(int argc, char *argv[])
{
int in = 0, out = 0;
char strin[LENSTR], strdec[LENSTR], strout[LENSTR];
 
if (argc == 4) /*проверяем есть ли данные в командной строке
если есть считываем их и выводим на экран*/
{
strcpy(strin, argv[1]);
in = atol(argv[2]);
out = atol(argv[3]);
printf("::\n", in, out, strin);
}
 
if (!((in >= 2 && in <= 16) && (out >= 2 && out <= 16)))
/*если командная строка пуста просим ввести значения от руки*/
do {
printf(": ");
scanf("%d %d %s", &in, &out, strin);
} while ((in >= 2 && in <= 16) && (out >= 2 && out <= 16));
 
strcpy(strdec, ToDec(in, strin)); //переводим число в десятиричную систему счисления из исходной
strcpy(strout, ToOut(out, strdec)); //переводим число из десятиричной системы счисления в целевую
 
printf("ђҐ§г«мвв: %s\n", strout);
 
_getch();
return 0;
}
 
char *Invert(char *str)
{
char tmp;
for (int i = 0; i < strlen(str)/2; i++)
{
tmp = str[i];
str[i] = str[strlen(str) - (i + 1)];
str[strlen(str) - (i + 1)] = tmp;
}
return str;
}
 
int Pow(int osn, int step)
{
int result = 1;
while(step > 0)
{
result = result * osn;
step--;
}
return result;
}
 
char *ToDec(int in, char *dig)
{
int res = 0, index = 0, tmp;
char strdec[LENSTR];
Invert(dig);
for (int i = 0; i < strlen(dig); i++)
{
tmp = Pow(in, i);
res = CharToInt(dig[i])*tmp + res;
}
 
while (res > 0)
{
strdec[index++] = IntToChar(res % 10);
res = res / 10;
}
strdec[index] = 0;
Invert(strdec);
                                  return strdec;
}
 
char *ToOut(int out, char *dig)
{
int dec = atol(dig), index = 0;
char strout[LENSTR];
while (dec >= out)
{
strout[index++] = IntToChar(dec % out);
dec = dec / out;
}
if (dec > 0)
strout[index++] = IntToChar(dec);
strout[index] = 0;
Invert(strout);
                             return strout;
}
int CharToInt (char c)
{
int res;
c = tolower(c);
switch (c)
{
case '0': res = 0; break;
case '1': res = 1; break;
case '2': res = 2; break;
case '3': res = 3; break;
case '4': res = 4; break;
case '5': res = 5; break;
case '6': res = 6; break;
case '7': res = 7; break;
case '8': res = 8; break;
case '9': res = 9; break;
case 'a': res = 10; break;
case 'b': res = 11; break;
case 'c': res = 12; break;
case 'd': res = 13; break;
case 'e': res = 14; break;
case 'f': res = 15; break;
}
return res;
}
 
char IntToChar (int c)
{
char res;
switch (c)
{
case 0: res = '0'; break;
case 1: res = '1'; break;
case 2: res = '2'; break;
case 3: res = '3'; break;
case 4: res = '4'; break;
case 5: res = '5'; break;
case 6: res = '6'; break;
case 7: res = '7'; break;
case 8: res = '8'; break;
case 9: res = '9'; break;
case 10: res = 'a'; break;
case 11: res = 'b'; break;
case 12: res = 'c'; break;
case 13: res = 'd'; break;
case 14: res = 'e'; break;
case 15: res = 'f'; break;
}
return res;
}

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

textual
Листинг программы
char *ToDec(int in, char *dig)
{
int res = 0, index = 0, tmp;
char *strdec;
strdec=(char *)malloc (LENSTR * sizeof (char));
Invert(dig);
for (int i = 0; i < strlen(dig); i++)
{
tmp = Pow(in, i);
res = CharToInt(dig[i])*tmp + res;
}
 
while (res > 0)
{
strdec[index++] = IntToChar(res % 10);
res = res / 10;
}
strdec[index] = 0;
Invert(strdec);
                                  return strdec;
}

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

  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
Похожие ответы