【问题标题】:C- Function that compares two four digit number arraysC-比较两个四位数字数组的函数
【发布时间】:2020-03-22 14:00:06
【问题描述】:

我正在尝试创建一个比较两个四位数字和 返回两者之间相似数字的数量。例如,生成数字 4311,用户输入 1488, 分数应返回 2(4 和 1)。

如果是 4311 而另一个是 1147, 分数应返回三个(1、1 和 4)。我不知道为什么它没有给我正确的输出,希望你能帮忙。

int getSameDigitScore(int playerGuess, int generatedNum) {

    int score = 0;
    int i;
    int j;
    int k;
    int generatedNumArray[4];
    int playerGuessArray[4];

    // turns playerGuess into an array  
    while (playerGuess > 0 ) {
        i = 0;
        playerGuessArray[i] = playerGuess % 10;
        i++;
        playerGuess /= 10;
    }
    // turns generatedNum into an array
    while (generatedNum > 0) {
        i = 0;
        generatedNumArray[i] = generatedNum % 10;   
        i++;
        generatedNum /= 10;
    }
    // compares the two arrays  
    for (k = 3; k >= 0; k--) {

        for (j = 3; j >= 0; j--) {

            if (generatedNumArray[k] == playerGuessArray[j]) {
                score++;
                playerGuessArray[j] = 0;
                j = -5;
            }
        }
    }

    return score;
}

【问题讨论】:

  • 您能发布您当前的输出/错误消息吗?
  • j = -5 你想做什么?将playerGuessArray[j] 设置为-1 之类的值不是更好吗,因为 0 是您的用例的有效数字。

标签: c arrays for-loop while-loop


【解决方案1】:

您在生成 playerGuessArray 和 generatedNumArray 时在 while 循环内分配 i = 0。因此, playerGuess 和 generatedNumArray 数组的元素为 first digit of your number 0 0 0 。 将初始化移出循环。

【讨论】:

    【解决方案2】:
    int getSameDigitScore(int playerGuess, int generatedNum) {
    
        int score = 0;
        int i, j, k, n;
        int generatedNumArray[4];
        int playerGuessArray[4];
    
    // turns playerGuess into an array  
        i = 0; // This has been out of while loop
        while (playerGuess > 0 ) {
            playerGuessArray[i] = playerGuess % 10;
            i++;
            playerGuess /= 10;
        }
    // turns generatedNum into an array
        int n = 0; // This has been out of the while loop
        while (generatedNum > 0) {
            generatedNumArray[n] = generatedNum % 10;   
            n++;
            generatedNum /= 10;
        }
    // compares the two arrays  
        for (k = 3; k >= 0; k--) {
    
            for (j = 3; j >= 0; j--) {
    
                if (generatedNumArray[k] == playerGuessArray[j]) {
                    score++;
                    playerGuessArray[j] = 0;
                    j = -5;
            }
        }
    }
    
    return score;
    }
    
    int main() {
        int m;
    
        n = getSameDigitScore(1231, 2342);
        printf("Score is: %d\n", m);
    }
    

    您将在每次迭代中重新初始化增量变量 i,这应该移出 while 循环。随着移出上面的代码工作正常。

    【讨论】:

      【解决方案3】:

      代码存在以下问题。

      • 您正在 while 循环内初始化整数 i。这需要在每个循环的循环之前完成。

      • 您需要一个单独的数组来获得相等数字的输出。请参阅下面代码中的AnswerArray。将这个数组传递给函数并在函数内部清除这个数组也是一个很好的设计实践。

      • 在最后一个 for 循环中,您应该在获得匹配后从内部循环中中断。这是为了处理 playerGuess == 1222generatedNum = 1111 在显示的代码中这将导致 score 为 1 的情况。

      请参阅下面的最终代码以及一些测试用例。

      int getSameDigitScore(int playerGuess, int generatedNum, int *AnswerArray) {
      
          int score = 0;
          int i;
          int j;
          int k;
          int generatedNumArray[4] = {0};
          int playerGuessArray[4] = {0};
      
          memset(AnswerArray,0,4*sizeof(int));
          // turns playerGuess into an array  
          i = 0;
          while (playerGuess > 0 ) {
              playerGuessArray[i] = playerGuess % 10;
              i++;
              playerGuess /= 10;
          }
          // turns generatedNum into an array
          i = 0;
          while (generatedNum > 0) {
              generatedNumArray[i] = generatedNum % 10;   
              i++;
              generatedNum /= 10;
          }
          // compares the two arrays
          score=0;
          for (k = 3; k >= 0; k--) {
              for (j = 3; j >= 0; j--) {
                  if (generatedNumArray[k] == playerGuessArray[j]) {
                      AnswerArray[score++] = generatedNumArray[k];
                      playerGuessArray[j] = -1;
                      break;
                  }
              }
          }
      
          return score;
      }
      
      int main(void)
      {
          int AnswerArray[4],score;
      
          score = getSameDigitScore(4311,1488,AnswerArray);
          printf ("\nScore = %d \n Answer Array =  ",score);
          for (int i=0; i<score; i++)
          {
              printf ("%d ",AnswerArray[i]);
          }
      
          score = getSameDigitScore(4311,1147,AnswerArray);
          printf ("\nScore = %d \n Answer Array =  ",score);
          for (int i=0; i<score; i++)
          {
              printf ("%d ",AnswerArray[i]);
          }
      
          score = getSameDigitScore(1222,1111,AnswerArray);
          printf ("\nScore = %d \n Answer Array =  ",score);
          for (int i=0; i<score; i++)
          {
              printf ("%d ",AnswerArray[i]);
          }
      
          score = getSameDigitScore(1111,1222,AnswerArray);
          printf ("\nScore = %d \n Answer Array =  ",score);
          for (int i=0; i<score; i++)
          {
              printf ("%d ",AnswerArray[i]);
          }
      }
      

      【讨论】:

        【解决方案4】:

        您在循环内进行的初始化i=0 应该在循环外。

            while (playerGuess > 0 ) {
                i = 0;
                playerGuessArray[i] = playerGuess % 10;
                i++;
                playerGuess /= 10;
            }
        

        如果初始化在循环内部,那么,

        每次playerGuessArray[0] 的值都会更新。

        仅供参考:

        如果 playerGuess 可以在四位开头包含0 a,如0123

        比如playerGuessValue是0123,那么通过使用

        while (playerGuess > 0 ) {
                i = 0;
                playerGuessArray[i] = playerGuess % 10;
                i++;
                playerGuess /= 10;
        }
        
        

        playerGuessArray 将只包含 [1,2,3] 而不是 [0,1,2,3]

        因此,更好的解决方案是获取两个临时变量并一个一个地检查最后一位。 像这样:

        int temp1=playerGuess, temp2=GeneratedNum;
        int i=0;
        bool flag = true;
        while(flag && i < 4){
          if(temp1%10 != temp2%10){
             flag = false;
          }
         temp1 /= 10;
         temp2 /= 10;
         i++;
        }
        
        if(flag){
          score++;
        }
        
        

        仅供参考: 调试将帮助您找出这些小错误。因此,请尝试使用多个输入来调试您的代码并验证您的答案。

        这里有一些关于如何调试的参考:

        https://blog.hartleybrody.com/debugging-code-beginner/

        https://www.codementor.io/mattgoldspink/how-to-debug-code-efficiently-and-effectively-du107u9jh%60

        谢谢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-27
          • 2013-06-17
          • 1970-01-01
          • 2011-07-24
          相关资源
          最近更新 更多