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