多元化-如果票数相等,如何打印出多个获胜者?

时间:2020-01-05 15:29:17

标签: c cs50

多个程序-该程序从用户那里获取输入,并打印出票数最多的候选人。我遇到两个问题,我希望print_winner在出现并列的情况下打印多个获胜者,并且在每个人都被并列时显示所有获胜者?您如何建议我这样做?

如果有多个获胜者的票数相同,您如何建议我这样做?在回答问题时,请保持简单,因为我是编程新手,但实际上并没有遇到困难的用语。

P.S,我做了作业,这只是我要添加的一项附加功能。

谢谢

#include <cs50.h>

#include <stdio.h>

#include <string.h>

#include <stdbool.h>

// Max number of candidates
#define MAX 9

// Candidates have name and vote count
typedef struct 
{
    string name;
    int votes;
}
candidate;

// Array of candidates
candidate candidates[MAX];

// Number of candidates
int candidate_count;

// Function prototypes
bool vote(string name);
void print_winner(void);

int main(int argc, string argv[]) 
{
    // Check for invalid usage
    if (argc < 2) 
    {
        printf("Usage: plurality [candidate ...]\n");
        return 1;
    }
    // Populate array of candidates
    candidate_count = argc - 1;
    if (candidate_count > MAX) 
    {
        printf("Maximum number of candidates is %i\n", MAX);
        return 2;
    }
    for (int i = 0; i < candidate_count; i++) 
    {
        candidates[i].name = argv[i + 1];
        candidates[i].votes = 0;
    }

    int voter_count = get_int("Number of voters: ");

    // Loop over all voters
    for (int i = 0; i < voter_count; i++) 
    {
        string name = get_string("Vote: ");

        // Check for invalid vote
        if (!vote(name)) 
        {
            printf("Invalid vote.\n");
        }
    }

    // Display winner of election
    print_winner();
}

// Update vote totals given a new vote
bool vote(string name) 
{
    // TODO
    bool exist = false;

    for (int i = 0; i < candidate_count; i++) 
    {
        //check if the typed in name is in the list of candidates
        if (strcmp(name, candidates[i].name) == 0) 
        {
            candidates[i].votes += 1;
            exist = true;
            break;
        }

    }

    return exist;
}

// Print the winner (or winners) of the election
void print_winner(void) 
{
    int most = candidates[0].votes;
    string winner = candidates[0].name;
    for (int i = 1; i < candidate_count; i++) 
    {
        if (most < candidates[i].votes) 
        {
            most = candidates[i].votes;
            winner = candidates[i].name;
        }
    }

    //printf("%d", most);
    printf("%s\n", winner);
    return;
}

/* Print the winner (or winners) of the election
void print_winner(void) {
  int most = candidates[0].votes;
  string winner = candidates[0].name;
  for (int i = 1; i < candidate_count; i++) {
    if (most < candidates[i].votes) {
      most = candidates[i].votes;
    }

  }
  for (int j = 0; j < candidate_count; j++) {
    if (candidates[j].votes == most) {
      winner = candidates[j].name;
      printf("%s", winner);
    }
  }
}*/

2 个答案:

答案 0 :(得分:1)

根据the spec程序必须处理“多个获胜者”,它不是“附加功能”:

如果多次选举有可能以平局结束选举 每个候选人的票数最高。那样的话 应该输出每个获奖候选人的名字,每个名字 单独的行。

考虑print_winner时需要了解的内容。您需要知道什么是“最多”的投票,因为程序当前处于循环状态。另外,您需要知道获得了如此多的选票。这将需要遍历“候选”的另一个循环,打印出每个具有“最大”的候选。

答案 1 :(得分:0)

要打印多个获奖者,您需要循环。具体来说,您可以遍历所有候选人,并打印出票数等于most的候选人。