Advertisement
LilChicha174

Untitled

Dec 19th, 2021
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5. #include <wchar.h>
  6. #include <wctype.h>
  7.  
  8. # define STEP 2
  9. # define N 3
  10. # define D 5
  11. struct Sentence {
  12.     wchar_t *str;
  13.     int count;
  14.     int size;
  15.     int last;
  16.     int words;
  17.     int max_length;
  18.     wchar_t* words1;
  19.     wchar_t* max_length1;
  20. };
  21.  
  22. struct Text {
  23.     struct Sentence **sents;
  24.     int size;
  25.     int n;
  26. };
  27.  
  28. struct Sentence *get_sent();
  29.  
  30. // проверка на конец предложения
  31. int sent_end(wchar_t sym) {
  32.     if (sym == L'.' || sym == L'\n')
  33.         return 0;
  34.     return 1;
  35. }
  36. int count_words(wchar_t* sent){
  37.     int words = 1;
  38.     for(int i = 0;i<wcslen(sent);i++){
  39.         if ((sent[i] ==L' ' || sent[i] ==L',') && sent[i+1] !=L' ' && sent[i+1] !=L',' )
  40.             words++;
  41.     }
  42.     return words;
  43. }
  44.  
  45. int max_length(wchar_t* sent){
  46.     int max_ln = 0;
  47.     int ln = 0;
  48.     for(int i = 0; i<wcslen(sent); i++){
  49.         if (sent[i]!=' '){
  50.             ln++;
  51.             if(ln>max_ln)
  52.                 max_ln = ln;
  53.         } else{
  54.             ln = 0;
  55.         }
  56.     }
  57.     return max_ln;
  58. }
  59.  
  60. //888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
  61. // встечалось ли предложение ранее
  62. int is_repeated(struct Sentence **temp, struct Sentence *sentence, int i) {
  63.     for (int j = 0; j < i; j++) {
  64.         if (wcscasecmp(temp[j]->str, sentence->str) == 0)
  65.             return 1;
  66.     }
  67.     return 0;
  68. }
  69.  
  70. //очистка памяти
  71. void clean(struct Text *text){
  72.     for (int i = 0; i <= text->n; i++)
  73.         free((text->sents)[i]);
  74.     free(text->sents);
  75. }
  76.  
  77. wchar_t * fix(int kl){
  78.     wchar_t *words1 = malloc((N+1) * sizeof(wchar_t));
  79.     words1[0] = kl/10 + '0';
  80.     words1[1] = kl%10 + '0';
  81.     words1[2] = '\0';
  82.     return words1;
  83. }
  84.  
  85.  
  86.  
  87. // считывание предложения
  88. struct Sentence *get_sent() {
  89.     int i = 0;
  90.     int size = STEP * sizeof(wchar_t);
  91.     wchar_t *sent = malloc(size);
  92.     wchar_t *words1 = malloc(size);
  93.     wchar_t *max_length1 = malloc(size);
  94.     wchar_t sym;
  95.     int flag_end = 0;
  96.     int flag_beg = 0; // табуляция в начале предложения(буквы ещё не
  97.     // встретились)
  98.     do {
  99.         sym = getwchar();
  100.  
  101.         if (flag_beg == 0 && sym != L' ') {
  102.             flag_beg = 1;
  103.         }
  104.         if (flag_beg == 1 && sym != L'.' && sym != L'\n') {
  105.             sent[i] = sym;
  106.             i++;
  107.             size += STEP * sizeof(wchar_t);
  108.             sent = realloc(sent, size);
  109.         }
  110.         if (sym == L'\n')
  111.             flag_end = 1;
  112.     } while (sent_end(sym));
  113.     sent[i] = L'\0';
  114.     int j;
  115.     // удаляем лишние пробелы в конце
  116.     for (j = i - 1; j >= 0; j--) {
  117.         if (sent[j] == L' ') {
  118.             sent[j] = L'\0';
  119.             size -= STEP * sizeof(wchar_t);
  120.             sent = realloc(sent, size);
  121.         } else
  122.             break;
  123.     }
  124.     struct Sentence *sentence = malloc(sizeof(struct Sentence));
  125.     sentence->str = sent;
  126.     sentence->size = size;
  127.     sentence->count = j+1;
  128.     sentence->last = flag_end;
  129.     sentence->words = count_words(sent);
  130.     sentence->max_length = max_length(sent);
  131. //    if(sentence->words<10){
  132. //        sentence->words1[0] = '0';
  133. //        sentence->words1[1] = sentence->words + '0';
  134. //    }
  135. //    else{
  136. //        if(sentence->words<100){
  137. //            sentence->words1[0] = sentence->words/10 + '0';
  138. //            sentence->words1[1] = sentence->words%10 + '0';
  139. //        }
  140. //        else{
  141. //            sentence->words1[0] = sentence->words/100 + '0';
  142. //            sentence->words1[1] = (sentence->words/10)%10 + '0';
  143. //            sentence->words1[2] = (sentence->words/10)%10 + '0';
  144. //        }
  145. //    }
  146.     sentence->words1 = fix(sentence->words);
  147.     sentence->max_length1 = fix(sentence->max_length);
  148.     return sentence;
  149. }
  150.  
  151. // запись в память текста
  152. void get_text(struct Text *text) {
  153.     int size = STEP * sizeof(struct Sentence *);
  154.     struct Sentence **temp = malloc(size);
  155.     struct Sentence *sentence;
  156.     int i = 0;
  157.     do {
  158.         sentence = get_sent();
  159.         if (is_repeated(temp, sentence, i) == 0) {
  160.             temp[i] = sentence;
  161.             i++;
  162.             size += STEP * sizeof(struct Sentence *);
  163.             temp = realloc(temp, size);
  164.         }
  165.     } while (sentence->last == 0);
  166.     text->sents = temp;
  167.     text->n = i;
  168.     text->size = size;
  169. }
  170.  
  171. void hello(){
  172.     wchar_t * one = L"1 - Для каждого предложения вывести строку-дату вида “ДД-ММ-ГГГГ”.";
  173.     wchar_t * two = L"2 - Вывести предложения так, чтобы слова шли в обратном порядке.";
  174.     wchar_t * three = L"3 - Отсортировать предложения по длине первого слова в предложении.";
  175.     wchar_t * four = L"4 - Удалить все предложения у которых все слова имеют длину не больше 3 "
  176.                      "символов.";
  177.     wchar_t * five = L"5 - Выйти из программы";
  178.     wprintf(L"\n%ls\n%ls\n%ls\n%ls\n%ls\n", one, two, three, four, five);
  179. }
  180.  
  181. // ДД-ММ-ГГГГ
  182. void date(struct Text *text){
  183.     int i = 0;
  184.     struct Sentence **now = text->sents;
  185.     while (now[i]->last == 0) {
  186.         wprintf(L"%ls %ls-%ls-%d\n", now[i]->str,now[i]->words1,
  187.                 now[i]->max_length1, 1900+now[i]->count);
  188.         i++;
  189.     }
  190.     if (wcslen(now[i]->str) > 1) {
  191.         wprintf(L"%ls %ls-%ls-%d\n", now[i]->str, now[i]->words1,
  192.                 now[i]->max_length1, 1900+now[i]->count);
  193.     }
  194. }
  195.  
  196.  
  197. void reverse_sent(wchar_t *s, wchar_t *divider) {
  198.     wchar_t *word;
  199.     wchar_t * p;
  200.     s = wcstok(s, divider, &p);
  201.     if (s) {
  202.         word = wcsdup(s);
  203.         reverse_sent(L'\0', divider);
  204.         wprintf(L"%s ", word); //выводить слова будем при выходе из рекурсии
  205.         free(word); //освобождаем память
  206.     }
  207. }
  208.  
  209. void reverse(struct Text *text, int n){
  210.     struct Sentence **now = text->sents;
  211.     for(int i = 0; i<n; i++){
  212.         reverse_sent(now[i]->str, L" ,");
  213.         wprintf(L"\n");
  214.     }
  215. }
  216.  
  217. void sort(){
  218.     return;
  219. }
  220. void del(){
  221.     return;
  222. }
  223.  
  224.  
  225. int main() {
  226.     setlocale(LC_ALL, "");
  227.     wchar_t answer[D];
  228.     struct Text text;
  229.     get_text(&text);
  230.     hello();
  231.     int kl = 0;
  232.     do{
  233.         fgetws(answer, 3, stdin);
  234.         switch(answer[0]){
  235.             case L'1':
  236.                 date(&text);
  237.                 break;
  238.             case L'2':
  239.                 reverse(&text, text.n);
  240.                 break;
  241.             case L'3':
  242.                 sort();
  243.                 break;
  244.             case L'4':
  245.                 del();
  246.                 break;
  247.             case L'5':
  248.                 break;
  249.             default:
  250.                 wprintf(L"Ошибка ввода!\n");
  251.                 break;
  252.         };
  253.         kl++;
  254.         if (kl>3){
  255.             hello();
  256.             kl = 0;
  257.         }
  258.     }while(answer[0]!='5');
  259.     clean(&text);
  260.     return 0;
  261. }
  262.  
  263.  
  264.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement