← 学习库 C++程序设计教程 本册目录

第5章 循环结构程序与 C++ 基础知识(四)

原书第 83 页

第5章 简化循环往复的事情——循环结构 程序及 C++ 基础知识(四)

在生活中,有很多重复的事情要做。例如,工厂中的自动控制生产线,在一段时间内,每天都在生产同一种产品;大一的学生,每个学期要上若干堂英语课;学生在上体育课时,假设要跑2000m,球场一周是400m,则需跑5圈,也就是围着球场跑一圈的动作要重复循环5次。每当碰到重复的动作、操作时,都可以把它们设计成循环结构的程序,它也是C++的三大程序结构之一。使用循环结构程序,可以把循环往复的事情简化,从而达到省时又省力、事半功倍的效果。

5.1 累计产品数量的例题详解

【例 5-1】 有一个工厂,要供应 100 件某产品给客户,为了节约,要控制生产数量既满足客户需求又不过剩。假设每天生产该产品的数量因生产人员及调试难易等因素不确定,试编写程序用计算机来进行控制。

1. 用心分析人想通,机随人行写提纲

人的做法如图5-1和图5-2所示。

Image
图 5-1 用 while 语句累计产品数量的流程图
图 5-2 用 do...while 语句累计产品数量的流程图

2. 对号入座写文章,头脑运行改文章

解法一:

循环程序有3种,此题的解法一是采用while循环语句,即先判断是否循环,再决定是否做重复动作。在while循环语句的花括号内写重复的动作,并使循环次数加1,在while后的圆括号内写继续循环的条件表达式。

注意:图5-1和图5-2的循环次数正好和产品的累计数量相同,所以,不用另外设一个循环次数的变量,用这个产品累计数量作为继续循环的条件即可。

原书第 84 页

用 “pnum++;” 模仿人累计产品数量的动作,即每生产一个产品,该累计产品数量的变量就增加 1。

首先,准备累计产品数量的房间(变量 pnum),并将其初始化为 0,即 int pnum=0;,以保证开始统计时该房间是空的(0)。

然后,循环从while(pnum<100)开始,先判断是否满足继续循环的条件(pnum<100,即产品数量小于100),若满足,则进入循环,做重复动作(累计产品数量);依此循环,直到不满足时(产品数量不小于100,即等于100时)结束循环,显示累计结果。

因为累计产品数量的语句是 pnum++;,是后增量运算,即后加 1,则有:

第1次循环结束时,pnum=0+1=1。

第2次循环结束时,pnum=1+1=2。

第99次循环结束时,pnum=98+1=99。

第100次循环结束时,pnum=99+1=100。

如果将循环条件写成 pnum<=100,则还要循环第 101 次,即多循环了 1 次,结果就错误了,所以,循环条件应为 pnum<100 才对。

注意:循环条件与控制循环次数的变量(pnum)的初始值有关,如果 pnum 的初始值等于 1,那么,循环条件又应该怎样写呢?请读者思考。

程序代码如下:

//ex5-1.cpp
#include<iostream.h>
void main()
{
    int pnum=0;//定义累计产品数量的变量,并将其初始化为0
    //(当累加变量的初始值为0时才正确)
    while(pnum<100)//当产品数量小于100时,循环累计
    {
        pnum++;//累计产品数量
    }
    cout<<"该合格产品已生产了:"<<pnum<<"件"<<endl;//显示最终累计结果
}

解法二:

本题还可以利用 do...while 循环语句编程,与 while 语句的区别是:先做重复动作,再判断是否循环,读者可对比图 5-1 和图 5-2 所示的流程图,加以体会。

程序代码如下:

//ex5-1-2.cpp
#include<iostream.h>
void main()
{
    int pnum=0;//定义累计产品数量的变量,并将其初始化为 0
    //(当累加变量的初始值为 0 时才正确)
原书第 85 页

do//无论如何,均统计第一次产品数量

{
    pnum++;//累计产品数量
} while(pnum<100);//当产品数量小于100时,循环累计,句末的分号不可少
cout<<"该合格产品已生产了:"<pnum<<"件"<endl;//显示最终累计结果
}

3. C++帮助且裁判,人定胜机凯歌扬

运行结果:

该合格产品已生产了:100件

结果正确。

此题还可用 for 循环来编程,读者可参照例 5-6 或 5.3 节的知识进行编写,还可比照 while 循环的例子进行编写。

5.2 勤奋实践,总结评分

5.2.1 习题
  1. 编程实现循环显示“热烈欢迎新同学!”和“祝你们学习愉快,天天进步!”两条标语,直到需要停止时才结束循环。
  1. 将若干组容易混淆的英语单词循环显示,每组英语单词既有英语,又有中文释意,每组信息显示一行,若干行轮流显示,每组信息的停留时间按学习程度而定,当记忆清楚了一些信息后,可更换为另一些信息。读者也可以自己设计其他的学习方案。请编程实现。
  1. 假设一个十字路口的某方向的红绿灯按这样的规律显示:绿灯亮30秒,黄灯亮3秒,红灯亮27秒,应该怎样用程序去控制?不妨用一些字符或符号分别表示绿灯、黄灯和红灯,如可以用“#”代表绿灯,用“*”代表黄灯,用“!”代表红灯等。在调试时,可以将时间调整为绿灯亮3秒、黄灯亮1秒、红灯亮2秒。

4.模仿超市优惠广告信息的循环显示(自行设计些优惠广告信息)。请编程实现。

  1. 用 C++ 程序模仿公交车上的电子告示牌,不断显示每个到站的站名。
  1. 求 $ s_{20000}=1+3+5+\cdots+39999 $ 的和,并输出显示结果,试编程实现。如果要计算其中前 n 项的和(n 根据需要确定),应该怎样编程?
  1. 编写一年的考勤统计空表,格式和项目按一般的考勤统计表确定,用 C++程序来实现。

8.有一位建筑设计人员,想丈量一块斜三角形的土地面积。设斜三角形的三条边分别为a、b、c,a、b边之间的夹角为角C,b、c边之间的夹角为角A,c、a边之间的夹角为角B。如果该建筑设计人员测量到了该斜三角形的a、b边和角C,请问你能通过三角函数及三角形的一些定理、公式帮他算出该斜三角形的面积吗?

假设他又分别测量到了 b、c 边和角 A,以及 c、a 边和角 B,请问你能通过后两次的计算结果验证出第一次的计算结果正确与否吗?请编程实现。

  1. 当新生入学、参观团光临或专家教授来讲学时,在电子荧屏上循环显示
原书第 86 页

“welcome!” 的字幕,并配上精美的花边图案,试编程实现。

  1. 大家经常会遇到求某数的多少次方的指数计算,如 $ 2^{32} $ 等,试用幂函数的展开式:

$$ \mathbf{a}^{\mathbf{x}}=\mathbf{1}+\frac{\ln\mathbf{a}}{1}\mathbf{x}+\frac{(\ln\mathbf{a})^{2}}{2!}\mathbf{x}^{2}+\frac{(\ln\mathbf{a})^{3}}{3!}\mathbf{x}^{3}+\mathbf{L}+\frac{(\ln\mathbf{a})^{\mathbf{n}}}{\mathbf{n}!}\mathbf{x}^{\mathbf{n}}+\cdots\qquad(\mathbf{a}>0,\ -\infty<\mathbf{x}<+\infty) $$

算出指数的结果,如计算 $ 2^{32} $ 等,并结合 C++ 标准函数的计算结果来比较用两种方法计算出来的误差,请编程实现。

5.2.2 思考题

1.设计一个适用于智力玩具的加减乘除运算软件,要求显示结果,并评判结果,用键盘输入控制该软件的运行或停止。

  1. 编写一道程序,要求输出 1~100 之间既不能被 2 整除,也不能被 3 整除的数,输出格式为每行 10 个数。
5.2.3 总结评分,继续提高

浏览、体验了例题、习题和思考题之后,说说自己的体会和收获,并认真总结,按表5-1给自己评判一下可以得多少分。

表5-1 总结评分表
成 绩ABCD不足的原因改进的方法备 注
C++知识完全理解和会用基本理解和会用肤浅理解和会用基本不理解和不会用
程序原创(独立编程)的比例(%)≥9080~8960~79< 60

不论得分多少,大家都要总结经验,扬长避短,不断提高,勤奋努力。

最后浏览一下本章的第4节,可以先考考自己,然后再浏览,以便使重点知识掌握得更牢固。

5.3 C++ 基础知识(四)

本节的 C++ 基础知识,包括算术运算方面的知识,几种处理循环往复事情的方法(以后称之为循环程序结构),以及不用判断就按转移命令去做事情的方法(以后称之为转向语句)。

5.3.1 算术运算(二)

1. 在什么情况下用到算术运算(二)

算术运算(二)是 3.3.3 节内容的延续,所以其用途与前述相同。同样,读者在用到算术运算(二)时,也要知道如何查找、应用。

2. 关于算术运算(二)

自增(减)、复合赋值和逗号运算操作符的操作含义如表5-2所示。

原书第 87 页
表5-2 自增(减)、复合赋值和逗号运算操作符的操作含义
操作符名称操作含义
++增量操作符每执行一次加 1
--减量操作符每执行一次减 1
++y前增量操作符y 先加 1,再将加 1 的 y 值作为整个表达式 $ ++y $ 的值(即 y 值=整个表达式 $ ++y $ 的值),如例 5-2
y++后增量操作符先将 y 值作为整个表达式 $ y++ $ 的值,再将 y 加 1 作为 y 的值(即 y 值≠整个表达式 $ y++ $ 的值,也即 y 值比整个表达式 $ y++ $ 的值大 1),如例 5-3
--y前减量操作符y 先减 1,再将减 1 的 y 值作为整个表达式 $ -y $ 的值(即 y 值=整个表达式 $ -y $ 的值)
y--后减量操作符先将 y 值作为整个表达式 $ y-- $ 的值,再将 y 减 1 作为 y 的值(即 y 值≠整个表达式 $ y-- $ 的值,也即 y 值比整个表达式 $ y-- $ 的值小 1)
+=同类的操作符加法且赋值缩写操作符和其他缩写操作符
还有:-=、*=、/=、%=加法且赋值缩写操作符和其他缩写操作符将左边的变量加上右边的数据,并将此结果又送回(赋值)给左边的变量其余缩写操作符的操作含义依此类推,如例 5-4 和例 5-5
,逗号运算符语句格式为:表达式 1,表达式 2,...,表达式 n\n按表达式 1~表达式 n 的顺序从左到右运算,最后,整个逗号表达式的值等于表达式 n 的值

注:关于前增(减)量和后增(减)量的赋值原则是,在赋值时,若变量名在运算符之前,则先赋值,否则,后赋值。

3. 如何运用算术运算(二)的操作符

【例5-2】

y=6;

x=++y;//先计算 y=y+1=6+1=7,再将 y 的值(7)赋给 x,即 x 的值为 7

cout<<"x="<<x<<endl;

cout<<"y="<<y<<endl;

运行结果:

x=7

y=7//y 值=整个表达式++y 的值(赋给 x 的值)

【例5-3】

y=6;

x=y++;//先将 y 的值(6)赋给 x,即 x 的值为 6,再计算 y=y+1=6+1=7

cout<<"x="<<x<<endl;

cout<<"y="<<y<<endl;

运行结果:

x=6

y=7// y 值比整个表达式 y++ 的值(赋给 x 的值)大 1,因为是后加 1

【例5-4】

x=2;

y=6;

x- = y; //先计算 x-y,再将 x-y 的结果赋给 x

原书第 88 页

cout<<"x="<<x<<endl;

cout<<"y="<<y<<endl;

运行结果:

x=-4

y=6//注意:y值没变

【例5-5】

x=2;

y=6;

x*=y;//先计算x*y,再将x*y的结果赋给x

cout<<"x="<<x<<endl;

cout<<"y="<<y<<endl;

运行结果:

x=12

y=6//注意:y值没变

5.3.2 几种循环结构程序

1. 在什么情况下用循环结构程序

在日常生活中,总有一些事情是重复做某个动作或多个动作。如前面所提到的围着球场跑2000m,这个跑就是重复的动作。如果把重复动作用顺序结构或选择结构的程序来写,那么,程序将会相当烦琐、相当长,致使程序不优化。首先,书写程序和输入、调试程序麻烦、易出错,且费时费力;其次,程序的可读性不好(可读性即读懂程序的难易性);再次,带来了更多的后遗症,对程序的可移植性(将该程序用到其他程序中)或维护性(维护、修改该程序)等均不利。

在 C++ 中,通常用循环结构程序来处理这些重复做的事情。也就是说,在处理事情的程序中,一有重复就采用循环结构程序。

2. 关于循环结构程序

循环结构程序如表5-3所示,表中的各种形式都用于处理重复做的事情。

表5-3 循环结构程序
序号循环语句及语法格式操作含义流程图及备注
设置循环次数的初始值while(继续循环的条件表达式){ 做重复动作 改变循环次数}后一条语句先确定循环次数的初始值A:判断是否满足继续循环的条件,若满足,则进行循环{\n 做重复动作\n 改变循环次数}回到A点;\n若不满足,则结束循环执行后一条语句,见例5-1和第20章的综合设计Image
原书第 89 页

(续)

序号循环语句及语法格式操作含义流程图及备注
设置循环次数的初始值do {做重复动作改变循环次数} while(继续循环的条件表达式);后一条语句不管三七二十一,进来首先走一轮,即做一遍重复动作,并改变循环次数,直到碰到while 才判断是否满足继续循环的条件,若满足,则继续做第二轮,依此类推,当不满足时,结束循环,执行后一条语句,见例5-1循环次数初始化做重复动作改变循环次数循环条件后一条语句
for(设置循环次数初始值的表达式1;继续循环的条件表达式2;改变循环次数的表达式3){做重复动作}后一条语句for 循环实质上是把 while 循环写在for的条件表达式中(除了“做重复动作”保留在花括号内),一一对应过去即可以理解其操作含义。同理,将3个表达式一一对应地放在while流程图中,即成为for循环的流程图了,见例5-6循环次数初始化(表达式1)循环条件(表达式2)做重复动作改变循环次数(表达式3)后一条语句

对于表5-3,要注意以下几点。

1)在 while 循环和 do...while 循环中,满足继续循环的条件均写在 while 处。

2)在 do...while 循环的 while 句末尾要加分号。

3)for 循环中的 3 条表达式之间用分号分隔。

4)要正确设置循环次数的初始值和继续循环的条件表达式,否则,程序会出现死循环现象(没完没了地循环)。

5)若结果不正确或出现了死循环,要用人脑跟踪运行循环的第1轮、第2轮和最后一轮,并记下相关的数据,从而快速找到不正确或死循环的原因,以便对症下药。

3. 如何运用循环结构程序

1)当需要先判断条件是否满足才做循环操作时,用 while 循环比较方便,如例 5-1 的解法一和第 20 章的综合设计。

2)当无论条件满足与否都做第一轮重复动作,而第二轮后的循环操作是否继续则要根据条件表达式满足与否来决定时,用 do...while 循环较方便,用 for 循环也可以,如例 5-1 的解法二。

3)当循环次数比较确定,控制循环次数的变量值也可以在循环操作中用到时,用 for 循环实现较清晰、方便,如例 5-6。

当然,对以上3种循环做适当调整,可以相互使用,还可以嵌套(即某个循环中有另外一些循环),只是要看哪一种对于编写程序更方便、程序的可读性更好一些而已,这也体现了程序的不唯一性。

在对号入座写文章时,关键在于找出重复规律,并合理利用。

原书第 90 页

【例 5-6】打印一个如图 5-3 所示的右上三角形图案,试编程实现。

(1) 用心分析人想通,机随人行写提纲

人的做法是:假设每行30格,第一副“#”在第29、30格的位置上(一副“#”由一个空格和1个“#”组成),其流程图如图5-4所示。

Image
图5-3 右上三角形的图案
图 5-4 不用循环打印右上三角形的流程图

图 5-4 所示的做法较烦琐。由图 5-3 可见,该三角形图案的每一行都由多个空格和几副“#”组成,最好采用循环结构来实现。并且,其中有这样的规律:每一行的“#”的个数正好等于行数,每一行的空格数正好等于(30-2×行数),把该想法画成流程图,如图 5-5 所示。

此题的关键:找出画这个图案的重复规律,以及重复规律与循环变量之间的关系,并合理地加以利用。

Image
图 5-5 使用循环打印右上三角形的流程图
原书第 91 页

(2)对号入座写文章,头脑运行改文章

1 )程序设计思路。

人是怎么做的,就让电脑跟着怎么做。通常,人画此图是从上至下、从左至右不断重复地画空格和“#”,当碰到有不断重复的动作时就选用循环结构程序,因此,该题选择用循环结构程序来实现。

比较常用和方便的是 for 循环语句,但此题也可用另外两种循环语句。假设用 for 语句负责画多少行,则行的任务可以完成,但每一行中又有若干个空格和“#”,因此,把上一个 for 循环语句作为外循环,在其中嵌套两个并列的内循环 for 语句,画每一行中的空格和“#”。该设计思路的流程图如图 5-5 所示。

在外循环 for 语句中,表达式 1 是初始化(如此例中的外循环变量 i=1);表达式 2 是判断循环是否结束,在此例中,因为有 5 行,所以 i≤5 就循环,否则结束;表达式 3 是改变循环变量,使循环变量的值能达到表达式 2 的循环结束条件,而不至于进入死循环状态(例如 i++),要注意这几个表达式的设置和配合。循环体是重复的动作,此例是画空格和“#”。

2 )设计程序代码。

根据图5-5、上述程序设计思路和C++的循环语句知识,即可对号入座写文章了。

//ex5-1.cpp
#include<iostream.h>
void main()
{
    int i,j,k;
    char c='';
    for(i=1;i<=5;i++)
    {
        for(j=1;j<=30-2*i;j++)
        cout<<c;
        for(k=1;k<=i;k++)
        cout<<" #";
        cout<<endl;
    }
}

思考问题:若循环变量初始值=0,则应如何修改判断表达式?

3)程序分析解释。

初始化:根据图5-5所示,需要3个整型变量作为3个循环的循环变量,分别设为i、j、k,其中,行数用i表示、空格数用j表示、“#”数用k表示。

输入只用了一句:char c=',表示把一个空格赋给字符变量 c。

处理和输出:二者结合在一起,采用双重循环 for 语句,外循环在上面已做了分析解释,那么内循环变量的初始值应如何设置呢?虽然每行的空格和“#”不等,但有规律,按照图 5-5 的做法,用循环变量 j 负责画每一行的空格,接着用循环变量 k 画每一行的“#”,i 就是行数。因为每一行都必须画一个或一个以上的空格和“#”,所以 j、k 的初始

原书第 92 页

值为 1,循环的终止条件是每一行要画的空格数和“#”数,则表达式 2 分别为 $ j \leq -30 - 2 \times i $ 和 $ k \leq i $。因为内循环每循环一次就画一个空格和一副“#”,所以要改变循环变量来继续循环,即有 $ j++ $ 和 $ k++ $。

至少要用人脑运行两次,一次是第一次循环,另一次是最后一次循环,若认为正确,则上机调试;否则,继续进行修改,直到认为正确为止。

总之,程序的编写不是唯一的,读者应尽量将其编写得完备,使其可行性、可靠性、可读性、可维护性和可移植性要好。

3)C++帮助且裁判,人定胜机凯歌扬

运行结果如图5-3所示,即结果正确。

5.3.3 几种转向语句

1. 在什么情况下用转向语句

当程序按顺序、选择和循环结构不能做完事情时,则要借助一些转向语句,把程序转到可以完成事情的步骤上去。

2. 关于转向语句

转向语句有几种,如表5-4所示。

3. 如何运用转向语句

在使用时应注意以下几点:

1)区别 continue 和 break 的作用,并能正确运用这两个语句。

2)尽量不要用 goto 语句,因为其可读性、可维护性等不好。在一般情况下,均可用其他语句代替 goto 语句。

表5-4 几种转向语句
序号转向语句及语法格式操作含义流程图及备注
... continue; ...当执行到 continue 时,只结束本次循环。继续判断是否要进入下一次循环,而不是终止整个循环,见例 5-7Image
... 在循环或开关语句中插一句 break; ... 后一条语句当执行到 break 时,终止整个循环或跳出(终止)开关语句,执行后一条语句,见例 5-7 和第 20 章的综合设计
... 语句标号:某语句 ... 在程序中加一句 goto 语句标号; ...当执行到“goto 语句标号”;时,程序转向带有此语句标号的某语句处执行,见例 5-8 的“default:goto start1”、例 19-3 的“goto in1”和第 20 章的综合设计Image

【例 5-7】试编程实现下述功能:

1)当不按下键盘的按键时,交替循环显示十八字方针“寓德于教(学),以德促教

原书第 93 页

(学),人定胜机,机随人行”和如图5-6所示的8字环。

2)当显示十八字方针时若有键按下,则一直循环显示“寓德于教(学),以德促教(学),人定胜机,机随人行”。

3)当显示8字环时若有键按下,则程序结束。

解题如下:

Image

(1)用心分析人想通,机随人行写提纲人的做法如图5-7所示。

图5-68 字环图
Image
图 5-7 交替循环显示十八字方针和 8 字环的流程图

2)对号入座写文章,头脑运行改文章编写程序如下:

//ex5-7-3.cpp
#include<iostream.h>
#include<time.h>//时间函数的头文件
#include<iomanip.h>//使用控制格式输出法要包括此文件
#include<windows.h>//system("cls")被包括在其中
#include<conio.h>//kbhit()被包括在其中

void main()
{
    int i;
    int t1, t2; //t1 是显示十八字方针的起始时间,t2 是显示 8 字环的起始时间
原书第 94 页
int key2;//接收键盘返回值的变量
char c='';//定义一个空格字符c
for(i=1;i<=65534;i++)
{
    system("cls");//清屏
    t1=clock()//CLK_TCK;//记录显示十八字方针的起始时间,并将其转换为秒
    while(clock()//CLK_TCK-t1<3)//当累计的时间减去起始时间小于3秒时,
                //继续循环
    {
        system("cls");
        cout<<"寓德于教(学),以德促教(学),人定胜机,机随人行""<<endl;
        for(int i=0;i<10000;i++)//显示延时,以防闪烁
            for(int j=0;j<100000;j++);
        }
        if(_kbhit())//判键盘函数,若显示十八字方针时有键按下,
                //即_kbhit()为非0值,则执行下一句
            continue;//结束此次for循环,即不执行此句后的for语句
            //而跳到for语句判断是否进行下次循环。
            //由于在按键之后,_kbhit()一直为非0值,
            //所以,一直按此方式运行
            //要停止程序运行,可同时按下Ctrl键和C键或关闭运行窗口,
            //若显示十八字方针时没有按下键,则执行for循环的所有语句
        t2=clock()//CLK_TCK;//记录显示8字环的起始时间,并将其转换为秒
        while(clock()//CLK_TCK-t2<1.2)//显示8字环
        {
            system("cls");
            cout<<setw(20)<<setfill(c)<<'1'<<endl;
            cout<<setw(17)<<setfill(c)<<'2'<<setw(6)<<setfill(c)<<'3'<<endl;
            cout<<setw(15)<<setfill(c)<<'4'<<setw(10)<<setfill(c)<<'5'<<endl;
            cout<<setw(17)<<setfill(c)<<'6'<<setw(6)<<setfill(c)<<'7'<<endl;
            cout<<setw(20)<<setfill(c)<<'8'<<endl;
        }
        key2=kbhit();//当显示8字环时,判断键盘是否被按下
        if(key2)//如果有键按下,则key2为非0值,执行下一句
            break;//结束for循环
}

//程序结束

运行结果同题目要求,正确。

(3) C++帮助且裁判,人定胜机凯歌扬

【例 5-8】有一个 1 分钟的智力竞猜游戏,竞猜减法计算结果的正误,即随机出减法题并给出答案,如果答案对则按 y 键,如果错则按 n 键,选择正确得 10 分,当历时达 1 分钟时,即结束游戏,显示共答了多少题,答对了多少题,总得分是多少,试编程实现。

原书第 95 页

(1)用心分析人想通,机随人行写提纲人的做法如图5-8所示。

Image
图 5-8 智力竞猜游戏的流程图

(2)对号入座写文章,头脑运行改文章编写程序如下:

//ex5-8-4.cpp
#include<iostream.h>
#include<time.h>//时间函数的头文件
#include<stdlib.h>//使用随机函数要包括此文件
#include<windows.h>//system("cls")被包括在其中
#include<conio.h>//getch()被包括在其中
void main()
{
    int pz;//答题的总数
原书第 96 页

int py;//答对题的总数

int sco;//总得分

clock_t st,nowt;//开始时间 st 和当前时间 nowt

char b='y',jieg;
int ran1;//存放随机数的结果
while(1)
{
    pz=0;//将答题的总数清 0
    py=0;//将答对题的总数清 0
    sco=0;//将总得分清 0
    st=time(NULL);//获取开始时间
    do
    {
        start1:ran1=rand()%100;//产生随机数,且将随机数模 100 后取余数
        switch(ran1)//按照随机数选择进入下述的
        //某个出题、答题、评分和记录操作
    }

        case l:system("cls");
        cout<<"68-19=59"<endl;
        cout<<"对吗?对——输入 y;错——输入 n"<endl;
        jieg=getch();//从键盘接收一个字符,不回显
        pz++;//答题总数增加1
        if(jieg=='n')//答对了进入此操作
        {
            sco+=10;//加10分
            py++;//答对题目总数增加1
        }
        break;//跳出 switch 语句

        case 2:system("cls");
            cout<<"17-13=4"<endl;
            cout<<"对吗?对——输入 y;错——输入 n"<endl;
            jieg=getch();
            pz++;
            if(jieg=='y')
            {
                sco+=10;
                py++;
            }
            break;
        case 3:system("cls");
            cout<<"2000-1896=108"<endl;
            cout<<"对吗?对——输入 y;错——输入 n"<endl;
            jieg=getch();
            pz++;
原书第 97 页
if(jieg=='n')
{
    sco+=10;
    py++;
}

break;

case 4:
    System("cls");
    cout<<"360-280=80<<endl;
    cout<<"对吗?对——输入y;错——输入n"<<endl;
    jieg=getch();
    pz++;
    if(jieg=='y')
    {
        sco+=10;
        py++;
    }
    break;

case 5:
    System("cls");
    cout<<"15-27=-12<<endl;
    cout<<"对吗?对——输入y;错——输入n"<<endl;
    jieg=getch();
    pz++;
    if(jieg=='y')
    {
        sco+=10;
        py++;
    }
    break;

case 6:
    System("cls");
    cout<<"39-12-19=9<<endl;
    cout<<"对吗?对——输入y;错——输入n"<<endl;
    jieg=getch();
    pz++;
    if(jieg=='n')
    {
        sco+=10;
        py++;
    }
    break;

case 7:
    System("cls");
    cout<<"10000-399=9601<<endl;
    cout<<"对吗?对——输入y;错——输入n"<<endl;
    jieg=getch();
    pz++;
原书第 98 页
if(jieg=='y')
{
    sco+=10;
    py++;
}

break;

case 8:system("cls");
    cout<<"21-5-32=-16"<<endl;
    cout<<"对吗?对——输入y;错——输入n"<<endl;

jieg=getch();

pz++;

if(jieg=='y')
{
    sco+=10;
    py++;
}

break;

case 9:system("cls");
    cout<<"-50+41=8"<<endl;
    cout<<"对吗?对——输入y;错——输入n"<<endl;

jieg=getch();

pz++;

if(jieg=='n')
{
    sco+=10;
    py++;
}

break;

case 10:system("cls");
    cout<<"106-64-41=0"<<endl;
    cout<<"对吗?对——输入y;错——输入n"<<endl;

jieg=getch();

pz++;

if(jieg=='n')
{
    sco+=10;
    py++;
}

break;

default:goto start1://若随机数不是1~10范围内的数字,

//则无条件转到标号为start1的语句执行

//(即 start1:ran1=rand()%10;语句)

nowt=time(NULL);//获取当前时间

原书第 99 页
}while((nowt-st)<=60); // 若当前时间减起始时间小于等于 60 秒,则 system("cls");
cout<<"游戏结束时间到。"<<endl;
cout<<"你答题的总数是:"<<pz<<endl;
cout<<"你答对题的总数是:"<<py<<endl;
cout<<"你答题的总得分是:"<<sco<<endl;
cout<<"再加油,争取更好的成绩!"<<endl;
cout<<"你还想再做游戏吗?想就请输入 y,否则输入 n"<<endl;
cin>>b;
if(b=='n')
{
    cout<<"再见!"<<endl;
    break;
}

(3)C++帮助且裁判,人定胜机凯歌扬

运行结果:

游戏结束时间到。

你答题的总数是:36

你答对题的总数是:32

你答题的总得分是:320

再加油,争取更好的成绩!

你还想再做游戏吗?想就请输入 y,否则输入 n 再见!

果正确。

结果正确。

5.4 C++ 基础知识(四)的亮点

1. 算术运算(二)的亮点

1)同前理,不必背熟表 5-2,只要学会查找,边学边记、边用边记,慢慢就会熟能生巧了。

2)注意前增(减)量和后增(减)量的运算次序及结果,以及它们的赋值原则。

3)逗号运算符就是一步一步地前进,到达终点的成果才是整个逗号表达式的结果。

4)其他方面同3.4节的3中的2)、3)两条。

  1. 几种循环结构程序的亮点

1)一有重复就采用循环结构程序。

2)正确理解和掌握 while、do...while 和 for 这 3 种类型的循环语句的操作含义和原理,在使用时,关键在于找出重复规律,并合理利用。另外,读者还要正确书写循环语句,并关注其中的要点。

原书第 100 页

3)对于3种循环,哪一种对编写程序更方便、程序的可读性更好,就选择哪一种。

3. 几种转向语句的亮点

1)当程序按顺序、选择和循环结构仍不能做完事情时,则要用到转向语句。

2)在使用时应注意:区别 continue 和 break 的作用并能正确运用;尽量不要用 goto 语句。

至此,已介绍完了 C++ 程序的三大结构,对它们的应用就像盖房子一样,可以盖别墅、楼房或四合院,关键看哪一种更合适。C++ 程序无论是现在学的面向过程的设计,还是以后学的面向对象的设计,也无论是单文件还是多文件,单函数还是多函数,其程序结构无外乎这 3 种:顺序、选择、循环,所以,读者要牢牢掌握 C++ 程序的这三大基石。

← 第4章 选择结构程序与 C++ 基础知识(三)第6章 数组 →