Advertisement
LilChicha174

Untitled

Dec 19th, 2021
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <wchar.h>
  5. #include <wctype.h>
  6.  
  7. # define STEP 5
  8. # define N 3
  9. # define D 5
  10. struct Sentence {
  11.     wchar_t *str;
  12.     int count;
  13.     int size;
  14.     int last;
  15.     int words;
  16.     int max_length;
  17.     wchar_t *words1;
  18.     wchar_t *max_length1;
  19.     struct sent *words_arr;
  20.  
  21. };
  22.  
  23. struct Text {
  24.     struct Sentence **sents;
  25.     int size;
  26.     int n;
  27. };
  28.  
  29. struct sent {
  30.     wchar_t **words;
  31.     int size;
  32. };
  33.  
  34. //очистка памяти
  35. void clean(struct Text *text) {
  36.     for (int i = 0; i < text->n; i++) {
  37.         free((text->sents)[i]->str);
  38.         free((text->sents)[i]->words1);
  39.         free((text->sents)[i]->max_length1);
  40.         free((text->sents)[i]->words_arr);
  41.     }
  42.     free(text->sents);
  43. }
  44.  
  45.  
  46. struct Sentence *get_sent();
  47.  
  48. // проверка на конец предложения
  49. int sent_end(wchar_t sym) {
  50.     if (sym == L'.' || sym == L'\n')
  51.         return 0;
  52.     return 1;
  53. }
  54.  
  55. int count_words(wchar_t *sent) {
  56.     int words = 1;
  57.     for (int i = 0; i < wcslen(sent); i++) {
  58.         if ((sent[i] == L' ' || sent[i] == L',') && sent[i + 1] != L' ' && sent[i + 1] != L',')
  59.             words++;
  60.     }
  61.     return words;
  62. }
  63.  
  64. int max_length(wchar_t *sent) {
  65.     int max_ln = 0;
  66.     int ln = 0;
  67.     for (int i = 0; i < wcslen(sent); i++) {
  68.         if (sent[i] != ' ') {
  69.             ln++;
  70.             if (ln > max_ln)
  71.                 max_ln = ln;
  72.         } else {
  73.             ln = 0;
  74.         }
  75.     }
  76.     return max_ln;
  77. }
  78.  
  79. //888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
  80. // встечалось ли предложение ранее
  81. int is_repeated(struct Sentence **temp, struct Sentence *sentence, int i) {
  82.     for (int j = 0; j < i; j++) {
  83.         if (wcscasecmp(temp[j]->str, sentence->str) == 0)
  84.             return 1;
  85.     }
  86.     return 0;
  87. }
  88.  
  89.  
  90. wchar_t *fix(int kl) {
  91.     wchar_t *words1 = malloc((N + 1) * sizeof(wchar_t));
  92.     words1[0] = kl / 10 + '0';
  93.     words1[1] = kl % 10 + '0';
  94.     words1[2] = '\0';
  95.     return words1;
  96. }
  97.  
  98. struct sent *arr_words(wchar_t *sent);
  99.  
  100. // считывание предложения
  101. struct Sentence *get_sent() {
  102.     int i = 0;
  103.     int size = STEP * sizeof(wchar_t);
  104.     wchar_t *sent = malloc(size);
  105.     wchar_t *words1 = malloc(size);
  106.     wchar_t *max_length1 = malloc(size);
  107.     wchar_t sym;
  108.     int flag_end = 0;
  109.     int flag_beg = 0; // табуляция в начале предложения(буквы ещё не
  110.     // встретились)
  111.     do {
  112.         sym = getwchar();
  113.  
  114.         if (flag_beg == 0 && sym != L' ') {
  115.             flag_beg = 1;
  116.         }
  117.         if (flag_beg == 1 && sym != L'.' && sym != L'\n') {
  118.             sent[i] = sym;
  119.             i++;
  120.             size += STEP * sizeof(wchar_t);
  121.             sent = realloc(sent, size);
  122.         }
  123.         if (sym == L'\n')
  124.             flag_end = 1;
  125.     } while (sent_end(sym));
  126.     sent[i] = L'\0';
  127.     int j;
  128.     // удаляем лишние пробелы в конце
  129.     for (j = i - 1; j >= 0; j--) {
  130.         if (sent[j] == L' ') {
  131.             sent[j] = L'\0';
  132.             size -= STEP * sizeof(wchar_t);
  133.             sent = realloc(sent, size);
  134.         } else
  135.             break;
  136.     }
  137.     struct Sentence *sentence = malloc(sizeof(struct Sentence));
  138.     sentence->str = sent;
  139.     sentence->size = size;
  140.     sentence->count = j + 1;
  141.     sentence->last = flag_end;
  142.     sentence->words = count_words(sent);
  143.     sentence->max_length = max_length(sent);
  144.     sentence->words_arr = arr_words(sent);
  145.     sentence->words1 = fix(sentence->words);
  146.     sentence->max_length1 = fix(sentence->max_length);
  147.     return sentence;
  148. }
  149.  
  150. // запись в память текста
  151. void get_text(struct Text *text) {
  152.     int size = STEP * sizeof(struct Sentence *);
  153.     struct Sentence **temp = malloc(size);
  154.     struct Sentence *sentence;
  155.     int i = 0;
  156.     do {
  157.         sentence = get_sent();
  158.         if (is_repeated(temp, sentence, i) == 0) {
  159.             temp[i] = sentence;
  160.             i++;
  161.             size += STEP * sizeof(struct Sentence *);
  162.             temp = realloc(temp, size);
  163.         }
  164.     } while (sentence->last == 0);
  165.     text->sents = temp;
  166.     text->n = i;
  167.     text->size = size;
  168. }
  169.  
  170. void hello() {
  171.     wchar_t *one = L"1 - Для каждого предложения вывести строку-дату вида “ДД-ММ-ГГГГ”.";
  172.     wchar_t *two = L"2 - Вывести предложения так, чтобы слова шли в обратном порядке.";
  173.     wchar_t *three = L"3 - Отсортировать предложения по длине первого слова в предложении.";
  174.     wchar_t *four = L"4 - Удалить все предложения у которых все слова имеют длину не больше 3 "
  175.                     "символов.";
  176.     wchar_t *five = L"5 - Выйти из программы";
  177.     wprintf(L"\n%ls\n%ls\n%ls\n%ls\n%ls\n", one, two, three, four, five);
  178. }
  179.  
  180. // ДД-ММ-ГГГГ
  181. void date(struct Text *text) {
  182.     int i = 0;
  183.     struct Sentence **now = text->sents;
  184.     while (now[i]->last == 0) {
  185.         wprintf(L"%ls %ls-%ls-%d\n", now[i]->str, now[i]->words1,
  186.                 now[i]->max_length1, 1900 + now[i]->count);
  187.         i++;
  188.     }
  189.     if (wcslen(now[i]->str) > 1) {
  190.         wprintf(L"%ls %ls-%ls-%d\n", now[i]->str, now[i]->words1,
  191.                 now[i]->max_length1, 1900 + now[i]->count);
  192.     }
  193. }
  194.  
  195.  
  196. void reverse_sent(wchar_t *s, wchar_t *divider) {
  197.     wchar_t *word;
  198.     wchar_t *p;
  199.     s = wcstok(s, divider, &p);
  200.     if (s) {
  201.         word = wcsdup(s);
  202.         reverse_sent(L'\0', divider);
  203.         wprintf(L"%s ", word); //выводить слова будем при выходе из рекурсии
  204.         free(word); //освобождаем память
  205.     }
  206. }
  207.  
  208. struct sent *arr_words(wchar_t *sent) {
  209.     int size = STEP;
  210.     wchar_t **words = calloc(STEP, sizeof(wchar_t *));
  211.     struct sent *arr_of_sent = malloc(sizeof(struct sent));
  212.     int i = 0;
  213.     wchar_t *str1 = calloc(wcslen(sent), sizeof(wchar_t *));
  214.     wcscpy(str1, sent);
  215.     wchar_t *buffer;
  216.     wchar_t *token = wcstok(str1, L" ,", &buffer);
  217.  
  218.     while (token) {
  219.         words[i] = token;
  220.         token = wcstok(NULL, L" ,", &buffer);
  221.         i++;
  222.         if (i == size - 1) {
  223.             size += STEP;
  224.             words = realloc(words, size * sizeof(wchar_t *));
  225.         }
  226.     }
  227.  
  228.     if (words[1] == NULL) {
  229.         words[1] = (wchar_t *) "\0";
  230.     }
  231.  
  232.     if (words[2] == NULL) {
  233.         words[2] = (wchar_t *) "\0";
  234.     }
  235.     arr_of_sent->words = words;
  236.     arr_of_sent->size = i;
  237.  
  238.     return arr_of_sent;
  239. }
  240.  
  241. void reverse(struct Text *text) {
  242.     int i;
  243.     for (i = 0; i < text->n; i++) {
  244.         for (int j = text->sents[i]->words_arr->size - 1; j >= 0; j--) {
  245.             wprintf(L"%ls ", text->sents[i]->words_arr->words[j]);
  246.         }
  247.         if (i != text->n - 1)
  248.             wprintf(L"\n");
  249.     }
  250. }
  251.  
  252. int first_len(wchar_t *sent) {
  253.     int kl = 0;
  254.     for (int i = 0; i < wcslen(sent); i++) {
  255.         if (sent[i] != L' ' && sent[i] != L',')
  256.             kl++;
  257.         else break;
  258.     }
  259.     return kl;
  260. }
  261.  
  262. wchar_t **bubble_sort(wchar_t **data0, int size) {
  263.     int i, j;
  264.     for (i = 0; i < size; ++i) {
  265.         for (j = size - 1; j > i; --j) {
  266.             if (first_len(data0[j]) < first_len(data0[j - 1])) {
  267.                 wchar_t *t = data0[j - 1];
  268.                 data0[j - 1] = data0[j];
  269.                 data0[j] = t;
  270.             }
  271.         }
  272.     }
  273.     return data0;
  274. }
  275.  
  276. int is_short(wchar_t *sentence) {
  277.     int kl = 0;
  278.     for (int i = 0; i < wcslen(sentence); i++) {
  279.         if (sentence[i] != ' ' && sentence[i] != ',') {
  280.             kl++;
  281.             if (kl > 3)
  282.                 return 1;
  283.         } else
  284.             kl = 0;
  285.     }
  286.     return 0;
  287. }
  288.  
  289. // получит динамический массив из всех предложений
  290. wchar_t **sent_arr(struct Text *text) {
  291.     wchar_t **arr1 = malloc(text->n * sizeof(wchar_t *));
  292.     for (int i = 0; i < text->n; i++) {
  293.         arr1[i] = text->sents[i]->str;
  294.     }
  295.     return arr1;
  296. }
  297.  
  298. void del(struct Text *text) {
  299.     wchar_t **arr;
  300.     arr = sent_arr(text);
  301.     for (int i = 0; i < text->n; i++) {
  302.         if (is_short(arr[i]))
  303.             wprintf(L"%ls\n", arr[i]);
  304.     }
  305. }
  306.  
  307.  
  308. void sort_list(struct Text *text) {
  309.     wchar_t **arr;
  310.     arr = sent_arr(text);
  311.     for (int i = 0; i < text->n; i++) {
  312.         arr[i] = text->sents[i]->str;
  313.     }
  314.     arr = bubble_sort(arr, text->n);
  315.     for (int i = 1; i < text->n; i++) {
  316.         wprintf(L"%ls\n", arr[i]);
  317.     }
  318. }
  319.  
  320. int main() {
  321.     setlocale(LC_ALL, "");
  322.     wchar_t answer[D];
  323.     struct Text text;
  324.     get_text(&text);
  325.     hello();
  326.     int kl = 0;
  327.     do {
  328.         wprintf(L"Выберите одно действие: ");
  329.         fgetws(answer, 3, stdin);
  330.         switch (answer[0]) {
  331.             case L'1':
  332.                 date(&text);
  333.                 break;
  334.             case L'2':
  335.                 reverse(&text);
  336.                 break;
  337.             case L'3':
  338.                 sort_list(&text);
  339.                 break;
  340.             case L'4':
  341.                 del(&text);
  342.                 break;
  343.             case L'5':
  344.                 wprintf(L"Выход из программы\n");
  345.                 break;
  346.             default:
  347.                 wprintf(L"Ошибка ввода!\n");
  348.                 break;
  349.         };
  350.     } while (answer[0] != '5');
  351.     clean(&text);
  352.     return 0;
  353. }
  354.  
  355.  
  356.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement