Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * main.c -- программа, печатающая результат вычислений
- * в соответствии с заданием Param42-43 (8-9 вариант)
- *
- * Param42. Описать функцию CompressStr(S) строкового типа, выполняющую
- * сжатие строки S по следующему правилу: каждая подстрока строки S,
- * состоящая из более чем четырех одинаковых символов C, заменяется
- * текстом вида <<C{K}>>, где K - количество символов C (предполагатся,
- * что строка S не содержит фигурных скобок <<{>> и <<}>>). Например,
- * для строки S = <<bbbccccce>> функция вернёт строку <<bbbc{5}e>>.
- * С помощью функции CompressStr сжать пять данных строк.
- *
- * Param43. Описать функцию DecompressStr(S) строкового типа,
- * восстанавливающую строку, сжатую процедурой CompressStr
- * (см. задание Param42). Параметр S содержит сжатую строку;
- * восстановленная строка являтся возвращаемым значением функции.
- * С помощью функции DecompressStr восстановить пять данных
- * сжатых строк.
- *
- * Copyright (c) 2019, Harichev Evgeny
- *
- * This code is licensed under a MIT-style license.
- *
- **/
- #include <string.h>
- #include <stdio.h>
- #include <malloc.h>
- #define MAXLINE 1000
- char* CompressStr(char *line);
- char* DecompressStr(char *line);
- int main()
- {
- char *line = (char*) calloc(MAXLINE, 1);
- printf("Введите нормальную cтроку: ");
- scanf("%s", line);
- line = CompressStr(line);
- printf("Сжатая строка: %s\n", line);
- line = DecompressStr(line);
- printf("Восстановленная строка: %s\n", line);
- free(line);
- return 0;
- }
- char* CompressStr(char *line)
- {
- int length, number = 1;
- length = strlen(line);
- char *new_line = (char*) calloc(MAXLINE, 1);
- for (int i = 0; i < length; i++) {
- if (line[i] == line[i+1]) {
- number++;
- }
- else {
- if (number > 4) {
- sprintf(new_line, "%s%c{%d}", new_line, line[i], number);
- number = 1;
- } else {
- for(int m = 0; m < number; m++) {
- sprintf(new_line, "%s%c", new_line, line[i]);
- }
- number = 1;
- }
- }
- }
- return new_line;
- }
- char* DecompressStr(char *line)
- {
- int length, cur = 0, rank, number;
- length = strlen(line);
- char *new_line = (char*) calloc(MAXLINE, 1);
- for (int i = 0; i < length; i++) {
- rank = 1;
- if (line[i+1] == '{') {
- number = line[i+2] - 48;
- while (line[i+2+rank] - 48 >= 0 && line[i+2+rank] - 48 <= 9) {
- number = number * 10 + line[i+2+rank] - 48;
- rank++;
- }
- while (cur != number) {
- sprintf(new_line, "%s%c", new_line, line[i]);
- cur++;
- }
- i += 2 + rank;
- } else {
- sprintf(new_line, "%s%c", new_line, line[i]);
- }
- cur = 0;
- }
- return new_line;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement