Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define READ_ARR 50
- #define SIZE_STR 25
- #define SIZE_SENT 5
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include <stdlib.h>
- //Считываем строку в массив символов
- int read_arr(char** str){
- char check;
- int i = 0;
- int read_size = READ_ARR;
- *str = (char*)malloc(read_size*sizeof(char));
- while (check != '\n'){
- scanf ("%c",&check);
- (*str)[i] = check;
- i++;
- if (read_size==i)
- {
- read_size += READ_ARR;
- *str = (char*)realloc(*str, read_size * sizeof(char));
- }
- }
- (*str)[i] = '\0';
- return i;
- }
- //Создаем массив предложений попутно удаляя символы табудяции перед ними
- int make_arr(char**str, int str_len, char*** bin_arr){
- int i;
- int numb = 0;
- int first_symb = 0;
- int len_each_str = 0;
- int size_sent = SIZE_SENT;
- int size_str = SIZE_STR;
- *bin_arr= (char**)malloc(size_sent*sizeof(char*));//Выделяем память под массив предложений
- **bin_arr= (char*)malloc(size_str*sizeof(char));//Выделяем память под первое предложение
- for (i=0;i<str_len;i++){
- (*bin_arr)[numb][len_each_str++] = (*str)[i];
- // В случае, если количество памяти отведенное под предложение недостаточно, то увеличиваем её на size_str=25
- if (len_each_str == size_str)
- {
- size_str += SIZE_STR;
- (*bin_arr)[numb] = (char*)realloc((*bin_arr)[numb], size_str * sizeof(char));
- }
- /*В случае, если символ является точкой, знаком вопроса или точкой с запятой,
- то заканчиваем записывать предложение и переходим к следующему элементу в массиве предложений*/
- if ((*str)[i] == '.')
- {
- (*bin_arr)[numb++][len_each_str] = '\0';
- // В случае, если количество памяти отведенное под массив предложений недостаточно, то увеличиваем её на size_sent=5
- if (numb == size_sent)
- {
- size_sent += SIZE_SENT;
- *bin_arr = (char**)realloc(*bin_arr, size_sent * sizeof(char*));
- }
- size_str = 25;
- //Отводим память под следующее предложение
- (*bin_arr)[numb] = (char*)malloc(size_str * sizeof(char));
- //Обнуляем длину предложение и первый символ
- len_each_str = 0;
- }
- }
- (*bin_arr)[numb][len_each_str] = '\0';
- return numb;
- }
- //Удаление повторяющихся предложений
- void delete_replics(int numb_sent, char*** bin_arr){
- int i, j=0, k=0;
- int flag = 0;
- int flag1 = 1;
- for (i = 0; i < numb_sent-1;i++){
- if ((*bin_arr)[i] != NULL)
- for (j = i+1; j < numb_sent; j++){
- if (((*bin_arr)[j] != NULL)){
- while (((*bin_arr)[i][k] != '\0')||((*bin_arr)[j][k] !='\0')){
- if (( tolower( (*bin_arr)[i][k]) != tolower( (*bin_arr)[j][k]))||(strlen((*bin_arr)[i])!=strlen((*bin_arr)[j]))){
- flag = 1;
- break;
- }
- k++;
- }
- k = 0;
- if (flag==0){
- (*bin_arr)[j] = NULL;
- flag1 = 0;
- }
- flag = 0;
- }
- }
- if (flag1==0){
- (*bin_arr)[i] = NULL;
- }
- flag1 = 1;
- }
- }
- int delete_NULLS(int numb_sent, char*** bin_arr){
- int new_numb=0,i=0,j=0,l=0;
- for(i=0;i<numb_sent-1;i++){
- if ((*bin_arr)[i]==NULL){
- for (j=i+1;j<numb_sent;j++){
- (*bin_arr)[l]=(*bin_arr)[j];
- l++;
- }
- }
- l = i+1;
- }
- return new_numb;
- }
- int cmp(const void* a, const void* b){
- a = *(char **) a;
- b = *(char **) b;
- if (a==NULL && b!=NULL)
- return 1;
- if (a!=NULL && b==NULL)
- return -1;
- return 0;
- }
- /*
- }
- //Вывод результата
- void print_arr( char **bin_arr, int numb_sent, int new_numb_sent)
- {
- for (int i = 0; i<numb_sent+1; i++)
- {
- if (bin_arr[i]!=NULL)
- printf("%s\n",bin_arr[i]);
- }
- printf("Количество предложений до %d и количество предложений после %d", numb_sent, new_numb_sent);
- }*/
- int main(){
- int i;
- char* str;
- int str_len = read_arr(&str);
- for (i = 0; i <str_len; i++)
- printf("%c",str[i]);
- char ** bin_arr;
- int numb_sent = make_arr(&str,str_len,&bin_arr);
- for (i = 0;i <numb_sent;i++)
- printf("%s\n",bin_arr[i]);
- printf("\n\n");
- delete_replics(numb_sent, &bin_arr);
- for (i = 0;i <numb_sent;i++)
- //if (bin_arr[i]!=NULL)
- printf("%s\n",bin_arr[i]);
- //int new = delete_NULLS(numb_sent, &bin_arr);
- qsort(bin_arr, numb_sent, sizeof(char*), cmp);
- printf("\n\n");
- for (i = 0;i <numb_sent;i++)
- // if (bin_arr[i]!=NULL)
- printf("%s\n",bin_arr[i]);
- int new_numb = 0;
- printf("\n\n");
- for (i=0;i<numb_sent;i++)
- if (bin_arr[i]!=NULL)
- new_numb++;
- for (i=0;i<new_numb;i++)
- printf("%s\n",bin_arr[i]);
- /*
- int new_numb_sent = edit_arr(&bin_arr,numb_sent);
- print_arr(bin_arr, numb_sent, new_numb_sent);
- for (i = 0; i<numb_sent; i++)
- free(bin_arr[i]);
- free(bin_arr);
- free(str);*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement