Преобразование строкового представления чисел из одной системы исчисления в другую - 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;
}
Объяснение кода листинга программы
- Функция
ToDecпринимает два аргумента: целое числоinи строкуdig - Строка
digсодержит цифры, которые представляют число в некоторой системе исчисления - Функция преобразует строку
digв десятичное числоres - В процессе преобразования, для каждой цифры
dig[i]функция вычисляет степеньinи умножает результат наtmp, затем добавляет результат кres - Затем функция преобразует
resв строку, используя функциюIntToCharдля каждой цифры, и сохраняет результат вstrdec - Функция возвращает
strdecкак результат - Если в процессе преобразования происходит ошибка, например,
inравно 0 илиdigне содержит цифр, функция может вернутьNULLили сгенерировать исключение - В коде не обрабатываются ошибки, поэтому предполагается, что входные данные корректны
- Временная переменная
tmpиспользуется для вычисления степени числаin - Функция
Invertиспользуется для инвертирования порядка цифр в строкеdigи в конечном результате вstrdec - Функция
CharToIntпреобразует символы в десятичные числа - Функция
IntToCharпреобразует десятичные числа в символы - В цикле
whileпроисходит добавление цифр результата в строкуstrdec - Результат
resделится на 10, чтобы получить следующую цифру результата - Переменная
indexиспользуется для отслеживания позиции следующей цифры в строкеstrdec - В конце функции, функция
Invertприменяется кstrdec, чтобы получить исходный порядок цифр - Функция
mallocиспользуется для выделения памяти для строкиstrdec - В конце функции,
strdecвозвращается как результат - Если память не может быть выделена, функция может вернуть
NULLили сгенерировать исключение - Предполагается, что функция
InvertиCharToIntопределены и работают корректно