| 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 |
|
|