Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163

Косвенный рекурсивный вызов функции

13.02.2016, 20:13. Показов 3585. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый вечер.
Пишу программу, вычисляющую массивы. Внутри программы есть две(пока что одна) задачи, которые она выполняет(две функции). Проблема в следующем - в начале я предоставляю пользователю выбор - какую задачу он хочет решить. После выбора и решения я хочу вернуть управление функции выбора задачи.
Как я понял, получается что-то вроде косвенной рекурсии, но я что-то, видимо, делаю не так и мне компилятор выдаёт ошибку: main.cpp:16: ошибка: 'task1' was not declared in this scope.

Вот прототип:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int choice(){
    //спрашиваем что хотим делать
    //[1]выполнить задачу 1
    task1();
    //[2]выполнить задачу 2
    task2();
    //[3]выйти
    return 0;
}
 
void task1(){
    //делаем тут что-то
    //спрашиваем выполнить ещё раз или выйти?
    //[1] - выполнить ещё раз
    task1();
    //[2]выйти
    choice();
}
 
void task2(){
    //делаем тут что-то
    //спрашиваем выполнить ещё раз или выйти?
    //[1] - выполнить ещё раз
    task2();
    //[2]выйти
    choice();
}
 
int main(){
    choice();
    return 0;
}
Вот полный текст:
Полный текст программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <ctime>
 
using namespace std;
 
void choice(){
    system("cls");
    cout << "Choose the task you wanna execute:\n"
         << "[1] - Task 1\n"
         << "[2] - Task 2\n"
         << "[3] - Exit\n";
    int ans;
    cout << "What do you choose? : ";
    cin >> ans;
    switch(ans){
        case 1: task1();
        //case 2: task2();
        case 3: ;
        default: choice();
    }
}
 
void task1(){
    system("cls");
    cout << "Enter size of the massive: ";
    int mSize, bot, top, k, max;
    cin >> mSize;
    cout << "\nEnter bottom limit of massive numbers: ";
    cin >> bot;
    cout << "\nEnter top limit of massive numbers: ";
    cin >> top;
    cout << "\nEnter number to search in massive. 'K': ";
    cin >> k;
    cout << "\nCreating massive..." << "\n\nInitial massive:\n\n";
    mSize -= 1;
    int A[mSize];
    srand(time(0));
    for (int i=0, c=1; i<=mSize; i++, c++){
        A[i]=bot + rand() % top;
        cout << A[i] << ", ";
        if(c%5==0) cout << endl;
    }
    cout << "\nSearching for K...\n";
    for (int i=0, cflag=0, gflag=0; i<=mSize; i++){
 
        if (A[i]==k){
            if (cflag==0){cflag=1;cout << "Looks like we apparently found something!\n";}
            cout << "A[" << i+1 << "] = K = " << A[i] << endl;
            gflag = 1;
        }
 
        else
            if((i==mSize) && (gflag!=1)){
            cout << "Seems there's nothing around like 'K'.\n"
                 << "Replacing the first biggest number with 'K'\n";
            max = A[0];
 
            for(int i=0,maxAi; i<=mSize; i++){
 
                if (max < A[i]) {max = A[i];maxAi=i;}
                if (i==mSize){
                    A[maxAi]=k;
                    cout << "A[" << maxAi+1 << "] = " << max << " was replaced with K";
                    cout << "\n\nNew massive is:\n";
                    for (int i=0, c=1; i<=mSize; i++, c++){
                        cout << A[i] << ", ";
                        if(c%5==0) cout << endl;
                    }
                    goto mark;
                }
            }
        }
    }
    mark:
    cout << "\nDo you want to exec one more time? y\\n: ";
    char ans;
    cin >> ans;
    if (ans=='y') {system("cls");task1();}
}
 
int main()
{
    choice();
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2016, 20:13
Ответы с готовыми решениями:

рекурсивный вызов функции-члена
как осуществить рекурсивный вызов функции члена?

Рекурсивный вызов функции main
Не понимаю, где здесь рекурсивный вызов main() будет? Написал такой код: #include&lt;iostream&gt; using namespace std; ...

Рекурсивный вызов constexpr функции
Приветствую уважаемые форумчане. Возможно ли реализовать указанное в теме телодвижение, с условием передачи в качестве входного параметра в...

4
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
13.02.2016, 20:17
Лучший ответ Сообщение было отмечено inviter42 как решение

Решение

inviter42, компилятор обрабатывает исходники сверху вниз,
когда он обрабатывает функцию choice, то про другие он ничего не знает.
Так что нужно перед этой функцией объявить, что существуют другие функции.
1
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
13.02.2016, 20:23  [ТС]
nonedark2008, да, но проблема тогда будет с другого конца. Потому что в функции choice есть вызов task1(task2), а в функции task1 есть вызов choice.

Добавлено через 56 секунд
nonedark2008, аа, я понял. Глупый я. В объявлении не будет вызова.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
13.02.2016, 20:51
Цитата Сообщение от inviter42 Посмотреть сообщение
Потому что в функции choice есть вызов task1(task2), а в функции task1 есть вызов choice.
Только с таким подходом у тебя будет другая проблема, связанная с переполнением стека.
С каждым вызовом функции сохраняется информация о том, откуда она была вызвана, чтобы туда вернуться.
Если ты бездумно будешь создавать рекурсивные вызовы, то в итоге твоя программа выдаст ошибку, так как память выделенная под стек рано или поздно закончится.
0
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
13.02.2016, 20:53  [ТС]
nonedark2008, в этой программе переполнение маловероятно. Но я буду иметь в виду, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2016, 20:53
Помогаю со студенческими работами здесь

Считать одномерный массив с файла, отсортировать его использую рекурсивный вызов функции
Нужно написать прогу на Си, самую элементарную... Считать одномерный массив с файла, отсортировать его использую рекурсивный вызов функции,...

Используя рекурсивный вызов функции вычислить сумму заданного числа элементов ряда
В программировании я просто дуб дубом, но нужно срочно сделать одну задачу в Qt. Сама задача: Используя рекурсивный вызов функции...

Рекурсивный вызов
Требуется определить функцию: (N,M), которая заполняет прямоугольник, имеющий высоту m, цифрами: n n-1 … 1 n n-1 … 1 … n n-1 …...

рекурсивный вызов мейн
Задача такая: Написать программу содержащую функцию мейн, включить в нее локальную переменную коунт типа статик, дав ей начальное значение...

Рекурсия: как выделяется память под рекурсивный вызов?
на картинке файлик из википедии в которой говорится что рекусия имеет вид дерева и некоторые ветви могут вычислятся по многу раз. А как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru