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

第4章 选择结构程序与 C++ 基础知识(三)

原书第 72 页

第4章 何去何从的情况判断——选择结构程序及 C++基础知识(三)

在日常生活中,除了按部就班地处理事情以外,还可以根据实际情况处理事情,例如,若天气好,就去郊游,等等。这就是 C++ 程序结构的第二大类——选择结构程序,此外,本章还将介绍 C++ 基础知识(三)。学完本章后,读者即可熟练地使用选择结构程序了。

4.1 查询高考成绩进入哪类学校分数线的例题详解

【例 4-1】 设想设计一个查询高考成绩进入了哪类学校分数线的程序,当从键盘输入某个考生的成绩时,该程序就会根据分数将考生划分到清华或北大的录取分数线、全国重点大学的录取分数线、一般大学的录取分数线、大专的录取分数线和未录取分数线 5 种分类情况里,并显示进入了某种分类情况,试编程完成此工作。

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

人的做法如图4-1所示。图4-2是图4-1的简易流程图,读者可对二者进行比较。

Image
图4-1 查询高考成绩进入了哪类学校分数线的流程图
原书第 73 页
Image
图4-2 查询高考成绩进入了哪类学校分数线的简易流程图
  1. 对号入座写文章,头脑运行改文章程序代码如下:
Image
原书第 74 页

该题将高考成绩与多个分数段比较,从而判断考生进入了哪一类学校的分数线,对应图4-1,可知 C++中进行选择判断的句子与人的生活语言很相仿,即“如果”就是英语单词 if,“否则”就是 else。把选择判断的条件表达式(例如 $ scog \geq 850 $)放在 if 的圆括号内,若满足条件则显示“入清华、北大分数线”,否则,继续下一个分数段的判断。条件表达式 $ (scog \geq 790 \&\& scog < 850) $ 要两条同时满足,因为是判断是否在这个区间内,“&&”是逻辑与符号,意思是“而且”,依此类推,当所有情况都不满足时,显示最后一条信息。

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

(1)第一次运行结果

请输入高考成绩:

790

入全国重点大学分数线

(2)第二次运行结果

请输入高考成绩:

649.99

没有进入最低录取分数线或输入成绩错误

注意:从键盘上输入完数据后要按〈Enter〉键。

4.2 勤奋实践,总结评分

4.2.1 习题
  1. 编写某个学生社团的活动计划表,假设其中有些是按条件选择执行的方案,试用 C++ 程序实现。如下雨是 1 号方案,则当从键盘输入 1 时,就显示 1 号方案。
  1. 用C++程序实现显示读者大学生涯的计划表,假设按照不同的条件已设置了不同的计划,当在键盘上输入1号条件时,就会相应显示1号计划。

3.出几道速算题,从键盘上输入答案,若答对了,则显示答案及赞扬的语句,否则,显示鼓励的语句,试编程实现。

  1. 搭乘火车,当乘客的随身行李>20kg时,要另外收费,请自行假设一些收费条件,例如,20kg<行李重量≤30kg时,行李费=(行李重量-20)×10%(元);30kg<行李重量≤40kg时,行李费=(行李重量-20)×8%(元),等等。在运行时,从键盘上输入行李重量,即可显示出应收取的行李费,试编写程序完成该项工作。
  1. 通信公司经常有优惠送话费的活动,例如,充值500元送200元话费;充值300元送100元话费;充值100元送20元话费,等等。同样,在运行时从键盘上输入充值金额,就显示出应送的话费,试编写程序完成该项工作。

6.在一个抢答题比赛的现场,有10个队员参赛,设抢答时各队员按下的抢答键分别是他们自己的参赛号码,在抢答比赛结束时统计哪个队员抢答的次数最多,并将其显示出来,请编程实现。

  1. 有一个工厂,加工某种产品,假设产品以某标称尺寸 90mm 的偏差来划分正品、次
原书第 75 页

品和废品,要求偏差 $ \leq\pm1\% $,并按下述原则划分:偏差 $ \leq\pm0.2\% $是正品, $ \pm1\%\geq $偏差 $ \geq\pm0.2\% $是次品,偏差 $ \geq\pm1\% $是废品。操作人员从键盘输入10个产品的尺寸,按上述原则区分各档次产品,并输出显示,试编写此程序。

  1. 在商场购买商品,有时需要先称出重量,才能确定购物金额,一般是商场服务员按所购商品选中该商品的编号,然后称出重量,打印出该商品的金额标签。用计算机模仿该项工作,人工输入该商品的编号和重量,由于该商品的单价是预先存储在计算机中的,所以计算机会自动显示出该商品的编号、重量、单价及金额,请编程实现。
  1. 将 10 个学生的成绩分段(成绩需要输入),分段标准如下:

A:成绩 $ \geq90 $分。

B:90分>成绩≥80分。

C: 80分>成绩≥70分。

D:70分>成绩≥60分。

E:成绩<60分。

分别统计各成绩段的百分比,然后输出上述成绩分段的结果,试编写程序完成该项工作。

10.在全国人口普查中,要统计各年龄段的人数及其占全国人口的比例,假设按表4-1所示的5个年龄段进行统计。试编程实现。

表4-1 按年龄分段的全国人口普查表
年龄分段代号年龄(岁)人数比例(%)备 注
A年龄≤16
B16<年龄≤45
C45<年龄≤60
D60<年龄≤70
E年龄>70
4.2.2 思考题
  1. 查询某年、某月、某日是星期几,并显示输出。

提示:

1)满足下述条件之一均为闰年:年份数可被400整除;年份数可被4整除但不能被100整除。

2)闰年的天数比非闰年多一天,即闰年的2月份有29天,而非闰年的2月份有28天。

3)公元1年1月1日是星期一。

  1. 编写解一元二次方程的求根公式 $ x_{1,2}=\frac{-b\pm\sqrt{b^{2}-4ac}}{2a} $ 的程序。
4.2.3 总结评分,继续提高

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

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

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

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

4.3 C++ 基础知识(三)

在选择结构程序中,需要对何去何从的情况进行判断,这个何去何从涉及关系运算与逻辑运算的表达式;有时候还要从键盘上输入数据给计算机,这时就要用到输入语句,这些知识都是读者必须浏览清楚和细心体会的。

4.3.1 输入语句 cin

1. 在什么情况下用 cin 语句

当用键盘输入数据时,用输入语句 cin。使用 cin 语句输入数据时,一般先要有 cout 语句来提示输入什么数据。

2. 关于 cin 语句

在键盘上输入数据给对应的变量时,语句格式如下:

$$ cin>> 变量名 1[>> 变量名 2>>...>> 变量名 n]; $$

注意:没有“cin>>变量名 1[>>变量名 2>>...>>变量名 n]>>endl;" 这种格式,endl 只在 cout 语句中使用。在程序运行到 cin 语句时,计算机会等待操作者输入数据,操作者从键盘上输入数据后,按下〈Enter〉键,程序就继续往下执行。当输入多个数据时,各个数据之间用空格或〈Enter〉键分隔。

3. 如何运用 cin 语句

(1) 输入数字类的数据

【例4-2】

int a;

cin>>a;//用键盘输入整型数据给变量 a,例如,输入 39

//若加上输出语句,输出a的结果就为39

(2) 输入单个字符类的数据

【例4-3】

char b;

cin>>b;//从键盘上输入一个字符给 b,例如,输入 E,则 b 中的内容就为 E

原书第 77 页

(3) 输入大于一个字符的数据

【例4-4】

char name[12];//定义一个最多由12个字符组成的字符数组

cin>>name;//从键盘上输入一个姓名,如“张三”,则name中放的就是“张三”

(4)连续输入n个数据

【例4-5】

double x,y,z;//定义 x、y、z 均为 double 型的变量

cin>>x>>y>>z;//用 cin 语句连续给 x、y、z 赋值

4.3.2 关系运算与逻辑运算

在事物与事物之间,每一件事情中的过程与过程之间,同一过程中的步骤与步骤之间,均有相互关系,这些关系又分为相互之间的大小、高低、先后等关系。C++在处理这些关系时,用关系运算符号把相关因素联系起来,形成关系运算。此外,事物之间还具有逻辑关系,对此C++用逻辑运算符号来进行处理,从而形成逻辑运算。

1. 在什么情况下用关系运算与逻辑运算

关系运算与逻辑运算用于选择结构程序的选择条件表达式中,还用于 C++程序的第三大结构——循环语句中,作为继续循环的条件表达式,即在选择结构和循环结构程序中都要用到关系运算与逻辑运算。

2. 关于关系运算、逻辑运算与条件表达式

(1) 关系运算、逻辑运算与条件运算

对于关系运算、逻辑运算与条件运算的运算符,在表 3-7 中已经列出,此处详细列出这3类运算的用途,如表4-3所示。

表4-3中,除了逻辑非以外的关系运算、逻辑运算的语句格式均为:

[表达式1] 运算符 表达式2

逻辑非的语句格式为:

运算符 表达式

表4-3 关系运算、逻辑运算与条件运算及其用途
分 类运算符运算符名称用 途
关系运算>大于比较左边表达式是否大于右边表达式
<小于比较左边表达式是否小于右边表达式
>=大于等于比较左边表达式是否大于等于右边表达式
<=小于等于比较左边表达式是否小于等于右边表达式
==恒等于比较两边表达式是否相等
!=不等于比较两边表达式是否不相等
原书第 78 页

(续)

分 类运算符运算符名称用 途
逻辑运算!逻辑非\n含义:“除了”除了表达式情况以外的所有情况都满足,如!x 表示除了 x 以外的所有值均满足
&&逻辑与\n含义:“而且”两边表达式之间的逻辑关系是“而且”,即两边表达式的条件同时满足,如 x && y 表示不仅满足 x 而且满足 y
||逻辑或\n含义:“或者”两边表达式之间的逻辑关系是“或者”,即两边表达式的条件或者其中之一满足,或者两者均满足,如 x || y 表示或者 x 满足、或者 y 满足、或者 x、y 两者都满足
条件运算?:条件运算符用于把比较简单的 if...else 语句写成一个条件运算语句

关系运算符两边的表达式的结果必须具有相同的数据类型,而逻辑运算符两边表达式的结果可以不具有相同的数据类型,混合条件表达式(既有关系运算又有逻辑运算的条件表达式)也应符合这些规则。

注意:其中有几个运算符与数学中的符号=、≥、≤、≠意义相同,但写法不相同。

(2) 条件表达式

当将一些事物之间的关系作为条件描述时,需要用到条件表达式,然后判断条件表达式是否满足,若满足则去做某些事情,否则,去做另外一些事情。

条件表达式指用关系或逻辑运算符加表达式构成的表达式。条件表达式的运算结果(值)为布尔值,布尔值为1,表示真,即条件满足;布尔值为0,表示假,即条件不满足。

“[表达式 1] 运算符号 表达式 2” 还可以成为新的表达式,设为“表达式新 1”,利用新的表达式还可以组成关系运算或逻辑运算,其格式为:

$$ 【表达式新 1】\ 运算符 \ 表达式新 2\ 运算符 \ldots 表达式新 \ n $$

也就是说,一个表达式中可含有多个运算符和表达式。

总之,条件表达式的运算结果(值)不是真,就是假,二者必有其一。真指满足,假指不满足。实际上,读者不用去想真和假或者对应的1和0,在写提纲、画流程图、编写程序时只想满足和不满足即可。在画流程图时可以简写:满足——Y(Yes),否则(不满足)——N(No)。

3. 如何运用条件表达式

注意:条件表达式不能孤立使用,它是被用在条件判断语句或循环语句中作为选择什么的条件或者是否继续循环的条件。例如,例 4-1 的 if(scog>=850)和 if(scog>=790&&scog<850),例 5-b 的 for(i=1;i<=5;i++)和 for(j=1;j<=30-2*i;j++)等,此类应用比比皆是。

4.3.3 选择结构程序

4.3.2 节讲了关系运算与逻辑运算,它们都是要和选择结构程序或循环结构程序结合使用的。本节先介绍选择结构程序的相关知识。

1. 在什么情况下用选择结构程序

当判断一件事情何去何从时要使用选择结构程序。

【例4-6】

如果天天下雨,旅游就改期;否则,去旅游。

2. 关于选择结构程序

选择结构程序的语法格式及用途等知识点如表4-4所示。

原书第 79 页
表4-4 选择结构程序的语法格式、操作含义、用途及流程图
序号选择语句及语法格式操作含义用途流程图及备注
if(选择条件表达式) 事情 A; 后一条语句; ...如果选择条件表达式满足,做事情 A,否则,不做事情 A;接着从后一条语句往下执行只判断是否要做事情 A,如例 5-8Image
if(选择条件表达式) ```cpp 事情 A; else 事情 B; ``` 后一条语句; ...如果选择条件表达式满足,做事情 A,做完 A 后不做事情 B,跳到后一条语句处往下执行,否则,做事情 B;接着从后一条语句往下执行有两件事情要选择做,肯定要做其中一件事情,如例 4-1Image
if(选择条件表达式) ①或② 后一条语句; ...③、④两种形式是对应①、②的嵌套语句,其含义是把①或②的含义嵌套至①的事情 A 中或②的事情 A 和事情 B 中,这两种形式还可以继续在里面一层一层地嵌套在进入大事件 A 后,还要进一步选择做什么事情把①或②的流程图嵌套至①的流程图的事情 A 处即可
if(选择条件表达式) ```cpp ①或② else ①或② ``` 后一条语句; ...同上在进入大事件 A 或大事件 B 后,还要进一步选择做什么事情,如例 4-1把①或②的流程图嵌套至②的流程图的事情 A 和事情 B 处即可
switch(表达式) ```cpp { case 满足做事情 A 的代号:事情 A;break; case 满足做事情 B 的代号:事情 B;break; ... case 满足做事情 n 的代号:事情 n;break; default: 做不满足上述情况的事;(此句可不加break) } ``` 后一条语句; ...switch 语句又称为开关语句,该表达式相当于收音机的波段开关 若满足做事情 A 的代号,则转到 A,听 A 电台(做事情 A);做完事情 A 就跳出此开关语句,接着从后一条语句往下执行 若满足做事情 B 的代号,则转到 B,听 B 电台(做事情 B);做完后跳出开关语句 ... 若满足做事情 n 的代号,则转到 n,听 n 电台(做事情 n);做完后跳出开关语句 做除了 A、B、...、n 外的所有事情(可不加 break) switch 语句的结束处 接着从后一条语句往下执行 ...有两件以上的事情要选择做,判断是做其中的哪一件,如例 4-7Image
(条件表达式)?(满足条件时的表达式 1);(不满足条件时的表达式 2);实际上,这是一条 if...else 语句,如果满足条件,则执行表达式 1,否则,执行表达式 2见表 4-3同②
原书第 80 页

在表4-4中,有以下几点需要注意。

1)事情 A 和事情 B 均可以是以下几种情况之一。

① 没有语句的空语句,空语句的格式为:

//即仅以一个分号代表一条空语句

② 可以用一条语句做完的事情。

③用两条以上的语句才能做完的事情,这样的语句称为复合语句。必须用一对花括号“{ }”将复合语句括起来,C++才能一次执行完复合语句,以做完某件事情。

2)条件表达式要书写正确,并且,if 与 else 要配对,要符合逻辑,即符合事物的规律,否则,机就不随你行了。

3)break语句的含义是打断并转向,其作用是跳出某个过程。例如,执行完事情 A 后,执行 break 语句就打断(跳出)了 switch 语句,执行 switch 的后一条语句。一般情况下,在 switch 语句的每个分支末尾都要加此 break 语句,以保证在处理完 switch 语句的某个分支的事情后,就跳出 switch 语句。

4)在 switch 语句的某件事情中还可以嵌套另一个 switch 语句,也可以嵌套 if 或 if...else 语句,以及循环结构的语句或顺序结构的语句。在 if 或 if...else 语句中可以嵌套其本身,也可以嵌套 switch 语句,以及循环结构的语句或顺序结构的语句。

5)if...else 语句成对的规则为:else 与上面最靠近它的 1 个没有配对的且符合程序设计思路的 if 配对。或者,在 Visual C++ 6.0 中编写程序时,输入完 if 语句,按回车键,则光标就会自动对齐到刚才输入的 if 处,在此处输入的 else 就是与该 if 配对的。

6)只要将表4-4中的流程图模块放在整个程序的流程图中需要的位置,就是选择结构程序的流程图了(如图4-1所示),然后按此流程图写出程序,自然就是选择结构程序了。switch语句的流程图的判断框用矩形框,有一个入口,多个出口;其他流程图的判断框用菱形框,有一个入口,两个出口(Y分支和N分支),如表4-4中的各流程图所示。

3. 如何运用选择结构程序

1)当判断一个条件满足与否后只有一种选择,就运用表4-4中的①。

2)当判断一个条件满足与否后有两种选择,就运用表4-4中的②,如例4-1。

3)当需要判断多个条件满足与否时,可以运用表4-4中的③、④,如例4-1。

4)当需要从多件事情中选择某一件做时,可以运用表4-4中的⑤,如例4-7。但switch语句有时可能不能直接使用,因为有时选择条件无法用整型、字符型表达式来表示,用枚举型又不太方便,所以需要先进行一些条件等效变换,即用整型的1、2、3、4或字符型的A、B、C、D来代替原有的各种情况(就像收音机的波段开关,打到哪一档就收听哪个电台)。对于制作菜单,switch语句是很方便的,如第20章的综合设计。

如果条件等效变换较难,则可采用 if...else 语句进行处理。

注意:在表 4-4 的 switch 语句中,表达式指用整型、字符型或枚举型数据组成的表达式;满足做某事情的代号指用常量表达式表示的代号,并且这个代号必须与表达式的数据类型相同,如例 4-7 所示。

在例 4-6 中,用文字就可以表达选择结构,并且用 if...else 语句也容易编程,但用 switch 语句就行不通,当然,如果通过一些条件等效变换,还是可以的,如例 4-7。

原书第 81 页

【例4-7】如果不上课,就去图书馆;如果有作业要交,就去自习;如果有一些生活用品急需购买,就去购物;或者哪儿也不去,在宿舍休息。试用 switch 语句编程实现。

先将人的做法用简易流程图画出,如图4-3所示。

Image
图4-3 根据条件选择计划的简易流程图

此题若用 if...else 语句编程较麻烦,但 switch 语句又不能直接使用,因为这些选择条件无法用整型、字符型表达式来表示,用枚举型又不太方便,所以,要先进行一些条件等效变换,即用整型的 1、2、3、4 或字符型的 A、B、C、D 来代替 4 种情况。那么,就先显示一张条件等效变换清单,然后提示操作者输入代号,操作者按自己的情况按下对应的代号,从而进入相应的选择操作。实际上,此题是一个简单的菜单显示和操作的例子。程序如下:

//ex4-7.cpp
#include<iostream.h>
void main()
{
    int ca;
    cout<<图书馆——1<<endl;//列一张条件等效变换清单,实际上是一个菜单
    cout<<“自习——2”<<endl;
    cout<<“购物——3”<<endl;
    cout<<“休息——4”<<endl;
    cout<<“请输入对应的代号:<<endl;
    cin>>ca;//接收操作者选择的代号
    switch(ca)//开关语句根据代号进入相应的操作
    {
        case 1:cout<<“去图书馆”<<endl;break;//显示去图书馆,并跳出开关语句
        case 2:cout<<“自习”<<endl;break;
        case 3:cout<<“购物”<<endl;break;
        case 4:cout<<“休息”<<endl;break;
        default:cout<<“对不起,您输入的代号错了。”;//当非上述4种选择时,进行友好提
}
原书第 82 页

运行结果:

图书馆——1

自习——2

购物——3

休息——4

请输入对应的代号:1

去图书馆

结果正确。

4.4 C++ 基础知识(三)的亮点

  1. 输入语句 cin 的亮点

1)当用键盘输入数据时,才用输入语句cin。

  1. >>是从尖头往宽口流向 cin,即输入数据给计算机,不能用 cout 的<<符号来代替 cin 的>>符号。

3)在cin语句中,没有endl。

  1. 关系运算与逻辑运算的亮点

1)按 $ C^{++} $的格式正确使用运算符。

2)关系运算符两边表达式的结果必须具有相同的数据类型,而逻辑运算符两边表达式的结果可以不具有相同的数据类型,混合条件表达式(既有关系运算又含有逻辑运算的条件表达式)也应符合这些规则。

3)在混合条件表达式中,特别要注意 C++ 的运算次序,即先算什么后算什么。对于运算优先级低,但又需要先运算的部分,要用圆括号括起来。

4)要正确表示条件表达式。

3. 选择结构程序的亮点

1)有 if 可以没有 else,但有 else 必定有 if。要注意,它们之间该成双成对时一定要成双成对,在调试中往往错在此,所以一定要人脑跟踪运行,分析逻辑关系上是否正确,只有人搞清楚并确认了,机才会与人同行。

2)对于每种选择语句,均要注意流程图的逻辑是否正确。

3)要写对条件表达式,有时还要结合实际情况进行条件的等效变换。

4)条件运算语句实质上相当于一条选择语句,只不过是换一种方式表达而已。

5)在调试时,若搞不清楚、调不通,可以重新用人脑运行,并研究流程图和程序(均在纸上谈兵),然后再上机让C++给你裁判评分。

6)调试技巧:if 与 else 是否配对,用光标和〈Enter〉键把程序排成锯齿形即可知道。要对齐锯齿形,可借助键盘上的〈Tab〉键(往右移动语句时用此)和〈Backspace〉键(往左移动语句时用此)。

总之,要正确地运用关系与逻辑判断表达式编写选择结构程序。

← 第3章 顺序结构程序与 C++ 基础知识(二)第5章 循环结构程序与 C++ 基础知识(四) →