Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sociodim
0 / 0 / 0
Регистрация: 28.10.2015
Сообщений: 2
#1

Разработать архитектуру программы управления роботом - C++

28.10.2015, 19:34. Просмотров 315. Ответов 2

Робот принимает команды типа "go north 1000", "turn left", "beep 5", "analyze oxygen", "analyze earth" и так далее. Архитектура должна предусматривать легкое добавление команд и описание допустимых операндов этих команд. Например, для "go" это "north", "west" и так далее, для "turn" - "left" и "right". Или "degrees", но тогда надо указать градусы. Просто куча if-ов не устраивает, надо красиво сделать. Видимо, тут нужен паттерн "Стратегия", а может и нет, я пока не придумал.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2015, 19:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разработать архитектуру программы управления роботом (C++):

Разработать проэкт управления телефоном - C++
Разработать проэкт управления телефоном (ООП С++) Добавлено через 58 секунд если чесно то ващэ без понятия как ето...

Разработать класс с набором функций для управления односвязным списком - C++
Добрый день, форумчане! Обращаюсь к вам с просьбой, с чего начать мне выполнение данного задания, какие элементы использовать. Или хотя...

Пройденный роботом путь - C++
Всем привет. Совсем недавно начала изучать язык С++ и попалась такая задача, никак не могу понять, как к ней подойти вообще, возможно,...

Рекурсивный обход роботом плоской фигуры - C++
Всем доброго времени суток. Помогите, пожалуйста, в решении задачи на рекурсию. Необходимо, чтобы пользователь нарисовал какую-либо...

Управление мобильным роботом, построенным на базе Pololu. - C++
Доброе время суток. Нужно написать или заставить работать готовую программу для управления мобильным роботом построенного на базе Pololu. К...

Разработать программы - C++
Помогите решить вот такие интересные задачки. 1. Дан файл, содержащий произвольный текст. Определить, сколько слов в тексте. Результат...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hoggy
6539 / 2719 / 470
Регистрация: 15.11.2014
Сообщений: 6,002
Завершенные тесты: 1
28.10.2015, 19:59 #2
Цитата Сообщение от sociodim Посмотреть сообщение
Видимо, тут нужен паттерн "Стратегия", а может и нет, я пока не придумал.
здесь нужен бинд имен команд на функции, которые эти команды реализуют.


например, вот мой консольный робот:

умеет три команды:

C++
1
2
3
void print(){ std::cout << "print()\n"; }
int add(int a, int b){ return a + b; }
int sub(int a, int b){ return a - b; }
соответственно,
умеет печатать текст,
складывать и вычитать значения.

команды и аргументы подаются в видете текста из консольки.

http://rextester.com/NAENGJ62317

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
#include <map>
#include <string>
#include <iostream>
#include <sstream>
#include <functional>
#include <stdexcept>
#include <type_traits>
 
//------------------------------------------------------------------------------------------------------//
 
    template<class Sig, class F>
        struct stream_function_;
 
    template<class R, class... Args, class F>
    struct stream_function_<R(Args...), F>
    {
        stream_function_(F f)
            : _f(f) 
        {}
 
        void operator()(std::istream& args, std::string* out_opt)const
            { call<R>(args, out_opt); }
 
    private:
        template<class T> static T get(std::istream& args)
        {
            T t; 
            if( !(args >> t) )
                args.clear(),
                throw std::invalid_argument("invalid argument to stream_function");
 
            return t;
        }
 
        #define dIS_VOID \
            std::is_same<U, void>::value
        #define dVOID    \
            typename std::enable_if<dIS_VOID, U>::type* = nullptr
        #define dRETURN  \
            typename std::enable_if<!dIS_VOID,U>::type* = nullptr
 
        template<class U, dVOID>
        void call(std::istream& args, std::string*) const
        {
            (void)args;
            _f( std::forward<Args>(get<Args>(args))... );
        }
 
        template<class U, dRETURN>
        void call(std::istream& args, std::string* out_opt) const
        {
            if(!out_opt) 
                return call<void>(args, nullptr);
 
            std::stringstream conv;
            conv << _f( std::forward<Args>(get<Args>(args))... );
            if(!conv)
                throw std::runtime_error("bad return in stream_function");
 
            *out_opt = conv.str();
        }
        #undef dIS_VOID 
        #undef dRETURN
        #undef dVOID
 
        F _f;
    };
 
    template<class Sig, class F>
    stream_function_<Sig, F> 
        stream_function(F f){ return f; }
 
    typedef std::function<void(std::istream&, std::string*)> 
        func_type;
    typedef std::map<std::string, func_type> 
        dict_type;
 
 
//------------------------------------------------------------------------------------------------------//
 
void print(){ std::cout << "print()\n"; }
 
int add(int a, int b){ return a + b; }
int sub(int a, int b){ return a - b; }
 
 
int main()
{
    dict_type func_dict;
    func_dict["print"] = stream_function<void()>(print);
    func_dict["add"]   = stream_function<int(int,int)>(add);
    func_dict["sub"]   = stream_function<int(int,int)>(sub);
 
    std::cout << "[ functions binded ]\n";
    for(const auto& i: func_dict)
        std::cout << " --- " << i.first<<'\n';
 
    std::cout << " enter 'exit' to exit\n";
 
    for(;;)
    {
        std::cout << "Which function should be called?\n";
        std::string tmp;
        std::cin >> tmp;
        
        std::cout << "selected: "<<tmp<<'\n';
 
        if(tmp=="exit")
            break;
 
        const auto it = func_dict.find(tmp);
 
        if(it == func_dict.end()){
            std::cout << "Invalid function '" << tmp << "'\n";
            continue;
        }
 
        try{
            std::string result;
            it->second(std::cin, &result);
            std::cout << "Result: " << (result.empty()? "none" : result) << '\n';
        }
        catch(std::exception const& e){
            std::cout << "Error: '" << e.what() << "'\n";
            std::cin.ignore();
            continue;
        }
        
    }
}
для того, что бы создать поддержку новой команды,
необходимо придумать ей текстовое имя (можно хоть на русском),
и сопоставить этому имени функцию,
которая будет реализовывать эту команду.


то бишь, непосредственно бинд происходит здесь:

C++
1
2
3
4
    dict_type func_dict;
    func_dict["print"] = stream_function<void()>(print);
    func_dict["add"]   = stream_function<int(int,int)>(add);
    func_dict["sub"]   = stream_function<int(int,int)>(sub);
обычный словарик.
ключ - имя команды.
значение - имя функции, с указанием типов аргументов и возвращаемого значения.
sociodim
0 / 0 / 0
Регистрация: 28.10.2015
Сообщений: 2
29.10.2015, 09:14  [ТС] #3
А можно как-то попроще? Например, если все команды однотипные (принимают один параметр, возвращают bool, свидетельствующий об успехе или неуспехе, причем успех или неуспех определяется тем, является ли параметр разрешенным для данной операции). Я подумываю сделать класс Command, которые реализует некую абстрактную команду (т.е. список разрешенных параметров). Каждый раз, конструируя робота, надо будет указать все возможные команды (которые, в свою очередь, указывают все возможные параметры). Как-то так:

C++
1
2
3
4
5
6
7
Command go = new Command("go");
go.addOption("ahead");
Command turn = new Command("turn");
turn.addOption("left");
Robot robot = new Robot();
robot.addCommand(new Command(go));
robot.addCommand(new Command(turn));
Или что-то похожее, пусть и очень отдаленно. Я только начал изучать C++, да и в паттернах проектирования плаваю...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2015, 09:14
Привет! Вот еще темы с ответами:

Разработать визуальное оформление для программы - C++
Помогите новичку, есть код . Мне нужно сделать из него полноценную программу . Имею ввиду визуальную составляющую, чтоб она выглядила...

Задача на Архитектуру ПК - C++
Доброе время суток. Задали написать программу, не имею малейшего понятия как все реализовать (в принципе язык не обязательно С++ ). ...

Как разработать автоматизированные тесты для программы? - C++
В программе есть класс, он имеет несколько методов. Один метод принимает массив данных, другой изменяет его, третий выводит значения на...

Хочу понять архитектуру C++ - C++
Ребят, всем привет.Хочу разобраться в плюсах. Я java-шник. Я знаю что есть JDK (всё что нужно для разработчика), который содержит...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru