如何使用switch代替if else?

时间:2015-03-21 01:46:16

标签: c++ switch-statement

我正在参加我的第一个编程课程,并且任务是使用switch语句重做以前的程序(这个)。我以为开关只是用来比较单个字符。

该程序基本上只接收一个字符串并计算数字,字母,其他字符和总字符.....

#include <iostream> 
using namespace std;

int main()
{
    char s[50];
    int i;
    int total = 0;
    int letters = 0;
    int numbers = 0;
    int others = 0;    

    cout << "Enter a continuous string of characters with no blank spaces" << endl;
    cout << "(example: aBc1234!@#$%)" << endl << endl;
    cout << "Enter your string: ";
    cin >> s;
    cout << endl;

    i = 0;
    while (s[i] != 0)
    {
        if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z'))
            letters++;
        else if ((s[i] >= '0' && s[i] <= '9'))
            numbers++;
        else
            others++;
        i++;
        total++;
    }

    cout << letters << " letters" << endl;
    cout << numbers << " numbers" << endl;
    cout << others << " other characters" << endl;


    return 0;
}

4 个答案:

答案 0 :(得分:3)

对于这种特殊情况,if/else是最好的方法(如@zenith所说),但如果你希望用switch语句做,你会做

switch(s[i])
{
    case `0`:
    case '1':
    case '2':
    //repeat for '3'-'8'
    case '9':
        //do whatever you want when it is a digit here
        break;
    case 'A':
    case 'a':
    case 'B':
    case 'b':
    //repeat for 'C'-'y'
    case 'Z':
    case 'z':
        //do whatever you want when it is a letter
        break;
    default:
        //do whatever you want when it was not a letter or a digit
        break;
}

case语句中的switch匹配时,会执行相应break的所有内容 - 这就是您如何对此类案例进行分组

答案 1 :(得分:2)

你不应该。 switch语句的工作基于==,而不是<= / >= / < / >

case语句中的switch必须是常量表达式。您必须为每个角色单独case

在某些情况下switch是更好的解决方案。但这不是其中之一。这里有ifelse

答案 2 :(得分:1)

您需要将所有感兴趣的角色映射到行为上。

enum char_category { OTHER, LETTER, NUMBER };
unsigned char mapping[256];

memset(mapping, OTHER, sizeof mapping);

for( char ch = '0'; ch <= '9'; ++ch ) mapping[ch] = NUMBER;
for( char ch = 'A'; ch <= 'Z'; ++ch ) mapping[ch] = mapping[tolower(ch)] = LETTER;

然后你可以使用跳转表:

switch ( mapping[s[i]] )
{
    case NUMBER:
        break;
    case LETTER:
        break;
    case OTHER:
        break;
}

或者你可以完全跳过条件:

int count[3] = { 0, 0, 0 };

count[mapping[s[i]]]++;

letters = count[LETTER];
numbers = count[NUMBER];
other = count[OTHER];

请注意,如果您有多个输入字符,则设置映射的工作是合理的。

答案 3 :(得分:0)

switch(s[i]) {
    case '0':
    ...
    case '9': numbers++; break;
    default: {
        switch(toupper(s[i])) {
            case 'A':
            case 'B':
            ...
            case 'Z': letters++; break;
            default: others++;
        }
     }
}