【问题标题】:How can I write the same code using switch statement and the full word instead of initials?如何使用 switch 语句和完整的单词而不是首字母来编写相同的代码?
【发布时间】:2019-11-12 16:23:28
【问题描述】:

请考虑以下代码:

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
int main(int argc, char** argv) {
    enum object {rock, paper, scissors};
    object player1, player2;
    cout << " "Enter "r" for rock, "p" for paper or "s" for scissors:";
    char p1, p2;
    cin >> p1 >> p2;

    if (p1 == 'r') {player1 = rock;}
    else if (p1 == 'p') {player1 = paper;}
    else if (p1 == 's') {player1 = scissors;}
    else {cout << "invalid input, play again" << endl; exit(1);}

    if (p2 == 'r') {player2 = rock;}
    else if (p2 == 'p') {player2 = paper;}
    else if (p2 == 's') {player2 = scissors;}
    else {cout << "invalid input, play again" << endl; exit(1);}

    if (player1==player2) cout <<"objects are equal";
    else if (player1==rock && player2==paper) cout << "player 2 is the winner";
    else if (player1==rock && player2==scissors) cout<<"player 1 is the winner";
    else if (player1==paper && player2==rock) cout << "player 1 is the winner";
    else if (player1==paper && player2==scissors) cout <<"Palyer 2 is the winnder";
    else if (player1==scissors && player2==paper) cout << "Player 1 is winner";
    else cout <<"Player 2 is the winner";
    cout << endl;
}

当用户必须给出完整的单词(石头、纸、剪刀)而不是输入的首字母时,如何使用 switch 语句重写上述代码。

更新:我已经用 switch 转换了部分代码,但我很想看看是否可以将它用于整个代码:

例如:

switch (p1) {
        case 'r': player1=rock; break;
        case 'p': player1=paper; break;
        case 's': player1=scissors; break;
    }

而不是

if (p1 == 'r') {player1 = rock;}
    else if (p1 == 'p') {player1 = paper;}
    else if (p1 == 's') {player1 = scissors;}
    else {cout << "invalid input, play again" << endl; exit(1);}

【问题讨论】:

  • 当然只有 3 项,但您可以使用 std::map 来摆脱 switch 和很多 if / else 语句。
  • @VladfromMoscow 为什么重新打开? OP想要打开字符串,骗子说他们不能
  • @NathanOliver-ReinstateMonica 查看我的回答。
  • @VladfromMoscow 如果你想添加一些东西,你把它添加到骗子中,你不会重新打开问题。现在信息被隔离而不是集成,

标签: c++ switch-statement


【解决方案1】:

你不能这么简单。 switch 不适用于字符串。但是,您可以绕过这个问题并在进行切换之前计算object

std::string player1Input, player2Input;
//...
std::cin >> player1Input >> player2Input;

object player1Choice = getChoice(player1Input);
object player2Choice = getChoice(player2Input);

getChoice 可能如下所示:

object getChoice(std::string input)
{
    if(input == "rock")
        return object::rock;
    else if(input == "paper")
        return object::paper;
    else if(input == "scisor")
        return object::sciscor;
    else {
        //invalid input
    }
}

然后你就可以使用你的开关了:

switch(player1Choice)
{
case object::rock:
    switch(player2Choice)
    {
    case object::rock: //rock vs rock
        break;
    ...
    };

    break;
...
}

【讨论】:

  • 我认为这是我的问题的一个很好的解决方案。但是我收到错误“使用未声明的标识符'player1'”为cin
  • @developer 哎呀,对不起,这是一个错字,我已修正:)
  • 现在我收到此错误:二进制表达式的无效操作数 ('std::__1::istream' (aka 'basic_istream') 和 'std::__1::string' (aka 'basic_string, allocator >'))
  • 是的,我想我需要休息一下。
  • @developer 我的意思是我自己,因为有两个错别字;)但是休息总是好的^^
【解决方案2】:

不能。

switch 适用于内置类型,例如 intboolchar

它不是一个复杂的比较功能,可以对字符串进行检查。

【讨论】:

  • 谢谢!这就是为什么原始代码使用首字母而不是完整单词的原因。
  • @developer 是的,可能。
【解决方案3】:

你的意思好像是这样的

#include <string>
#include <iterator>
#include <algorithm>

//...

const char * object_name[] = { "rock", "paper", "scissors" };
enum object {rock, paper, scissors};

std::string choice;
std::cin >> choice;

//...

auto it = std::find_if( std::begin( object_name ), std::end( object_name ),
                        [&choice]( const char *item )
                        {
                            return choice == item;
                        } );

if ( it != std::end( object_name ) )
{
    int p1 = std::distance( std::begin( object_name ), it );

    switch ( p1 )
    {
    case rock:
        //...
        break;
    case paper:
        //...
        break;
    case scissors:
        //...
        break;
    }
}

这是一个演示程序

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main() 
{
    const char * object_name[] = { "rock", "paper", "scissors" };
    enum object {rock, paper, scissors};

    std::string choice;

    std::cout << "Enter \"" << object_name[0] << "\", or \""  << object_name[1]
              << "\", or \"" << object_name[2] << "\": ";
    std::cin >> choice;

    auto it = std::find_if( std::begin( object_name ), std::end( object_name ),
                        [&choice]( const char *item )
                        {
                            return choice == item;
                        } );

    if ( it != std::end( object_name ) )
    {
        int p1 = std::distance( std::begin( object_name ), it );

        switch ( p1 )
        {
        case rock:
            std::cout << object_name[rock];
            break;

        case paper:
            std::cout << object_name[paper];
            break;
        case scissors:
            std::cout << object_name[scissors];
            break;
        }
    }

    return 0;
} 

它的输出可能看起来像

Enter "rock", or "paper", or "scissors": paper
paper

【讨论】:

  • 谢谢,但我认为这超出了我目前对 cpp 编码的了解。我正在尝试向自己解释这些台词。
  • @developer 查看添加到我的答案中的演示程序。
猜你喜欢
  • 2015-12-05
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
相关资源
最近更新 更多