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

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

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

Задача: Дана последовательность символов, состоящая из слов четной длины. Вывести на экран все слова четной длины, у которых все буквы из первой половины слова встречаются во второй половине слова, или сообщение «Нет», если требуемых слов нет. Вот мой вариант кода. Я пытался засунуть первую и вторую половины слова в разные массива и сравнивать элементы. В итоге выводится только слово "нет", а не нужные слова. Буду благодарен за помощь.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
 
int main ()
{
    int n, i, j, pp=0, k, p, flag=0, flag2=0;
    char s[1000], sf[1000], s1[1000], s2[1000];
    setlocale(LC_ALL, "Russian");
    printf("Введите строку\n");
    gets(s);
    n = strlen(s);
    for (i=0; i<=n; i++)
        if ((s[i] == ' ') || (s[i]=='\0')) {
            for (j=pp; j<i; j++)
                sf[j] = s[j];
            pp = i;
            p = strlen(sf)/2;
            for (j=0; j<p; j++)
                s1[j] = sf[j];
            for (j=0; j<p; j++)
                s2[j] = sf[j+p+1];
            for (j=0; j<p; j++)
                for (k=0; k<p; k++)
                    if (s1[j] == s2[k])
                        flag++;
            if(flag == p)
                for (i=0; i<n; i++){
                    printf("%c", sf[i]);
                    flag2++; }
            memset(sf, 0, sizeof(sf) / sizeof(sf[0]));
            }
    if(!flag2)
        printf("Нет\n");
    system("Pause");
    return 0;
}

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
int isWord(char* s)
{
    int len, i;
    int letterInFirstHalf[256] = {0};
    len = strlen(s);
    if (len%2!=0)
        return 0;
    for (i=0; i<len/2; i++)
        if (letterInFirstHalf[(int)s[i]]==0)
            letterInFirstHalf[(int)s[i]]++;
    for (i; i<len; i++)
        if (letterInFirstHalf[(int)s[i]]==1)
            letterInFirstHalf[(int)s[i]]--;
    for (i=0; i<256; i++)
        if (letterInFirstHalf[i]!=0)
            return 0;
    return 1;
}
 
int main()
{
    char *p, text[] = "1234 123125 133132 aaababcd";
    int flag = 0;
    p = strtok(text," ");
    while (p)
    {
        if (isWord(p))
        {
            puts(p);
            flag = 1;
        }
        p = strtok(0," ");
    }
    if (!flag)
        puts("No");
    system("pause");
    return 0;
}

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

В этом коде определенная задача, которая состоит в том, чтобы вывести все слова в строке, длина которых четная, и в которых все буквы из первой половины слова встречаются во второй. Код состоит из двух функций:

  1. Функция isWord принимает строку в качестве аргумента и проверяет, удовлетворяет ли она условию задачи. Она инициализирует массив letterInFirstHalf, который будет использоваться для отслеживания количества букв из первой половины слова. Затем она проверяет, является ли длина строки четной. Если нет, функция возвращает 0. Если да, она проходит по всем символам строки, подсчитывая количество каждого символа в первой половине и обновляя соответствующий элемент массива letterInFirstHalf. Затем она проходит по всем символам строки еще раз, проверяя, есть ли в массиве letterInFirstHalf значение 1 для каждого символа, что означает, что этот символ встречается в первой половине слова. Если она находит такой символ, функция возвращает 0. Если нет, функция возвращает 1.
  2. Функция main является точкой входа в программу. Она объявляет строку text и переменную flag для отслеживания того, найдено ли хотя бы одно слово, удовлетворяющее условию задачи. Затем она использует функцию strtok для разделения строки на слова и передает каждое слово функции isWord. Если слово удовлетворяет условию задачи, функция выводит его и устанавливает флаг flag в 1. Если ни одно слово не удовлетворяет условию задачи, программа выводит сообщение No. В конце программы она вызывает функцию system, чтобы приостановить выполнение программы до тех пор, пока пользователь не нажмет любую клавишу. Код работает правильно, если в нем нет ошибок. Он должен выводить все слова в строке, длина которых четная, и в которых все буквы из первой половины слова встречаются во второй.

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

12   голосов , оценка 4.417 из 5
Похожие ответы