【问题标题】:When and how does bool get called in this code?在这段代码中何时以及如何调用 bool?
【发布时间】:2020-09-17 12:47:22
【问题描述】:

我一直在学习 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;
}

【问题讨论】:

  • bool 是一种类型(如 intfloatchar)。它只有两个值:0(假)或 1(真)。

标签: c boolean cs50


【解决方案1】:

bool 是一个 type,用于创建一个 boolean 变量,即足以用于 true/false 评估的变量。所以,因为bool 不是一个函数,它不会被调用

原型:bool vote(string name);表示函数vote()接受一个string变量作为参数,并返回一个booltruefalse)它的返回值,其中bool 类型返回的值只能是10。 (TRUEFALSEbool 的这个属性使得声明 if (!vote(name)){...} 成为可能。此构造使用通用 shortcut 语法来调用函数、评估返回值并在一行中决定执行流程。

这也可以使用更详细的语法编写:

bool result = false; //'result' is created and initialized to false

result = vote(name);//function vote() is called, and assigns its return value to result.
if(result == false)
{
     printf("Invalid vote.\n");
}  

其中bool 变量result 被分配了函数vote() 的返回值。 同样暗示,如果vote() 的返回值为true,那么比较语句(result == false) 将失败,并绕过失败消息。

【讨论】:

  • 谢谢,这很有帮助。现在开始变得更有意义了。
  • @millsware - 欢迎您。我在我的回答中发现了一个错字,并已修复它,但以防万一你读到:bool 类型只能是12 这当然是不正确的。已更正为:bool 类型只能是 10
【解决方案2】:

如何在这段代码中调用 bool?

您对这里的术语有一些严重的误解。问“如何调用 bool”没有任何意义。让我为你澄清一些:

  1. bool 就是我们所说的“数据类型”。其他数据类型为intchar。这些定义了内存中值的含义。比如int是正负整数,char是字母和符号,bool是真或假。

  2. 函数是我们“调用”的东西。更具体地说,函数是执行特定任务的一段代码。我们“调用”该函数以使其执行该任务。这就是为什么询问“何时调用 bool”是没有意义的。我们从不“调用 bool”,因为 bool 是数据类型而不是函数。

  3. 当我们声明一个函数时,我们必须提供 3 条信息:函数名称、输入列表(或更准确地说是每个输入的类型)和函数结果的类型(称为“返回类型”)。当您编写bool vote(string name); 时,这会声明一个名为vote 的函数,该函数将string 作为输入并返回bool

    混淆可能是因为我们使用bool 作为函数定义的一部分。在上面的例子中,我们只是说调用vote()函数的结果不是真就是假。

考虑到所有这些,我们可以讨论何时调用vote() 函数。要弄清楚这一点,您只需查看所有出现单词vote 的代码。如果你这样做,你会发现一行if (!vote(name))。这是调用vote() 的地方。换句话说,我们告诉计算机执行 vote() 函数中的代码,它返回一个真或假值,用于评估 if 语句的条件。

在您继续学习编程时,请务必密切注意术语。像许多其他学科一样,我们有自己的词汇。为了与其他程序员交流,您需要使用正确的词语。更重要的是,理解我们使用的词语将帮助您更清楚地理解这些概念,以便您自己应用它们。

【讨论】:

  • 谢谢,这很有帮助。现在开始变得更有意义了。
【解决方案3】:

in // 在给定新投票的情况下更新投票总数 你应该写 i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2021-09-30
    • 2017-01-14
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多