Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д