加载中...
Hello World 循环版
第1节:初学C++,应该学什么?
第2节:《白话C++》练的什么“功”?
第3节:《白话C++》练的什么“武”?
第4节:打开浏览器,线上玩转C++
第5节:逐字逐句,深入理解C++最小例程
第6节:做一个“会”犯错误的程序员
第7节:Hello World 中文版
第8节:Hello World 函数版
第9节:Hello World 交互版
第10节:Hello World 分支版
第11节:Hello World 循环版
第12节:Hello Object 生死版.上
第13节:Hello Object 生死版. 下
第14节:Hello Object 成员版
第15节:Hello Object 派生版
第16节:Hello Object 多态版
课文封面

重点学习如何使用 while 创建循环,和如何借助 break 打破循环……有破有立。

  1. 含十数个知识点:bool类型、bool字面值、定义整数、如何从控制台计入整数,整数后置自增、如何求余,逻辑“或”运算等。
  2. 含五个例程。

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 文件版” 这堂课。