CS50 pset3径流

时间:2020-05-18 18:25:14

标签: c cs50

我一开始就陷入CS50 pset3径流。香港专业教育学院使用了几种外部资源,但没有任何意义。请帮助我,因为我不明白,这组设置即将退出。

以下是说明:

  • 该函数接受参数选民,等级和姓名。如果name与有效候选人的姓名匹配,则应更新全局首选项数组,以表明选民投票人将该候选人作为其等级首选项(其中0是第一优先,1是第二优先,依此类推。 )。
  • 如果成功记录了首选项,则函数应返回true;否则,返回true。否则,该函数应返回false(例如,如果name不是候选对象之一的名称)。
  • 您可以假设没有两个候选人的名字相同。

这是我的代码:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

// Max voters and candidates
#define MAX_VOTERS 100
#define MAX_CANDIDATES 9

// preferences[i][j] is jth preference for voter i
int preferences[MAX_VOTERS][MAX_CANDIDATES];

// Candidates have name, vote count, eliminated status
typedef struct
{
    string name;
    int votes;
    bool eliminated;
}
candidate;

// Array of candidates
candidate candidates[MAX_CANDIDATES];

// Numbers of voters and candidates
int voter_count;
int candidate_count;

// Function prototypes
bool vote(int voter, int rank, string name);
void tabulate(void);
bool print_winner(void);
int find_min(void);
bool is_tie(int min);
void eliminate(int min);

int main(int argc, string argv[])
{
    // Check for invalid usage
    if (argc < 2)
    {
        printf("Usage: runoff [candidate ...]\n");
        return 1;
    }

    // Populate array of candidates
    candidate_count = argc - 1;
    if (candidate_count > MAX_CANDIDATES)
    {
        printf("Maximum number of candidates is %i\n", MAX_CANDIDATES);
        return 2;
    }
    for (int i = 0; i < candidate_count; i++)
    {
        candidates[i].name = argv[i + 1];
        candidates[i].votes = 0;
        candidates[i].eliminated = false;
    }

    voter_count = get_int("Number of voters: ");
    if (voter_count > MAX_VOTERS)
    {
        printf("Maximum number of voters is %i\n", MAX_VOTERS);
        return 3;
    }

    // Keep querying for votes
    for (int i = 0; i < voter_count; i++)
    {

        // Query for each rank
        for (int j = 0; j < candidate_count; j++)
        {
            string name = get_string("Rank %i: ", j + 1);

            // Record vote, unless it's invalid
            if (!vote(i, j, name)) // if vote bool is Not true
            {
                printf("Invalid vote.\n");
                return 4;
            }
        }

        printf("\n");
    }

    // Keep holding runoffs until winner exists
    while (true)
    {
        // Calculate votes given remaining candidates
        tabulate();

        // Check if election has been won
        bool won = print_winner();
        if (won)
        {
            break;
        }

        // Eliminate last-place candidates
        int min = find_min();
        bool tie = is_tie(min);

        // If tie, everyone wins
        if (tie)
        {
            for (int i = 0; i < candidate_count; i++)
            {
                if (!candidates[i].eliminated)
                {
                    printf("%s\n", candidates[i].name);
                }
            }
            break;
        }

        // Eliminate anyone with minimum number of votes
        eliminate(min);

        // Reset vote counts back to zero
        for (int i = 0; i < candidate_count; i++)
        {
            candidates[i].votes = 0;
        }
    }
    return 0;
}

// Record preference if vote is valid
bool vote(int voter, int rank, string name)
{


    for (int i = 0; i < candidate_count; i++)
    {

        if (strcmp (name, candidates[i].name) == 0)
        {

            preferences[voter][rank]++;
            return true;

        }

    }


// TO DO
    return false;
}



1 个答案:

答案 0 :(得分:1)

您的vote函数中有一个错误可能被您忽略了。如果选民的输入是有效的候选人姓名,则您希望将候选人索引放在首选项数组中,而不仅仅是添加到该选民首选项上。请记住:vote函数只是更新选民排名的偏好,而tabulate函数实际上是汇总所有候选人选票的地方。

这是我的意思的一个例子。想象一下,有三名候选人进行决赛选举:爱丽丝,鲍勃和查理。这意味着候选人数组将在零索引中存储爱丽丝,将Bob存储为第一索引,将Charlie存储为第二索引。现在想象一下,第一选民有鲍勃(Bob)作为他们的首选候选人,查理(Charlie)是他们的第二首选候选人,爱丽丝(Alice)是他们的最后选择。根据您的功能,您的preferences[0]将存储一个包含元素{1,1,1}的数组,因为每次您说preferences[voter][rank]++;时,您只是在空的首选项数组中加1。您想在preferences[0]中拥有一个元素为{1、2、0}的数组。这是因为选民的第一选择是Bob,又名candidates[1],第二选择是Charlie,又名candidates[2],第三选择是Alice,又名candidates[0]

因此,通过遍历候选人列表,您可以通过变量i获得要添加的候选人的正确索引,因此只需将代码行更改为preferences[voter][rank] = i;

您的vote函数应如下所示:

// Record preference if vote is valid
bool vote(int voter, int rank, string name)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp(name, candidates[i].name) == 0)
        {
            preferences[voter][rank] = i;
            return true;
        }
    }
    return false;
}

PS:逐步调试50是在这类问题中使用的出色工具。

PPS:我希望您已经解决了这个问题,但是如果没有,我希望您继续学习本课程。问题集具有挑战性,但是当您完成时值得。

您好@ user13569450,如果此问题或任何答案已解决您的问题,请通过单击对勾标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为答题者和您自己赢得了一定声誉。没有义务这样做。