我如何使用 switch 而不是 if else 来做到这一点?
How do I do this with switch instead of if esle?
我正在上我的第一门编程课程,作业是使用 switch 语句重做之前的程序(这个)。我以为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;
}
你不应该。 switch
语句基于 ==
,而不是 <=
/ >=
/ <
/ >
.
switch
语句中的case
必须是常量表达式。您必须为每个字符制作一个单独的 case
。
有些情况下 switch
是更好的解决方案。但这不是其中一种情况。这里 if
和 else
是要走的路。
switch(s[i]) {
case '0':
...
case '9': numbers++; break;
default: {
switch(toupper(s[i])) {
case 'A':
case 'B':
...
case 'Z': letters++; break;
default: others++;
}
}
}
在这种特殊情况下,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
之前的所有内容 - 这就是您可以像这样对案例进行分组的方式
您需要从所有感兴趣的角色到行为的映射。
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;
那你可以使用跳转table:
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];
请注意,只有当您输入的字符超过几十个时,设置映射的工作才合理。
我正在上我的第一门编程课程,作业是使用 switch 语句重做之前的程序(这个)。我以为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;
}
你不应该。 switch
语句基于 ==
,而不是 <=
/ >=
/ <
/ >
.
switch
语句中的case
必须是常量表达式。您必须为每个字符制作一个单独的 case
。
有些情况下 switch
是更好的解决方案。但这不是其中一种情况。这里 if
和 else
是要走的路。
switch(s[i]) {
case '0':
...
case '9': numbers++; break;
default: {
switch(toupper(s[i])) {
case 'A':
case 'B':
...
case 'Z': letters++; break;
default: others++;
}
}
}
在这种特殊情况下,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
之前的所有内容 - 这就是您可以像这样对案例进行分组的方式
您需要从所有感兴趣的角色到行为的映射。
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;
那你可以使用跳转table:
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];
请注意,只有当您输入的字符超过几十个时,设置映射的工作才合理。