imho.ws |
![]() |
![]() |
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
![]() |
# 1 |
Junior Member
Регистрация: 20.06.2003
Адрес: Israel
Сообщения: 106
![]() |
![]() ![]() Нужно решить задачу следущего типа дано: заголовок ф-ции int check_alpha(char *s1, char *s2) функция должна проверять есть ли заглавные буквы что находятся в s1 также и в s2 при этом они должни быть в одном и том же порядке если да то возвращает 1 нет 0. пример check_alpha("12AbBC54","A76B87C9")=1 check_alpha("12AbBC54","AABBCC")=1 check_alpha("12AAbBC54","ABC")=0 check_alpha("12AbBC54","ACBB)=0 |
![]() |
![]() |
# 3 |
::VIP::
Регистрация: 17.12.2002
Адрес: Q-ata, Israel
Сообщения: 310
![]() ![]() ![]() ![]() ![]() |
Код:
int check_alpha(char *s1, char *s2) { char *ss1=s1, *ss2=s2; int cmp1=0,cmp2=0; if (!s1 && !s2) return 1; // <<<<<<<<<<< OK if (*s1>='A' && *s1<='Z') cmp1=1; if (*s2>='A' && *s2<='Z') cmp2=1; if (cmp1 && cmp2 && *s1!=*s2) return 0; // <<<<<<<<< FAIL if (!cmp1 && *s1!='\0') ss1++; if (!cmp2 && *s2!='\0') ss2++; return check_alpha(ss1,ss2); // <<<<<<<< recursion call } |
![]() |
![]() |
# 6 |
Junior Member
Регистрация: 20.06.2003
Адрес: Israel
Сообщения: 106
![]() |
![]()
к сожалению эта замена не решает проблемы, т.к. ф-ция все равно входит в бесконечную рекурсию как только находит две одинаковых больших буквы. сейчас буду думать, что нужно изменить чтобы этого не происходило. если будут идеи пиши.
|
![]() |
![]() |
# 8 |
Junior Member
Регистрация: 20.06.2003
Адрес: Israel
Сообщения: 106
![]() |
![]()
эту строчку я еще сначала добавил только это не решает проблему тут имхо подход не совсем верный, как мне кажется тут нужно сделать, что то типа цикла. кроме того когда функция доходит до "/0" она у тебя возвращает 1, даже если не все буквы совпадают.
как мне кажется тут нужно делать проверку в цикле взять букву i в первом слове и сравнивать в цикле с буквами i,i+1,i+2,...i+n во втором до тех пор пока не находит совпадение как только есть совпадение то увеличить i на 1 и заново начать проверку только во втором слове уже продолжать с i+n. т.к. нужно чтобы еще и порядок совпадал. проблема только в одном я не знаю как это реализовать, да и сам алгоритм не точный. |
![]() |
![]() |
# 9 |
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
check_alpha("12AbBC54","AABBCC")=1
Помоему должен быть 0, поскольку порядок не тот, во второй строке не подстроки ABC. Ну а с циклами можешь попробовать примерно так: Код:
int check_alpha(char *s1, char *s2) { int i=0; int j=0; char* ss1=s1; char* ss2=s2; int res=0; for (*ss1;*ss1;ss1++) { if (*ss1>='A' && *ss1<='Z') i++; else continue; for(*ss2;*ss2;ss2++) { if (*ss2>='A' && *ss2<='Z') j++; else continue; if(*ss1==*ss2 && j==i) { res++; ss2++; break; } else { res=0; ss2++; return check_alpha(s1,ss2); } } } if(res==i) return 1; return 0; }
__________________
Best Regards |
![]() |
![]() |
# 10 | ||
Guest
Сообщения: n/a
|
alexey_ma
Цитата:
Очень сложно ты написал. По-моему работать не будет, хотя проследить алгоритм мне неподсилу. Цитата:
Вот мой вариант: Код:
int f(const char *s1, const char *s2) { if(!s1 || !s2) return 0; while(*s1 != '\0'){ if(!isupper(*s1)){ s1++; continue; } while(*s2 != '\0'){ if(*s2 == *s1) break; s2++; } if(*s2 == '\0') return 0; s1++; } return 1; } |
||
![]() |
# 12 | |
Guest
Сообщения: n/a
|
alexey_ma
Цитата:
Ладно, тогда так: Код:
int f(const char *s1, const char *s2) { if(!s1 || !s2) return 0; while(*s1 != '\0'){ if(!isupper(*s1)){ s1++; continue; } while(*s2 != '\0'){ if(*s2 == *s1) break; s2++; } if(*s2 == '\0') return 0; else s2++; s1++; } return 1; } |
|
![]() |
# 17 |
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
А чего там пояснять? Ты же сам все написал.
Проходишь по массивам. i и j - это порядковый номер символа в массиве. Проверкой "*ss1>='A' && *ss1<='Z' отсекаем все маленькие буквы. Если "if(*ss1==*ss2 && j==i)" то есть буквы равны и их порядковые номера равны - делаем брейк и переходим к следующему символу в первом массиве если нет то продвигаем указатель во втором массиве и рекурсивно вызываем функцию. Только криво все это. Рекурсия за уши притянута, она здесь не нужна . Machine сделал все правильно и красиво.
__________________
Best Regards |
![]() |
![]() |
# 18 | |
Guest
Сообщения: n/a
|
Izzyy
Цитата:
Он вам давал какие-нибудь задачки по обоработке деревьев, например? |
|
![]() |
# 19 |
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
2Izzyy
Вот еще вариант как можно рекурсивно сделать: Код:
int check_alpha(char *s1, char *s2) { if(!*s1 ) return 1; if (!(*s1>='A' && *s1<='Z')) return check_alpha(++s1,s2); else { if(!*s2) return 0; if (*s2>='A' && *s2<='Z') { if(*s1 == *s2) return check_alpha(++s1,++s2); else return 0; } else return check_alpha(s1,++s2); } return 0; }
__________________
Best Regards |
![]() |