我正在参加我的第一个编程课程,并且任务是使用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;
}
答案 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
是更好的解决方案。但这不是其中之一。这里有if
和else
。
答案 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++;
}
}
}