Задача на алгоритмы. Работа со строками - C (СИ)
Формулировка задачи:
Всем доброго времени суток!
Передо мной стоит достаточно нетривиальная задача. Кому интересно прошу помочь.
Задача:
На входе: у нас строка, которая содержит пробелы (работать нужно не со string, а только с char), также эта строка содержит числа в десятичной системе исчисления.
На выходе: точно эта же строка, только в ней все числа десятичной системы исчисления заменены на эти же числа только представленные в шестнадцатеричной системы исчисления.
Условия: нельзя пользоваться никакими стандартными функциями и библиотеками. Все так сказать "в ручную".
Я собственно говоря написал код, который находит в строке все числа десятичной системы исчисления, формирует новую строку из этих чисел в шестнадцатеричной системе исчисления. Но эта строка без пробелов и содержит только числа.
Как работает мой код:
На входе: 44ssf44fffff4ddd4; На выходе: Ox6C81C
А как должно быть:
На входе: aaaa 444444ffffff dddd; На выходе: aaaa Ox6C81Cffffff dddd;
Моя реализация:
Буду очень благодарен за помощь!
Листинг программы
- #include <stdio.h>
- void inputChar(char *str)
- {
- printf("input array char <100: ");
- scanf("%s", str);
- }
- void revers(char *A)
- {
- int j;
- for (j = 0; A[j] != '\0'; j++);
- j--;
- for (int i = 0; i <j; i++, j--)
- {
- char temp = A[i];
- A[i] = A[j];
- A[j] = temp;
- }
- }
- int charToDecInt(char *A)
- {
- int summ = 0;
- for (int i = 0; A[i] != '\0'; i++)
- {
- if (A[i] >= '0' && A[i] <= '9')
- {
- summ *= 10;
- summ += A[i] - '0';
- }
- }
- return summ;
- }
- void decIntTohexString(int a, char *A)
- {
- int j = 0;
- while (a != 0)
- {
- int r = a % 16;
- if (r > 9)
- {
- r += 'A' - 10;
- }
- else
- {
- r += '0';
- }
- A[j++] = r;
- a /= 16;
- }
- A[j] = '\0';
- revers(A);
- }
- void display()
- {
- const int N = 100;
- char A[N] = "";
- char B[N] = "";
- inputChar(A);
- int a = charToDecInt(A);
- decIntTohexString(a, B);
- printf("hexChar = Ox%s\n", B);
- }
- int main()
- {
- display();
- return 0;
- }
Решение задачи: «Задача на алгоритмы. Работа со строками»
textual
Листинг программы
- #include <stdio.h>
- #include <locale.h>
- int strLen(char *S)
- {
- int n;
- for (n = 0; S[n] != '\0'; n++);
- return n;
- }
- void revers(char *A)
- {
- int j;
- for (j = 0; A[j] != '\0'; j++);
- j--;
- for (int i = 0; i <j; i++, j--)
- {
- char temp = A[i];
- A[i] = A[j];
- A[j] = temp;
- }
- }
- void digitDecToHexString(int digit, char *T)
- {
- int j = 0;
- while (digit != 0)
- {
- int r = digit % 16;
- if (r >= 1 && r <= 9)
- {
- r += '0';
- }
- else
- {
- r += 'A' - 10;
- }
- T[j++] = r;
- digit /= 16;
- }
- T[j] = '\0';
- revers(T);
- }
- void intDecToCharHex(char *A, char *B)
- {
- int n = strLen(A);
- char Hex[1000] = "";
- int i = 0;
- int j = 0;
- int k = 0;
- int v = 0;
- int p = 0;
- for(i = 0; i<n; i++)
- {
- if ('0' <= A[i] && A[i] <= '9')
- {
- v = v * 10 + (A[i] - '0');
- k = 1;
- }
- else
- {
- if (k == 1)
- {
- digitDecToHexString(v, Hex);
- B[j++] = '0';
- B[j++] = 'x';
- for (p = 0; p < strLen(Hex); p++)
- {
- B[j++] = Hex[p];
- }
- }
- B[j++] = A[i];
- k = 0;
- v = 0;
- }
- }
- if (k == 1)
- {
- digitDecToHexString(v, Hex);
- B[j++] = '0';
- B[j++] = 'x';
- for (p = 0; p < strLen(Hex); p++)
- {
- B[j++] = Hex[p];
- }
- }
- }
- void inputCharArray(char *S)
- {
- printf("Введите строку на латинском алфавите размерностью мене 1000 символов: \n");
- scanf("%[^\n]s", S);
- }
- void display()
- {
- char A[1000] = { '\0' };
- inputCharArray(A);
- char B[1000] = "";
- intDecToCharHex(A, B);
- printf("Входная строка: \n%s\n", A);
- printf("Строка после обработки: \n%s\n", B);
- }
- int main()
- {
- setlocale(LC_ALL, "Rus");
- display();
- return 0;
- }
Объяснение кода листинга программы
- В функции
strLen
инициализируется переменнаяn
равной 0. - В функции
revers
инициализируется переменнаяj
равной 0. - В функции
digitDecToHexString
используется переменнаяr
для хранения остатка от деления числа на 16. - В функции
intDecToCharHex
инициализируется переменнаяn
равной 0. - В функции
intDecToCharHex
инициализируется массивHex
размером 1000 символов со значением пустой строки ````. - В функции
intDecToCharHex
инициализируется переменнаяk
равной 0. - В функции
intDecToCharHex
инициализируется переменнаяv
равной 0. - В функции
intDecToCharHex
инициализируется переменнаяp
равной 0. - В функции
inputCharArray
выводится запрос на ввод строки. - В функции
display
создается пустой массивA
размером 1000 символов. - В функции
display
вызывается функцияinputCharArray
для ввода строки в массивA
. - В функции
display
создается пустой массивB
размером 1000 символов. - В функции
display
вызывается функцияintDecToCharHex
для преобразования строки из массиваA
в массивB
. - В функции
display
выводится на экран входная строка из массиваA
. - В функции
display
выводится на экран обработанная строка из массиваB
. - В функции
main
устанавливается локальная настройка на русский язык с помощьюsetlocale
. - В функции
main
вызывается функцияdisplay
. - В функции
main
возвращается 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д