Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию - C (СИ) (71636)
Формулировка задачи:
Дана строка длиной n символов, содержащая слова, т.е. группы
символов, разделенные пробелами и другими разделителями (знаками
препинания) и не содержащие пробелов внутри себя.
Задание:Вывести те слова, которые отличаются от последнего слова и
удовлетворяют условию, что в слове нет повторяющихся букв.
Помогите пожалуйста
Решение задачи: «Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию»
textual
Листинг программы
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- const int N = 1022;//изменяя эту цифру,меняем размер строки,попробуйте уменьшить
- //например до 100,может из-за нехватки памяти проблемы
- int main()
- {
- int i, j, x = 0, flag = 0, len;//len - длина слова
- char str_last[20], *str_now, str2[N];//str_last - последнее слово, str_now - текущее слово
- char str[N]; //str[N] - текущая строка,str2[N] - копия текущей строки
- char sep[10] = " , ";//строка символов-разделителей(пробел,запятая,табуляция)
- char *istr;
- for(i = 0; i < N; ++i){
- if(i == N - 1) //в конце строки
- str[i] = '\0';// ставим нулевой символ(если кто не в курсе,то именно наличием нулевого
- else //символа в самом конце строка отличается от просто массива)
- if(i % 5 ==0 && i > 0)//через каждые 5 символов печатаем пробел(число 5 выбрано произвольно)
- str[i] = ' ';
- else
- str[i] = rand()%26 + 97;//остальные элементы заполняем буквами(только англ.маленькие)
- }
- strcpy(str2, str);//получившуюся строку str копируем в str2(функция strtok разрушает исходную
- //строку)поэтому разбивать на слова будем ее копию с последующим удалением
- printf("Source string:\n %s\n", str);//печатаем исходную строку
- printf("Result:\n");
- istr = strtok(str2, sep);//находим первое слово и записываем его в istr
- while(istr != NULL){
- strcpy(str_last, istr);//в цикле каждое найденное слово копируем в str_last,каждый раз
- istr = strtok(NULL, sep);//стирая предыдущее,т.о. останется только последнее слово
- }
- remove(str2);//стираем остатки копии исходной строки,т.к. она уже разрушена
- istr = strtok(str, sep);//повторяем разбивку исходной строки на слова
- while(istr != NULL){
- str_now = istr;//находим текущее слово
- ++x;//счетчик слов увеличивается на 1
- len = strlen(str_now);//узнаем длину текущего слова
- if(0 != strcmp(str_now, str_last)){//сравниваем текущее слово с последним,если они не
- for(i = 0; i < len; ++i){ //одинаковы,то сравниваем символы внутри текущего
- for(j = 0; j < len; ++j){ //слова
- if(str_now[i] == str_now[j] && i != j){//если находим повторяющиеся символы
- flag = 1;//поднимаем флаг
- printf("Repeating letters in element %d\n", x);//и печатаем номер этого
- } //слова просто для наглядности(можно и не печатать,тогда и
- } //переменную х можно не использовать совсем)
- }
- if(flag == 0)//если флаг опущен,значит повторяющиеся символы внутри текущего слова
- printf("%s\n", str_now);//не найдены,печатаем текущее слово
- flag = 0;//если флаг был поднят-опускаем его
- }
- else//иначе,если текущее слово совпадает с последним словом
- printf("Repeating words\n");//печатаем уведомление о повторяющихся словах
- istr = strtok(NULL, sep);//продолжаем разбивать строку на слова,пока она не кончится
- }
- return 0;
- }
Объяснение кода листинга программы
- В начале программы объявляются и инициализируются переменные:
- i, j, x, flag (счетчики, флаг)
- str_last (последнее слово)
- str_now (текущее слово)
- str, str2 (строки)
- sep (строка-разделитель)
- istr (указатель на текущее слово)
- Затем в цикле заполняется строка str случайными буквами, а каждые 5 символов добавляется пробел.
- Получившаяся строка копируется в str2.
- Исходная строка выводится на экран.
- Строка str2 разбивается на слова с помощью функции strtok, первое слово копируется в str_last.
- Цикл повторяется, пока не будут найдены все слова в исходной строке.
- Если текущее слово отличается от последнего, то проверяется наличие повторяющихся символов внутри него.
- Если повторяющиеся символы найдены, то выводится уведомление и номер текущего слова.
- Если повторяющихся символов нет, то текущее слово выводится на экран.
- Если текущее слово совпадает с последним, то выводится уведомление о повторяющихся словах.
- После окончания цикла, остатки копии исходной строки удаляются.
- Исходная строка снова разбивается на слова, и цикл повторяется, пока не будут найдены все слова.
- По завершении программы возвращается 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д