Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <wctype.h>
- #include <stdlib.h>
- #include <wchar.h>
- #include <locale.h>
- #include <string.h>
- #define COUNT_SENT 20
- #define SIZE_SENT 10
- struct Sentence
- {
- wchar_t *sentence;
- int len; //количество символов
- int size; //размер массива
- int words; //количество слов
- };
- struct Text//Стрктура текст
- {
- struct Sentence *text;
- int sentences; // размер массива
- int count; //количество предложений
- };
- void input(struct Text *text)//ввод текста ,передается структура текст с переменной указателя текст
- {
- fputws(L"Пожалуйста введите текст: \n",stdout);// Вывод строки «Пожалуйста введите текст:» в стандартный поток вывода
- text->sentences=10;//Обращение к члену структуры («член b объекта, на который указывает a»)
- text->text=(struct Sentence*)malloc(sizeof(struct Sentence)*text->sentences);//создается память под массивы
- text->count=0; //передает в структуру текст ,что кол-во предложений в тексте 0
- int point =0;//была ли точка перед \n
- int kir=0;
- int count_kir = 0;
- wchar_t c='s';//????????????????
- int i=0,j=0; //индексы
- while((c=getwchar())!='\n')
- {
- if (j==0)
- {
- text->text[i].words=1;
- text->text[i].size=100;
- text->text[i].sentence = (wchar_t*)malloc(sizeof(wchar_t)*(text->text[i].size));
- }
- text->text[i].sentence[j]=c;
- j++;
- point=0;
- if (i==text->sentences-1)
- {
- text->sentences+=COUNT_SENT;
- text->text=(struct Sentence*)realloc(text->text,sizeof(struct Sentence)*(text->sentences));
- }
- if(j==text->text[i].size-3)
- {
- text->text[i].size+=SIZE_SENT;
- text->text[i].sentence=(wchar_t*)realloc(text->text[i].sentence,sizeof(wchar_t)* (text->text[i].size));
- }
- if(((int)c>=192)&&((int)c<=255))
- {
- kir++;
- }
- if (c=='.')
- {
- text->text[i].sentence[j]='\0';
- text->text[i].len=j;
- text->text[i].count_kir=kir;
- kir=0;
- j=0;
- i++;
- text->count+=1;
- point=1;
- }
- else if (c==' ' || c==',')
- {
- text->text[i].words++;
- }
- }
- if (point == 0)//если пользователь не поставил точку в конце последнего предолжения
- {
- if (text->text[i].sentence[j-1]==' ' || text->text[i].sentence[j]==',')
- {
- text->text[i].sentence[j-1]='.';
- text->text[i].sentence[j]='\0';
- }
- else{
- text->text[i].sentence[j]='.';
- text->text[i].sentence[j+1]='\0';
- }
- text->count++;
- text->text[i].len=j;
- }
- }
- int not_in_indexes(int*indexes,int ind,int i)
- {
- for(int j = 0 ; j<ind;j++){
- if (indexes[j]==i)
- {
- return 0;
- }
- }
- return 1;
- }
- int comp(const void* i, const void *j)
- {
- const int *arg1 =i;
- const int *arg2 = j;
- return *arg1 - *arg2;
- }
- void del_sent (struct Text *text)//4 абзац
- {
- int diff=0;
- int count;
- int m;//indexes[i]
- int stop=0;
- int *indexes;//какой то массив
- int len_indexes=10;//кол-во эл массива
- int ind=0;
- indexes= malloc(sizeof(int)*len_indexes);//выделение памяти
- int i ,j;
- for ( i = 0 ; i<text->count;i++)
- {
- for ( j = i+1 ; j <text->count;j++)
- {
- if(wcslen(text->text[i].sentence)==wcslen(text->text[j].sentence))
- {
- if(!(wcscasecmp(text->text[i].sentence,text->text[j].sentence)))
- {
- if(ind>=len_indexes-2)
- {
- len_indexes*=2;
- indexes=realloc(indexes,sizeof(int)*len_indexes);//скорее всего реализует память под значения для удаления предложения
- }
- if (not_in_indexes(indexes,ind,i))//проверяем есть ли индекс уже в массиве
- {
- indexes[ind]=i;
- ind++;
- }
- if (not_in_indexes(indexes,ind,j))
- {
- indexes[ind]=j;
- ind++;
- }
- }
- }
- }
- }
- qsort(indexes,ind,sizeof(int),comp); // сортировка
- for (int i = 0 ; i<ind;i++)
- {
- m=indexes[i]-diff;
- for(int j = 0 ; text->text[m].sentence[j];j++)
- {
- text->text[m].sentence[j]='\0';
- }
- count=text->count-1;
- for (int j = m ; j<count;j++)
- {
- if(text->text[j].size<text->text[j+1].size)
- {
- text->text[j].sentence=realloc(text->text[j].sentence,sizeof(wchar_t)*text->text[j+1].size);
- }
- text->text[j].len=text->text[j+1].len;
- text->text[j].size=text->text[j+1].size;
- text->text[j].words=text->text[j+1].words;
- wcscpy(text->text[j].sentence,text->text[j+1].sentence);
- }
- text->count-=1;
- diff+=1;
- }
- free(indexes);
- }
- void del_lcl(struct Text *text)
- {
- for (int i = 0 ; i<text->count;i++)//цикл фор делается пока не дайдет до послднего предложения
- {
- for (int j = 0 ; j<text->text[i].len;j++)//цикл фор делается пока не дайдет до послднего предложения
- {
- if(((int)text->text[i].sentence[j]>=65)&&((int)text->text[i].sentence[j] <= 90))
- {
- int k = j;
- text->text[i].sentence[k] = ' ';
- while(text->text[i].sentence[k]!='\0'){
- text->text[i].sentence[k]=text->text[i].sentence[k+1];
- k++;
- }
- j--;
- text->text[i].len--;
- }
- }
- }
- }
- void output(struct Text *text){
- fputws(L"--------------------------------------TEXT-------------------------------------\n\n",stdout);
- for(int k = 0 ; k< text->count;k++){
- fputws(text->text[k].sentence,stdout);
- }
- fputws(L"\n\n--------------------------------------TEXT-------------------------------------\n\n",stdout);
- return;
- }
- int menu()
- {
- int i = 0;
- wchar_t x[90];
- wchar_t *end;
- fputws(L"-------------------------------------------------------------------------------",stdout);
- fputws(L"\nВведите номер действия, которое необходимо выполнить:\n\n",stdout);
- fputws(L"1 - Вывести номер предложения в котором встречается подстрока, задающей время вида “часы:минуты” и количество минут до текущего времени\n",stdout);
- fputws(L"2 - В каждом предложении удалить все заглавные латинские буквы.\n",stdout);
- fputws(L"3 - Отсортировать предложения по уменьшению количеству кириллических букв.\n",stdout);
- fputws(L"4 - Удалить все предложения в которых нет специальных символов.\n",stdout);
- fputws(L"5 - Вывести текст\n",stdout);
- fputws(L"0 - Закончить\n",stdout);
- fputws(L"\n-------------------------------------------------------------------------------\n\n",stdout);
- fputws(L"Ввод: ",stdout);
- int kk = 0;
- while((x[kk]=getwchar())!='\n')
- {
- kk++;
- }
- if (x[0]=='\n')
- {
- return 10;
- }
- x[kk]='\0';
- fputws(L"\n",stdout);
- for (int i=0;x[i]!='\0';i++)
- {
- if (iswdigit(x[i]))
- {
- continue;
- }
- else{
- return 10;
- break;
- }
- }
- return (wcstol(x,&end,10));
- }
- int main()
- {
- setlocale(LC_ALL,"");
- int n;
- struct Text text;
- input(&text);
- del_sent(&text);
- output(&text);
- while ((n=menu())!=0){
- switch (n)
- {
- case 1:
- break;
- case 2:
- del_lcl(&text);
- break;
- case 3:
- break;
- case 4:
- break;
- case 5:
- output(&text);
- break;
- default:
- fputws(L"Пожалуйста, введите корректное значение !\n",stdout);
- break;
- }
- }
- for (int k = 0 ; k <text.sentences;k++)
- {
- free(text.text[k].sentence);
- }
- free(text.text);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement