Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- #include <wchar.h>
- #include <wctype.h>
- # define STEP 2
- # define N 3
- # define D 5
- struct Sentence {
- wchar_t *str;
- int count;
- int size;
- int last;
- int words;
- int max_length;
- wchar_t* words1;
- wchar_t* max_length1;
- };
- struct Text {
- struct Sentence **sents;
- int size;
- int n;
- };
- struct Sentence *get_sent();
- // проверка на конец предложения
- int sent_end(wchar_t sym) {
- if (sym == L'.' || sym == L'\n')
- return 0;
- return 1;
- }
- int count_words(wchar_t* sent){
- int words = 1;
- for(int i = 0;i<wcslen(sent);i++){
- if ((sent[i] ==L' ' || sent[i] ==L',') && sent[i+1] !=L' ' && sent[i+1] !=L',' )
- words++;
- }
- return words;
- }
- int max_length(wchar_t* sent){
- int max_ln = 0;
- int ln = 0;
- for(int i = 0; i<wcslen(sent); i++){
- if (sent[i]!=' '){
- ln++;
- if(ln>max_ln)
- max_ln = ln;
- } else{
- ln = 0;
- }
- }
- return max_ln;
- }
- //888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
- // встечалось ли предложение ранее
- int is_repeated(struct Sentence **temp, struct Sentence *sentence, int i) {
- for (int j = 0; j < i; j++) {
- if (wcscasecmp(temp[j]->str, sentence->str) == 0)
- return 1;
- }
- return 0;
- }
- //очистка памяти
- void clean(struct Text *text){
- for (int i = 0; i <= text->n; i++)
- free((text->sents)[i]);
- free(text->sents);
- }
- wchar_t * fix(int kl){
- wchar_t *words1 = malloc((N+1) * sizeof(wchar_t));
- words1[0] = kl/10 + '0';
- words1[1] = kl%10 + '0';
- words1[2] = '\0';
- return words1;
- }
- // считывание предложения
- struct Sentence *get_sent() {
- int i = 0;
- int size = STEP * sizeof(wchar_t);
- wchar_t *sent = malloc(size);
- wchar_t *words1 = malloc(size);
- wchar_t *max_length1 = malloc(size);
- wchar_t sym;
- int flag_end = 0;
- int flag_beg = 0; // табуляция в начале предложения(буквы ещё не
- // встретились)
- do {
- sym = getwchar();
- if (flag_beg == 0 && sym != L' ') {
- flag_beg = 1;
- }
- if (flag_beg == 1 && sym != L'.' && sym != L'\n') {
- sent[i] = sym;
- i++;
- size += STEP * sizeof(wchar_t);
- sent = realloc(sent, size);
- }
- if (sym == L'\n')
- flag_end = 1;
- } while (sent_end(sym));
- sent[i] = L'\0';
- int j;
- // удаляем лишние пробелы в конце
- for (j = i - 1; j >= 0; j--) {
- if (sent[j] == L' ') {
- sent[j] = L'\0';
- size -= STEP * sizeof(wchar_t);
- sent = realloc(sent, size);
- } else
- break;
- }
- struct Sentence *sentence = malloc(sizeof(struct Sentence));
- sentence->str = sent;
- sentence->size = size;
- sentence->count = j+1;
- sentence->last = flag_end;
- sentence->words = count_words(sent);
- sentence->max_length = max_length(sent);
- // if(sentence->words<10){
- // sentence->words1[0] = '0';
- // sentence->words1[1] = sentence->words + '0';
- // }
- // else{
- // if(sentence->words<100){
- // sentence->words1[0] = sentence->words/10 + '0';
- // sentence->words1[1] = sentence->words%10 + '0';
- // }
- // else{
- // sentence->words1[0] = sentence->words/100 + '0';
- // sentence->words1[1] = (sentence->words/10)%10 + '0';
- // sentence->words1[2] = (sentence->words/10)%10 + '0';
- // }
- // }
- sentence->words1 = fix(sentence->words);
- sentence->max_length1 = fix(sentence->max_length);
- return sentence;
- }
- // запись в память текста
- void get_text(struct Text *text) {
- int size = STEP * sizeof(struct Sentence *);
- struct Sentence **temp = malloc(size);
- struct Sentence *sentence;
- int i = 0;
- do {
- sentence = get_sent();
- if (is_repeated(temp, sentence, i) == 0) {
- temp[i] = sentence;
- i++;
- size += STEP * sizeof(struct Sentence *);
- temp = realloc(temp, size);
- }
- } while (sentence->last == 0);
- text->sents = temp;
- text->n = i;
- text->size = size;
- }
- void hello(){
- wchar_t * one = L"1 - Для каждого предложения вывести строку-дату вида “ДД-ММ-ГГГГ”.";
- wchar_t * two = L"2 - Вывести предложения так, чтобы слова шли в обратном порядке.";
- wchar_t * three = L"3 - Отсортировать предложения по длине первого слова в предложении.";
- wchar_t * four = L"4 - Удалить все предложения у которых все слова имеют длину не больше 3 "
- "символов.";
- wchar_t * five = L"5 - Выйти из программы";
- wprintf(L"\n%ls\n%ls\n%ls\n%ls\n%ls\n", one, two, three, four, five);
- }
- // ДД-ММ-ГГГГ
- void date(struct Text *text){
- int i = 0;
- struct Sentence **now = text->sents;
- while (now[i]->last == 0) {
- wprintf(L"%ls %ls-%ls-%d\n", now[i]->str,now[i]->words1,
- now[i]->max_length1, 1900+now[i]->count);
- i++;
- }
- if (wcslen(now[i]->str) > 1) {
- wprintf(L"%ls %ls-%ls-%d\n", now[i]->str, now[i]->words1,
- now[i]->max_length1, 1900+now[i]->count);
- }
- }
- void reverse_sent(wchar_t *s, wchar_t *divider) {
- wchar_t *word;
- wchar_t * p;
- s = wcstok(s, divider, &p);
- if (s) {
- word = wcsdup(s);
- reverse_sent(L'\0', divider);
- wprintf(L"%s ", word); //выводить слова будем при выходе из рекурсии
- free(word); //освобождаем память
- }
- }
- void reverse(struct Text *text, int n){
- struct Sentence **now = text->sents;
- for(int i = 0; i<n; i++){
- reverse_sent(now[i]->str, L" ,");
- wprintf(L"\n");
- }
- }
- void sort(){
- return;
- }
- void del(){
- return;
- }
- int main() {
- setlocale(LC_ALL, "");
- wchar_t answer[D];
- struct Text text;
- get_text(&text);
- hello();
- int kl = 0;
- do{
- fgetws(answer, 3, stdin);
- switch(answer[0]){
- case L'1':
- date(&text);
- break;
- case L'2':
- reverse(&text, text.n);
- break;
- case L'3':
- sort();
- break;
- case L'4':
- del();
- break;
- case L'5':
- break;
- default:
- wprintf(L"Ошибка ввода!\n");
- break;
- };
- kl++;
- if (kl>3){
- hello();
- kl = 0;
- }
- }while(answer[0]!='5');
- clean(&text);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement