Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию - C (СИ) (71636)

Узнай цену своей работы

Формулировка задачи:

Дана строка длиной n символов, содержащая слова, т.е. группы символов, разделенные пробелами и другими разделителями (знаками препинания) и не содержащие пробелов внутри себя. Задание:Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию, что в слове нет повторяющихся букв. Помогите пожалуйста

Решение задачи: «Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. const int N = 1022;//изменяя эту цифру,меняем размер строки,попробуйте уменьшить
  5.                     //например до 100,может из-за нехватки памяти проблемы
  6. int main()
  7. {
  8.      int i, j, x = 0, flag = 0, len;//len - длина слова
  9.     char str_last[20], *str_now, str2[N];//str_last - последнее слово, str_now - текущее слово
  10.     char str[N];  //str[N] - текущая строка,str2[N] - копия текущей строки
  11.     char sep[10] = " ,  ";//строка символов-разделителей(пробел,запятая,табуляция)
  12.     char *istr;
  13.     for(i = 0; i < N; ++i){
  14.         if(i == N - 1) //в конце строки
  15.             str[i] = '\0';// ставим нулевой символ(если кто не в курсе,то именно наличием нулевого
  16.         else              //символа в самом конце строка отличается от просто массива)
  17.             if(i % 5 ==0 && i > 0)//через каждые 5 символов печатаем пробел(число 5 выбрано произвольно)
  18.                 str[i] = ' ';
  19.             else
  20.                 str[i] = rand()%26 + 97;//остальные элементы заполняем буквами(только англ.маленькие)
  21.     }
  22.     strcpy(str2, str);//получившуюся строку str копируем в str2(функция strtok разрушает исходную
  23.                       //строку)поэтому разбивать на слова будем ее копию с последующим удалением
  24.     printf("Source string:\n %s\n", str);//печатаем исходную строку
  25.     printf("Result:\n");
  26.     istr = strtok(str2, sep);//находим первое слово и записываем его в istr
  27.     while(istr != NULL){
  28.         strcpy(str_last, istr);//в цикле каждое найденное слово копируем в str_last,каждый раз
  29.         istr = strtok(NULL, sep);//стирая предыдущее,т.о. останется только последнее слово
  30.     }
  31.     remove(str2);//стираем остатки копии исходной строки,т.к. она уже разрушена
  32.     istr = strtok(str, sep);//повторяем разбивку исходной строки на слова
  33.     while(istr != NULL){
  34.         str_now = istr;//находим текущее слово
  35.         ++x;//счетчик слов увеличивается на 1
  36.         len = strlen(str_now);//узнаем длину текущего слова
  37.         if(0 != strcmp(str_now, str_last)){//сравниваем текущее слово с последним,если они не
  38.             for(i = 0; i < len; ++i){      //одинаковы,то сравниваем символы внутри текущего
  39.                 for(j = 0; j < len; ++j){  //слова
  40.                     if(str_now[i] == str_now[j] && i != j){//если находим повторяющиеся символы
  41.                         flag = 1;//поднимаем флаг
  42.                         printf("Repeating letters in element %d\n", x);//и печатаем номер этого
  43.                     }            //слова просто для наглядности(можно и не печатать,тогда и
  44.                 }         //переменную х можно не использовать совсем)
  45.             }
  46.             if(flag == 0)//если флаг опущен,значит повторяющиеся символы внутри текущего слова
  47.                 printf("%s\n", str_now);//не найдены,печатаем текущее слово
  48.             flag = 0;//если флаг был поднят-опускаем его
  49.         }
  50.         else//иначе,если текущее слово совпадает с последним словом
  51.             printf("Repeating words\n");//печатаем уведомление о повторяющихся словах
  52.         istr = strtok(NULL, sep);//продолжаем разбивать строку на слова,пока она не кончится
  53.     }
  54.     return 0;
  55. }

Объяснение кода листинга программы

  1. В начале программы объявляются и инициализируются переменные:
    • i, j, x, flag (счетчики, флаг)
    • str_last (последнее слово)
    • str_now (текущее слово)
    • str, str2 (строки)
    • sep (строка-разделитель)
    • istr (указатель на текущее слово)
  2. Затем в цикле заполняется строка str случайными буквами, а каждые 5 символов добавляется пробел.
  3. Получившаяся строка копируется в str2.
  4. Исходная строка выводится на экран.
  5. Строка str2 разбивается на слова с помощью функции strtok, первое слово копируется в str_last.
  6. Цикл повторяется, пока не будут найдены все слова в исходной строке.
  7. Если текущее слово отличается от последнего, то проверяется наличие повторяющихся символов внутри него.
  8. Если повторяющиеся символы найдены, то выводится уведомление и номер текущего слова.
  9. Если повторяющихся символов нет, то текущее слово выводится на экран.
  10. Если текущее слово совпадает с последним, то выводится уведомление о повторяющихся словах.
  11. После окончания цикла, остатки копии исходной строки удаляются.
  12. Исходная строка снова разбивается на слова, и цикл повторяется, пока не будут найдены все слова.
  13. По завершении программы возвращается 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы