CS50 Tideman - 打印获胜者适合我,但我有点难闻

问题描述 投票:0回答:2

我的程序中一切正常,如果您仍在尝试弄清楚如何使其工作,您可能不应该阅读剧透。

我找到了一种找到选举获胜者的方法,我遍历锁定的二维数组中每个候选人的列,如果其中一个值为真,那么我改变候选人,因为这不是图表的来源(一个箭头指向他)

这就是我在代码中编写的方式:

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 的检查

c cs50
2个回答
1
投票

只需使用

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;
}

0
投票

您想连续尝试每一个

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
。否则,执行循环回到外循环的顶部。

© www.soinside.com 2019 - 2024. All rights reserved.