替代C中的switch语句
我在下面发布的代码是我整个程序的一部分。其余代码与此问题无关。除了使用这个长switch语句之外还有其他解决方案吗?主要目标是缩短代码。该if语句仅用于将小写字母大写。
int POINTS[] = { 1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10 };
int compute_score(string word)
{
// TODO: Compute and return a score for string
int word_length = strlen(word);
int i, sum = 0;
for (i = 0; i < word_length; i++)
{
//This if statement is used to captalise lower-case letters.
if (islower(word[i]))
{
word[i] = toupper(word[i]);
}
//This switch statement is the key in this program. It will check
//each letter of word and then modify variable sum according to it.
switch (word[i])
{
case 'A':
sum = sum + POINTS[0];
break;
case 'B':
sum = sum + POINTS[1];
break;
case 'C':
sum = sum + POINTS[2];
break;
case 'D':
sum = sum + POINTS[3];
break;
case 'E':
sum = sum + POINTS[4];
break;
case 'F':
sum = sum + POINTS[5];
break;
case 'G':
sum = sum + POINTS[6];
break;
case 'H':
sum = sum + POINTS[7];
break;
case 'I':
sum = sum + POINTS[8];
break;
case 'J':
sum = sum + POINTS[9];
break;
case 'K':
sum = sum + POINTS[10];
break;
case 'L':
sum = sum + POINTS[11];
break;
case 'M':
sum = sum + POINTS[12];
break;
case 'N':
sum = sum + POINTS[13];
break;
case 'O':
sum = sum + POINTS[14];
break;
case 'P':
sum = sum + POINTS[15];
break;
case 'Q':
sum = sum + POINTS[16];
break;
case 'R':
sum = sum + POINTS[17];
break;
case 'S':
sum = sum + POINTS[18];
break;
case 'T':
sum = sum + POINTS[19];
break;
case 'U':
sum = sum + POINTS[20];
break;
case 'V':
sum = sum + POINTS[21];
break;
case 'W':
sum = sum + POINTS[22];
break;
case 'X':
sum = sum + POINTS[23];
break;
case 'Y':
sum = sum + POINTS[24];
break;
case 'Z':
sum = sum + POINTS[25];
break;
}
}
return sum;
}
回答
我猜你想要这样的东西,只是没有费心在你的switch语句中正确设置所有索引:
if ('A' <= word[i] && word[i] <= 'Z') {
sum += POINTS[word[i] - 'A'];
}
诀窍是chars 也只是数字,因此您可以比较它们以查看字符是否为大写拉丁字母,然后减去'A'以获得POINTS数组中从 0 开始的位置。
但是请注意,这只是工作,如果你的目标系统上的字符集包含字母A,通过Z连续按字母顺序排列。目前为止,大多数系统都使用(超集)ASCII,上面的代码可以正常工作。但是,如果使用更奇特的字符集(例如 EBCDIC),您将需要不同的方法,例如查找表、哈希表或……大switch语句。