Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int count_posl, max_count_words, min_count_words, count_strok;
- char *razdelit; // строка разделителей
- char **text; // текст
- int *count_words; // количество слов в каждой строке текста
- /*
- count_words_in_str - функция, которая возвращает количество слов в строке
- -------------------------------------------------------------------------
- stroka - строка, в которой мы находим слова
- */
- int count_words_in_str(char *stroka)
- {
- int result=0,i;
- for (i=1; i<strlen(&stroka[0]); i++)
- {
- if ( strchr(razdelit, stroka[i]) != NULL) // если символ является разделителем
- {
- if ( strchr(razdelit, stroka[i-1]) == NULL) // если предыдущий не является разделителем
- result++; // увеличиваем результат
- }
- }
- return result;
- }
- /*
- swap - процедура обмена двух строк текста
- ---------------------------------
- pos1 - индекс первой строки текста
- pos2 - индекс второй строки текста
- */
- void swap(int pos1, int pos2)
- {
- char *tmp; // буфер для обмена
- tmp=(char*)malloc(sizeof(text[pos1])*2);
- strcat(tmp, text[pos1]);
- free(text[pos1]);
- text[pos1] = (char*)malloc(sizeof(text[pos2])*2);
- text[pos1][0]='\0';
- strcat(text[pos1], text[pos2]);
- free(text[pos2]);
- text[pos2]=(char*)malloc(sizeof(tmp));
- text[pos2][0]='\0';
- strcat(text[pos2], tmp);
- int t=count_words[pos1];
- count_words[pos1]=count_words[pos2];
- count_words[pos1]=t;
- }
- /*
- end_of_razdelit - функция, показывающая окончен ввод разделителей или нет
- */
- int end_of_razdelit()
- {
- int i;
- for (i=0; i<strlen(&razdelit[0]); i++)
- {
- int t=1, j;
- // если у нас осталось проверить символов меньше, чем нам нужно в последовательности, то возвращаем 0
- if ( i+count_posl>=strlen(&razdelit[0]) )
- {
- return 0;
- }
- for (j=i+1; j<i+count_posl; j++)
- {
- // если код предыдущего символа больше текущего, то последовательность нарушена
- if ( (int)razdelit[j] < (int)razdelit[j-1])
- {
- t=0;
- break;
- }
- }
- // если t=1, то мы нашли последовательность разделителей
- if ( t )
- {
- return 1;
- }
- }
- //последовательность не найдена, возрвращаем 0
- return 0;
- }
- /*
- процедура ввода данных
- */
- void init()
- {
- printf("vvedite kol-vo razdelitelei v posledovatelnosti\n");
- scanf("%d%*c", &count_posl);
- printf("vvedite razdeliteli\n");
- razdelit=(char*)malloc(sizeof(char));
- razdelit[0]='\0';
- //считываем посимвольно разделители
- while ( 1== 1)
- {
- char r;
- scanf("%c", &r);
- //выделяем память под новый символ
- int length = strlen(&razdelit[0]);
- razdelit=(char*)realloc(razdelit, (length+1)*sizeof(char));
- //добавляем новый разделитель
- razdelit[length]=r;
- razdelit[length+1]='\0';
- // проверка на окончание ввода разделителей
- if ( end_of_razdelit() )
- {
- break;
- }
- }
- printf("Vvedite interval slov v stroke\n");
- scanf("%d %d%*c", &min_count_words, &max_count_words);
- printf("Vvedite text\n");
- text=(char**)malloc(sizeof(char*));
- count_words=(int*)malloc(sizeof(int));
- count_strok=0;
- while ( 1==1)
- {
- char str[256];
- fgets(str, 256, stdin);
- count_strok++;
- // выделяем память под новую строку
- text=(char**)realloc(text, (count_strok+1)*sizeof(char*));
- text[count_strok] = (char*)malloc(strlen(&str[0])*sizeof(char));
- text[count_strok][0]='\0';
- //запоминаем количество слов в строке
- count_words=(int*)realloc(count_words, (count_strok+1)*sizeof(int));
- count_words[count_strok]=count_words_in_str(str);
- strcat(text[count_strok], str);
- //проверка: количество слов лежит в данной интервале?
- if ( (count_words[count_strok] >= min_count_words) && ( count_words[count_strok]<=max_count_words) )
- break;// да -> прекращаем ввод
- }
- }
- /*
- sort_text - процедура, которая сортирует текст в порядке убывания количества слов в строке
- */
- void sort_text()
- {
- int i,j;
- for (i=1; i<=count_strok; i++)
- {
- for (j=i+1; j<=count_strok; j++)
- {
- if ( count_words[j] > count_words[i])
- // обмен строк текста с помощью процедуры
- swap(i, j);
- }
- }
- }
- /*
- del_words - процедура удаляет первое и последнее слово в строке
- ---------------------------------------------------------------
- stroka - строка, в которой мы будем удалять слова
- */
- void del_words(char *stroka)
- {
- int i;
- //удаляем первое слово
- for (i=0; i<strlen(&stroka[0]); i++)
- {
- // если текущий символ является разделителем, то удаляем все символы до него
- if ( strchr(razdelit, stroka[i]) != NULL)
- {
- // ищем подряд идущие разделители, их тоже удалим
- while ( (i+1<strlen(&stroka[0])) && ( strchr(razdelit,stroka[i+1]) != NULL ) )
- i++;
- int j;
- //смещение элементов строки влево
- for (j=i+1; j<strlen(&stroka[0]); j++)
- stroka[j-i-1] = stroka[j];
- stroka[strlen(&stroka[0])-i-1] = '\0';
- break;
- }
- }
- // ищем конец последнего слова ( символ, который не является разделителем)
- int pos=strlen(&stroka[0])-1;
- while ( strchr(razdelit, stroka[pos]) != NULL)
- pos--;
- //удаляем последнее слово
- for (i=pos; i>=0; i--)
- {
- // если текущий символ является разделителем, то удаляем все символы после него
- if ( strchr(razdelit, stroka[i]) != NULL)
- {
- //удалем все символы после разделителя
- stroka[i+1] = '\0';
- break;
- }
- }
- }
- /*
- print - процедура вывода текста и освобождения памяти
- */
- void print()
- {
- printf("Answer:\n");
- //вывод текста
- int i;
- for (i=1; i<=count_strok; i++)
- {
- printf("%s\n", text[i]);
- // освобождаем память
- free(text[i]);
- }
- free(text);
- }
- int main()
- {
- //ввод данных
- init();
- //сортировка текста
- sort_text();
- //удаляем первое и последнее слово в первой строке
- del_words(text[1]);
- //если текст состоит более чем из одной строки, то удаляем слова из нее
- if ( count_strok > 1 )
- {
- del_words(text[count_strok]);
- }
- // выводим сформированный текст
- print();
- return 0;
- }
Add Comment
Please, Sign In to add comment