sultan

kursa4_katya

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