我最近一直在做很多CS50项目,当我进入实验2时,我遇到了一个障碍。这个实验对我来说很难,但我还是成功了。..有点。当我运行它时,它会显示两个提示,但无论我输入什么,它总是一个平局。
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Points assigned to each letter of the alphabet
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 word1, string word2);
int main(void)
{
int i=0, j=0;
// Get input words from both players
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Convert to uppercase
int toupper(int word1);
int toupper(int word2);
// Score both words
int score = compute_score(word1, word2);
// TODO: Print the winner
if (score == 1) {
printf("Player 1 Wins!");
}
else if (score == 2) {
printf("Player 2 Wins!");
}
else {
printf("Tie!");
}
printf("\n");
}
int compute_score(string word1, string word2)
{
int i, j, k, n1=strlen(word1), n2=strlen(word2), p1=0, p2=0;
const int alphabetSize = 26;
char letters[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
for (i=0; i<n1 + n2; i++) {
for (j=0; j<alphabetSize; j++) {
if (letters[j] == word1[i]) {
p1 += POINTS[j];
}
}
for (k=0; k<alphabetSize; k++) {
if (letters[k] == word2[i]) {
p2 += POINTS[k];
}
}
}
if (p1 > p2) {
return 1;
}
else if (p1 < p2) {
return 2;
}
else {
return 3;
}
}
2条答案
按热度按时间7nbnzgx91#
这两条线
只不过是同一个函数
toupper
的声明。如果你想把字符串转换成大写,你可以自己编写一个单独的函数,例如
在
main
中,而不是上面所示的两行函数
compute_score
中的for循环由于访问索引在
[0, n1 + n2)
范围内的字符串之外的内存,导致未定义的行为相反,编写一个单独的函数来计算字符串的得分,如
在main中你可以写
请注意,使用
char *
和const char *
来代替typedef名称string
会更好。dddzy1tm2#
下面的解决方案是使用Ada编程语言完成的。这是为了表明,选择解决问题的语言可以影响解决方案的表达方式。
分数仅基于字母,而不是输入字符串中的任何其他字符。您必须确保您没有试图累积白色、数字或标点符号的分数。