0 / 0 / 1
Регистрация: 03.08.2014
Сообщений: 49
|
||||||
1 | ||||||
Рекурсия (вызов только 3 раза)04.03.2015, 15:03. Показов 1589. Ответов 16
Метки нет (Все метки)
Привет! Есть программка, проблема заключается в том чтобы сделать вызов рекурсии ТОЛЬКО 3 раза, т.е. как при пароле, есть только 3 попытки. Сейчас она вызывается постоянно, если введено неверное значение. Как сделать вызов только 3 раза...
0
|
04.03.2015, 15:03 | |
Ответы с готовыми решениями:
16
Рекурсия: как выделяется память под рекурсивный вызов? Очень странная ошибка: Функция gets() вызывается только со второго раза Рекурсия: как выводить на экран только удовлетворяющие условия Найти максимальное число, встречающееся в заданном массиве только два раза |
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
04.03.2015, 15:12 | 2 | |||||
Добавить переменную счетчика попыток вестимо.
Например так:
1
|
04.03.2015, 15:17 | 3 | |||||
Маша - это Маша, но 3 раза - это 3 раза! (С)
Заводите интовый параметр в вашу гет пасс, каждый вложенный вызов осуществляете с увеличением его на единицу, в начале функции проверяете его значение, первый вызов в мэйне делаете с нулевым или единичным значением - все.
Tulosba, не видел ваш вариант когда писал свой. Статик... Имхо, явный аргумент по значению тут элегантнее смотрится.
1
|
0 / 0 / 1
Регистрация: 03.08.2014
Сообщений: 49
|
|
04.03.2015, 15:18 [ТС] | 4 |
Спасибо!)
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
04.03.2015, 15:24 | 5 |
Статические переменные в функциях это вообще не оч.хорошо. При условии использования ООП они должны переехать в поля класса. Но т.к. тут никакого ООП по сути нет, я предложил самое простое (как мне показалось) решение. Инкапсуляция переменной внутри метода (static), имхо в данном случае проще, чем передача аргумента, т.к. вся логика остается внутри метода (параметр при вызове не нужен). Также не меняется сигнатура функции get_pass().
1
|
04.03.2015, 15:30 | 6 |
Tulosba, все понимаю, кроме одного А сейчас нет под рукой компилятора чтобы проверить. Если бы вы просто сделали честную глобальную переменную и зануляли ее ДО вызова гет_пасс в мэйне, а внутри гет_пасс только инкрементировали и проверяли ее значение, но не зануляли, тогда было бы все железно и понятно. А сейчас у вас она статик, то есть по сути глобальная, но видна только из гет_пасс, а вы кажый раз ее там зануляете - с какого она должна быть больше единицы при очередном вызове? Или объясните где я ошибаюсь, или скажите что я прав
0
|
04.03.2015, 15:41 | 8 | |||||
Хм... Оказывается (внезапно), что при последующих рекурсивных вызовах статическая переменная не переопределяется если она уже была определена и ей было назначено значение при определении в первом вызове.
0
|
04.03.2015, 15:50 | 10 |
Хотя действительно, что это я... При тех же циклических (а не рекурсивных) вызовах функции статические переменные именно так себя и ведут, просто меня запутала рекурсивная вложенность контекстов, а статики (как глобальные по сути) ничем в данном случае не отличаются по своему поведению. Но в любом случае спасибо за науку
ЗЫ а про базовые вещи... Вот когда писал на одном языке, знал его повадки, приоритеты операций, передачу параметров по значению/ссылке и т.п. А когда попробовал другие - уже начинаю иногда путаться где у чего какая область видимости и т.п. Так что звиняйте барин за проколы в базовых вещах
0
|
Tulosba
|
04.03.2015, 16:04
#11
|
0
|
0 / 0 / 1
Регистрация: 03.08.2014
Сообщений: 49
|
||||||
04.03.2015, 16:35 [ТС] | 12 | |||||
Вопрос, а как этот код правильно перевести для СИшки?
0
|
0 / 0 / 1
Регистрация: 03.08.2014
Сообщений: 49
|
||||||
04.03.2015, 17:01 [ТС] | 14 | |||||
А эту строчку? getline(cin, user_pass);
scanf(user_pass); ??
Кликните здесь для просмотра всего текста
Ошибка 1 error C2061: синтаксическая ошибка: идентификатор "password_is_valid" Ошибка 2 error C2059: синтаксическая ошибка: ; Ошибка 3 error C2059: синтаксическая ошибка: тип
0
|
0 / 0 / 1
Регистрация: 03.08.2014
Сообщений: 49
|
|
04.03.2015, 17:09 [ТС] | 16 |
Ок, буду пробовать...Правда проблема с булом...
Кликните здесь для просмотра всего текста
Ошибка 1 error C2061: синтаксическая ошибка: идентификатор "password_is_valid"
Ошибка 2 error C2059: синтаксическая ошибка: ; Ошибка 3 error C2059: синтаксическая ошибка: тип 6 IntelliSense: идентификатор "bool" не определен 7 IntelliSense: идентификатор "true" не определен 8 IntelliSense: идентификатор "false" не определен
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
04.03.2015, 17:13 | 17 |
0
|
04.03.2015, 17:13 | |
04.03.2015, 17:13 | |
Помогаю со студенческими работами здесь
17
Рекурсия: умножение двух чисел, используя только операцию сложения Рекурсия: вычисление произведения элементов массива (только четных и больше 0) Cкопировать в массив только те элементы, который в первом массиве встретились ровно 2 раза Рекурсия: функция умножения двух чисел, используя только операцию сложения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |