0.视频
1.循环流程
2.例程1:爱你永不变
// 例程1:爱你永远不变
#include <iostream>
int main()
{
while(2>1)
{
std::cout << "爱你又一天!" << std::endl;
}
}
爱你永不变的不变,在这个例程中,使用 “2>1”这样一个没学编程的人(比如你女朋友)也能理解和放心的方式来表达。
提醒:如果你是在本地编译运行这段程序,那么程序运行起来之后,你可能需要通过 Ctrl+C (在Windows下)等方式来强行停止一段天长地久不死不休的爱情……
3.例程2:真的爱你,一天又一天
上面的爱情有瑕疵:每天都在重复昨天的甜言蜜语,一点变化没有……
既然寻求变化,那就像前面的 “Hello World 交互版”一样,引入变量吧!
我们使用一个 int (整数)类型的变量,取名 “day”,来记录当前是相爱的第几天,然后在甜言蜜语中加入这个一天一变的元素:
// 例程2:真的爱你,一天又一天
#include <iostream>
int main()
{
int day = 1; // 相爱的天数,初始为 1
while(true) // 改用 bool 类型的字面量:true (真)
{
std::cout << "爱你第" << day << "天!" << std::endl;
day++;
}
}
变化:
- 第6行:定义了一个 day 的变量,类型是整数(int),初始为1天,一见钟情?
- 第9行:使用 day 变量;
- 第10行:通过自增操作符 ++,让 day 的值,从1到2,从2到3增长。
知识点:
- int: 即 integer 。在C/C++中表示 整数。整数即: ……-3,-2,-1,-3,0,1,2,3……这类的数。在C/C++中,两个整数做什么计算,其结果中的小数部分,都会被直接丢弃,比如 5 ÷ 2,得到 的是另一个整数:2,而不是 2.5;
- true:是 C/C++ 中,一种专用来表达逻辑真假的数据类型,称为布尔类型,对应类型名称为 bool (boolean),这种类型的字面值只有两个:true、false。true为真,false为假,没有中间值。本例中使用 true 作为循环的条件;
- 死循环:无法结束的循环,比如本例中的 while 循环;
- day++。++ 在C/C++表示自增操作符,即可以让操作数的值加1,比如day++,每执行一次,day的值就增加1。++放在操作数后面,称为 “后置自增”,对应的是“前置自增”,比如: ++day。二者区别我们以后再学习。
4.例程3:爱情的保质期有多长?
天长地久的爱情少见,多见的是保质期的爱情。
同样,一层不变的死循环操作少见,多见的是通过每次的变化,最终触发循环条件不成立,从而结束循环。
// 例程3:爱情的保质期有多长?
#include <iostream>
int main()
{
int expire; // 保质期(天数)
std::cout << "你的爱情保质期有几天?";
std::cin >> expire; // 让用户输入天数
int day = 1;
while(day <= expire) // 没有天长地久的爱情,仅当在保质期内,才进入爱的循环
{
std::cout << "爱你第" << day << "天!" << std::endl;
day++;
}
}
要点解释:
- 新引入变量,又是 int 类型,名为 expire。
- 通过 std::cin 配合 流输入操作符,实现将用户在键盘上输入的整数,赋值给 expire。
之前我们有学过配合 std::getline()函数和 std::cin 配合,实现将用户的一整行输入内容,作为名字读入,之所以使用 getline(),是因为它能读取输入中的空格——外国人姓名通是含有空格的; - 今天直接使用 流输入操作符 >> 读入整数,因为整数不能包含空格;
- <= 就是小于等于之意。假设 expire 是 100,那么在第100天,还是会输出爱的表达的;
- 千万别忘记写 day++;否则,保质期光标示,但不起作用,爱情市场监督局会找你罚款。
这段代码很可贵,它可贵就可贵在:一、支持了爱情有保质期这一普遍存在的业务特性,二、仍然将爱情的时长,交给用户自行决定。
5.例程4:爱到某一天,心就break
// 例程4:爱到某一天,心就break
#include <iostream>
int main()
{
int expire; // 保质期(天数)
std::cout << "你的爱情保质期有几天?";
std::cin >> expire; // 让用户输入天数
int day = 1;
while(day <= expire) // 没有天长地久的爱情,仅当在保质期内,才进入爱的循环
{
// “渣男”条件:
if (day % 3 == 0 && day % 13 == 0 && day % 17 == 0)
{
std::cout << "对不起,今天、突然、烦了……" << std::end;
break;
}
std::cout << "爱你第" << day << "天!" << std::endl;
day++;
}
}
核心区别就在第14行新增的渣男条件判断与操作。
表面上看这段爱情还是有保质期保障的,但其实,在循环执行层面,多了一个简化的条件分支,相比我们前面课堂学习 if/else 或 if/else if/else …,这里只有 if :
代码A;
if (条件)
{
代码B;
}
代码C;
如何条件成立,上面示例代码走的是:代码A → 代码B → 代码C。
条件不成立,走的是:代码A → 代码C ;
即:代码B 仅在条件成立时才执行。
例中的条件使用到了 C/C++ 中的 “求余”操作符。即:求余数的操作。因为day和3、13、17等操作数都是整数类型,所以如前所述,它们的除法结果中,不会带小数,但可以通过此处的求余操作符(更专业的术语是“求模”) % ,取得余数(余数当然也是整数类型),比如:
- 4 % 2 得 0 (能整除)
- 5 % 2 得 1 (不能整除)
如此,渣男条件用嘴巴描述,即:如果相爱的天数,能同时被3、13、17整数,那么老子就要走人了……
6.先别管爱情,回上班路……
不上班哪来的收入?没有收入哪来的爱情……
所以不要纠缠什么爱情保质期,什么渣男条件了……
回到上班路,基于上一节《Hello World分支版》的代码,本课的问候程序加入以下功能:
#include <iostream>
#include <string_view>
#include <string>
// 负责问候(输出)
void Hello(std::string_view XXX)
{
if (XXX == "志玲")
{
std::cout << "你好,志玲,你很美,你是站长的女神" << std::endl;
}
else if (XXX == "老板娘")
{
std::cout << "你好,财神!" << std::endl;
}
else
{
std::cout << "你好," << XXX << "!" << std::endl;
}
}
// 负责遇见(输入)
std::string Input(int i) // 用上 i
{
std::cout << "遇见的第"<< i << "同事是谁?请输入名字:";
std::string name;
std::getline(std::cin, name);
return name;
}
int main()
{
int i=1; // 遇上第几个同事了?
while(true) // 每天上班会遇到几个同事无法事先预知,所以用 “死循环”
{
std::string who = Input(i);
if (i==14 || who == "结束") // 第14个了?或 “遇见” "结束"?
{
break;
}
Hello(who);
i++; // 重要哦!!!!
}
}
如果你能完整自主地写出本课的最后例程,事实上,你哪怕是一位正在实习的大学生,你也可以在有人带的和安排的情况下,帮助一家软件企业写一些简单的业务逻辑了。比如:
业务需要:用 C++ 读入一个日志文件,循环检查,并累加其中是否有包含 “127.0.0.1” 内容的行数。
你还不懂得如何“读入一个日志文件”?哦,就相当于例中的 Input(int i) 这个函数,你不会写嘛?没关系,比如你早入职15天的另外一个实习生,他学习了《白话C++》这本书的更多课程,那就他写 Input(i),你写别的……显然,再有什么别的你不会写了。
至于如何从文件中读写,也快了,《快速感受与探索之旅》很快就会上到 “XXX 文件版” 这堂课。