Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию - 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.