Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для Bangemin
0 / 0 / 1
Регистрация: 06.11.2015
Сообщений: 99

Организовать меню так, чтобы при каждом варианте выбора выполнялась определённая функция

25.03.2016, 19:51. Показов 2013. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как правильно организовать такого рода меню с под-менюшками:

1. что-то;
2. что-то;
3. что-то;
4. что-то;

5. выход;

При нажатии на которую должна выполняться функция определенного класса.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2016, 19:51
Ответы с готовыми решениями:

Как сделать так, чтобы определённая часть кода выполнялась только в случае выполнения заданного условия?
Как сделать так чтобы элемент кода выполнялся после выполнения условия? Мне нужно сделать чтобы при правильном вводе "пароля"...

Сделать так, чтобы функция setbox выполнялась раз в некоторое время
Суть такова: пишу игру, в стиле гонок. Снизу - спрайт автомобиля, сверху сбрасываются блоки-"препятствия". Их горизонтальная...

Как сделать так чтобы функция не выполнялась до того момента когда она получит второй параметр
Как сделать так чтобы функция не выполнялась до того момента когда она получит второй параметр. Почемуто она у меня начинает выполнятся до...

4
1 / 1 / 1
Регистрация: 18.11.2014
Сообщений: 101
25.03.2016, 20:14
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
#include <iostream>
using namespace std;
 
void func1() {cout<<" you enter 1 ";}
void func2() {cout<<" you enter 2 ";}
void func3() {cout<<" you enter 3 ";}
void func4() {cout<<" you enter 4 ";}
 
int main(){
    setlocale(LC_ALL,"Russian");
 
 
    int a;
 
    cout<<1<<" что-то "<<endl;
    cout<<2<<" что-то "<<endl;
    cout<<3<<" что-то "<<endl;
    cout<<4<<" что-то "<<endl;
    cout<<5<<" выход "<<endl;
 
    cin>>a;
 
    switch(a){
    case 1: func1(); break;
    case 2: func2(); break;
    case 3: func3(); break;
    case 4: func4(); break;
    case 5: return 0; break;
    }
 
 
    system("pause");
    return 0;
}
0
 Аватар для Bangemin
0 / 0 / 1
Регистрация: 06.11.2015
Сообщений: 99
25.03.2016, 20:27  [ТС]
а как обеспечить выход сочетанием клавиш, или же нажатием F1 ...?
Вообще такое возможно?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.03.2016, 20:46
Лучший ответ Сообщение было отмечено Bangemin как решение

Решение

http://rextester.com/UINVP16677

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <limits>
#include <functional>
#include <iostream>
#include <cassert>
#include <string>
#include <map>
 
//-------------------------------------------------------------------------         
//-------------------------------------------------------------------------        
//-------------------------------------------------------------------------       
 
void clear_input()
{
    std::wcin.clear(),
    std::wcin.ignore(std::numeric_limits<std::streamsize>::max(), L'\n');
    assert(std::wcin);
}
 
template<typename Data, class Checker> 
void input(const wchar_t* msg, const wchar_t* help, 
    const Checker& checker, Data& dst)
{
    for (;;)
    {
        assert(std::wcout);
        assert(std::wcin);
 
        std::wcout << msg; 
        std::wcin  >> dst;
 
        if (!std::wcin || !checker(dst) )
            std::wcout << L"\nошибка: " << help,
            clear_input();
        else 
            break; 
    }
}
 
template<typename Data > 
void input(const wchar_t* msg, const wchar_t* help, Data& dst)
{ 
    const auto lambda = [](const Data&) { return true; };
    input(msg, help, lambda, dst);
}
 
//-------------------------------------------------------------------------         
//-------------------------------------------------------------------------        
//-------------------------------------------------------------------------       
 
 
class menu
{
    using callback = std::function<void()>;
 
    struct element
    {
        element(const std::wstring& description = L"", const callback& callback_ = callback() )
            :m_description(description)
            ,m_callback(callback_)
        {}
        
        std::wstring m_description;
        callback m_callback;
    };
    
    using elements = std::map<size_t, element>;    
public:
    template<class F>
    void add(const std::wstring& description, F&& callback)
        { m_elements[++m_index] = element(description, callback); }
 
    void view()const
    {
        for(const auto& pair_: m_elements)
            std::wcout << pair_.first << L") " 
            << pair_.second.m_description
            << std::endl;
    }
    
    void select(const size_t n)
    {
        const auto f = m_elements.find(n);
        if(f==m_elements.cend())
            throw std::logic_error("error: invalid index of variables");
        f->second.m_callback();
    }
    
private:
    elements m_elements;
    size_t m_index = 0;
};
 
struct some
{
    void foo()const { std::wcout << L"хочу foo"<<std::endl; }
    void bar()const { std::wcout << L"хочу bar"<<std::endl; }
    void exit()const { std::wcout << L"хочу выйти"<<std::endl; ::exit(0); }
};
 
int main()
{
    setlocale(LC_ALL, "");
    
    some agregat;
    
    menu menu;
    
    menu.add(L"foo" , [&agregat](){ agregat.foo() ; });
    menu.add(L"bar" , [&agregat](){ agregat.bar() ; });
    menu.add(L"exit", [&agregat](){ agregat.exit(); });
    
    for(;;)
    {
        menu.view();
        
        size_t index = 0;
        input(L"что вы хотите? ",
              L"введите число соответствующее вашему выбору",
              index
        );
        std::wcout << std::endl;
 
        try
        {
            menu.select(index);
        }
        catch(const std::logic_error& e)
        {
            std::wcout << L"fuck" <<std::endl;
            break;
        }
    }
}
Добавлено через 3 минуты
Цитата Сообщение от Bangemin Посмотреть сообщение
Вообще такое возможно?
это системно зависимо.

вам нужно смотреть в сторону библиотеки OIS (кроссплатформа), либо в сторону API конкретных систем.

windows, console:

здесь реакция на esc или enter

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
template<typename Data, class Checker> 
void input(const wchar_t* msg, const wchar_t* help, 
    const Checker& checker, Data& dst, const bool check = true)
{
    for (;;)
    {
        assert(std::wcout);
        std::wcout << msg; 
        std::wstring accumulate;
        for (;;)
        {
            auto code = _getch();
            if (code == 13 || code == 27)
                break;
 
            if (code == 224)
                _getch(),
                code = 8;
                
            if ( code == 8)
            {
                std::cout << "\b \b";
                if(!accumulate.empty())
                    accumulate.pop_back();
            }
            else
            {
                const auto ch = static_cast<char>(code);
                accumulate += stdlocal::convert(&ch, 1);
                std::cout << ch;
            }
        }
 
        std::wstringstream wss(accumulate);
        assert(wss);
        wss >> dst;
 
        const bool invalid = check && !wss;
        if ( invalid || !checker(dst))
            std::wcout << L"\nошибка: " << help;
        else
            break;
    }
}
Добавлено через 5 минут
Цитата Сообщение от hoggy Посмотреть сообщение
accumulate += stdlocal::convert(&ch, 1);
забыл выложить для полноты картины:
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
namespace stdlocal {
 
    std::wstring convert(const char* first, const size_t len, const std::locale& loc)
    {
        if(len == 0)
            return std::wstring();
 
        const std::ctype<wchar_t>& facet =
            std::use_facet< std::ctype<wchar_t> >(loc);
 
        const char* last = first + len;
 
        std::wstring result(len, L'\0');
 
        facet.widen(first, last, &result[0]);
        return result;
    }
 
    std::string convert(
        const wchar_t* first,
        const size_t len,
        const std::locale& loc,
        const char default_char
    )
    {
        if(len == 0)
            return std::string();
 
        const std::ctype<wchar_t>& facet =
            std::use_facet<std::ctype<wchar_t> >(loc);
 
        const wchar_t* last  = first + len;
 
        std::string result( len, default_char );
        facet.narrow( first, last, default_char, &result[0] );
        return result;
    }
 
    std::string  convert( const wchar_t* s, const std::locale& loc, const char default_char )
        { return convert(s, std::wcslen(s), loc, default_char); }
    std::string  convert(const std::wstring& s, const std::locale& loc, const char default_char)
        { return convert(s.c_str(), s.length(), loc, default_char);  }
    std::wstring convert( const char* s, const std::locale& loc)
        { return convert(s, std::strlen(s), loc); }
    std::wstring convert( const std::string& s, const std::locale& loc)
        { return convert(s.c_str(), s.length(), loc); }
 
}//namespace stdlocal
1
 Аватар для Bangemin
0 / 0 / 1
Регистрация: 06.11.2015
Сообщений: 99
26.03.2016, 09:31  [ТС]
Я тут немножко поискал, и присмотрел такую конструкцию :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <windows.h>
 
int main(){
    
    while(TRUE)
    {
        if(GetAsyncKeyState(VK_BACK))
        {
            keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0); // отжимаем клавишу
            printf("Done!");
        }
        if(GetAsyncKeyState(VK_ESCAPE))
        {
            keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0); // отжимаем клавишу
            return 0;
            exit(1);
        }
    }
 
}
Правильная она, или же стоит как-то организовать ее вызов через функцию?( Если через нее, то объясните пожалуйста как ).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.03.2016, 09:31
Помогаю со студенческими работами здесь

Сделать так, чтобы при каждом изменении переменной pos вызывалась некоторая сторонняя функция
Нужно сделать так, чтобы при каждом изменении переменной pos вызывалась некоторая сторонняя функция (если быть точным, процедура прорисовки...

Как сделать, чтобы при нажатии на кнопку выполнялась функция?
Простите, я только начинаю работать с QT и я не знаю Как сделать чтобы при нажатии на кнопку выполнялась функция. Например, я нажав на...

Как можно cделать так чтобы при вызове функции GetFolder() меню выбора директории становилось автоматически на задаваемый путь?
Подскажите пожалуйста как можно cделать так чтобы при вызове функции GetFolder() меню выбора директории становилось автоматически на...

Переписать программу так, чтобы она выполнялась с динамическими массивами
Переписать программы так, чтобы они выполнялась с динамическими массивами. 1) program odin; {$APPTYPE CONSOLE} uses SysUtils; ...

Работа с SQLCLR - Сделать так, чтобы процедура выполнялась на сервере
Подскажите, вот у меня процедура на C#, которая берет указанную таблицу и что-то с ней делает. ConnectionString у меня там задан явным...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru