4.1 顺序结构
顺序结构是指按照所有语句出现的顺序先后执行,先出现的先执行,后出现的后执行。顺序结构的执行流程如图4-1所示。
图4-1 顺序结构
在C++中,顺序结构的语句一般包含三种:表达式语句、输入语句和输出语句。
4.1.1 表达式语句
通过前面章节的学习,读者对表达式语句已经有了一定认识,在本节中再将其强化一下。表达式语句是最简单的语句,任何一个表达式加上分号就是一个表达式语句。表达式语句与表达式的区别是,表达式可包含在其他表达式中,而表达式语句则不能。表达式语句的一般形式为:
表达式语句的特殊形式为空语句,这在第3章也介绍过。空语句就是只有一个分号的语句,相当于一个空表达式,其一般形式为:
此外,我们也应了解一下复合语句。复合语句由两条以上的语句组成,并用一对花括号({})括起来。复合语句又称为块语句或块程序,其一般形式为:
注意
空语句通常没有实际作用,主要用于延时,与循环语句一起使用实现程序的等待、延时功能。
4.1.2 输入语句
事实上,C++没有提供输入/输出语句,其输入/输出功能由函数(scanf、printf)或流控制来实现。输入/输出流(I/O流)是输入或输出的一系列字节。C++定义了包含重载运算符“<<”和“>>”的iostream类。在这里只介绍如何利用C++的标准输入/输出流实现数据的输入/输出功能。
基本输入/输出语句较为复杂,在前面的示例中,用到了cin和cout分别实现从键盘输入和在显示器上输出的功能。绝大多数C++程序都使用了系统提供的I/O流,以实现基本的输入和输出操作。在I/O流类的定义中,把C++语言中的左、右移位运算符“<<”和“>>”通过运算符重载的方法定义为插入(输出)和提取(输入)运算符。
当程序需要执行键盘输入时,可以使用抽取操作符“>>”从输入流cin中抽取键盘输入的字符和数字,并把它赋给指定的变量。
【范例4-1】输入语句的使用。该范例给出了最简单的输入语句的实现。该程序段的功能是接收用户从键盘输入的一个整数,并将其存储到变量a中,实现代码如代码清单4-1所示。
代码清单4-1
【运行结果】在Visual C++中新建一个【C++ Source File】后输入如上的代码,编译运行后,其结果如图4-2所示。
图4-2 输入语句
【范例解析】在范例4-1代码中只有一个输入语句,即该程序执行后接收键盘输入的数值,并将其存储到变量a中,但并未对该变量进行其他任何操作。此外,cin语句可同时接收多个键盘输入并将其存入对应的变量中,可以分辨不同的变量类型。例如,下列的写法也是正确的。
警告
此处的抽取操作符“>>”与位移运算符“>>”是同样的符号,但这个符号在不同的地方其含义是不一样的。
4.1.3 输出语句
同样,当程序需要在屏幕上显示输出时,可以使用插入操作符“<<”向输出流cout中插入字符和数字,并把它在屏幕上显示输出。
【范例4-2】输出语句的使用。该范例给出了最简单的输出语句的实现,其功能是输出字符串“Hello”,使其显示到屏幕上,实现代码如代码清单4-2所示。
代码清单4-2
【运行结果】同样,在Visual C++中新建一个【C++ Source File】文件后输入如上的代码,编译运行后,其结果如图4-3所示。
图4-3 输出语句
【范例解析】范例4-2程序实现在终端输出一个字符串。需要注意的是,此处的字符“\n”为转义字符,表示换行。在cout操作符后加上该字符,表示输出后光标往下移动一行。此外,在C++中,换行也可以通过关键字endl来实现,因此,上述语句也可以改写为:
注意
与输入语句一样,此处的插入操作符“<<”与位移运算符“<<”是同样的符号,但这种符号在不同的地方其含义是不一样的。
在C++程序中,cin与cout允许将任何基本数据类型的名字或值传给流。而且书写格式较灵活,可以在同一行中串连书写,也可以分写在几行,提高可读性。例如,下列语句:
等价于
也等价于
4.1.4 格式控制符
前面提到过,cin和cout是预先定义的流对象,分别为标准输入流和标准输出流,一般代表标准输入设备(键盘)和标准输出设备(显示器)。为了更好地调整输入/输出格式,C++还提供了格式控制函数和格式控制符,主要有以下5种。
●flags:该函数一般有以下两种形式,第一种形式是通过参数1Flags重新设置标志字并返回原来的标志字;第二种形式是通过无参数的flags函数返回当前的标志字。
●setf:该函数一般也有以下两种形式,第一种形式是通过参数1Flags来设置指定的格式控制标志位;第二种形式是用来设置指定的格式控制标志位的值。
●unsetf:该函数的一般形式如下,这种形式是通过参数1Flags来清除指定的格式控制标志位(使那些位的值为“0”)。
●fill:该函数一般有以下两种形式,第一种形式是将填充字符设置为cFill,并返回原填充字符;第二种形式是通过无参数的fill函数返回当前的填充字符。
●precision:该函数形式一般也有以下两种,第一种形式是设置浮点数精度为np,并返回原精度;第二种形式是通过无参数的precision函数返回当前的浮点数精度。
●width:该函数的形式一般也有以下两种,第一种形式设置当前显示数据的域宽nw,并返回原域宽;第二种形式是通过无参数的width函数返回当前显示数据的域宽。
C++在头文件iomanip.h中定义了控制符对象,可以直接将这些控制符嵌入到I/O语句中进行格式控制。在使用这些控制符时,只需在程序的开头包含头文件iomanip.h,即使用#include<iomanip.h>预处理命令即可。
警告
使用cin和cout必须加入头文件<iostream.h>,即在程序代码的开始部分使用预处理命令#include<iostream.h>,否则将不能通过系统编译。
为了让读者更好地理解如何使用格式控制函数和格式控制符显示不同输出格式的数据,下面通过一个示例来讲解。
1.控制不同进制的输出
前面讲解了众多格式控制符,为方便读者理解,这里将重要的控制符单独列出,通过示例的形式介绍,使读者能更深刻地理解。
【范例4-3】控制不同进制的输出。该范例通过前面介绍的I/O控制符来控制不同进制的数值输出,实现代码如代码清单4-3所示。
代码清单4-3
【运行结果】在Visual C++中编译上述程序代码,若编译无误后使用快捷键【Ctrl+F5】执行该代码,其返回结果如图4-4所示。
图4-4 控制不同进制的输出
【范例解析】在范例4-3中,输出整数1000在各种不同进制下的表示,默认输出是十进制的数字,不需要任何格式输出符即为默认输出格式。
提示
格式输出符dec也表示十进制输出,通常省略。格式输出符oct表示为八进制输出,hex表示十六进制输出。
2.控制输出宽度
在具体的应用中,通常需要对输出内容的宽度做一些限制,比如设置为输出若干位,而这可以通过4.1.4节讲解的控制符来实现。
【范例4-4】控制输出宽度。该范例针对同一个数值,通过输出格式控制函数,实现不同宽度的输出格式,实现代码如代码清单4-4所示。
代码清单4-4
【运行结果】在Visual C++中编译上述程序代码,若编译无误后使用快捷键【Ctrl+F5】执行该代码,其返回结果如图4-5所示。
图4-5 控制输出宽度
【范例解析】范例4-4实现对输出字符或数值宽度的控制。读者从上述执行结果可以看出,当需输出的内容宽度达不到setw控制符中设定的宽度时,Visual C++将在输出内容前面填补空格;当需输出的内容的宽度大于setw控制符中设定的宽度时,系统将全部予以输出。
注意
上述输出语句中的endl控制符表示在输出时插入换行符并刷新流,其也可以用C语言中的“\n”来代替。
3.控制输出精度
在实际应用中,有时需要对输出的浮点型数据进行精度控制,这也需要通过输出控制符来实现。
【范例4-5】控制输出精度。该范例针对同一个数值,通过输出控制符,实现不同精度的输出,实现代码如代码清单4-5所示。
代码清单4-5
【运行结果】同样,在Visual C++中编译上述程序代码,若编译无误后使用快捷键【Ctrl+F5】执行该代码,其返回结果如图4-6所示。
图4-6 控制输出精度
【范例解析】范例4-3对一个浮点数控制其输出的有效位数。从上述示例中读者可以看出,如果希望显示的数字是1.23,即保留两位小数,可用setprecision(3)控制符加以控制,此时显示3位有效位。当小数位数截短显示时,进行四舍五入处理。此外,需要注意的是,C++默认的输出流数值的有效位是6。
注意
凡是在程序中使用了格式控制符,诸如以上的控制进制输出、控制输出的宽度、精度等,在预编译时都必须包含头文件iomanip.h,即在头文件处加上语句#include<iomanip.h>,否则编译时将不能通过。
此外,C++还提供了其余一些控制符,表4-1所示为常用的I/O流控制符。
表4-1 常用的I/O流控制符
4.1.5 应用示例
本节介绍了顺序结构的组成语句,主要包括表达式语句、输入语句和输出语句。下面通过一个较为综合的示例回顾一下顺序结构的各种语句及控制函数和控制符。
【范例4-6】顺序结构应用示例。该范例给出了使用不同格式控制函数和格式控制符输出数据时返回的数据显示,实现代码如代码清单4-6所示。
代码清单4-6
【运行结果】在Visual C++ 6.0集成环境下执行上述代码,其执行结果如图4-7所示。
图4-7 应用示例
【范例解析】在范例4-6中,设置对齐的标志位是向右,其输出的宽度为10,如不够则在前面填充*符号,输出精度为4,显示数值的正号。此外,接收一个键盘输入的八进制数值,以不同进制将该数值输出。
提示
上述代码中使用了4.1节中所提到的所有格式控制函数和格式控制符,读者可根据其注释和如图4-5所示的输出结果理解这些控制函数或控制的作用。