【问题标题】:histogram went in to infinite loop直方图进入无限循环
【发布时间】:2013-04-08 12:28:19
【问题描述】:

你好,我这里有这段代码

int calMode(RECORD list[], int count)
{
    int tempMode = 1;
    int i = 1, j, k;
    int current = 0;

  while ( i <= count)
  {
       k = 1;
       if (list[current].score == list[current + i].score)
       {
          k++;
          i++;
       }
       printf("%d:", list[current].score);
       for(j = 0; j <= k ; j++)
       {
            printf("*");
       }
       printf("\n");
       current = current + k;
           i++;
  } 
   return tempMode;
}

我以为代码的逻辑没问题,为什么会进入死循环?

谁能建议修复此代码的方法?并且假设在进入函数calMode之前对数据列表进行了排序,我认为for循环有问题

我编辑了代码知道我的输出是

60
66
71
71
72
75
79
82
82
82
91
size is: 12
73.50
60:**
66:*
71:*
71:*
72:*
75:*
79:*
82:*
82:*
82:*
91:* 

输出错误但不再无限循环

【问题讨论】:

  • 编辑的目标是什么。在这种情况下,循环将是无限的,但您每次都重新初始化i ...
  • 你能建议另一种编写这段代码的方法吗,我有点卡在代码的逻辑上
  • 实际上,我现在真的不知道你的代码应该做什么
  • 它只假设打印出一个直方图,其中分数列表及其出现次数表示为星号,例如,如果我们有 60 和 60,那么代码将输出 60:**跨度>
  • 我认为最简单的方法是做两个循环。第一个迭代列表并创建另一个将包含每个值的计数。然后第二个循环迭代先前创建的列表以显示直方图。

标签: c structure histogram


【解决方案1】:
 if (list[current].score == list[i].score)
 {
     k++;
     i++;
 }

如果这个测试是错误的,i 将永远不会增加,这是无限循环。

【讨论】:

  • 等待如果该测试错误然后程序将退出 if 语句并继续打印出当前索引
  • @user1763658 是的,但那又怎样?它仍然不会增加i,因此循环不会向前移动,因此下一次迭代将永远完全相同。如果这发生在k = 0 的第一次迭代中,那么你就卡住了。
  • 是的。这是正确的。然后将处理for循环,current将增加k。但如果 if 测试在第一次迭代后被跳过,k 也永远不会增加。
  • 是的,你是对的,我已经编辑了代码,现在我应该增加
【解决方案2】:

修复例如

int calMode(RECORD list[], int count){
    int tempMode = 1;
    int i, k;
    int current = 0;

    while (current < count){
        printf("%d:", list[current].score);
        for(k=0; (i=current + k) < count ; ++k){
            if(list[current].score == list[i].score)
                printf("*");
            else 
                break;
        }
        printf("\n");
        current = current + k;
    } 
   return tempMode;
}

【讨论】:

    【解决方案3】:

    根据您的代码,如果第 0 元素和第 1 元素的分数不相等,它将进入无限循环。我认为一些增量条件也应该在 if 语句之外。 [我不知道你的逻辑,这只是一个猜测]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多