我的程序中一切正常,如果您仍在尝试弄清楚如何使其工作,您可能不应该阅读剧透。
我找到了一种找到选举获胜者的方法,我遍历锁定的二维数组中每个候选人的列,如果其中一个值为真,那么我改变候选人,因为这不是图表的来源(一个箭头指向他)
这就是我在代码中编写的方式:
void print_winner(void)
{
int i = 0;
for (int j = 0; j < candidate_count; j++)
{
if (locked[j][i] == true)
{
i++;
j = -1;
}
}
printf("%s\n", candidates[i]);
return;
}
我在将 -1 值分配给 j 时遇到了问题(因为当循环以新的 i 再次开始时,j 会自动递增,所以我必须这样做才能检查 j = 0)
有没有办法让它不那么“臭”?
我尝试使用 j = 0;但循环的下一次迭代将 j 增加到 1,跳过对 j = 0 的检查
只需使用
while
循环代替 for
并仅在需要时递增 j
。
void print_winner(void)
{
int i = 0, j = 0;
while (j < candidate_count)
{
if (locked[j][i] == true)
{
i++;
j = 0;
}
else
{
j++;
}
}
printf("%s\n", candidates[i]);
return;
}
您想连续尝试每一个
i
,直到找到一个有效的。这对我来说听起来像是一个循环。那么这样的事情怎么样:
void print_winner(void) {
int i = 0;
for (; i < candidate_count; i++) {
int j = 0;
for (; j < candidate_count && !locked[j][i]; j++) { /* empty */ }
if (j == candidate_count) {
break;
}
}
if (i < candidate_count) {
printf("%s\n", candidates[i]);
} else {
printf("error\n");
}
}
外循环运行超过
i
,如果您耗尽所有候选者而没有找到合适的候选者(可能构成数据错误),则中止。由于 i
在循环外部声明,因此当循环终止时它将保留其值。
内循环运行于
j
。同样,声明 j
是为了在循环终止时保持可访问性并保留其值。此时,我们可以通过 j
的最终值知道 locked
中被测试的任何元素是否评估为 true。如果没有,那么我们从外循环中break
。否则,执行循环回到外循环的顶部。