Вывести все слова четной длины, у которых все буквы из первой половины слова встречаются во второй - 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; }
Объяснение кода листинга программы
В этом коде определенная задача, которая состоит в том, чтобы вывести все слова в строке, длина которых четная, и в которых все буквы из первой половины слова встречаются во второй. Код состоит из двух функций:
- Функция
isWord
принимает строку в качестве аргумента и проверяет, удовлетворяет ли она условию задачи. Она инициализирует массивletterInFirstHalf
, который будет использоваться для отслеживания количества букв из первой половины слова. Затем она проверяет, является ли длина строки четной. Если нет, функция возвращает 0. Если да, она проходит по всем символам строки, подсчитывая количество каждого символа в первой половине и обновляя соответствующий элемент массиваletterInFirstHalf
. Затем она проходит по всем символам строки еще раз, проверяя, есть ли в массивеletterInFirstHalf
значение 1 для каждого символа, что означает, что этот символ встречается в первой половине слова. Если она находит такой символ, функция возвращает 0. Если нет, функция возвращает 1. - Функция
main
является точкой входа в программу. Она объявляет строкуtext
и переменнуюflag
для отслеживания того, найдено ли хотя бы одно слово, удовлетворяющее условию задачи. Затем она использует функциюstrtok
для разделения строки на слова и передает каждое слово функцииisWord
. Если слово удовлетворяет условию задачи, функция выводит его и устанавливает флагflag
в 1. Если ни одно слово не удовлетворяет условию задачи, программа выводит сообщениеNo
. В конце программы она вызывает функциюsystem
, чтобы приостановить выполнение программы до тех пор, пока пользователь не нажмет любую клавишу. Код работает правильно, если в нем нет ошибок. Он должен выводить все слова в строке, длина которых четная, и в которых все буквы из первой половины слова встречаются во второй.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д