Описать функцию CompressStr(S) строкового типа, выполняющую сжатие строки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Описать функцию CompressStr(S) строкового типа

, выполняющую сжатие строки S по следующему правилу: каждая подстрока строки S, состоящая из более чем четырех одинаковых символов C, заменяется текстом вида «С{K}», где K — количество символов C (предполагается, что строка S не содержит фигурных скобок «{» и «}»). Например, для строки S = «bbbccccce» функция вернет строку «bbbc{5}e». С помощью функции CompressStr сжать пять данных строк. Имеется обратная задача, и есть эта готовая на паскале, но нужно на С.

Решение задачи: «Описать функцию CompressStr(S) строкового типа, выполняющую сжатие строки»

textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
 
 
#define MIN_CHARS_AMOUNT_TO_CONVERT 4
 
 
size_t count_same_chars(char const* str) {
    size_t count = 1;
    char ch = *str;
    
    while (*++str != '\0' && *str == ch) {
        ++count;
    }
    
    return count;
}
 
void compress_str(char * str) {
   size_t count;
   char * p;
 
   while (*str != '\0') {
      count = count_same_chars(str);
 
      if (count >= MIN_CHARS_AMOUNT_TO_CONVERT) {
          p = str;
         *++p = '{';
         ++p;
         p += sprintf(p, "%u", (unsigned int)count);
         *p = '}';
         strcpy(++p, str + count);
         str = p;
      } else {
         str += count;
      }
   }
}
 
 
int main() {
   char str1[] = "bbbccccce";
   char str2[] = "bbbbcce";
   char str3[] = "bbbccceee";
   char str4[] = "aaaaaaaabbbbcccc";
   char str5[] = "aabbbcccc";
   char str6[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
   char str7[] = "aaaaaaaaaabbbcccccccccccca";
   
   compress_str(str1);
   compress_str(str2);
   compress_str(str3);
   compress_str(str4);
   compress_str(str5);
   compress_str(str6);
   compress_str(str7);
   
   assert(strcmp(str1, "bbbc{5}e") == 0);
   assert(strcmp(str2, "b{4}cce") == 0);
   assert(strcmp(str3, "bbbccceee") == 0);
   assert(strcmp(str4, "a{8}b{4}c{4}") == 0);
   assert(strcmp(str5, "aabbbc{4}") == 0);
   assert(strcmp(str6, "a{50}") == 0);
   assert(strcmp(str7, "a{10}bbbc{12}a") == 0);
 
   return EXIT_SUCCESS;
}

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

  1. В функции compress_str выполняется сжатие строки str.
  2. В функции count_same_chars подсчитывается количество одинаковых символов в строке str.
  3. В цикле while происходит проход по всем символам строки str.
  4. Если количество одинаковых символов (count) больше или равно MIN_CHARS_AMOUNT_TO_CONVERT, то выполняется сжатие подстроки.
  5. В подстроке, соответствующей count символам, заменяется на {count}.
  6. В main функции создаются строки для тестирования compress_str.
  7. Функция compress_str вызывается для каждой из созданных строк.
  8. Результат сжатия проверяется с помощью функции assert.
  9. В случае ошибки, программа завершается с кодом ошибки EXIT_FAILURE.
  10. В случае успеха, программа завершается с кодом успеха EXIT_SUCCESS.

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


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

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

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