Задача на алгоритмы. Работа со строками - 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;
}

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

  1. В функции strLen инициализируется переменная n равной 0.
  2. В функции revers инициализируется переменная j равной 0.
  3. В функции digitDecToHexString используется переменная r для хранения остатка от деления числа на 16.
  4. В функции intDecToCharHex инициализируется переменная n равной 0.
  5. В функции intDecToCharHex инициализируется массив Hex размером 1000 символов со значением пустой строки ````.
  6. В функции intDecToCharHex инициализируется переменная k равной 0.
  7. В функции intDecToCharHex инициализируется переменная v равной 0.
  8. В функции intDecToCharHex инициализируется переменная p равной 0.
  9. В функции inputCharArray выводится запрос на ввод строки.
  10. В функции display создается пустой массив A размером 1000 символов.
  11. В функции display вызывается функция inputCharArray для ввода строки в массив A.
  12. В функции display создается пустой массив B размером 1000 символов.
  13. В функции display вызывается функция intDecToCharHex для преобразования строки из массива A в массив B.
  14. В функции display выводится на экран входная строка из массива A.
  15. В функции display выводится на экран обработанная строка из массива B.
  16. В функции main устанавливается локальная настройка на русский язык с помощью setlocale.
  17. В функции main вызывается функция display.
  18. В функции main возвращается 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы