【问题标题】:CS50 Scrabble | Code goes wrong only with "QUESTION!" wordCS50 拼字游戏 |代码只有在“QUESTION!”时才会出错!单词
【发布时间】:2021-10-05 00:20:45
【问题描述】:

编程伙伴。希望大家都好。

我正在做 CS50 的拼字游戏练习,程序运行良好。

但是...当您键入“问题!”时或“问题?”作为第一个单词,它不再将“Q”识别为字母,因此将其设为零。

我做错了吗?

我试图在将字母从单词分配到点之后立即打印输出,似乎那里有问题,但我不知道是什么。

#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>

// Points assigned to each letter of the alphabet

int POINTS[] = {1, 1, 3, 3, 3, 3, 2, 2, 1, 1, 4, 4, 2, 2, 4, 4, 1, 1, 8, 8, 5, 5, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 8, 8, 4, 4, 10, 10, 0};
char LETTERS[] = {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '\0'};

int compute_score(string word);

int main(void)
{
    int lcounter = 0;
    int counter;
    int index1;
    int index2;
    
    // Get input words from both players
    
    string word1 = get_string("Player 1: ");
    string word2 = get_string("Player 2: ");
    
    // FIND LENGTH OF WORD STRINGS
    
    int length_word1 = strlen(word1);
    int length_word2 = strlen(word2);

    // FIND CHARS OF STRINGS IN ARRAY AND ASSIGN VALUE
    
    string cword1 = word1;
    string cword2 = word2;
    
    int word1_counter = length_word1 - 1;
    int word2_counter = length_word2 - 1;
    int w1index[word1_counter];
    int w2index[word2_counter];
    
    for (counter=0; counter < 53; counter ++)
    {
        if (cword1[word1_counter] == LETTERS[counter])
        {
            w1index[word1_counter] = counter;
            word1_counter--;
            counter = -1;
        }
        else if (word1_counter < 0)
        {
            counter = 54;
        }
        else if (counter == 52)
        {
            w1index[word1_counter] = 52;
            word1_counter--;
            counter = -1;
        }
    }
    
    for (counter=0; counter < 53; counter ++)
    {
        if (cword2[word2_counter] == LETTERS[counter])
        {
            w2index[word2_counter] = counter;
            word2_counter--;
            counter = -1;
        }
        else if (word2_counter < 0)
        {
            counter = 54;
        }
        else if (counter == 52)
        {
            w2index[word2_counter] = 52;
            word2_counter--;
            counter = -1;
        }        
    }
    
    // Score both words
    int score1;
    int score2;
    
    for (counter = 0; counter < length_word1; counter ++)
    {
        score1 = score1 + POINTS[w1index[counter]];
    }
    for (counter = 0; counter < length_word2; counter ++)
    {
        score2 = score2 + POINTS[w2index[counter]];
    }
    // TODO: Print the winner
    if (score1 > score2)
    {
        printf("Player 1 wins!");
    }
    else if (score1 < score2)
    {
        printf("Player 2 wins!");
    }
    else if (score1 == score2)
    {
        printf("Tie!");
    }
}

【问题讨论】:

  • 我想建议,如果您将其中的一些分解为更小的函数,这将更容易推理。也许 score_for_letter 将 ASCII 字符转换为表示该字母值的 int。
  • 感谢您的反馈。在了解此代码出了什么问题后,我会立即尝试。我坚持使用它,因为它似乎适用于所有其他单词,但是当我们尝试以“Q”开头并以“!”结尾的单词时或“?”,就会出现这个错误。
  • 让您的代码更易于推理可能会帮助您解决这个问题。如果您移动代码以将单个字母的数值输出到函数中,则可以确保它始终有效。然后你可以编写一个函数来获取一个单词的数值。您可以确保它始终有效。所有大问题都只是小问题的集合。

标签: c cs50


【解决方案1】:

好的,我想我理解了你的算法。

有两个错误。第一个在这里:

int word1_counter = length_word1 - 1;
int word2_counter = length_word2 - 1;
int w1index[word1_counter];
int w2index[word2_counter];

您没有为预期的大小保留足够的空间。 所以第二个循环(填充w2index 的循环)实际上会在填充w2index 的第一个成员时覆盖w1index 的最后一个成员。 将这些行更改为:

int word1_counter = length_word1 - 1;
int word2_counter = length_word2 - 1;
int w1index[word1_counter + 1];
int w2index[word2_counter + 1];

另一个错误在这里:

// Score both words
int score1;
int score2;

变量未初始化。改为:

// Score both words
int score1 = 0;
int score2 = 0;

不使用变量lcounterindex1index2。删除它们。

名称word*_counter 不是很好,因为您实际上将它们用作索引...您可以使用break 退出循环并进一步分解/简化代码。但我看到你还在开始,所以很容易过于复杂......不过没关系。这需要时间。美妙之处在于,随着经验的积累,我们总是倾向于让这些事情变得更简单!

【讨论】:

  • 非常感谢。有效。我没有注意循环容器的大小。我会读到休息。再次感谢您给我的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多