制作千层面

概念学习C++17

简介

基础知识

C++ 学习之旅从变量、函数调用和注释开始。

注释

注释分为单行注释和多行注释。// 之后同一行中的所有内容都会被编译器忽略。多行注释也称为 C 风格注释,用 /* 和 */ 包围,二者之间的内容同样会被忽略。

变量

C++ 是有类型的语言。所有类型都必须在编译时确定,而且通常需要显式声明。变量的类型不能改变。可以像下面这样声明一个名为 years 的整数变量:

int years;

声明变量时同时初始化是良好的编程习惯。C++ 提供了多种初始化方式,其中花括号形式更符合现代 C++ 的风格,等号形式也很常见。

int tomatoes{80};
int potatoes = 40;

注意:始终初始化变量 C++ 可能允许你写出使用未初始化变量的代码,但在明确赋值之前,不能依赖它的值。为了避免先使用后赋值及由此产生的未定义行为,应当始终初始化变量。未定义行为可能使程序在此前看似正常运行后,突然在最糟糕的时刻崩溃。务必避免依赖未定义行为。

算术运算

*、+、- 等算术运算符可以组成表达式,例如 3 * 2 或 tomatoes + potatoes。

更新变量

只要保持变量的类型不变,就可以重新赋值:

tomatoes = tomatoes - 5; // tomatoes is now 75
potatoes = (32 * 2) + 11; // potatoes is now 75 as well

函数

函数具有名称、返回类型和参数列表,参数列表也可以为空。下面的 always_fortyseven 函数始终返回 47:

int always_fortyseven() {
    return 47;
}

下面是接收一个参数的 vip_fee 函数:

int vip_fee(int standard_fee) {
    /*
    vip_fee calculates the vip fee based on the standard_fee.
    */
    int vip_multi{3};
    return standard_fee * vip_multi;
}

下面的 total_fee 接收三个参数,并调用另一个函数:

int total_fee(int vips, int adults, int kids) {
    /*
    total_fee calculates the total price for a group of VIP and adult guests with kids.
    Kids get a flat discount on the standard fee.
    VIP guest fees are calculated by calling vip_fee.
    */
    int standard_fee{30};
    int kids_discount{15};

    int kids_total_fee = kids * (standard_fee - kids_discount);
    int vips_total_fee = vips * vip_fee(standard_fee);
    int adult_total_fee = adults * standard_fee;

    return vips_total_fee + adult_total_fee + kids_total_fee;
}

与某些语言不同,C++ 函数不会自动返回最后一条语句的值。需要返回值时,必须使用 return 关键字。

空白与格式

空白用于组织源代码,包括空格、制表符和换行。编译器通常忽略不影响语义的多余空白,因此可以用它们整理代码结构。恰当地使用空白有助于提高可读性。代码格式有多种规范,它们属于约定,而不是编译器强制执行的规则。

// Formatting makes it easier to find bugs

int eggs_yolks =  3;
int      yeast = 15;

int flour=500;int sugar=200;// compact, but difficult to read

任务说明

卢西安的女朋友正在回家的路上,他却还没有做好纪念日晚餐!

本练习需要编写代码,帮助卢西安按照他最喜欢的食谱制作一份精致的千层面。

你需要完成四个任务,都与千层面的制作时间有关。

1. 定义预计烘烤时间,单位为分钟

定义不接收参数的 ovenTime() 函数,返回千层面应在烤箱中烘烤多少分钟。食谱规定的预计烘烤时间是 40 分钟:

ovenTime();
// => 40

2. 计算剩余烘烤时间,单位为分钟

定义 remainingOvenTime(int actualMinutesInOven) 函数。参数表示千层面已经烘烤的分钟数。根据上一任务中的预计烘烤总时间,返回还需烘烤多少分钟。

remainingOvenTime(30);
// => 10

3. 计算准备时间,单位为分钟

定义 preparationTime(int numberOfLayers) 函数。参数表示千层面的层数。假设准备每层需要 2 分钟,返回准备这些层一共花费的分钟数。

preparationTime(2);
// => 4

4. 计算已用总时间,单位为分钟

定义 elapsedTime(int numberOfLayers, int actualMinutesInOven) 函数。第一个参数表示千层面的层数,第二个参数表示已经烘烤的分钟数。函数返回截至目前制作千层面花费的总时间,即准备时间与已经烘烤时间之和。

elapsedTime(3, 20);
// => 26
需要一点帮助?查看分步提示

提示

通用提示

  • 每条语句末尾不要忘记 ;。
  • 可以用 int myInteger = 44; 定义整数。

1. 获取烘烤时间

  • 任务说明中给出了食谱要求的烘烤时间。
  • 函数可以使用 return 2; 这样的语句返回一个值。

2. 获取准备时间

  • 通过相应参数可以获得层数。
  • 定义整数时也可以进行计算,例如 int myInteger = 3 + myOtherInteger;。

3. 计算剩余烘烤时间

  • 可以调用其他函数,并像使用变量一样使用返回值,例如 return 22 * myOtherCalculation();。

4. 计算千层面的已用总时间

  • 输出应当合并准备时间与千层面已经在烤箱中烘烤的时间。