【问题标题】:Getting a for loop to work with negative numbers让 for 循环处理负数
【发布时间】:2016-03-09 22:16:44
【问题描述】:

编写一个循环,将每个数组元素设置为自身和下一个元素的和,除了最后一个元素保持不变。注意不要索引超出最后一个元素。前任: 初始分数:10、20、30、40 循环后得分:30、50、70、40 第一个元素是 30 或 10 + 20,第二个元素是 50 或 20 + 30,第三个元素是 70 或 30 + 40。最后一个元素保持不变。 这是一个我需要帮助的家庭作业问题。 我遇到的问题是,如果 bonusScores 为负,它对我的​​代码使用的示例是 -100、-200、-300、-400、-500。

include<stdio.h>

int main(void)
{
    const int SCORES_SIZE = 4;
    int bonusScores[SCORES_SIZE];
    int i = 0;

    bonusScores[0] = 10;
    bonusScores[1] = 20;
    bonusScores[2] = 30;
    bonusScores[3] = 40;

    /* Your solution goes here  */
    for (i = 0; i < SCORES_SIZE; i++)
    {
        if (( bonusScores[i] <= bonusScores[i +1] ) || (bonusScores[i] < bonusScores [i+1]))
        {
            bonusScores[i] = (bonusScores [i] + bonusScores[i+1]);
        }
        else
        {
            bonusScores[i] = bonusScores[i];
        }
    }
    for (i = 0; i < SCORES_SIZE; ++i)
    {
        printf("%d ", bonusScores[i]);
    }
    printf("\n");

    return 0;
}

【问题讨论】:

  • 请提供预期输出和实际输出。
  • 为什么标志很重要?为什么你的代码中有这些比较?整个算法应该是一个循环,里面有一个赋值。
  • 对于第一组它有效。像 10, 20, 30, 40 输出是 30,50,70,40。但是,当它使用 -100、-200、-300、-400、-500 时。它应该显示 -300 -500 -700 -900 -500 但我的只显示原始输入。我没有算法,因为它是只需要代码的在线教科书

标签: c arrays loops


【解决方案1】:

您通过在循环中添加 if 条件使负数成为问题。这是多余的。您只需要获取数组并对其进行转换,以便元素 i 代表原始数组中的 a[i] + a[i+1]。这不需要对标志进行任何特殊处理。

另外,请注意,在您的代码中,您指的是元素 i + 1,而这可能是超出数组边界的元素(假设为 i = 3)。当您修改代码以正确循环时,请务必避免在数组边界之外进行索引。

您可以通过在for 循环中使用适当的条件来完全避免检查。不仅i 必须小于数组的大小,而且i+1 也必须满足这个条件。

【讨论】:

    【解决方案2】:

    您应该只遍历您的数组SCORES_SIZE-1 次。在循环内部只需添加 current + next 并将其存储到您的数组中,如下所示:

    include<stdio.h>
    
    int main(void)
    {
        const int SCORES_SIZE = 4;
        int bonusScores[SCORES_SIZE];
        int i = 0;
    
        bonusScores[0] = 10;
        bonusScores[1] = 20;
        bonusScores[2] = 30;
        bonusScores[3] = 40;
    
        /* Your solution goes here  */
        for (i = 0; i < SCORES_SIZE-1; i++)
        {
    
            bonusScores[i] = (bonusScores [i] + bonusScores[i+1]);
        }
        for (i = 0; i < SCORES_SIZE; ++i)
        {
            printf("%d ", bonusScores[i]);
        }
        printf("\n");
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      作业里写着

      注意不要超出最后一个元素的索引

      但是这个循环

         for (i = 0; i < SCORES_SIZE; i++)
         {
              if (( bonusScores[i] <= bonusScores[i +1] ) || (bonusScores[i] < bonusScores [i+1]))
              {
                  bonusScores[i] = (bonusScores [i] + bonusScores[i+1]);
              }
              else
              {
                  bonusScores[i] = bonusScores[i];
              }
          }
      

      i 等于SCORES_SIZE - 1 时,尝试使用超出最后一个元素的索引

      作业中没有提到这种情况

      if (( bonusScores[i] <= bonusScores[i +1] ) || (bonusScores[i] < bonusScores [i+1]))
      

      相同
      if (( bonusScores[i] <= bonusScores[i +1] ))
      

      不清楚你为什么写这个条件。

      循环可以如下所示

      for ( i = 1; i < SCORES_SIZE; ++i )
      {
          bonusScores[i-1] += bonusScores[i];
      }
      

      这是一个演示程序

      #include <stdio.h>
      
      int main( void ) 
      {
          const int SCORES_SIZE = 4;
          int bonusScores[SCORES_SIZE];
      
          bonusScores[0] = 10;
          bonusScores[1] = 20;
          bonusScores[2] = 30;
          bonusScores[3] = 40;
      
          for ( int i = 1; i < SCORES_SIZE; ++i )
          {
              bonusScores[i-1] += bonusScores[i];
          }
      
          for ( int i = 0; i < SCORES_SIZE; ++i )
          {
              printf( "%d ", bonusScores[i] );
          }
          printf( "\n" );
      
          bonusScores[0] = -100;
          bonusScores[1] = -200;
          bonusScores[2] = -300;
          bonusScores[3] = -400;
      
          for ( int i = 1; i < SCORES_SIZE; ++i )
          {
              bonusScores[i-1] += bonusScores[i];
          }
      
          for ( int i = 0; i < SCORES_SIZE; ++i )
          {
              printf( "%d ", bonusScores[i] );
          }
          printf( "\n" );
      }    
      

      它的输出是

      30 50 70 40 
      -300 -500 -700 -400 
      

      【讨论】:

      • 感谢您的帮助。我真的不确定为什么我有一些随机的东西在那里。再次感谢你。你的解释很好地解释了我哪里出错了。
      • @pckofwolfs 完全没有。我们初学者应该互相帮助。:)
      【解决方案4】:

      嗯,两个负数加起来是一个更大的负数,所以只需继续添加数字,而无需检查它们是负数还是正数。

      您的循环应该只运行到您要更新的数字。由于您不需要更新最后一个数字,所以不要去那里。
      除此之外,我认为你很正常。

      【讨论】:

      • 我如何将它传达给代码。这是有道理的,我知道这与我的 if 语句有关,但我不知道我怎么能弄清楚直到最后一个数字才算出来?
      • 如果您知道数组的总大小,应该很容易在最后一个停止循环。
      • 本书只是生成数字并通过代码运行。在通过本书使用的第一组数字之前,我不知道这些数字是多少。
      【解决方案5】:

      也许,这就是你所期待的:

      #include <stdio.h>
      
      int main(void) {
          const int SCORES_SIZE = 4;
          int bonusScores[SCORES_SIZE];
          int i = 0;
      
          bonusScores[0] = -10;
          bonusScores[1] = -20;
          bonusScores[2] = -30;
          bonusScores[3] = -40;
      
          printf("Negative scores:\n");
          for (i = 0; i < SCORES_SIZE; i++)
          {
              if(i!=SCORES_SIZE-1)
                  bonusScores[i] = (bonusScores [i] + bonusScores[i+1]);
          }
          for (i = 0; i < SCORES_SIZE; ++i) {
            printf("%d ", bonusScores[i]);
          }
          printf("\n");
      
          bonusScores[0] = 10;
          bonusScores[1] = 20;
          bonusScores[2] = 30;
          bonusScores[3] = 40;
      
          printf("Positive scores:\n");
          for (i = 0; i < SCORES_SIZE; i++)
          {
              if(i!=SCORES_SIZE-1)
                  bonusScores[i] = (bonusScores [i] + bonusScores[i+1]);
          }
          for (i = 0; i < SCORES_SIZE; ++i) {
            printf("%d ", bonusScores[i]);
          }
      
          return 0;
      }
      

      语音控制台:

      Negative scores:
      -30 -50 -70 -40 
      Positive scores:
      30 50 70 40 
      

      【讨论】:

        【解决方案6】:
        //This is the Java version of your problem, if anyone is interested.
        public class StudentScores {
          public static void main (String [] args) {
          final int SCORES_SIZE = 4;
          int[] bonusScores = new int[SCORES_SIZE];
          int i = 0;
        
          bonusScores[0] = 10;
          bonusScores[1] = 20;
          bonusScores[2] = 30;
          bonusScores[3] = 40;
        
        for (i = 0; i < SCORES_SIZE - 1; ++i) {
            bonusScores[i] = (bonusScores[i] + bonusScores[i+1]);
            }
        
        for (i = 0; i < SCORES_SIZE; ++i) {
             System.out.print(bonusScores[i] + " ");
            }
             System.out.println();
        
          return;
            }
        }
        

        【讨论】:

          【解决方案7】:

          简单循环:

          /* Your solution goes here  */
            for (i = 0; i < bonusScores.length; ++i) 
            {
               if (i == bonusScores.length -1)
               {
                  break;
               }
               bonusScores[i] = (bonusScores[i] + bonusScores[i+1]);
            }
          
          
            for (i = 0; i < bonusScores.length; ++i) 
            {
               System.out.print(bonusScores[i] + " ");
            }
            System.out.println();
          

          【讨论】:

            【解决方案8】:
            for(i = 0; i < bonusScores.length - 1; i++)
            {
            bonusScores[i] += bonusScores[i + 1];
            }
            

            【讨论】:

            • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。
            【解决方案9】:

            这是我得到的,所有答案都是正确的:

            import java.util.Scanner;
            public class StudentScores {
            public static void main (String [] args) {
              Scanner scnr = new Scanner(System.in);
              final int SCORES_SIZE = 4;
              int[] bonusScores = new int[SCORES_SIZE];
              int i;
            
              for (i = 0; i < bonusScores.length; ++i) {
                 bonusScores[i] = scnr.nextInt();
              }
            
              for(i = 0; i < SCORES_SIZE - 1; ++i){
                    bonusScores[i] = bonusScores[i] + 
            bonusScores[i + 1];
                 }
            
              for (i = 0; i < bonusScores.length; ++i) {
                 System.out.print(bonusScores[i] + " ");
              }
            
              System.out.println();
            }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-09-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-04
              • 2011-05-19
              相关资源
              最近更新 更多