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

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

  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
Похожие ответы