我一直在努力学习CS50,只是为了学习编程的基础知识。我成功地做了习题集3的复数运算,但我并不真正理解布尔运算是如何工作的。所以具体的问题是:
1)布尔结构是如何工作的?2)何时以及如何调用它?
我正在试着理解使用这个的基本方面。谢谢你的帮助。
代码如下:
#include <cs50.h>
#include <stdio.h>
#include <string.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
for (int i = 0; i < candidate_count; i++)
{
if (strcmp (name, candidates[i].name) == 0)
{
candidates[i].votes++;
return true;
}
}
return false;
}
// Print the winner (or winners) of the election
void print_winner(void)
{
// TODO
for (int i = 1; i < candidate_count; i++)
{
if (candidates[0].votes < candidates[i].votes)
candidates[0].votes = candidates[i].votes;
}
printf ("%s\n", candidates[0].name);
for (int i = 1; i < candidate_count; i++)
{
if (candidates[0].votes == candidates[i].votes)
printf ("%s\n", candidates[i].name);
}
return;
}
4条答案
按热度按时间xmakbtuz1#
在这段代码中如何调用bool?
这里您对术语有一些严重的误解。问“bool是如何被调用的”没有任何意义。让我为您澄清一些问题:
bool
是我们所说的“数据类型”。其他数据类型是int
和char
。它们定义了内存中值的含义。例如,int
是正整数和负整数,char
是字母和符号,bool
是真或假。1.函数是我们“调用”的东西。更具体地说,函数是执行特定任务的一段代码。我们“调用”函数是为了让它执行该任务。这就是为什么问“什么时候调用bool”没有意义。我们从不“调用bool”,因为
bool
是数据类型而不是函数。1.当我们声明一个函数时,我们必须提供3条信息:函数名、输入列表(或者更准确地说是每个输入的类型)以及函数结果的类型(称为“返回类型”)。当你写
bool vote(string name);
时,它声明了一个名为vote
的函数,该函数将string
作为输入,并返回bool
。混淆可能是因为我们使用
bool
作为函数定义的一部分。在上面的例子中,我们只是说调用vote()
函数的结果是true或false。考虑到这些,我们可以讨论
vote()
函数何时被调用。要弄清楚,您只需查看代码中所有出现的单词vote
。如果这样做,您将发现一行if (!vote(name))
。这就是vote()
被调用的地方。换句话说,我们告诉计算机执行vote()
函数中的代码,它返回一个true或false值,用于计算if语句的条件。当你继续学习编程时,一定要密切注意术语。像许多其他学科一样,我们有自己的词汇。为了与其他程序员交流,你需要使用正确的词汇。更重要的是,理解我们使用的词汇将帮助你更清楚地理解概念,以便你自己应用它们。
dbf7pr2w2#
bool
是一个type
,用于创建一个 boolean 变量,即一个足以进行true/false
求值的变量。因此,因为bool
不是一个函数,所以它不会被 * 调用 *。原型:
bool vote(string name);
表示函数vote()
接受string
变量作为参数,并返回bool
* 值 *(true
或false
),其中bool
类型返回的值只能是1
或0
。(TRUE
或FALSE
)bool
的这个属性使得if (!vote(name)){...}
语句成为可能。这个构造使用一个公共的 shortcut 语法来调用函数,计算返回值并决定执行流,所有这些都在一行中完成。也可以使用更详细的语法编写此代码:
其中
bool
变量 result 被赋值为函数vote()
的返回值。这也意味着,如果vote()
的返回值是true
,则比较语句(result == false)
将失败,并绕过失败消息。e4eetjau3#
在// Update vote totals中,给定一个新的投票,你应该写i〈voter_count而不是i〈candidate_count,因为如果你有3个候选人和100个投票人,你只会考虑前3个投票人,其他97个不会被考虑。所以正确的代码是与voter count而不是candidate count进行比较。谢谢。
qvsjd97n4#
现在对此进行评论可能有点晚了(并且可能与您的问题有点不相关),但是我编写了与您相同的代码,并且遇到了一个问题。
因此,根据这个代码,得票最高的候选人的名字有时会打印两次。
我认为这是因为如果候选人[i]的票数高于候选人[0],我们就给予候选人[0]以候选人[i]的值,但候选人[i]的值保持不变。例如,如果我们有3个候选人(A、B、C),其投票为在运行print_赢家函数的前半部分之后,我们的结果变为C(3票),B(1票),C(3票)。然后打印出“C”,因为它是候选人[0]的名字。然后运行print_赢家函数的剩余部分,再次打印出“C”,因为它是与候选人[0]得票相同的候选人[2]的名字。
如果我在这一点上错了,请纠正我。我也只是一个编码初学者:)。