轨道
/
C++
C++
/
练习
/
千层面
千层面

千层面

学习练习

简介

基础

为了开启 C++ 之旅,我们先从变量、函数调用和注释讲起。

注释

注释有两种:单行注释和多行注释。 同一行中 // 后面的所有内容都会被编译器忽略。 多行注释也叫 C 风格注释。 它们由 /* 和 */ 包起来。 夹在两者之间的内容同样会被忽略。

变量

C++ 是一门类型化语言。 所有类型都必须在编译期确定,而且通常需要你显式地写出来。 变量的类型不能改变。 一个名为 years 的整数变量可以这样声明:

int years;

声明变量时顺便初始化是个好习惯。 C++ 提供了多种初始化的写法。 用大括号的写法更符合现代 C++,但用等号的写法也很常见。

int tomatoes{80};
int potatoes = 40;
Caution

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

说明

Lucian 的女朋友正在回家的路上,而他还没做好他们的周年纪念晚餐!

在这个练习中,你要写一些代码,帮助 Lucian 参照他最爱的食谱做出一道精致的千层面。

你有四个任务,都与做千层面所花的时间有关。

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
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
C++ Exercism

准备好开始 千层面 了吗?

注册 Exercism,借助 19 个概念100 个练习 和真人导师指导,学习并掌握 C++,全部免费。