Guest User

Untitled

a guest
May 21st, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.23 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int count_posl, max_count_words, min_count_words, count_strok;
  7. char *razdelit; // строка разделителей
  8. char **text; // текст
  9. int *count_words; // количество слов в каждой строке текста
  10.  
  11. /*
  12. count_words_in_str - функция, которая возвращает количество слов в строке
  13. -------------------------------------------------------------------------
  14. stroka - строка, в которой мы находим слова
  15.  
  16. */
  17.  
  18. int count_words_in_str(char *stroka)
  19. {
  20.  
  21.     int result=0,i;
  22.  
  23.     for (i=1; i<strlen(&stroka[0]); i++)
  24.     {
  25.  
  26.         if ( strchr(razdelit, stroka[i]) != NULL) // если символ является разделителем
  27.         {
  28.  
  29.             if ( strchr(razdelit, stroka[i-1]) == NULL) // если предыдущий не является разделителем
  30.              result++; // увеличиваем результат
  31.  
  32.         }
  33.  
  34.     }
  35.     return result;
  36. }
  37.  
  38. /*
  39. swap - процедура обмена двух строк текста
  40. ---------------------------------
  41. pos1 - индекс первой строки текста
  42. pos2 - индекс второй строки текста
  43.  
  44. */
  45.  
  46. void swap(int pos1, int pos2)
  47. {
  48.     char *tmp; // буфер для обмена
  49.     tmp=(char*)malloc(sizeof(text[pos1])*2);
  50.     strcat(tmp, text[pos1]);
  51.  
  52.     free(text[pos1]);
  53.     text[pos1] = (char*)malloc(sizeof(text[pos2])*2);
  54.     text[pos1][0]='\0';
  55.     strcat(text[pos1], text[pos2]);
  56.  
  57.     free(text[pos2]);
  58.     text[pos2]=(char*)malloc(sizeof(tmp));
  59.     text[pos2][0]='\0';
  60.     strcat(text[pos2], tmp);
  61.  
  62.     int t=count_words[pos1];
  63.     count_words[pos1]=count_words[pos2];
  64.     count_words[pos1]=t;
  65. }
  66.  
  67. /*
  68. end_of_razdelit - функция, показывающая окончен ввод разделителей или нет
  69. */
  70.  
  71. int end_of_razdelit()
  72. {
  73.     int i;
  74.  
  75.     for (i=0; i<strlen(&razdelit[0]); i++)
  76.     {
  77.         int t=1, j;
  78.  
  79.         // если у нас осталось проверить символов меньше, чем нам нужно в последовательности, то возвращаем 0
  80.         if ( i+count_posl>=strlen(&razdelit[0]) )
  81.         {
  82.             return 0;
  83.         }
  84.  
  85.         for (j=i+1; j<i+count_posl; j++)
  86.         {
  87.  
  88.             // если код предыдущего символа больше текущего, то последовательность нарушена
  89.             if ( (int)razdelit[j] < (int)razdelit[j-1])
  90.             {
  91.  
  92.                 t=0;
  93.                 break;
  94.  
  95.             }
  96.  
  97.         }
  98.  
  99.         // если t=1, то мы нашли последовательность разделителей
  100.  
  101.         if ( t )
  102.         {
  103.             return 1;
  104.         }
  105.     }
  106.  
  107.     //последовательность не найдена, возрвращаем 0
  108.     return 0;
  109. }
  110.  
  111. /*
  112. процедура ввода данных
  113. */
  114.  
  115. void init()
  116. {
  117.     printf("vvedite kol-vo razdelitelei v posledovatelnosti\n");
  118.  
  119.     scanf("%d%*c", &count_posl);
  120.  
  121.     printf("vvedite razdeliteli\n");
  122.  
  123.     razdelit=(char*)malloc(sizeof(char));
  124.     razdelit[0]='\0';
  125.  
  126.     //считываем посимвольно разделители
  127.     while ( 1== 1)
  128.     {
  129.         char r;
  130.         scanf("%c", &r);
  131.  
  132.         //выделяем память под новый символ
  133.         int length = strlen(&razdelit[0]);
  134.         razdelit=(char*)realloc(razdelit, (length+1)*sizeof(char));
  135.  
  136.         //добавляем новый разделитель
  137.         razdelit[length]=r;
  138.         razdelit[length+1]='\0';
  139.  
  140.         // проверка на окончание ввода разделителей
  141.         if ( end_of_razdelit() )
  142.         {
  143.             break;
  144.         }
  145.  
  146.     }
  147.  
  148.     printf("Vvedite interval slov v stroke\n");
  149.     scanf("%d %d%*c", &min_count_words, &max_count_words);
  150.  
  151.     printf("Vvedite text\n");
  152.  
  153.     text=(char**)malloc(sizeof(char*));
  154.     count_words=(int*)malloc(sizeof(int));
  155.     count_strok=0;
  156.  
  157.     while ( 1==1)
  158.     {
  159.         char str[256];
  160.         fgets(str, 256, stdin);
  161.  
  162.         count_strok++;
  163.  
  164.         // выделяем память под новую строку
  165.         text=(char**)realloc(text, (count_strok+1)*sizeof(char*));
  166.         text[count_strok] = (char*)malloc(strlen(&str[0])*sizeof(char));
  167.         text[count_strok][0]='\0';
  168.  
  169.         //запоминаем количество слов в строке
  170.         count_words=(int*)realloc(count_words, (count_strok+1)*sizeof(int));
  171.         count_words[count_strok]=count_words_in_str(str);
  172.  
  173.         strcat(text[count_strok], str);
  174.  
  175.         //проверка: количество слов лежит в данной интервале?
  176.         if ( (count_words[count_strok] >= min_count_words) && ( count_words[count_strok]<=max_count_words) )
  177.             break;// да -> прекращаем ввод
  178.  
  179.     }
  180.  
  181. }
  182.  
  183. /*
  184.  sort_text - процедура, которая сортирует текст в порядке убывания количества слов в строке
  185. */
  186.  
  187. void sort_text()
  188. {
  189.     int i,j;
  190.  
  191.     for (i=1; i<=count_strok; i++)
  192.     {
  193.  
  194.         for  (j=i+1; j<=count_strok; j++)
  195.         {
  196.  
  197.             if ( count_words[j] > count_words[i])
  198.                 // обмен строк текста с помощью процедуры
  199.                 swap(i, j);
  200.  
  201.         }
  202.  
  203.     }
  204.  
  205. }
  206.  
  207. /*
  208.  del_words - процедура удаляет первое и последнее слово в строке
  209.  ---------------------------------------------------------------
  210.  stroka - строка, в которой мы будем удалять слова
  211. */
  212.  
  213. void del_words(char *stroka)
  214. {
  215.     int i;
  216.  
  217.     //удаляем первое слово
  218.     for (i=0; i<strlen(&stroka[0]); i++)
  219.     {
  220.  
  221.         // если текущий символ является разделителем, то удаляем все символы до него
  222.         if ( strchr(razdelit, stroka[i]) != NULL)
  223.         {
  224.  
  225.             // ищем подряд идущие разделители, их тоже удалим
  226.             while ( (i+1<strlen(&stroka[0])) && ( strchr(razdelit,stroka[i+1]) != NULL ) )
  227.                 i++;
  228.  
  229.  
  230.             int j;
  231.             //смещение элементов строки влево
  232.             for (j=i+1; j<strlen(&stroka[0]); j++)
  233.                 stroka[j-i-1] = stroka[j];
  234.  
  235.             stroka[strlen(&stroka[0])-i-1] = '\0';
  236.  
  237.             break;
  238.         }
  239.  
  240.     }
  241.  
  242.     // ищем конец последнего слова ( символ, который не является разделителем)
  243.     int pos=strlen(&stroka[0])-1;
  244.     while ( strchr(razdelit, stroka[pos]) != NULL)
  245.         pos--;
  246.     //удаляем последнее слово
  247.     for (i=pos; i>=0; i--)
  248.     {
  249.  
  250.         // если текущий символ является разделителем, то удаляем все символы после него
  251.         if ( strchr(razdelit, stroka[i]) != NULL)
  252.         {
  253.  
  254.             //удалем все символы после разделителя
  255.             stroka[i+1] = '\0';
  256.  
  257.             break;
  258.         }
  259.  
  260.     }
  261. }
  262.  
  263. /*
  264. print - процедура вывода текста и освобождения памяти
  265. */
  266.  
  267. void print()
  268. {
  269.     printf("Answer:\n");
  270.  
  271.     //вывод текста
  272.     int i;
  273.     for (i=1; i<=count_strok; i++)
  274.     {
  275.  
  276.         printf("%s\n", text[i]);
  277.  
  278.         // освобождаем память
  279.         free(text[i]);
  280.  
  281.     }
  282.     free(text);
  283. }
  284.  
  285. int main()
  286. {
  287.     //ввод данных
  288.     init();
  289.  
  290.     //сортировка текста
  291.     sort_text();
  292.  
  293.     //удаляем первое и последнее слово в первой строке
  294.     del_words(text[1]);
  295.  
  296.     //если текст состоит более чем из одной строки, то удаляем слова из нее
  297.     if ( count_strok > 1 )
  298.     {
  299.         del_words(text[count_strok]);
  300.     }
  301.  
  302.     // выводим сформированный текст
  303.     print();
  304.     return 0;
  305. }
Add Comment
Please, Sign In to add comment