Проверка двух строк, если они состоят из одинаковых слов - C (СИ)
Формулировка задачи:
Нам задаются две строки, если они состоят из одинаковых слов, то функция должна вернуть 1, иначе 0. Регистр букв и знаки препинания не учитываются.
Примеры:
Помыслив немного составил для себя алгоритм:
1.Перевести все символы в нижний регистр букв. (если я не ошибаюсь есть такая команда)
2.Разбить строки на два двумерных массива по словам, при этом выкинем знаки препинания.
3.Убрать повторяющиеся слова.
4.Проверяем если все слова из первого массива есть во втором.
Алгоритм вроде выглядит рабочим, но боюсь что будет много мороки с памятью. Может у кого есть идеи как упростить его?
res = sameWords ( "Hello students.", "HELLO studEnts!" ); /* res = 1 */ res = sameWords ( " He said 'hello!'", "'Hello.' he said." ); /* res = 1 */ res = sameWords ( "He said he would do it.", "IT said: 'He would do it.'" ); /* res = 1 */ res = sameWords ( "one two three", "one two five" ); /* res = 0 */
Решение задачи: «Проверка двух строк, если они состоят из одинаковых слов»
textual
Листинг программы
#ifndef __PROGTEST__ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #endif /* __PROGTEST__ */ int sameWords ( const char * a, const char * b ) { int i=0,l=0,f=0,h=0,n=1,nb=1,fb=0,na=0,nb1=0,ka=0,kb=0; char arrayA[200][1000]={}; while(a[i]!='\0') { while (a[l]==' ') {l++;i++;} if (a[i]==' ') {f++;h=0;n++;while(a[i+1]==' '){i++;} } if ((a[i]>='A'&&a[i]<='Z')||(a[i]>='a'&&a[i]<='z')) { arrayA[f][h]=a[i]; ka++; h++; } i++; } char arrayB[200][1000]={}; i=0;f=0;h=0;l=0; while(b[i]!='\0') { while (b[l]==' ') {l++;i++;} if (b[i]==' ') {f++;h=0;nb++;while(b[i+1]==' '){i++;} } if ((b[i]>='A'&&b[i]<='Z')||(b[i]>='a'&&b[i]<='z')) { arrayB[f][h]=b[i]; kb++; h++; } i++; } for (f=0;f<n;f++){ for(h=0;arrayA[f][h]!='\0';h++){ printf("%c", arrayA[f][h]);} printf ("\n"); } for (f=0;f<nb;f++){ for(h=0;arrayB[f][h]!='\0';h++){ printf("%c", arrayB[f][h]);} printf ("\n"); } if (ka==0&&kb==0) {return 1;} for (f=0;f<n;f++){ for(fb=0;fb<nb;fb++){ if((strcasecmp(arrayA[f],arrayB[fb]))==0) na++;}if (na<1){return 0;}na=0;} for (fb=0;fb<nb;fb++){ for(f=0;f<n;f++){ if((strcasecmp(arrayB[fb],arrayA[f]))==0) nb1++;}if (nb<1){return 0;}na=0;} return 1; } #ifndef __PROGTEST__ int main ( int argc, char * argv [] ) { int res; res = sameWords ( "Hello students.", "HELLO studEnts!" ); /* res = 1 */ res = sameWords ( " He said 'hello!'", "'Hello.' he said." ); /* res = 1 */ res = sameWords ( "He said he would do it.", "IT said: 'He would do it.'" ); /* res = 1 */ res = sameWords ( "one two three", "one two five" ); /* res = 0 */ return 0; } #endif /* __PROGTEST__ */
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д