第3章 顺序结构程序与 C++ 基础知识(二)
第3章 按部就班的事件处理——顺序结构 程序及 C++ 基础知识(二)
在浏览和体验完 C++乐园的第一站后,进入了 C++乐园的第二站。这一站的主要内容——顺序结构比较简单,就像日常生活的流水账一样,按部就班地处理就可以了,但它同时也是 C++ 的三大程序结构之一,是最基本、用得最多的程序结构,读者不可轻视。本章将介绍 C++基础知识(二),包括数据类型,如何给数据起名字,怎么进行算术运算和赋值,还有按部就班的程序结构——顺序结构。学习了本章之后,就可以用 C++处理这类按部就班的事件了。
3.1 例题详解
日常生活中,有许多事情是按部就班地处理的,此处通过两个例题来学习 C++ 对于按部就班的事件是如何处理的。实际上,第2章的处女作也是一个按部就班处理事情的简例,后面的例子也与处女作类似,只是多显示几种情况而已。
3.1.1 显示自动控制煮饭情况
【例 3-1】本例将编写自动控制煮饭系统中的显示煮饭过程状况的程序,即将煮饭过程中的如量米、洗米、煮饭及饭煮好了等状况通过计算机屏幕显示出来,供煮饭人员观察,以了解这个煮饭控制系统的内部工作情况。
1. 用心分析人想通,机随人行写提纲
还是按照“人定胜机,机随人行”的法则来编程,同时要遵循编程三部曲(以后的例题不再说明这段,但均是按此操作)。分析题意可知,人煮饭的过程为:首先是量米,然后洗米,最后煮饭,煮好饭就发出通知:饭煮好了。这是一个按顺序一步一步地进行的过程,显示这个煮饭过程的程序当然也就是按此顺序一步一步地显示煮饭状况,这类按部就班处理事件的程序,称为顺序程序,即程序是由开始的第一条语句起执行,然后从上到下,执行完一条语句再接着执行下一条语句,一直按顺序执行到程序的结尾处。
显示自动控制煮饭情况的程序就是按照上面分析的人煮饭的过程顺序显示煮饭情况,据此画出流程图,如图3-1所示。

按照人的想法和做法,从头到尾用人脑运行如图3-1所示的流程,确实能显示自动控制煮饭的情况,故可转入下一步(以后的例题不再说明这段,但均是按此操作)。
2. 对号入座写文章,头脑运行改文章
根据流程图 3-1,用 C++ 语句对号入座写文章。所谓对号入座,即把 C++ 中对应这个座位功能的语句放在这个座位上(以后的例题不再说明这段,但均是按此操作)。
其中的语句均是输出显示语句,故可按第2章所学过的cout语句写出C++文章,显示自动控制煮饭情况。源程序如下:
#include<iostream.h>
void main()
{
cout<<"现在时间:11:30"<<endl;
cout<<"正在量米"<<endl;
cout<<"量得大米1斤"<<endl;
cout<<"正在洗米"<<endl;
cout<<"洗米完成"<<endl;
cout<<"通电煮饭,约需15分钟"<<endl;
cout<<"米饭已煮好,请好好享用吧!"<<endl;
}
头脑运行改文章:这个题目比较简单,按人怎么想、怎么做的,让计算机也怎么做即可。按照顺序程序的特点,并与流程图3-1分析比照,确定可完成该流程图的功能,也符合C++的语法及规定,则可以转入下一步了(以后的例题不再说明这段,但均是按此操作)。
3. C++帮助且裁判,人定胜机凯歌扬
先按输入调试程序的三部曲(输入源程序—编译—连接)来操作(以后的例题不再说明这段,但均是按此操作),如果有错误,C++裁判会出示黄牌警告或指出致命性的错误,那就进入调试修改程序的过程。因为这个程序都是一系列的cout语句,如果有错,也是敲错字符、代号等引起的,所以,可以与头脑运行过的程序详细对照检查、更正,则一般就没有错误了,C++裁判就会判得分:100分,即在输出窗口显示出:0 error(s),0 warning(s),这样就可以运行了。
运行结果:
现在时间:11:30
正在量米
量得大米1斤
正在洗米
洗米完成
通电煮饭,约需15分钟
米饭已煮好,请好好享用吧!
结果正确。
3.1.2 计算斜三角形的边长
下面看看 C++ 是如何在科学计算中发挥作用的。
【例 3-2】有一个斜三角形,已知它的两条边长 b、c,以及 b、c 两条边之间的夹角 A,例如:b=7.2cm,c=5.8cm,A=40°,则用余弦定理的公式: $ a=\sqrt{b^{2}+c^{2}-2bc\cos A} $ 可以求出另外一条边 a 的长度。请编程实现,并变换 b、c 和 A 的值,观察、分析并比较结果。
1. 用心分析人想通,机随人行写提纲
这个题目很简单,是一个求解计算公式的值的问题,可采用顺序结构,人的做法用流程图表示出来,如图3-2所示。

2. 对号入座写文章,头脑运行改文章
对应流程图,分析如下。
(1) 输入
此题是输入已知数,这些已知数输入给谁?就像你送纪念品一样,总有个人接收,这个人就是 C++ 中的变量或常量,这个人是哪个人,总有个名字,对应的就是 C++ 中的变量名或常量名。此题就是有一些已知量,按题意分别给这些人(已知量)起名字为 b、c、A。日常生活中会将数据区分为整数、小数,等等。C++也像日常生活一样,把所有数据都分门别类后,再拿来使用。例如,C++ 的常用数据类型有:整型——整数、浮点型——有效数字少一些的小数和双精度型——有效数字多一些的小数等。对号入座时,小数应采用浮点型还是双精度型,此处不用太多考虑,暂且定为浮点型。浮点型的代号(关键字)是 float,则有 float b; float c; float A;。然后,送纪念品给这些变量。怎么送?即怎么输入已知数?对照这个输入功能的座位去 C++ 中找有输入功能的语句,暂且先找到赋值语句,赋值语句就是将右边的值送(赋)给左边的变量或表达式,那就用这种赋值语句来送纪念品吧。如把纪念品 7.2 送给 b 这个人(变量),然后,把这条语句放在输入已知数的位置,其他的两条语句也这样处理,就可以了。则有:
$$ b=7.2; $$
$$ c=5.8; $$
$$ \mathrm{A}=40^{\circ}; $$
最后这句不能这样写,因为按 C++ 的规定,凡是角度均要化为弧度进行计算,那就写成: $ \text{A} = 40^\circ \times \frac{\pi}{180^\circ} $;这样写也不行,一是 C++ 中的角度(右上角的°)不用写出;二是乘
法写为“*”,一定不能省略;三是除号写为“/”。于是写成A = 40 * π/180,还不行,因为C++不知道π是多少,还是算不出A。大家知道,π是常数,在C++中把常数(程序运行中不变的数)称为常量,常量一经说明(定义),在程序运行中就不能改变了,于是写成π=3.14159;还是不行,怎么没完没了的不行呢?C++就是这样,必须遵守它的规定。因为键盘上没有π这个字符,所以要给它起个名字,一般不论取常量名还是变量名,都取接近于日常生活意义的英文单词(可为一部分)或汉语拼音(也可为一部分),目的是见名知义,这样对于程序的可读性、可维护性均好。那就给π取名为pi,即有:
const double pi=3.14159;
A=40*pi/180;
或直接代入常量:
A=40*3.14159/180;
到此,基本上输入完了,进入下一步。
(2) 处理
这一步就唱处理这部曲了,即到了计算公式: $ a = \sqrt{b^2 + c^2} - 2bc\cos A $ 这一步,先进行公式简化。有没有注意到,这条公式很长,中间若出错了,不易查找,而且若一次写出的 C++ 表达式太冗长,可读性和可维护性不太好,所以应适当选用一些中间变量,分步求解。那就加两个中间变量 d 和 g 吧,则有:
d=2*b*c*cos(A);
g=b*b+c*c-d;
a= $ \sqrt{g} $;
多么清晰明了。
再考虑如何计算, $ b^2 $ 可以写成 $ b \times b $,同样有 $ c \times c $,但 $ \cos A $ 和平方根, $ C++ $ 是如何书写的呢?找不到,但是在一般的计算器上就容易了,有对应的按键:将 $ \cos $ 或 $ \sqrt{2} $ 按下,就求解出来了。 $ C++ $ 也不逊色,同样也想了个好办法,把烦琐的查表或平方根的求解过程写成了标准函数,只要代入这个函数(就像按计算器的按键一样),结果就出来了。
还有一个很重要的问题是:C++程序均是由若干个函数构成的,其中有许多常用的、普遍的情况已由 C++的程序去解决了,在 C/C++标准库函数中可找到,所以,只要适用于人的做法,能完成流程图的功能,就可以用 C/C++的标准函数去解决问题,这样不只省时、省力、不易出错,且可读性、可维护性好。
那怎么去找 C++的标准函数呢?有很多办法,如本书的附录有常用的 C/C++标准函数、Visual C++ 6.0 的帮助软件和 C/C++标准函数手册(均是函数原型,即函数的声明)等。试试看,还真找到了,有一种 C++标准指数函数,其功能是计算 $ x^y $ 的值,把 $ a = \sqrt{g} $ 写成 $ a = g^{1/2} $ 就与 $ x^y $ 对上号了, $ x^y $ 的函数原型是:double pow(double x, double y);,这个描述中的第一个单词 double 是说明该函数的结果值是双精度型,第二个单词 pow 是该函数的函数名,括号里是该函数的形式参数(简称形参),此处有两个形参 x 和 y,且这两个形参的数据类型也是双精度型的。
调用 C++ 标准函数时,要做以下几项工作。
1)在计算公式或调用处写出:
函数名([若干个实际参数])
千万不要加上数据类型的关键字(例如 double),此题的程序中调用指数函数的语句为:a=pow(g,1.0/2);,若干个实际参数(简称实参)的加入与否视函数原型(函数的声明 double pow(double x,double y);)而定,因为在调用函数时,把实参传递给相应的形参,所以,实参要与形参一一对应,即个数对应,数据类型对应,位置对应。此例形参为两个,所以,实参也为两个(g 和 1.0/2),且实参也应为 double 型,底数 g 作为 x,指数 1.0/2 作为 y。接收计算结果的变量 a(赋值号左边的 a)的数据类型还应与函数结果值的数据类型相同。调用时将“函数名([若干个实参])”放置在计算公式或输出语句中。
2)由于这些 C/C++标准函数的原型均是放置在某些头文件中声明的,所以要包括相应的头文件才能使用被这个头文件声明的函数,例如,程序中的第二行:#include
3)还要检查一下初始化的这些变量是否为函数原型中相应的数据类型,如果不是,请更正。检查初始设计的数据类型,发现确实不对,于是将 b、c 的数据类型改为双精度型 double。
此处只是学会使用 C/C++ 标准函数,关于函数,在后续章节中会详细讲到。
最后,整个等式右边算出来的结果值送给谁?如果是用来显示,那么就写成“cout<<pow(g,1.0/2);”,但如果要将这个结果给计算机保存起来,就要在计算机中找个变量,那就再加个变量名,什么数据类型呢?自然是双精度型 double 了,因为这个纪念品是双精度型 double 的,于是又添加一句 double a;同样,中间变量 d 和 g 也有此类处理。
同理,还找到了求解余弦函数的值的 C++ 标准函数:double cos(double x);,计算 cos(x) 的值,x 为弧度值,结果也是双精度型的,则 A 的数据类型也要改为双精度型 double。
到此处理完了。
(3)该引吭高歌了一一输出
读者通过前面两道例题,应该已学会输出了吧,本例的输出语句为:
cout<<"a="<<a<<"cm<<endl;
程序代码如下:
//c3-2.cpp
#include<iostream.h>
#include<math.h>//pow 函数在此头文件中
void main()
{
const double pi=3.14159;
double b;
double c;
double A;
double d; //中间变量
double g; //中间变量
double a;
b=7.2;
}
c=5.8;
A=40*pi/180;
d=2*b*c*cos(A);
g=b*b+c*c-d;
a=pow(g,1.0/2);
cout<<a="<<a<<"cm<<endl;
该程序能实现流程图的功能,则进入下一步。
- C++帮助且裁判,人定胜机凯歌扬
上机实验记录如表3-1所示。
| 出错现象 | 出错原因 | 解决办法 |
| 'cos': undeclared identifier 'pow' : undeclared identifier | 没加#include<math.h> | 加此句更正了此错 |
| 结果为1,不对 | pow(x,y)中的 y 为 1/2,因为分子和分母均为整型,不能将 int 2 转换成 double 型,所以 1/2 取整是 0,任何数的零次方=1,结果永远为 1 | 将 y 改为 1.0/2 更正了此错 |
运行结果:
a=4.6368cm
结果正确。
3.2 勤奋实践,总结评分
3.2.1 习题
- 请打印输出一张常用电话号码及其联系人名(或单位名称)的备忘录,先编写出程序,再让计算机为你代劳。
2.请编写一个打印输出某学生的成绩单的程序,成绩单的格式如表3-2所示,表中的信息自定。
| 序 号 | 学 号 | 姓 名 | 高 数 | 物 理 | 英 语 | 备 注 |
- 请编写一个求某次考试全班的平均分的程序。
- 请编写一个求解一元一次方程的程序,方程自定。
- 请编写一封家信给你亲爱的父母。
- 为了学习上的方便,编写一道程序,把本学期的课程表打印出来。
- 有一条旅游路线,请用 C++ 程序画出,该线路也请你自行设计。
- 请用 C++ 编写一道程序,进行一个简单的顺序游戏。
- 请编写一个教室座位表,行及列及学生姓名自定。
- 请从你学过的数学或物理计算公式中挑选一个,用 C++ 编写程序,让计算机自动计算出结果。计算公式在你会编写程序的范围内选。例如:已知三角形的三条边,如何求得该三角形的面积。
3.2.2 思考题
- 假设学号是由两位数字字符组成,且按从小到大的顺序排列,则最后一位学生的学号即本班的人数,现想通过学号统计全校学生的人数,如何实现呢?
2.请编写计算房间面积的程序,房间呈长方形,要求用赋值语句或初始化方式输入长和宽。
3.2.3 总结评分,继续提高
浏览体验了例题、习题和思考题之后,说说自己的体会和收获,并认真总结,按表3-3给自己评判一下可以得多少分。
| 成 绩 | A | B | C | D | 不足的原因 | 改进的方法 | 备 注 |
| C++知识 | 完全理解和会用 | 基本理解和会用 | 肤浅理解和会用 | 基本不理解和不会用 | |||
| 程序原创(独立编程)的比例(%) | ≥90 | 80~89 | 60~79 | <60 |
不论得分多少,大家都会有或多或少的成功,都要好好总结经验,扬长避短,继续勤奋努力。
最后浏览一下本章的第4节,可以先考考自己,然后再浏览,以便使重点知识掌握得更牢固。
3.3 C++ 基础知识(二)
前面提到 C++ 语言是高级算法语言,是接近人的生活的语言,则 C++ 基本可以直接运用数学公式来描述算法并进行运算。运算肯定就要有数据(包括数字和文字等信息),C++ 将大千世界的数据进行了分类,并且给这些数据起名字,以方便在程序中使用这些数据,所以应该了解 C++ 如何将数据分类,如何给数据起名,如何引入运算符,如何进行运算等知识。此外,本节还将介绍按顺序执行的程序结构的知识。
3.3.1 数据类型
先从 C++ 对数据的分类说起。
1. 在什么情况下用到数据类型
凡是用到数据(包括数字和文字等信息)时,就要把这些数据归属到某种数据类型中,
先定义这些数据是属于哪种数据类型的,然后才能使用这些数据。例如,日常生活中进行人口统计,会统计出男性多少人,女性多少人,人数一般用整型数字来表示,这个整型数字就是数据类型中的一种。同样,C++中凡是要用到数据时,都要先把它归到C++的某个数据类型中。例如,整型(int):1、70、900;浮点型:3.14159;字符型:‘9’;字符串型:“男性”,等等。
2. 关于数据类型
C++的数据类型分为基本数据类型和非基本数据类型。C++的基本数据类型既包含数字计算中的数据(例如,3+2=5),也包括文字信息(例如,‘m’)。C++的数据类型如表3-4所示。
| 数据类型 | 基本数据类型 | 整型 int |
| 字符型 char | ||
| 浮点型 float;双精度型 double | ||
| 布尔型 bool | ||
| 非基本数据类型 | 数组 type[] | |
| 指针 type * | ||
| 结构 struct | ||
| 类 class | ||
| 枚举 enum | ||
| 联合 union | ||
| 空类型 void |
常用的基本数据类型如表3-5所示(以32位计算机为例)。下面分析常见的4种数据类型:int、float、double和char。
| 类 型 | 含 义 | 长度 (字节) | 表示数据范围 | 备 注 |
|---|---|---|---|---|
| char | 字符型 | 1 | -128 ~ 127 | |
| unsigned char | 无符号字符型 | 1 | 0 ~ 255 | |
| signed char | 有符号字符型 | 1 | -128 ~ 127 | |
| int | 整型 | 4 | -2147483648 ~ 2147483647 | |
| unsigned int | 无符号整型 | 4 | 0 ~ 4294967295 | |
| signed int | 有符号整型 | 4 | -2147483648 ~ 2147483647 | |
| short int | 短整型 | 2 | -32768 ~ 32767 | |
| unsigned short int | 无符号短整型 | 2 | 0 ~ 65535 | |
| signed short int | 有符号短整型 | 2 | -32768 ~ 32767 | |
| long int | 长整型 | 4 | -2147483648 ~ 2147483647 | |
| signed long int | 有符号长整型 | 4 | -2147483648 ~ 2147483647 | |
| unsigned long int | 无符号长整型 | 4 | 0 ~ 4294967295 | |
| float | 浮点型 | 4 | $ -3.4 \times 10^{-38} \sim 3.4 \times 10^{38} $ | 约 6 位有效位 |
| double | 双精度型 | 8 | $ -1.7 \times 10^{-308} \sim 1.7 \times 10^{308} $ | 约 15 位有效位 |
| long double | 长双精度型 | 8 | $ -3.4 \times 10^{-4932} \sim 1.1 \times 10^{38} $ | 约 15 位有效位 |
(1)整型——int
1)在什么情况下用整型:这与数学概念一样,当数据是整数时用整型。
2)关于整型:int 表示的数据范围是 $ -2147483648 \sim 2147483647 $。
3)如何用整型:当数据是在 int 表示范围内时就选用整型。
(2)浮点型——float
1)在什么情况下用浮点型:当数据有小数部分时用浮点型,但要注意:数据应在浮点型的表示范围内。
2)关于浮点型:float 表示的数据范围是 $ -3.4 \times 10^{-38} \sim 3.4 \times 10^{38} $。
3)如何用浮点型:当数据是在 float 表示范围内时就选用浮点型。
(3)双精度型——double
1)在什么情况下用双精度型:当数据是小数时用双精度型,其表示数据范围比浮点型大。
2)关于双精度型:double 表示的数据范围是 $ -1.7 \times 10^{-308} \sim 1.7 \times 10^{308} $。
(4)字符型——char
3)如何用双精度型:当数据是在 double 表示范围内时就选用双精度型。
1)在什么情况下用字符型:当数据是 C++ 字符集中的单个字符(包括文字字符和数字型字符)时用字符型。
2)关于字符型:char 表示的字符是 C++ 字符集中的任意一个单个字符,C++ 字符集是计算机键盘上所能表示的单个字符的一部分。字符集是由 26 个英文字母(大、小写)、10 个阿拉伯数字(0~9),以及其他符号(+、-、*、/、=、,,、_、:、?、\、"、'、~、|、!、#、%、&、(、)、[、]、{、}、^、<、>、空格)组成的。char 表示的数据范围是 -128~127。
3)如何用字符型:当字符数据是在 char 表示范围内时就选用字符型。例如,字符常量有 ‘x’、‘Y’、‘5’、‘!’ 等,这些字符常量是用单引号括起来的单个字符。还有一种转义字符常量,是以右斜杠加字符组成的。C++常用的转义字符如表 3-6 所示。例如,例 2-1 中使用了换行符 “\n”,例 3-4 中使用了制表符 “\t”。字符变量就是单个的可以变化的字符。
3. 如何运用数据类型
根据数据的性质和特点选用数据类型。例如,在基本数据
| 字符形式 | 功能 |
| \n | 换行 |
| \r | 回车 |
| \t | 制表 |
| \a | 响铃 |
类型中,如果数据是文字信息,就选用字符类型,如果是单个文字,则选用 char,否则选用宽字符型 w-char 或 string 等。如果是数字型的,且又是整数,那就先选整型 int,若计算机提示错误,即范围不够时,则选长整型等;若是带有小数点的数,先选用浮点型,当有效位数不够时,则选双精度型等。
总之,不必在数据选型上考虑太多,先考虑在大范围内选型(例如,先考虑数字或文字,再考虑整型或符点型,单文字还是多个文字等),若在调试程序时出错,再细细考究或具体查表3-5,调整数据类型。具体使用数据类型是在为数据起名字的过程中,下面就来讲解。
3.3.2 C++如何给数据起名字
有了数据类型,具体的数据怎么与数据类型挂上钩(联系上)呢?这是首要关心的问题,因为在程序执行的过程中就要用到具体的数据。C++是将数据的名字与数据类型挂上钩
的,那怎样给数据起名字,又怎样将二者挂上钩呢?下面将进行讲解。
1. 在什么情况下要给数据起名字
一般有数据时都要给数据起名字(除非数据不保存在计算机中,即这些数据仅使用一次),就像小孩出生后,要给他起名字,不能一辈子喊他为“喂”。
当给数据起了名字后,计算机就在它的存储器里开了一个房间,这样,就可以把数据存放在这个房间中,在需要时取出来或放回去。所以,如果不给数据起名字,计算机就不安排房间存放数据,则数据用一次就消失了,如例3-1的所有字符串数据并没有保存起来,只是用来显示一次就消失了。
2. 关于 C++ 中的数据名字——变量名及常量名
C++都把所有的数据分为两大范围。
一 种范围是程序运行期间可变化的数据,C++称此为变量。
另一种范围是程序运行期间不可变化的数据,C++称此为常量。
即数据既有变量数据,也有常量数据。在变量中有整型变量、浮点型变量、双精度变量和字符型变量等,常量也不外如此,类似的有整型常量等。
变量名和常量名都是设计编程者自己起的名字,但必须遵守 C++ 的规则,即用大小写英文字母、0~9 这 10 个阿拉伯数字和下画线起名,且以字母或下画线开头,不要与 C++ 的关键字相同(C++ 的关键字基本是由某个英语单词或某个英语单词的其中一部分组成的,如 char (字符)、if(如果)和 else(否则)等)。因为 C++ 是接近生活的语言,所以最好用接近生活实际意义的英文单词或汉语拼音给数据起名,这样,也会使程序的可读性、可维护性好。为避免与关键字相同,起名字时可以在关键字的末尾加个数字或用汉语拼音,这样就不会与关键字相同了。
例如,圆周率 $ \pi $ 用 $ \mathrm{pi} $ 作为名字,这对读懂程序及修改程序有明显的对应含义,带来了极大的方便。
起好的这些名字与上一节讲的数据类型又有什么关系呢?上一节讲到,凡在 C++中使用的数据都要归属到某个数据类型中,因为在某个数据类型中有众多的数据,若要加以区分,就要在该数据类型中给你所需要的数据起个名字,这样二者就联系上了,怎么联系?用下面的命名(定义)方法就可以了。
(1)变量命名(即定义变量)
C++给变量起名有几种格式,分别如下。
1)格式一:
数据类型的关键字 变量名:
其中,C++定义的数据类型的关键字如表3-4和表3-5所示,变量名是自己起的名字。
【例 3-3】定义一个名字叫 a 的整型变量和一个叫 c1 的字符变量。
int a;//定义了一个整型变量a
char c1; //定义了一个字符型变量 cl
起了名字后,在程序中才能用这个整型变量 a 和字符变量 cl。
2)格式二:
格式一 = 变量的初始值;
在定义变量或常量的同时给它们赋初始值称为初始化。
【例 3-4】定义一个名字叫 a 的整型变量,且 a 的初始值为 2;另外,定义一个名字叫 word1 的字符变量,并给 word1 赋初始值 68。
int a=2;
char word1=68;//赋予 ASCII 码字符集中的字符 D 的数值 68
cout<<"a="<<a<<"\t'<<"word1="<<word1<<endl;
//其中,打印出 word1 的内容是:ASCII 码为 68 的字符 D。注意:不是打印出数字 68
运行结果:
a=2 word1=D
a=2 word1=D
3)格式三:如给多个相同数据类型的变量起名,则可以写成:
数据类型的关键字若干个变量名(中间用逗号隔开);
【例 3-5】分别给 3 个双精度型的变量起名。
double dou1,dou2,dou3;
4)格式四:如给多个相同数据类型的变量起名,且赋初值,则可以写成:
数据类型的关键字 变量名 1=初始值 1, 变量名 2=初始值 2,..., 变量名 n=初始值 n;
【例 3-6】分别给 3 个双精度型的变量起名,并赋初值。
double dou1=0,dou2=3.95,dou3=645.728;
(2)常量命名
常量的命名格式是在类似于变量命名格式一(其中的变量名应为常量名)前加上const,其后赋予常量值,给常量起名字必须将常量值赋给该常量,这将在后面的赋值语句中介绍,读者先认识这种格式。
1)格式一:
const 数据类型的关键字 常量名=常量值;
【例 3-7】给圆周率起一个名字叫 $ \mathrm{pi} $ 的浮点型常量名,且赋予常量值 3.14159。
const float pi=3.14159;
2)格式二:
const 若干个常量命名格式一(中间用逗号隔开,句首只写一个 const);
【例 3-8】分别给 3 个双精度型的常量起名,并赋常量值;又分别给两个字符常量起名,并赋常量值,然后分别显示。
#include
void main()
{
const double dou1=45.02,dou2=3.14159,dou3=7256.278;
cout<<dou1<<" "<<dou2<<" "<<dou3<<endl;
const char w1=67,w2='+';
cout<<w1<<w2<<w2<<endl;
}
运行结果:
45.02 3.14159 7256.28
C++
结果正确。
请读者自行对应程序分析结果。
3. 如何运用名字
程序中一般都有数据,都要使用数据,使用数据时一般都是通过喊数据名的方式来使用的(有时也直接用数据,但该数据没保存),所以,必须先起名(先给数据起名,即先定义),还要给变量或常量一个实际的数据,然后才能喊名字(即使用数据),此即为“先定义,后使用”原则。
【例 3-9】定义一个名字叫 a 的整型变量,a 的初始值为 2,并输出显示 a 的值。
int a=2;//先定义了变量名 a,然后使用(赋了初值2给a)cout<<a;//之后又使用a,即将a的值输出显示
如果把这两句调换位置,或不要第一句,都是行不通的。
总之,在使用名字时,切记 “先定义,后使用”,绝对不能违反。
3.3.3 算术运算(一)和赋值
有了数据,就可以用算术运算符等将数据连接起来,组成一个公式、算法或操作步骤,然后就可以进行运算并处理事情了。
C++有哪些符号可以将数据连接起来,又怎样连接呢?下面将分别进行介绍。
1. 在什么情况下用到算术运算(一)和赋值语句
当 C++ 程序要对数据进行运算和操作时,会用到 C++ 的算术运算或赋值语句。
【例 3-10】请定义一个变量 a,并赋初值 9,计算 x=a+8,最后输出显示 a 和 x 的值。
int a=9;//定义 a,并赋初值 9
int x=a+8;//加法的算术运算
cout<<a<<" "<<x<<endl;//对 a 和 x 进行输出显示的操作
运行结果:
9 17
结果正确。
2. 算术运算(一)和赋值
注意:文中凡是有不完整的程序,均是例句,若要运行,则需加上其他部分的语句。
首先来看看 C++ 有哪些运算符号,再了解 C++ 怎样将运算符号与数据连接成公式或操作模式,然后看看 C++ 如何进行运算和操作。
(1) 运算符号——操作符
数学中的一些算术运算符就是 C++ 的运算操作符,除此之外,C++ 中还有其他的一些操作符,如表 3-7 所示。
| 优先级排序 | 优先级 | 操作符 | 目数 | 含义 | 结合性 |
| 最高 | 1 | () | 单目 | 圆括号\n下标\n取结构成员\n类的作用域区分符\n取结构成员\n成员指针访问运算符 | 左→右 |
| [] | |||||
| -> | |||||
| :: | |||||
| * ->* | |||||
| 2 | ! | 单目 | 逻辑非\n按位求反\n自增 1\n自减 1\n取负\n取正\n取地址\n取内容\n强制类型转换\n长度计算\n分配堆内存\n释放堆内存 | 右→左 | |
| ++ | |||||
| -- | |||||
| + | |||||
| \&\& | |||||
| * | |||||
| 3 | * | 双目 | 乘\n除\n整数取模 | 左→右 | |
| / | |||||
| % | |||||
| 4 | + | 双目 | 加\n减 | 左→右 | |
| - | |||||
| 5 | << | 双目 | 左移\n右移 | 左→右 | |
| >> | |||||
| 6 | < | 双目 | 小于\n小于等于\n大于等于大于 | 左→右 | |
| <= | |||||
| >= | |||||
| > | |||||
| 7 | == | 双目 | 恒等\n不等于 | 左→右 | |
| != | |||||
| 8 | &\& | 双目 | 按位与 | 左→右 | |
| 9 | ^ | 双目 | 按位异或 | 左→右 | |
| 10 | | | 双目 | 按位或 | 左→右 | |
| 11 | && | 双目 | 逻辑与 | 左→右 | |
| 12 | || | 双目 | 逻辑或 | 左→右 | |
| 13 | ?: | 三目 | 条件 | 右→左 |
(续)
| 优先级排序 | 优先级 | 操作符 | 目数 | 含义 | 结合性 |
| 14 | = | 双目 | 赋值 | ||
| *= | 运算并赋值 | ||||
| /= | 运算并赋值 | ||||
| %= | 运算并赋值 | ||||
| += | 运算并赋值 | ||||
| -= | 运算并赋值 | 右→左 | |||
| &= | 运算并赋值 | ||||
| ^= | 运算并赋值 | ||||
| |= | 运算并赋值 | ||||
| <<= | 运算并赋值 | ||||
| >>= | 运算并赋值 | ||||
| 最低 | 15 | , | 逗号(顺序求值) | 左→右 |
在表3-7中,需注意以下几点。
优先级——将操作符按先后操作分为不同的优先级别,先做高级的,后做低级的。
结合性——在同等优先级别的操作符中,有按从左往右结合的操作,即左→右;或从右往左结合的操作,即右→左。
目数——参与运算的操作数的个数,如双目——两个操作数。
(2) 表达式
表达式是用数据(数字或字符)、名字(变量或常量名)、操作符描述的式子,它可用于表达算术运算、关系运算、逻辑运算、条件、状况等。
例如:
$$ \mathrm{x+y-n*3/2} $$
$$ i>0 $$
都是表达式。
注意:表达式中的局部变量必须先定义,且要先赋值,才有意义,否则这些局部变量的值是计算机随机分配的数据。
全局变量和静态局部变量视需要确定是否先赋值。
这几个变量的区分在后续章节中会讲到,这里需要知道的是:要用某个变量,就必须先给它起名字(定义变量),还要有名副其实的数据,即给它赋值,这样你才能取出数据来使用。
(3) 赋值(即传值)
1)C++的赋值号“=”是将该符号右边的值赋给左边的变量或表达式,即右值赋给左值,不能左值赋给右值,这与数学中的等号不同。用赋值号“=”将变量及表达式连接起来,就是赋值。
赋值语句的书写格式为:
左值=右值:
能放在赋值号左边的表达式(左值)必须是变量,或表示变量的表达式。
能放在赋值号右边的表达式(右值)可以是所有数据,包括变量、常量和表达式,即左值可以做右值,但右值不一定能做左值。
2)赋值的作用:将右值传递给左值。例如,同时给常量、变量命名和初始化,见例3-4、例3-6、例3-7和例3-8。还可将右边的表达式的值传递给左边的变量或表达式,如
$ (m=x+y)=a+b $; 等。
(4) 算术类型转换
当不同类型的数据进行算术运算时,可能会出现一些困惑,C++首先将它们向表示范围更大的数据类型转换,然后再进行算术运算(见表3-8),例如,一位浮点型(float)数和一位整型(int)数相乘,则先将两个数据转换成双精度型(double)数,然后再做两数相乘的运算。
| 数据表示范围小 | char\n $ \downarrow $ | unsigned char\n $ \downarrow $ | |
|---|---|---|---|
| short\n $ \downarrow $ | unsigned short\n $ \downarrow $ | ||
| int\n $ \downarrow $ | unsigned int\n $ \downarrow $ | ||
| $ \downarrow $ | long int\n $ \downarrow $ | float\n $ \downarrow $ | unsigned long\n $ \downarrow $ |
| 数据表示范围大 | double | ||
| $ \downarrow $ | |||
| long double |
有时要对数据进行强制转换,强制转换的格式为:
(转换后的数据类型名)(被转换的数据或表达式)
3. 如何运用运算符号和赋值号(即如何运算和操作)
(1)运算符号——操作符的应用
下面只举一些在算术运算中不常见的例子。
1)/——除法,用整型数做除法时,其结果是取了整数,即没有小数部分了。其他同算术运算的情况。
2)%——模(整除求余数)操作。
【例3-11】请将7%4的结果输出显示。
x=7%4;//右值:7模4的余数为3,把3赋给左值x
cout<<x;
3)()——圆括号,因为圆括号的优先级是最高的,所以,要先计算圆括号里的表达式。
【例 3-12】请计算 $ x=(a+3)*b $,并输出显示结果。
x=(a+3)*b; //先计算 a+3,然后将 a+3 的结果再乘以 b,并将整个右值赋给 x
cout<<x;
【例 3-13】请计算 $ y = m/(n+6*i) $,并输出显示结果。
y=m/(n+6*i);//虽然有两个乘除运算,但按优先级从高至低,先算圆括号内的,
//即计算顺序为:6 乘 i→6 乘 i 的值加 n→m 除以(6 乘 i 的值加 n 的结果)→将整个右值赋给 y cout<<y;
4)强制类型转换
【例 3-14】请计算 t=n/i,并输出显示结果。
没加强制转换的程序:
float t;
int n,i;
n=7;
i=3;
t=n/i;
cout<<t<<endl;
加了强制转换的程序:
float t;
int n,i;
n=7;
i=3;
t=(float)n/i;
cout<<t<<endl;
没加强制转换的结果:
2
加了强制转换的结果:
2.33333
还有一些情况将在后面的章节中进行介绍。
(2)赋值语句的应用
【例 3-15】请计算 m=n+8,并输出显示结果。
m=n+8;//变量 n 加上 8,将结果赋给 m(即结果保存在变量 m 中)
cout<<m;
【例 3-16】x 是整型常量,y 是变量,计算 x=y*10,并输出显示结果。
const int x=7;//定义 x 是整型常量,其常量值是 7
x=y*10;//错误
因为 x 是常量,即在定义常量时就确定其值是不变的,而 y 是变量,y 乘 10 当然就是一个变化的数据,不能把变化的数据赋给常量;另外,常量不能作为左值,即不能放在赋值号的左边。
3.3.4 顺序结构程序
在运算和操作中,都会像人们日常做事情一样,总有个先后顺序。C++程序是按人的思路和人的做法编写出来的,则 C++程序自然也有个执行顺序的问题。C++按几种形式进行运算或操作,下面先介绍一种最简单的执行顺序——顺序结构。
顾名思义,顺序结构程序就是按部就班地、从头到尾地、一步一步地执行语句的程序。
1. 在什么情况下用到顺序结构程序
当处理的事情或解决的问题是按从开始到结束的顺序一步一步地进行时,就用顺序结构
程序。
2. 关于顺序结构程序
顺序结构程序的编写还是按前述的编程三部曲进行,其处理部分按顺序执行即可。
3. 如何运用顺序结构程序
运用中没有什么特别的,就是将人想通的顺序过程写成提纲或画成流程图,再找到相应的C++语句,实现提纲或流程图的功能而已。如例3-1和例3-2所示。
3.4 C++ 基础知识(二)的亮点
走完了第二站,发现了一些亮点,分别如下。
1. 数据类型的亮点
1)数据分为两大类,即数字类和文字类。
2)C++数据类型的选用依数据的特点和范围而定,一般常用的是整型(int)、浮点型(float)、双精度型(double)和字符型(char)。
3)记住:定义变量或常量时,暂定某种类型,不行再换,不必为此而难于动笔。
2. 给数据起名字的亮点
1)记住“先定义,后使用”这个原则,即先起名字,后喊名字的原则,基本上都要给数据起名字(除非这个数据仅用一次),起名字前先确定数据是属于什么数据类型。
2 )要按 C++ 给数据起名字的规则起名。
3)区分给变量和常量起名字的语法格式。
4)记住:初始化时大致定义一些名字,不要在程序开头时为起名字而难于下笔,因为到用时再补起名也为时不晚,不必在此浪费时间。
3. 算术运算(一)和赋值的亮点
1)不必背熟表3-4~表3-8中的内容,只需在用到时进行查找并运用,就会逐步记住一些常用的数据类型和运算符了。
2)一定要遵循 C++ 各个操作符和赋值语句的使用原则及书写格式。
3)注意操作符的优先级和结合性(分为左→右和右→左)。
4. 顺序结构程序的亮点
1)记住:顺序结构程序是从开始至结束一句接着一句地执行的,从最顶层开始(程序开始)往下一层走,一步一步地下楼梯,一直走到一楼才停止(程序结束)。
2)前后顺序要合理,以保证程序能正确、可靠地运行。
3)同样要遵循图2-3所示的开发设计流程。
4)当表达式太长时,可设置一些中间变量来存放中间结果。
总之,要先给变量或常量起名字(定义),再进行输入、处理、输出的编程三部曲(即给变量或常量赋予数据、对数据进行运算和显示等操作)。