![]() |
Помогите!!! Срочно нужно решить одну задачку на С! Плиз!!!
:idontnow:
Нужно решить задачу следущего типа дано: заголовок ф-ции 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 |
Забыл сказать
ф-ция обязана быть рекурсивной
|
Код:
int check_alpha(char *s1, char *s2) |
не вышло
печально, но функция не работает просто виснет да даже если бы и не висла в ней есть ошибки, но все равно спасибо, ты меня на мысль натолкнул посмотрим, что получиться.
еще рз спасибо за помощь! |
ой,перепутал !!!
поменяй if (!s1 && !s2) return 1; на if (s1=='\0' && s2=='\0') return 1; |
Увы....
к сожалению эта замена не решает проблемы, т.к. ф-ция все равно входит в бесконечную рекурсию как только находит две одинаковых больших буквы. сейчас буду думать, что нужно изменить чтобы этого не происходило. если будут идеи пиши.
|
предпоследняя строка:
if (cmp1 && cmp2) {ss1++; ss2++;} |
снова нет
эту строчку я еще сначала добавил только это не решает проблему тут имхо подход не совсем верный, как мне кажется тут нужно сделать, что то типа цикла. кроме того когда функция доходит до "/0" она у тебя возвращает 1, даже если не все буквы совпадают.
как мне кажется тут нужно делать проверку в цикле взять букву i в первом слове и сравнивать в цикле с буквами i,i+1,i+2,...i+n во втором до тех пор пока не находит совпадение как только есть совпадение то увеличить i на 1 и заново начать проверку только во втором слове уже продолжать с i+n. т.к. нужно чтобы еще и порядок совпадал. проблема только в одном я не знаю как это реализовать, да и сам алгоритм не точный. |
check_alpha("12AbBC54","AABBCC")=1
Помоему должен быть 0, поскольку порядок не тот, во второй строке не подстроки ABC. Ну а с циклами можешь попробовать примерно так: Код:
int check_alpha(char *s1, char *s2) |
alexey_ma
Цитата:
Очень сложно ты написал. По-моему работать не будет, хотя проследить алгоритм мне неподсилу. Цитата:
Вот мой вариант: Код:
int f(const char *s1, const char *s2) |
Хорошо. Но есть ошибка.
У тебя для ("12AAbBC54","ABC") будет 1, а должен быть 0; return check_alpha(s1,ss2); A эту пургу я написал потому-что заказчик рекурсию просил :) |
alexey_ma
Цитата:
Ладно, тогда так: Код:
int f(const char *s1, const char *s2) |
Цитата:
Странная была просьба. Таки вещи нельзя через рекурсию делать. |
Полностью с тобой согласен .
Но Izzyy писал >> Забыл сказать >> ф-ция обязана быть рекурсивной |
alexey_ma
Препод наверное обкуренный был, когда задачку диктовал =)) Или не шарит в этом нифига... |
Спасибо
спасибо большое за предложеные решения и объяснения, препод он может и накуреный был, только вот его задача научить, а тема рекурсия была.:idea:
и еще to alexey ты не мог бы свой алгоритм пояснить |
А чего там пояснять? Ты же сам все написал.
Проходишь по массивам. i и j - это порядковый номер символа в массиве. Проверкой "*ss1>='A' && *ss1<='Z' отсекаем все маленькие буквы. Если "if(*ss1==*ss2 && j==i)" то есть буквы равны и их порядковые номера равны - делаем брейк и переходим к следующему символу в первом массиве если нет то продвигаем указатель во втором массиве и рекурсивно вызываем функцию. Только криво все это. Рекурсия за уши притянута, она здесь не нужна . Machine сделал все правильно и красиво. |
Izzyy
Цитата:
Он вам давал какие-нибудь задачки по обоработке деревьев, например? |
2Izzyy
Вот еще вариант как можно рекурсивно сделать: Код:
int check_alpha(char *s1, char *s2) |
Спасибо, весьма элегантный подход:claps:
|
Ты где учишься?
|
Часовой пояс GMT +4, время: 10:40. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.