You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 Scrabble题目point函数计分错误问题求助

CS50 Scrabble题目:point函数分数累加错误修复

你的代码存在两个核心问题,导致分数无法正确累加:

1. 错误使用位或运算符|判断字符匹配

你写的ply[i] == ('a'|'e'|'i'|...)完全不符合逻辑。|是位或运算符,它会将括号内所有字符的ASCII值做二进制位运算,最终得到一个单一数值,这个数值和任何输入字符的ASCII值都不相等,因此所有if/else if分支都会被跳过,直接执行else分支加10分。

正确写法应该使用逻辑或运算符||,逐个判断字符是否匹配:

if (ply[i] == 'a' || ply[i] == 'e' || ply[i] == 'i' || ply[i] == 'l' || ply[i] == 'n' || ply[i] == 'o' || ply[i] == 'r' || ply[i] == 's' || ply[i] == 't' || ply[i] == 'u')

另外,题目默认不区分大小写(比如'A'和'a'分数相同),可以先将字符转成小写,避免漏判:

#include <ctype.h> // 需要引入该头文件使用tolower函数

// 在point函数的循环内:
char c = tolower(ply[i]);
if (c == 'a' || c == 'e' || ...)

2. else语句语法错误

else后面的代码块用了圆括号(),不符合C语言语法规范,部分编译器可能勉强通过,但容易引发异常行为。应替换为花括号{}:

else
{
    score += 10;
}

修复后的完整代码

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h> // 新增,用于tolower函数

int score1 = 0;
int score2 = 0;
int point(string ply);
void compare(int pl1, int pl2);

int main(void)
{
    string ply1 = get_string("Player 1: ");
    string ply2 = get_string("Player 2: ");

    score1 = point(ply1);
    score2 = point(ply2);
    compare(score1, score2);
}

// calculate point
int point(string ply)
{
    int score = 0;

    for(int i = 0; i < strlen(ply); i++)
    {
        char c = tolower(ply[i]); // 转小写统一判断
        if(c == 'a' || c == 'e' || c == 'i' || c == 'l' || c == 'n' || c == 'o' || c == 'r' || c == 's' || c == 't' || c == 'u')
        {
            score += 1;
        }
        else if(c == 'd' || c == 'g')
        {
            score += 2;
        }
        else if(c == 'b' || c == 'c' || c == 'm' || c == 'p')
        {
            score += 3;
        }
        else if(c == 'f' || c == 'h' || c == 'v' || c == 'w' || c == 'y')
        {
            score += 4;
        }
        else if(c == 'k')
        {
            score +=5;
        }
        else if(c == 'j' || c == 'x')
        {
            score += 8;
        }
        else if(c == 'q' || c == 'z') // 补充原代码遗漏的10分字符
        {
            score += 10;
        }
    }
    return score;
}

// compare score
void compare(int pl1, int pl2)
{
    if(pl1 < pl2)
    {
        printf("Player 2 won!\n");
    }
    else if(pl1 > pl2)
    {
        printf("Player 1 won!\n"); // 修正大小写,保持统一
    }
    else
    {
        printf("tie\n");
    }
}

额外说明:原代码else分支直接加10分,但实际上只有'q'和'z'对应10分,修复后补充了这两个字符的判断,避免非字母字符错误加分。

内容的提问来源于stack exchange,提问作者Lanvo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:50:16