Advertisement
Guest User

CompressStr and DecompressStr

a guest
Dec 20th, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. /**
  2. * main.c -- программа, печатающая результат вычислений
  3. * в соответствии с заданием Param42-43 (8-9 вариант)
  4. *
  5. * Param42. Описать функцию CompressStr(S) строкового типа, выполняющую
  6. * сжатие строки S по следующему правилу: каждая подстрока строки S,
  7. * состоящая из более чем четырех одинаковых символов C, заменяется
  8. * текстом вида <<C{K}>>, где K - количество символов C (предполагатся,
  9. * что строка S не содержит фигурных скобок <<{>> и <<}>>). Например,
  10. * для строки S = <<bbbccccce>> функция вернёт строку <<bbbc{5}e>>.
  11. * С помощью функции CompressStr сжать пять данных строк.
  12. *
  13. * Param43. Описать функцию DecompressStr(S) строкового типа,
  14. * восстанавливающую строку, сжатую процедурой CompressStr
  15. * (см. задание Param42). Параметр S содержит сжатую строку;
  16. * восстановленная строка являтся возвращаемым значением функции.
  17. * С помощью функции DecompressStr восстановить пять данных
  18. * сжатых строк.
  19. *
  20. * Copyright (c) 2019, Harichev Evgeny
  21. *
  22. * This code is licensed under a MIT-style license.
  23. *
  24. **/
  25.  
  26. #include <string.h>
  27. #include <stdio.h>
  28. #include <malloc.h>
  29. #define MAXLINE 1000
  30.  
  31. char* CompressStr(char *line);
  32.  
  33. char* DecompressStr(char *line);
  34.  
  35. int main()
  36. {
  37. char *line = (char*) calloc(MAXLINE, 1);
  38. printf("Введите нормальную cтроку: ");
  39. scanf("%s", line);
  40. line = CompressStr(line);
  41. printf("Сжатая строка: %s\n", line);
  42. line = DecompressStr(line);
  43. printf("Восстановленная строка: %s\n", line);
  44. free(line);
  45.  
  46. return 0;
  47. }
  48.  
  49. char* CompressStr(char *line)
  50. {
  51. int length, number = 1;
  52. length = strlen(line);
  53. char *new_line = (char*) calloc(MAXLINE, 1);
  54. for (int i = 0; i < length; i++) {
  55. if (line[i] == line[i+1]) {
  56. number++;
  57. }
  58. else {
  59. if (number > 4) {
  60. sprintf(new_line, "%s%c{%d}", new_line, line[i], number);
  61. number = 1;
  62. } else {
  63. for(int m = 0; m < number; m++) {
  64. sprintf(new_line, "%s%c", new_line, line[i]);
  65. }
  66. number = 1;
  67. }
  68. }
  69. }
  70.  
  71. return new_line;
  72. }
  73.  
  74. char* DecompressStr(char *line)
  75. {
  76. int length, cur = 0, rank, number;
  77. length = strlen(line);
  78. char *new_line = (char*) calloc(MAXLINE, 1);
  79. for (int i = 0; i < length; i++) {
  80. rank = 1;
  81. if (line[i+1] == '{') {
  82. number = line[i+2] - 48;
  83. while (line[i+2+rank] - 48 >= 0 && line[i+2+rank] - 48 <= 9) {
  84. number = number * 10 + line[i+2+rank] - 48;
  85. rank++;
  86. }
  87. while (cur != number) {
  88. sprintf(new_line, "%s%c", new_line, line[i]);
  89. cur++;
  90. }
  91. i += 2 + rank;
  92. } else {
  93. sprintf(new_line, "%s%c", new_line, line[i]);
  94. }
  95. cur = 0;
  96. }
  97.  
  98. return new_line;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement