Advertisement
Guest User

курсач_v2

a guest
Dec 16th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.06 KB | None | 0 0
  1. #define READ_ARR 50
  2. #define SIZE_STR 25
  3. #define SIZE_SENT 5
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. #include <stdlib.h>
  8. //Считываем строку в массив символов
  9. int read_arr(char** str){
  10.     char check;
  11.     int i = 0;
  12.     int read_size = READ_ARR;
  13.     *str = (char*)malloc(read_size*sizeof(char));
  14.     while (check != '\n'){
  15.         scanf ("%c",&check);
  16.         (*str)[i] = check;
  17.         i++;
  18.         if (read_size==i)
  19.         {
  20.             read_size += READ_ARR;
  21.             *str = (char*)realloc(*str, read_size * sizeof(char));
  22.         }
  23.     }
  24.     (*str)[i] = '\0';
  25.     return i;
  26. }
  27. //Создаем массив предложений попутно удаляя символы табудяции перед ними
  28. int make_arr(char**str, int str_len, char*** bin_arr){
  29.     int i;
  30.     int numb = 0;
  31.     int first_symb = 0;
  32.     int len_each_str = 0;
  33.     int size_sent = SIZE_SENT;
  34.     int size_str = SIZE_STR;
  35.     *bin_arr= (char**)malloc(size_sent*sizeof(char*));//Выделяем память под массив предложений
  36.     **bin_arr= (char*)malloc(size_str*sizeof(char));//Выделяем память под первое предложение
  37.     for (i=0;i<str_len;i++){
  38.         (*bin_arr)[numb][len_each_str++] = (*str)[i];
  39.         // В случае, если количество памяти отведенное под предложение недостаточно, то увеличиваем её на size_str=25
  40.         if (len_each_str == size_str)
  41.         {
  42.             size_str += SIZE_STR;
  43.             (*bin_arr)[numb] = (char*)realloc((*bin_arr)[numb], size_str * sizeof(char));
  44.         }
  45.         /*В случае, если символ является точкой, знаком вопроса или точкой с запятой,
  46.         то заканчиваем записывать предложение и переходим к следующему элементу в массиве предложений*/
  47.         if ((*str)[i] == '.')
  48.         {
  49.             (*bin_arr)[numb++][len_each_str] = '\0';
  50.             // В случае, если количество памяти отведенное под массив предложений недостаточно, то увеличиваем её на size_sent=5
  51.             if (numb == size_sent)
  52.             {
  53.                 size_sent += SIZE_SENT;
  54.                 *bin_arr = (char**)realloc(*bin_arr, size_sent * sizeof(char*));
  55.             }
  56.             size_str = 25;
  57.             //Отводим память под следующее предложение
  58.             (*bin_arr)[numb] = (char*)malloc(size_str * sizeof(char));
  59.             //Обнуляем длину предложение и первый символ
  60.             len_each_str = 0;
  61.          }
  62.     }
  63.     (*bin_arr)[numb][len_each_str] = '\0';
  64.     return numb;
  65.  }
  66. //Удаление повторяющихся предложений
  67. void delete_replics(int numb_sent, char*** bin_arr){
  68.     int i, j=0, k=0;
  69.     int flag = 0;
  70.     int flag1 = 1;
  71.     for (i = 0; i < numb_sent-1;i++){
  72.         if ((*bin_arr)[i] != NULL)
  73.             for (j = i+1; j < numb_sent; j++){
  74.                 if (((*bin_arr)[j] != NULL)){
  75.                     while (((*bin_arr)[i][k] != '\0')||((*bin_arr)[j][k] !='\0')){
  76.                         if ((  tolower( (*bin_arr)[i][k]) != tolower( (*bin_arr)[j][k]))||(strlen((*bin_arr)[i])!=strlen((*bin_arr)[j]))){
  77.                             flag = 1;
  78.                             break;
  79.                         }
  80.                         k++;
  81.                     }
  82.                     k = 0;
  83.                     if (flag==0){
  84.                         (*bin_arr)[j] = NULL;
  85.                         flag1 = 0;
  86.                     }
  87.                     flag = 0;
  88.                 }
  89.             }
  90.             if (flag1==0){
  91.                     (*bin_arr)[i] = NULL;
  92.                 }
  93.             flag1 = 1;
  94.         }
  95. }
  96. int delete_NULLS(int numb_sent, char*** bin_arr){
  97.     int new_numb=0,i=0,j=0,l=0;
  98.     for(i=0;i<numb_sent-1;i++){
  99.         if ((*bin_arr)[i]==NULL){
  100.             for (j=i+1;j<numb_sent;j++){
  101.                 (*bin_arr)[l]=(*bin_arr)[j];
  102.                 l++;
  103.             }
  104.            
  105.         }
  106.         l = i+1;
  107.     }
  108.     return new_numb;
  109.    
  110.    
  111.    
  112.    
  113. }
  114. int cmp(const void* a, const void* b){
  115.     a = *(char **) a;
  116.     b = *(char **) b;
  117.     if (a==NULL && b!=NULL)
  118.         return 1;
  119.     if (a!=NULL && b==NULL)
  120.         return -1;
  121.     return 0;
  122.        
  123. }
  124.  
  125. /*
  126. }
  127.  //Вывод результата
  128. void print_arr( char **bin_arr, int numb_sent, int new_numb_sent)
  129. {
  130.     for (int i = 0; i<numb_sent+1; i++)
  131.         {
  132.             if (bin_arr[i]!=NULL)
  133.                 printf("%s\n",bin_arr[i]);
  134.         }
  135.     printf("Количество предложений до %d и количество предложений после %d", numb_sent, new_numb_sent);        
  136. }*/
  137.  int main(){
  138.     int i;
  139.     char* str;
  140.     int str_len = read_arr(&str);
  141.     for (i = 0; i <str_len; i++)
  142.             printf("%c",str[i]);
  143.  
  144.     char ** bin_arr;
  145.     int numb_sent = make_arr(&str,str_len,&bin_arr);
  146.     for (i = 0;i <numb_sent;i++)
  147.           printf("%s\n",bin_arr[i]);
  148.     printf("\n\n");
  149.     delete_replics(numb_sent, &bin_arr);
  150.     for (i = 0;i <numb_sent;i++)
  151.           //if (bin_arr[i]!=NULL)
  152.             printf("%s\n",bin_arr[i]);
  153.     //int new = delete_NULLS(numb_sent, &bin_arr);
  154.     qsort(bin_arr, numb_sent, sizeof(char*), cmp);
  155.     printf("\n\n");
  156.     for (i = 0;i <numb_sent;i++)
  157.          // if (bin_arr[i]!=NULL)
  158.             printf("%s\n",bin_arr[i]);
  159.     int new_numb = 0;
  160.     printf("\n\n");
  161.     for (i=0;i<numb_sent;i++)
  162.         if (bin_arr[i]!=NULL)
  163.             new_numb++;
  164.     for (i=0;i<new_numb;i++)
  165.         printf("%s\n",bin_arr[i]);
  166.    
  167.     /*
  168.     int new_numb_sent = edit_arr(&bin_arr,numb_sent);
  169.     print_arr(bin_arr, numb_sent, new_numb_sent);
  170.     for (i = 0; i<numb_sent; i++)
  171.         free(bin_arr[i]);
  172.     free(bin_arr);
  173.     free(str);*/
  174.     return 0;
  175.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement