持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
前言
CS50x 是哈佛大学推出的一门知名公开课,本课程是一门计算机科学的导论课程,适合于对计算机科学感兴趣的任何人学习,不需要任何基础。通过学习本课程有助于对计算机科学的体系建立一个基本的概念,其学习内容如下:
Plurality
本文为 Week3 课后题 Plurality 的题解,Plurality 是我们平时最常使用的投票排名系统,也被称为“得票最多者当选”或者”赢家通吃“的方法,就是每个选民只能投票给一个候选人,在选举结束时,获得最多选票的候选人会成为选举的胜利者,用函数写出来就是这样:
首先定义好候选人最大值,结构体,实际数量以及数组:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// 候选人的最大值
#define MAX 9
typedef struct
{
string name;
int votes;
} candidate;
candidate candidates[MAX];
int candidate_count;
bool vote(string name);
void print_winner(void);
复制代码
得到命令行输入,检查每个人的投票结果,决出赢家:
int main(int argc, string argv[])
{
if (argc < 2)
{
printf("Usage: plurality [candidate ...]\n");
return 1;
}
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: ");
// 检查所有人的投票结果
for (int i = 0; i < voter_count; i++)
{
string name = get_string("Vote: ");
if (!vote(name))
{
printf("Invalid vote.\n");
}
}
// 展示赢家
print_winner();
}
复制代码
查看投票结果是否合理:
bool vote(string name)
{
// TODO
for (int i = 0; i < candidate_count; i++)
{
if (strcmp(candidates[i].name, name) == 0)
{
candidates[i].votes++;
return true;
}
}
return false;
}
复制代码
决出胜者,找到得票最多的候选人,然后打印输出:
void print_winner(void)
{
// TODO
int max = 0;
for (int i = 1; i < candidate_count; i++)
{
if (candidates[max].votes < candidates[i].votes)
{
max = i;
}
}
for (int i = 0; i < candidate_count; i++)
{
if (candidates[max].votes == candidates[i].votes)
{
printf("%s\n", candidates[i].name);
}
}
return;
}
复制代码
测试样例
$ ./plurality Alice Bob
Number of voters: 3
Vote: Alice
Vote: Bob
Vote: Alice
Alice
复制代码
$ ./plurality Alice Bob
Number of voters: 3
Vote: Alice
Vote: Charlie
Invalid vote.
Vote: Alice
Alice
复制代码
$ ./plurality Alice Bob Charlie
Number of voters: 5
Vote: Alice
Vote: Charlie
Vote: Bob
Vote: Bob
Vote: Alice
Alice
Bob
复制代码