• Как создать консольный терминал на C++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    @grigorkh
    не используйте reinterpret_cast без крайней необходимости.

    предлагаю создать интерфейс и реализовать для каждой команды:
    class command_t
    {
    public:
    	virtual void apply(std::vector< std::string > const &args) = 0;
    	virtual std::string get_help() = 0;
    };
    
    class add_command_t : command_t
    {
    public:
    	void apply(std::vector< std::string > const &args)
    	{
    		int ans = atoi(args[1].c_str()) + atoi(args[2].c_str());
    		std::cout << ans;
    	}
    
    	std::string get_help()
    	{
    		return "add arg1 arg2\n";
    	}
    };
    
    //аналогично mul_command и.т.д


    Затем запихнуть экземпляры вместо функций в map.
    typedef std::map< std::wstring, command_t * > command_map_t;
    typedef command_map_t::iterator command_iter;
    
    //////////////////////////////////////////
    
    command_map_t commands;
    commands['add'] = new add_command_t();
    //...
    
    while (true)
    {
    	std::string x;
    	std::getline(cin, x);
    	std::vector< std::string > words = split(x); //напиши split сам
    
    	command_iter iter = commands.find(words[0]); 
    	if (iter != commands.end()) //если такая команда есть
    	{
    		iter->apply(words);
    	}
    	else
    	{
    		std::cout << "Wrong command!\n";
    	}
    }


    Так ты сможешь реализовать команды не только с 2 int-овыми параметрами. В конструктор help_command можно передать указатель на commands и в зависимости от аргументов выдавать справку по всем командам, или по конкретной указанной.
    Не забудь почистить память в конце.
    Ответ написан
    Комментировать
  • Как создать консольный терминал на C++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Ладно, @grigorkh, ты меня рассмешил.
    Сначала нужно научиться писать хоть что-то работающее. Вот
    так вы можете создать свою первую программу.
    Далее возьмите книжку по C++, Эккель подойдет. Читайте, напишите хотя бы 5-10 упражнений на строки, ввод-вывод, циклы, if.
    Теперь вы готовы приступить к выполнению вашего задания.
    В цикле (а этому моменту вы уже знаете что это такое) вы считываете команды по одной до тех пор пока не введена команда exit.
    Пусть каждая команда это строка, первое слово в которой - имя действия, остальные - аргументы. Научитесь разбивать строчку на слова. Дальше разбираете какая команда введена и формируете требуемый ответ. В итоге получится что-то такое:
    #include <iostream>
    #include <string>
    
    main ()
    {
    	while (true) 
    	{
    		std::string command;
    		std::getline (std::cin, command); 
    
    		if (command = "exit")
    			break;
    
    		std::vector<std::string> words = разбить_на_слова(command)
    
    		if (words[0] == "help")
    		{
    			std::cout << "plus arg1 arg2\nminus arg1 arg2"
    		}
    
    		if (words[0] == "plus")
    		{
    			std::cout << строка_в_число(words[1]) + строка_в_число(words[2]);
    		}
    
    		// дальше аналогично(или не очень) разобрать остальные команды
    	}
    
      return 0;
    }


    У такого кода будет много недостатков, например новые команды не очень удобно добавлять. Да и 2 + 2 * 2 ему не понять. Но до этого еще очень далеко.

    И научитесь пользоваться гуглом. Там есть ответы на 99.99% вопросов которые у вас возникнут в ближайшее несколько месяцев изучения программирования.
    Ответ написан
    2 комментария