Преобразование строкового представления чисел из одной системы исчисления в другую - 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
определены и работают корректно
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д