谭浩强C程序设计第3章.ppt

上传人:公**** 文档编号:574613766 上传时间:2024-08-16 格式:PPT 页数:113 大小:493KB
返回 下载 相关 举报
谭浩强C程序设计第3章.ppt_第1页
第1页 / 共113页
谭浩强C程序设计第3章.ppt_第2页
第2页 / 共113页
谭浩强C程序设计第3章.ppt_第3页
第3页 / 共113页
谭浩强C程序设计第3章.ppt_第4页
第4页 / 共113页
谭浩强C程序设计第3章.ppt_第5页
第5页 / 共113页
点击查看更多>>
资源描述

《谭浩强C程序设计第3章.ppt》由会员分享,可在线阅读,更多相关《谭浩强C程序设计第3章.ppt(113页珍藏版)》请在金锄头文库上搜索。

1、第第3章章 程序设计初步程序设计初步第第4章章 函数与预处理函数与预处理第第5章章 数组数组第第6章章 指针指针第第7章章 自定义数据类型自定义数据类型第第2 2篇篇面向过程的程序设计面向过程的程序设计第第3章章 程序设计初步程序设计初步3.1 面向过程的程序设计和算法面向过程的程序设计和算法3.2 +程序和语句程序和语句3.3 赋值语句赋值语句3.4 C+的输入与输出的输入与输出3.5 编写顺序结构的程序编写顺序结构的程序3.6 关系运算和逻辑运算关系运算和逻辑运算3.7 选择结构和语句选择结构和语句3.8 条件运算符和条件表达式条件运算符和条件表达式3.9 多分支选择结构和多分支选择结构和

2、switch语句语句3.10 编写选择结构的程序编写选择结构的程序3.11 循环结构和循环语句循环结构和循环语句3.12 循环的嵌套循环的嵌套3.13 break语句和语句和continue语句语句3.14 编写循环结构的程序编写循环结构的程序在面向过程的程序设计中,程序设计者必须指定计算在面向过程的程序设计中,程序设计者必须指定计算机执行的具体步骤,程序设计者不仅要考虑程序要机执行的具体步骤,程序设计者不仅要考虑程序要“做什么做什么”,还要解决,还要解决“怎么做怎么做”的问题,根据程序要的问题,根据程序要“做什么做什么”的要求,写出一个个语句,安排好它们的的要求,写出一个个语句,安排好它们的

3、执行顺序。怎样设计这些步骤,怎样保证它的正确性执行顺序。怎样设计这些步骤,怎样保证它的正确性和具有较高的效率,这就是算法需要解决的问题。和具有较高的效率,这就是算法需要解决的问题。3.1 面向过程的程序设计和算法面向过程的程序设计和算法一个面向过程的程序应包括以下两方面内容:一个面向过程的程序应包括以下两方面内容:(1) 对数据的描述。在程序中要指定数据的类型和数对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构据的组织形式,即数据结构(data structure)。(2) 对操作的描述。即操作步骤,也就是算法对操作的描述。即操作步骤,也就是算法(algorithm)。对于面

4、向过程的程序,可以用下面的公式表示:对于面向过程的程序,可以用下面的公式表示: 程序程序=算法算法+数据结构数据结构 作为程序设计人员,必须认真考虑和设计数据结构和作为程序设计人员,必须认真考虑和设计数据结构和操作步骤操作步骤(即算法即算法)。算法是处理问题的一系列的步骤。算法必须具体地指算法是处理问题的一系列的步骤。算法必须具体地指出在执行时每一步应当怎样做。出在执行时每一步应当怎样做。3.1.1 算法的概念算法的概念不要认为只有不要认为只有“计算计算”的问题才有算法。广义地说,的问题才有算法。广义地说,为解决一个问题而采取的方法和步骤,就称为为解决一个问题而采取的方法和步骤,就称为“算法算

5、法”。计算机算法可分为两大类别:数值算法和非数值算法。计算机算法可分为两大类别:数值算法和非数值算法。数值算法的目的是求数值解。非数值算法包括的面十数值算法的目的是求数值解。非数值算法包括的面十分广泛,最常见的是用于事务管理领域。目前,计算分广泛,最常见的是用于事务管理领域。目前,计算机在非数值方面的应用远远超过了在数值方面的应用。机在非数值方面的应用远远超过了在数值方面的应用。C+既支持面向过程的程序设计,又支持面向对象的既支持面向过程的程序设计,又支持面向对象的程序设计。无论面向过程的程序设计还是面向对象的程序设计。无论面向过程的程序设计还是面向对象的程序设计,都离不开算法设计。程序设计,

6、都离不开算法设计。1. 自然语言自然语言用中文或英文等自然语言描述算法。但容易产生歧义用中文或英文等自然语言描述算法。但容易产生歧义性,在程序设计中一般不用自然语言表示算法。性,在程序设计中一般不用自然语言表示算法。2. 流程图流程图 可以用传统的流程图或结构化流程图。用图的形式表可以用传统的流程图或结构化流程图。用图的形式表示算法,比较形象直观,但修改算法时显得不大方便。示算法,比较形象直观,但修改算法时显得不大方便。3. 伪代码伪代码(pseudo code) 伪代码是用介于自然语言和计算机语言之间的文字和伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。如符号来描述算法。如3

7、.1.2 算法的表示算法的表示if x is positive then print xelse print-x用伪代码写算法并无固定的、严格的语法规则,只需用伪代码写算法并无固定的、严格的语法规则,只需把意思表达清楚,并且书写的格式要写成清晰易读的把意思表达清楚,并且书写的格式要写成清晰易读的形式。它不用图形符号,因此书写方便、格式紧凑,形式。它不用图形符号,因此书写方便、格式紧凑,容易修改,便于向计算机语言算法容易修改,便于向计算机语言算法(即程序即程序)过渡。过渡。4. 用计算机语言表示算法用计算机语言表示算法 用一种计算机语言去描述算法,这就是计算机程序。用一种计算机语言去描述算法,这

8、就是计算机程序。由第由第1章已知,一个程序包含一个或多个程序单位章已知,一个程序包含一个或多个程序单位(每每个程序单位构成一个程序文件个程序单位构成一个程序文件)。每一个程序单位由。每一个程序单位由以下几个部分组成:以下几个部分组成: (1) 预处理命令。如预处理命令。如#include命令和命令和#define命令。命令。(2) 声明部分。例如对数据类型和函数的声明,以及声明部分。例如对数据类型和函数的声明,以及对变量的定义。对变量的定义。(3) 函数。包括函数首部和函数体,在函数体中可以函数。包括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句。包含若干声明语句和执行语句。如下面

9、是一个完整的如下面是一个完整的C+程序:程序:3.2 C+程序和语句程序和语句#include /预处理命令预处理命令using namespace std; /在函数之外的声明部分在函数之外的声明部分int a=3; /在函数之外的声明部分在函数之外的声明部分int main( ) /函数首部函数首部 float b; /函数内的声明部分函数内的声明部分 b=4.5; /执行语句执行语句 coutab; /执行语句执行语句 return 0; /执行语句执行语句如果一个变量在函数之外进行声明,此变量是全局变如果一个变量在函数之外进行声明,此变量是全局变量,它的有效范围是从该行开始到本程序单位

10、结束。量,它的有效范围是从该行开始到本程序单位结束。如果一个变量在函数内声明,此变量是局部变量,它如果一个变量在函数内声明,此变量是局部变量,它的有效范围是从该行开始到本函数结束。的有效范围是从该行开始到本函数结束。C+程序结程序结构可以用图构可以用图31表示。表示。图图3.1程序应该包括数据描述(由声明语句来实现)和数据程序应该包括数据描述(由声明语句来实现)和数据操作(由执行语句来实现)。数据描述主要包括数据操作(由执行语句来实现)。数据描述主要包括数据类型的声明、函数和变量的定义、变量的初始化等。类型的声明、函数和变量的定义、变量的初始化等。数据操作的任务是对已提供的数据进行加工。数据操

11、作的任务是对已提供的数据进行加工。C+程序中最小的独立单位是语句程序中最小的独立单位是语句(statement)。它它相当于一篇文章中的一个句子。句子是用句号结束的。相当于一篇文章中的一个句子。句子是用句号结束的。语句一般是用分号结束的语句一般是用分号结束的(复合语句是以右花括号结复合语句是以右花括号结束的束的)。C+语句可以分为以下语句可以分为以下4种:种:1. 声明语句声明语句如如int a,b;在在C语言中,只有产生实际操作的才称为语语言中,只有产生实际操作的才称为语句,对变量的定义不作为语句,而且要求对变量的定句,对变量的定义不作为语句,而且要求对变量的定义必须出现在本块中所有程序语句

12、之前。因此义必须出现在本块中所有程序语句之前。因此C程序程序员已经养成了一个习惯:员已经养成了一个习惯: 在函数或块的开头位置定在函数或块的开头位置定义全部变量。在义全部变量。在C+中,对变量中,对变量(以及其他对象以及其他对象)的定的定义被认为是一条语句,并且可以出现在函数中的任何义被认为是一条语句,并且可以出现在函数中的任何行,即可以放在其他程序语句可以出现的地方,也可行,即可以放在其他程序语句可以出现的地方,也可以放在函数之外。这样更加灵活,可以很方便地实现以放在函数之外。这样更加灵活,可以很方便地实现变量的局部化变量的局部化(变量的作用范围从声明语句开始到本变量的作用范围从声明语句开始

13、到本函数或本块结束函数或本块结束)。2. 执行语句执行语句通知计算机完成一定的操作。执行语句包括:通知计算机完成一定的操作。执行语句包括: (1) 控制语句,完成一定的控制功能。控制语句,完成一定的控制功能。C+有有9种控种控制语句,即制语句,即 if( )else (条件语句)条件语句) for( ) (循环语句)循环语句) while( ) (循环语句)循环语句) dowhile( ) (循环语句)循环语句) continue (结束本次循环语句)结束本次循环语句) break (中止执行或循环语句)中止执行或循环语句) switch (多分支选择语句)多分支选择语句) goto (转向语

14、句)转向语句) return (从函数返回语句)从函数返回语句)(2) 函数和流对象调用语句。函数调用语句由一次函函数和流对象调用语句。函数调用语句由一次函数调用加一个分号构成一个语句,例如数调用加一个分号构成一个语句,例如sort(x,y,z); /假设已定义了假设已定义了sort函数,它有函数,它有3个参数个参数coutx100) z=z-100;cout0) cout0endl;按语法规定按语法规定if后面的后面的( )内是一个条件内是一个条件。现在在现在在x的位的位置上换上一个赋值表达式置上换上一个赋值表达式“a=b”,其作用是:先进其作用是:先进行赋值运算(将行赋值运算(将b的值赋给

15、的值赋给a),),然后判断然后判断a是否大于是否大于0,如大于,如大于0,执行,执行cout00) cout0endl;因为在因为在if的条件中不能包含赋值语句。的条件中不能包含赋值语句。C+把赋值语把赋值语句和赋值表达式区别开来,增加了表达式的种类,能句和赋值表达式区别开来,增加了表达式的种类,能实现其他语言中难以实现的功能。实现其他语言中难以实现的功能。输入和输出并不是输入和输出并不是C+语言中的正式组成成分。语言中的正式组成成分。C和和C+本身都没有为输入和输出提供专门的语句结构。本身都没有为输入和输出提供专门的语句结构。输入输出不是由输入输出不是由C+本身定义的,而是在编译系统提本身定

16、义的,而是在编译系统提供的供的I/O库中定义的。库中定义的。C+的输出和输入是用的输出和输入是用“流流”(stream)的方式实现的。的方式实现的。图图3.2和图和图3.3表示表示C+通过流进行输入输出的过程。通过流进行输入输出的过程。3.4 C+的输入与输出的输入与输出图图3.2图图3.3有关流对象有关流对象cin、cout和流运算符的定义等信息是存和流运算符的定义等信息是存放在放在C+的输入输出流库中的,因此如果在程序中使的输入输出流库中的,因此如果在程序中使用用cin、cout和流运算符,就必须使用预处理命令把和流运算符,就必须使用预处理命令把头文件头文件stream包含到本文件中:包含

17、到本文件中: #include 尽管尽管cin和和cout不是不是C+本身提供的语句,但是在不致本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由混淆的情况下,为了叙述方便,常常把由cin和流提和流提取运算符取运算符“”实现输入的语句称为输入语句或实现输入的语句称为输入语句或cin语句,把由语句,把由cout和流插入运算符和流插入运算符“”实现输出的语实现输出的语句称为输出语句或句称为输出语句或cout语句。根据语句。根据C+的语法,凡是的语法,凡是能实现某种操作而且最后以分号结束的都是语句。能实现某种操作而且最后以分号结束的都是语句。cout语句的一般格式为语句的一般格式为 co

18、ut表达式表达式1表达式表达式2变量变量1变量变量2变量变量n;在定义流对象时,系统会在内存中开辟一段缓冲区,在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行用来暂存输入输出流的数据。在执行cout语句时,先语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到冲区满或遇到cout语句中的语句中的endl(或或n,ends,flush)为止,此时将缓冲区中已有的数据一起输出,为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备并清空缓冲区。输出流中的数据在系统默认的设备(一

19、般为显示器一般为显示器)输出。输出。*3.4.1 输入流与输出流的基本操作输入流与输出流的基本操作一个一个cout语句可以分写成若干行。如语句可以分写成若干行。如coutThis is a simple C+ program.endl;可以写成可以写成 coutThis is /注意行末尾无分号注意行末尾无分号a C+ program.endl; /语句最后有分号语句最后有分号也可写成多个也可写成多个cout语句,即语句,即coutThis is ; /语句末尾有分号语句末尾有分号cout a C+ ;cout program.;coutendl;以上以上3种情况的输出均为种情况的输出均为Th

20、is is a simple C+ program.注意注意 不能用一个插入运算符不能用一个插入运算符“”插入多个输出项:插入多个输出项:couta,b,c; /错误,不能一次插入多项错误,不能一次插入多项couta+b+c; /正确,这是一个表达式,作为一项正确,这是一个表达式,作为一项在用在用cout输出时,用户不必通知计算机按何种类型输输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义按相应的类型输出。如已定义a为为int型,型,b为为float型,型,c为为char型,则型,则co

21、uta b cabcd;可以写成可以写成 cina /注意行末尾无分号注意行末尾无分号 b /这样写可能看起来清晰些这样写可能看起来清晰些 c d; 也可以写成也可以写成cina;cinb;cinc;cind;以上以上3种情况均可以从键盘输入:种情况均可以从键盘输入: 1 2 3 4 也可以分多行输入数据:也可以分多行输入数据: 1 2 3 4 在用在用cin输入时,系统也会根据变量的类型从输入流输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有中提取相应长度的字节。如有char c1,c2;int a;float b;cinc1c2ab;如果输入如果输入1234 56.78 注

22、意:注意: 34后面应该有空格以便和后面应该有空格以便和56.78分隔开。也可分隔开。也可以按下面格式输入:以按下面格式输入:1 2 34 56.78 (在在1和和2之间有空格之间有空格)不能用不能用cin语句把空格字符和回车换行符作为字符输语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符或入给字符变量,它们将被跳过。如果想将空格字符或回车换行符回车换行符(或任何其他键盘上的字符或任何其他键盘上的字符)输入给字符变输入给字符变量,可以用量,可以用3.4.3节介绍的节介绍的getchar函数。函数。在组织输入流数据时,要仔细分析在组织输入流数据时,要仔细分析cin

23、语句中变量的语句中变量的类型,按照相应的格式输入,否则容易出错。类型,按照相应的格式输入,否则容易出错。上面介绍的是使用上面介绍的是使用cout和和cin时的默认格式。但有时时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右时规定字段宽度,只保留两位小数,数据向左或向右对齐等。对齐等。C+提供了在输入输出流中使用的控制符提供了在输入输出流中使用的控制符(有的书中称为操纵符有的书中称为操纵符),见书中表,见书中表3.1。需要注意的是:需要注意的是: 如果使用了控制符,在程序单位的如果使用了

24、控制符,在程序单位的开头除了要加开头除了要加iostream头文件外,还要加头文件外,还要加iomanip头头文件。文件。举例:举例: 输出双精度数。输出双精度数。*3.4.2 在输入流与输出流中使用控制符在输入流与输出流中使用控制符double a=123.456789012345;对对a赋初值赋初值(1) couta;输出:输出: 123.456 (2) coutsetprecision(9)a;输出:输出: 123.456789 (3) coutsetprecision(6);恢复默认格式恢复默认格式(精度为精度为6)(4) cout setiosflags(ios fixed);输出:

25、输出: 123.456789(5) coutsetiosflags(ios fixed)setprecision(8)a;输出:输出: 123.45678901(6) coutsetiosflags(ios scientific)a;输出:输出: 1.234568e+02(7) coutsetiosflags(ios scientific)setprecision(4)a; 输出:输出: 1.2346e02下面是整数输出的例子:下面是整数输出的例子: int b=123456;对对b赋初值赋初值(1) coutb;输出:输出: 123456(2) couthexb; 输出:输出: 1e240

26、(3) coutsetiosflags(ios uppercase)b;输出:输出: 1E240 (4) coutsetw(10)b,b; 输出:输出: 123456,123456(5) coutsetfill(*)setw(10)b;输出:输出: * 123456(6) coutsetiosflags(ios showpos)b;输出:输出: +123456如果在多个如果在多个cout语句中使用相同的语句中使用相同的setw(n),并使用并使用setiosflags(ios right),可以实现各行数据右对齐,如可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。果指定相同

27、的精度,可以实现上下小数点对齐。例例3.1 各行小数点对齐。各行小数点对齐。#include #include using namespace std;int main( ) double a=123.456,b=3.14159,c=-3214.67; coutsetiosflags(ios fixed)setiosflags(ios right)setprecision(2); coutsetw(10)aendl; coutsetw(10)bendl; coutsetw(10)cendl; return 0; 输出如下:输出如下: 123.46 (字段宽度为字段宽度为10,右对齐,取两位小数

28、,右对齐,取两位小数) 3.14 -3214.67先统一设置定点形式输出、取两位小数、右对齐。这先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效些设置对其后的输出均有效(除非重新设置除非重新设置),而,而setw只对其后一个输出项有效,因此必须在输出只对其后一个输出项有效,因此必须在输出a,b,c之前之前都要写都要写setw(10)。C+还保留了还保留了C语言中用于输入和输出单个字符的函语言中用于输入和输出单个字符的函数,使用很方便。其中最常用的有数,使用很方便。其中最常用的有getchar函数和函数和putchar函数。函数。1. putchar函数(字符输出函数)函数

29、(字符输出函数)putchar函数的作用是向终端输出一个字符。例如函数的作用是向终端输出一个字符。例如putchar(c);它输出字符变量的值。它输出字符变量的值。3.4.3 用用getchar和和putchar 函数进行字符的输入和输出函数进行字符的输入和输出例例3.2 输出单个字符。输出单个字符。#include /或者包含头文件或者包含头文件stdio.h: #include using namespace std;int main( )char a,b,c; a=B;b=O;c=Y; putchar(a);putchar(b);putchar(c);putchar(n); putcha

30、r(66);putchar(79);putchar(89);putchar(10); return 0;运行结果为运行结果为BOYBOY可以看到:可以看到: 用用putchar可以输出转义字符,可以输出转义字符,putchar(n)的作用是输出一个换行符,使输出的当前位置的作用是输出一个换行符,使输出的当前位置移到下一行的开头。移到下一行的开头。putchar(66)的作用是将的作用是将66作为作为ASCII码转换为字符输出,码转换为字符输出,66是字母是字母B的的ASCII码码,因此,因此putchar(66)输出字母输出字母B。其余类似。其余类似。putchar(10)中的中的10是换行符

31、的是换行符的ASCII码,码,putchar(10)输出一个换行符,作用与输出一个换行符,作用与putchar(n) 相同。相同。也可以输出其他转义字符,如也可以输出其他转义字符,如 putchar(101) (输出字符输出字符A,八进制的八进制的101是是A的的ASCII码)码) putchar() (输出单引号字符输出单引号字符) putchar(015) (输出回车,不换行,使输出的当前位置移输出回车,不换行,使输出的当前位置移到本行开头)到本行开头)2. getchar函数(字符输入函数)函数(字符输入函数)此函数的作用是从终端(或系统隐含指定的输入设备)此函数的作用是从终端(或系统隐

32、含指定的输入设备)输入一个字符。输入一个字符。getchar函数没有参数,其一般形式函数没有参数,其一般形式为为getchar( )函数的值就是从输入设备得到的字符。函数的值就是从输入设备得到的字符。例例3.3 输入单个字符。输入单个字符。#include using namespace std;int main( )char c; c=getchar( ); putchar(c+32); putchar(n); return 0; 在运行时,如果从键盘输入大写字母在运行时,如果从键盘输入大写字母A并按回车并按回车键,就会在屏幕上输出小写字母键,就会在屏幕上输出小写字母a。请注意,请注意,ge

33、tchar( )只能接收一个字符。只能接收一个字符。getchar函数函数得到的字符可以赋给一个字符变量或整型变量,也可得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。例如,例以不赋给任何变量,作为表达式的一部分。例如,例3.3第第5行可以用下面一行代替:行可以用下面一行代替:putchar(getchar()()+32););putchar(n);因为因为getchar( )读入的值为读入的值为A,A+32是小写字母是小写字母a的的ASCII码,因此码,因此putchar函数输出函数输出a。此此时不必定义变量时不必定义变量c。也可用也可用cout输出输出g

34、etchar函数得到字符的函数得到字符的ASCII的值:的值:coutgetchar( );这时输出的是整数这时输出的是整数97,因为用,因为用getchar( )读入的实际读入的实际上是字符的上是字符的ASCII码,现在并未把它赋给一个字符变码,现在并未把它赋给一个字符变量,量,cout就按整数形式输出。如果改成就按整数形式输出。如果改成cout(c=getchar( ); /设设c已定义为字符变量已定义为字符变量则输出为字母则输出为字母a,因为要求输出字符变量因为要求输出字符变量c的值。的值。可以看到用可以看到用putchar和和getchar函数输出和输入字符十函数输出和输入字符十分灵活

35、方便,由于它们是函数所以可以出现在表达式分灵活方便,由于它们是函数所以可以出现在表达式中,例如中,例如cout(c=getchar( )+32);在在C语言中是用语言中是用printf函数进行输出,用函数进行输出,用scanf函数进函数进行输入的。行输入的。C+保留了保留了C语言的这一用法。在此只作语言的这一用法。在此只作很简单的介绍。很简单的介绍。scanf函数一般格式是函数一般格式是 scanf(格式控制,输出表列格式控制,输出表列)printf函数的一般格式是函数的一般格式是printf(格式控制,输出表列格式控制,输出表列)3.4.4 用用scanf和和printf函数进行输入和输出函

36、数进行输入和输出例例3.4 用用scanf和和printf函数进行输入和输出。函数进行输入和输出。#include using namespace std;int main( )int a; float b; char c; scanf(%d %c %f,&a,&c,&b); /注意在变量名前要加地址运算符注意在变量名前要加地址运算符& printf(a=%d,b=%f,c=%cn,a,b,c); return 0;运行情况如下:运行情况如下:12 A 67.98 (本行为输入,输入的本行为输入,输入的3个数据间以空格相间个数据间以空格相间)a=12,b=67.980003,c=A(本行为输出

37、本行为输出) 输入的整数输入的整数12送给整型变量送给整型变量a,字符字符A送给字符变送给字符变量量c,67.98送给单精度变量送给单精度变量b。例例3.5 求一元二次方程式求一元二次方程式ax2+bx+c=0的根。的根。a,b,c的值的值在运行时由键盘输入,它们的值满足在运行时由键盘输入,它们的值满足b2-4ac0。根据求根据求x1,x2的算法。它可以编写出以下的算法。它可以编写出以下C+程序:程序: #include #include /由于程序要用到数学函数由于程序要用到数学函数sqrt,故应包含头文故应包含头文件件cmathusing namespace std;int main( )

38、float a,b,c,x1,x2; cinabc; x1=(-b+sqrt(b*b-4*a*c)/(2*a); x2=(-b-sqrt(b*b-4*a*c)/(2*a); coutx1=x1endl; coutx2=x2endl; return 0;3.5 编写顺序结构的程序编写顺序结构的程序运行情况如下:运行情况如下: 4.5 8.8 2.4 x1=-0.327612x2=-1.17794如果程序中要用到数学函数,都要包含头文件如果程序中要用到数学函数,都要包含头文件cmath(也可以用老形式的头文件也可以用老形式的头文件math.h,但提倡使用但提倡使用C+新形式的头文件,请参阅第新形式

39、的头文件,请参阅第14章章14.3节节)。在写程序。在写程序时,一定要注意将数学表达式正确地转换成合法的时,一定要注意将数学表达式正确地转换成合法的C+表达式。表达式。可以看到:可以看到: 顺序结构的程序中的各执行语句是顺序顺序结构的程序中的各执行语句是顺序执行的。这种程序最简单,最容易理解。执行的。这种程序最简单,最容易理解。往往要求根据某个指定的条件是否满足来决定执行的往往要求根据某个指定的条件是否满足来决定执行的内容。例如,购物在内容。例如,购物在1000元以下的打九五折,元以下的打九五折,1000元元及以上的打九折。及以上的打九折。C+提供提供if语句来实现这种条件选择。如语句来实现这

40、种条件选择。如if amount1000 tax=0.95; /amount代表购物总额,代表购物总额,tax代表折扣代表折扣else tax=0.9; /若若amount1000,条件满足,条件满足,tax=0.95,否则否则tax=0.9pay=amount*tax; /pay为实付款为实付款流程可以用图流程可以用图3.4表示。表示。图图3.43.6 关系运算和逻辑运算关系运算和逻辑运算上面上面if语句中的语句中的“amount1000”实现的不是算术运实现的不是算术运算,而是关系运算。实际上是比较运算,将两个数据算,而是关系运算。实际上是比较运算,将两个数据进行比较,判断比较的结果。进行

41、比较,判断比较的结果。“amount”是一个比较符,称为关系运算符。是一个比较符,称为关系运算符。C+的关系运算符有:的关系运算符有: (小于小于) (大于大于) = (大于或等于大于或等于) = (等于等于) != (不等于不等于) 优先级相同优先级相同 (低低)3.6.1 关系运算和关系表达式关系运算和关系表达式关于优先次序:关于优先次序: 前前4种关系运算符(种关系运算符(,)的优先级别)的优先级别相同,后两种也相同。前相同,后两种也相同。前4种高于后两种。例如,种高于后两种。例如,“”优先于优先于“”。而。而“”与与“a+b 等效于等效于 c(a+b) ab=c 等效于等效于(ab)=

42、c a=bc 等效于等效于a=(bc 等效于等效于a=(bc)用关系运算符将两个表达式连接起来的式子,称为关用关系运算符将两个表达式连接起来的式子,称为关系表达式。关系表达式的一般形式可以表示为系表达式。关系表达式的一般形式可以表示为表达式表达式 关系运算符关系运算符 表达式表达式其中的其中的“表达式表达式”可以是算术表达式或关系表达式、可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式。例如,下面逻辑表达式、赋值表达式、字符表达式。例如,下面都是合法的关系表达式:都是合法的关系表达式:ab, a+bb+c,(a=3)(b=5), ab)(b=0”的值为的值为“真真”。在。在C和

43、和C+中都用数值中都用数值1代表代表“真真”,用,用0代表代表“假假”。如果有以下赋值表达式:如果有以下赋值表达式:d=ab 则则d得到的值为得到的值为1f=abc f得到的值为得到的值为0C语言没有提供逻辑型数据,关系表达式的值语言没有提供逻辑型数据,关系表达式的值(真或真或假假)分别用数值分别用数值1和和0代表。代表。C+增加了逻辑型数据。增加了逻辑型数据。逻辑型常量只有两个,即逻辑型常量只有两个,即false(假假)和和true(真真)。逻辑型变量要用类型标识符逻辑型变量要用类型标识符bool来定义,它的值只能来定义,它的值只能是是true和和false之一。如之一。如bool foun

44、d,flag=false; /定义逻辑变量定义逻辑变量found和和flag,并使并使flag的初值为的初值为falsefound=true; /将逻辑常量将逻辑常量true赋给逻辑变量赋给逻辑变量found由于逻辑变量是用关键字由于逻辑变量是用关键字bool来定义的,因此又称为来定义的,因此又称为布尔变量。逻辑型常量又称为布尔常量。所谓逻辑型,布尔变量。逻辑型常量又称为布尔常量。所谓逻辑型,就是布尔型。就是布尔型。设立逻辑类型的目的是为了看程序时直观易懂。设立逻辑类型的目的是为了看程序时直观易懂。3.6.2 逻辑常量和逻辑变量逻辑常量和逻辑变量在编译系统处理逻辑型数据时,将在编译系统处理逻辑

45、型数据时,将false处理为处理为0,将,将true处理为处理为1。因此,逻辑型数据可以与数值型数据因此,逻辑型数据可以与数值型数据进行算术运算。进行算术运算。如果将一个非零的整数赋给逻辑型变量,则按如果将一个非零的整数赋给逻辑型变量,则按“真真”处理,如处理,如flag=123; /赋值后赋值后flag的值为的值为truecoutb) & (xy) 可写成可写成 ab & xy (a=b) | (x=y) 可写成可写成 a=b | x=y (!a) | (ab) 可写成可写成 !a | ab将两个关系表达式用逻辑运算符连接起来就成为一个将两个关系表达式用逻辑运算符连接起来就成为一个逻辑表达式

46、,上面几个式子就是逻辑表达式。逻辑表逻辑表达式,上面几个式子就是逻辑表达式。逻辑表达式的一般形式可以表示为达式的一般形式可以表示为表达式表达式 逻辑运算符逻辑运算符 表达式表达式逻辑表达式的值是一个逻辑量逻辑表达式的值是一个逻辑量“真真”或或“假假”。前面。前面已说明,在给出逻辑运算结果时,以数值已说明,在给出逻辑运算结果时,以数值1代表代表“真真”,以,以0代表代表“假假”,但在判断一个逻辑量是否为,但在判断一个逻辑量是否为“真真”时,采取的标准是:时,采取的标准是: 如果其值是如果其值是0就认为是就认为是“假假”,如果其值是非,如果其值是非0就认为是就认为是“真真”。例如:。例如:(1)

47、若若a=4,则则!a的值为的值为0。因为。因为a的值为非的值为非0,被认作,被认作“真真”,对它进行对它进行“非非”运算,得运算,得“假假”,“假假”以以0代表。代表。(2) 若若a=4,b=5,则则a & b的值为的值为1。因为。因为a和和b均为非均为非0,被认,被认为是为是“真真” 。(3) a,b值同前,值同前,a-b|a+b的值为的值为1。因为。因为a-b和和a+b的值都为非的值都为非零值。零值。(4) a,b值同前,值同前,!a | b的值为的值为1。(5) 4 & 0 | 2 的值为的值为1。在在C+中,整型数据可以出现在逻辑表达式中,在进中,整型数据可以出现在逻辑表达式中,在进行

48、逻辑运算时,根据整型数据的值是行逻辑运算时,根据整型数据的值是0或非或非0,把它作,把它作为逻辑量假或真,然后参加逻辑运算。为逻辑量假或真,然后参加逻辑运算。通过这几个例子可以看出:通过这几个例子可以看出: 逻辑运算结果不是逻辑运算结果不是0就是就是1,不可能是其他数值。而在逻辑表达式中作为参加,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是逻辑运算的运算对象可以是0(“假假”)或任何非)或任何非0的的数值(按数值(按“真真”对待)。如果在一个表达式中的不同对待)。如果在一个表达式中的不同位置上出现数值,应区分哪些是作为数值运算或关系位置上出现数值,应区分哪些是作为数值运算

49、或关系运算的对象,哪些作为逻辑运算的对象。运算的对象,哪些作为逻辑运算的对象。实际上,逻辑运算符两侧的表达式不但可以是关系表实际上,逻辑运算符两侧的表达式不但可以是关系表达式或整数达式或整数(0和非和非0),也可以是任何类型的数据,如,也可以是任何类型的数据,如字符型、浮点型或指针型等。系统最终以字符型、浮点型或指针型等。系统最终以0和非和非0来判来判定它们属于定它们属于“真真”或或“假假”。例如。例如c & 的的值为值为1。可以将表可以将表3.2改写成书中表改写成书中表3.3形式。形式。熟练掌握熟练掌握C+的关系运算符和逻辑运算符后,可以巧的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达

50、式来表示一个复杂的条件。例如,妙地用一个逻辑表达式来表示一个复杂的条件。例如,要判别某一年要判别某一年(year)是否为闰年。闰年的条件是符合是否为闰年。闰年的条件是符合下面两者之一:下面两者之一: 能被能被4整除,但不能被整除,但不能被100整除。整除。能被能被100整除,又能被整除,又能被400整除。例如整除。例如2004、 2000年是闰年,年是闰年,2005、 2100年不是闰年。年不是闰年。可以用一个逻辑表达式来表示:可以用一个逻辑表达式来表示:(year % 4 = 0 & year % 100 != 0) | year % 400 = 0 当给定当给定year为某一整数值时,如果

51、上述表达式值为真为某一整数值时,如果上述表达式值为真(1),则,则year为闰年;否则为闰年;否则year为非闰年。可以加一为非闰年。可以加一个个“!”用来判别非闰年:用来判别非闰年:!(year % 4 = 0 & year % 100 != 0) | year % 400 = 0)若表达式值为真若表达式值为真(1),year为非闰年。也可以用下面的为非闰年。也可以用下面的逻辑表达式判别非闰年:逻辑表达式判别非闰年:(year % 4 != 0) | (year % 100 = 0 & year % 400 !=0)若表达式值为真,若表达式值为真,year为非闰年。请注意表达式中右为非闰年。

52、请注意表达式中右面的括号内的不同运算符(面的括号内的不同运算符(%,!,&,=)的运算优先)的运算优先次序。次序。if语句是用来判定所给定的条件是否满足,根据判定语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。的结果(真或假)决定执行给出的两种操作之一。3.7 选择结构和语句选择结构和语句1. (表达式)语句(表达式)语句例如:例如:if(xy) coutxy) coutx;else cout500) cost=0.15;else if(number300) cost=0.10;else if(number100) cost=0.075;else if(

53、number50) cost=0.05;else cost=0;图图3.说明:说明:(1) 从图从图3.5和图和图3.6可以看到:可以看到: 3种形式的种形式的if语句都是语句都是由一个入口进来,经过对由一个入口进来,经过对“表达式表达式”的判断,分别执的判断,分别执行相应的语句,最后归到一个共同的出口。这种形式行相应的语句,最后归到一个共同的出口。这种形式的程序结构称为选择结构。在的程序结构称为选择结构。在C+中中if语句是实现选语句是实现选择结构主要的语句。择结构主要的语句。(2) 3种形式的种形式的if语句中在语句中在if后面都有一个用括号括起后面都有一个用括号括起来的表达式,它是程序编

54、写者要求程序判断的来的表达式,它是程序编写者要求程序判断的“条件条件”,一般是逻辑表达式或关系表达式。,一般是逻辑表达式或关系表达式。(3) 第第2、第、第3种形式的种形式的if语句中,在每个语句中,在每个else前面有一前面有一分号,整个语句结束处有一分号。分号,整个语句结束处有一分号。(4) 在在if和和else后面可以只含一个内嵌的操作语句(如后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号上例),也可以有多个操作语句,此时用花括号“”将几个语句括起来成为一个复合语句。将几个语句括起来成为一个复合语句。例例3.6 求三角形的面积。求三角形的面积。#includ

55、e #include /使用数学函数时要包含头文件使用数学函数时要包含头文件cmath#include /使用使用I/O流控制符要包含头文件流控制符要包含头文件iomanipusing namespace std;int main( ) double a,b,c; coutabc; if (a+bc & b+ca & c+ab) /复合语句开始复合语句开始 double s,area; /在复合语句内定义变量在复合语句内定义变量 s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); coutsetiosflags(ios fixed)setprecision(

56、4); /指定输出的数包含指定输出的数包含4位小数位小数 coutarea=areaendl; /在复合语句内输出局部变量的值在复合语句内输出局部变量的值 /复合语句结束复合语句结束else coutit is not a trilateral!b) max=a;else max=b;可以用条件运算符可以用条件运算符(? :)来处理:来处理:max=(ab)?a:b; 其中其中“(ab)?a:b”是一个是一个“条件表达式条件表达式”。它是这。它是这样执行的:如果样执行的:如果(ab)条件为真,则条件表达式的值条件为真,则条件表达式的值就取就取“?”后面的值,即条件表达式的值为,否则后面的值,即

57、条件表达式的值为,否则条件表达式的值为条件表达式的值为“:”后面的值,即后面的值,即b。3.8 条件运算符和条件表达式条件运算符和条件表达式条件运算符要求有条件运算符要求有3个操作对象,称三目(元)运算个操作对象,称三目(元)运算符,它是符,它是C+中惟一的一个三目运算符。条件表达式中惟一的一个三目运算符。条件表达式的一般形式为的一般形式为表达式表达式1 ? 表达式表达式2 表达式表达式3条件运算符的执行顺序是:先求解表达式条件运算符的执行顺序是:先求解表达式1,若为非,若为非0(真)则求解表达式(真)则求解表达式2,此时表达式的值就作为整,此时表达式的值就作为整个条件表达式的值。若表达式个条

58、件表达式的值。若表达式1的值为的值为0(假),则求(假),则求解表达式解表达式3,表达式,表达式3的值就是整个条件表达式的值。的值就是整个条件表达式的值。“max=(ab)?a:b” 的执行结果是将条件表达式的值的执行结果是将条件表达式的值赋给赋给max。也就是将也就是将a和和b二者中的大者赋给二者中的大者赋给max。条条件运算符优先于赋值运算符,因此上面赋值表达式的件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给求解过程是先求解条件表达式,再将它的值赋给max。条件表达式中,表达式条件表达式中,表达式1的类型可以与表达式的类型可以与表达式2和表达和表达

59、式式3的类型不同。如的类型不同。如x? a b如果已定义如果已定义x为整型变量,若为整型变量,若x=0,则条件表达式的则条件表达式的值为字符值为字符b的的ASCII码。表达式码。表达式2和表达式和表达式3的类的类型也可以不同,此时条件表达式的值的类型为二者中型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如有条件表达式较高的类型。如有条件表达式xy?1:1.5,如果如果xy,则条件表达式的值为则条件表达式的值为1.5,若,若xy,值应为值应为1,由于,由于C+把把1.5按双精度数处理,双精度的类型比整型高,按双精度数处理,双精度的类型比整型高,因此,将因此,将1转换成双精度数,以此作

60、为表达式的值。转换成双精度数,以此作为表达式的值。例例3.7 输入一个字符,判别它是否为大写字母,如果输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。输出最后得到的字符。#include using namespace std;int main( ) char ch; cinch; ch=(ch=A & ch=Z)?(ch+32):ch; /判别判别ch是否大写字母,是是否大写字母,是则转换则转换 coutchendl; return 0;switch语句是多分支选择语句,用来实现多分支选择

61、语句是多分支选择语句,用来实现多分支选择结构。结构。它的一般形式如下:它的一般形式如下:switch(表达式)表达式) case 常量表达式常量表达式1:语句:语句1 case 常量表达式常量表达式2:语句:语句2 . case 常量表达式常量表达式n:语句语句n default:语句语句n+1 3.9 多分支选择结构和多分支选择结构和switch 语句语句例如,要求按照考试成绩的等级打印出百分制分数段,例如,要求按照考试成绩的等级打印出百分制分数段,可以用可以用switch语句实现:语句实现:switch(grade) case A: cout85100n; case B: cout7084

62、n; case C: cout6069n; case D: cout60n; default : couterrorn; 说明:说明:(1) switch后面括号内的后面括号内的“表达式表达式”,允许为任何类,允许为任何类型。型。(2) 当当switch表达式的值与某一个表达式的值与某一个case子句中的常量子句中的常量表达式的值相匹配时,就执行此表达式的值相匹配时,就执行此case子句中的内嵌语子句中的内嵌语句,若所有的句,若所有的case子句中的常量表达式的值都不能与子句中的常量表达式的值都不能与switch表达式的值匹配,就执行表达式的值匹配,就执行default子句的内嵌语子句的内嵌语

63、句。句。(3) 每一个每一个case表达式的值必须互不相同,否则就会表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有两种出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。或多种执行方案)。(4) 各个各个case和和default的出现次序不影响执行结果。的出现次序不影响执行结果。例如,可以先出现例如,可以先出现“default:”,再出现再出现“case D:”,然后是然后是“case A:”。(5) 执行完一个执行完一个case子句后,流程控制转移到下一个子句后,流程控制转移到下一个case子句继续执行。子句继续执行。“case常量表达式常量表达式”

64、只是起语句只是起语句标号作用,并不是在该处进行条件判断。在执行标号作用,并不是在该处进行条件判断。在执行switch语句时,根据语句时,根据switch表达式的值找到与之匹配表达式的值找到与之匹配的的case子句,就从此子句,就从此case子句开始执行下去,不再进子句开始执行下去,不再进行判断。例如,上面的例子中,若行判断。例如,上面的例子中,若grade的值等于的值等于A,则将连续输出:则将连续输出: 85100 7084 6069 60 error因此,应该在执行一个因此,应该在执行一个case子句后,使流程跳出子句后,使流程跳出switch结构,即终止结构,即终止switch语句的执行。

65、可以用一个语句的执行。可以用一个break语句来达到此目的。将上面的语句来达到此目的。将上面的switch结构改写结构改写如下:如下:switch(grade) case A: cout85100n;break; case B: cout7084n;break; case C: cout6069n;break; case D: cout60n;break; default : couterrorn;break; 最后一个子句(最后一个子句(default)可以不加可以不加break语句。如果语句。如果grade的值为的值为B,则只输出则只输出“7084”。流程图见。流程图见图图3.7。图图3.

66、7在在case子句中虽然包含一个以上执行语句,但可以不子句中虽然包含一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本必用花括号括起来,会自动顺序执行本case子句中所子句中所有的执行语句。有的执行语句。(6) 多个多个case可以共用一组执行语句,如可以共用一组执行语句,如 . case A: case B: case C: cout60n; .当当grade的值为的值为A、B或或C时都执行同一组语时都执行同一组语句。句。例例3.8 编写程序,判断某一年是否为闰年。编写程序,判断某一年是否为闰年。#include using namespace std;int main( ) in

67、t year; bool leap; coutyear; /输入年份输入年份 if (year%4=0) /年份能被年份能被4整除整除 if(year%100=0) /年份能被年份能被4整除又能被整除又能被100整除整除 if (year%400=0) /年份能被年份能被4整除又能被整除又能被400整除整除 leap=true; /闰年,令闰年,令leap=true(真真) else leap=false; /非闰年,令非闰年,令leap=false(假假) else /年份能被年份能被4整除但不能被整除但不能被100整除肯定是闰年整除肯定是闰年 leap=true; /是闰年,令是闰年,令l

68、eap=true3.10 编写选择结构的程序编写选择结构的程序 else /年份不能被年份不能被4整除肯定不是闰年整除肯定不是闰年 leap=false; /若为非闰年,令若为非闰年,令leap=false if (leap) coutyear is ; /若若leap为真,就输出年份和为真,就输出年份和“是是” else coutyear is not ; /若若leap为真,就输出年份和为真,就输出年份和“不是不是” cout a leap year.endl; /输出输出“闰年闰年” return 0;运行情况如下:运行情况如下: 2005 2005 is not a leap year

69、. 1900 1900 is npt a leap year. 也可以将程序中第也可以将程序中第816行改写成以下的行改写成以下的if语句:语句:if(year%4!=0)leap=false;else if(year%100!=0)leap=true;else if(year400!=0)leap=false;elseleap=true;也可以用一个逻辑表达式包含所有的闰年条件,将上也可以用一个逻辑表达式包含所有的闰年条件,将上述述if语句用下面的语句用下面的if语句代替:语句代替:if(year%4 = 0 & year%100 !=0) | (year%400 = 0) leap=tru

70、e;else leap=false;例例3.9 运输公司对用户计算运费。路程运输公司对用户计算运费。路程(s)越远,每公越远,每公里运费越低。标准如下:里运费越低。标准如下: s250km 没有折扣没有折扣 250s500 2折扣折扣 500s1000 5折扣折扣 1000s2000 8折扣折扣 2000s3000 10折扣折扣 3000s 15折扣折扣设每公里每吨货物的基本运费为设每公里每吨货物的基本运费为p(price的缩写的缩写),货,货物重为物重为w(wright的缩写的缩写),距离为,折扣为,距离为,折扣为d(discount的缩写的缩写),则总运费,则总运费f(freight的缩写

71、的缩写)的计算的计算公式为公式为 f = p * w * s * (1 - d)图图3.8据此写出程序如下:据此写出程序如下: #include using namespace std;int main( )int c,s; float p,w,d,f; coutpws; if(s=3000) c=12; else c=s/250; switch (c) case 0:d=0;break; case 1:d=2;break; case 2: case 3:d=5;break; case 4: case 5: case 6: case 7:d=8;break; case 8: case 9: c

72、ase 10: case 11:d=10;break; case 12:d=15;break; f=p*w*s*(1-d/100.0); coutfreight=fendl; return 0;运行情况如下:运行情况如下:please enter p,w,s:100 20 300 freight=588000在人们所要处理的问题中常常遇到需要反复执行某一在人们所要处理的问题中常常遇到需要反复执行某一操作的情况。这就需要用到循环控制。许多应用程序操作的情况。这就需要用到循环控制。许多应用程序都包含循环。顺序结构、选择结构和循环结构是结构都包含循环。顺序结构、选择结构和循环结构是结构化程序设计的化

73、程序设计的3种基本结构,是各种复杂程序的基本种基本结构,是各种复杂程序的基本构造单元。因此程序设计者必须熟练掌握选择结构和构造单元。因此程序设计者必须熟练掌握选择结构和循环结构的概念及使用方法。循环结构的概念及使用方法。3.11 循环结构和循环语句循环结构和循环语句while语句的一般形式如下:语句的一般形式如下:while (表达式表达式) 语句语句其作用是:其作用是: 当指定的条件为真当指定的条件为真(表达式为非表达式为非0)时,执时,执行行while语句中的内嵌语句。其流程图见图语句中的内嵌语句。其流程图见图3.9。其特。其特点是:先判断表达式,后执行语句。点是:先判断表达式,后执行语句

74、。while循环称为循环称为当型循环。当型循环。图图3.93.11.1 用用while语句构成循环语句构成循环例例3.10 求求1+2+3+100。用流程图表示算法,见图用流程图表示算法,见图3.10。根据流程图写出程序:根据流程图写出程序:#include using namespace std;int main( )int i=1,sum=0; while (i=100) sum=sum+i; i+; coutsum=sumendl;运行结果为运行结果为sum=5050 图图3.10需要注意:需要注意:(1) 循环体如果包含一个以上的语句,应该用花括号循环体如果包含一个以上的语句,应该用花

75、括号括起来,以复合语句形式出现。如果不加花括号,则括起来,以复合语句形式出现。如果不加花括号,则while语句的范围只到语句的范围只到while后面第一个分号处。后面第一个分号处。(2) 在循环体中应有使循环趋向于结束的语句。在循环体中应有使循环趋向于结束的语句。do-while语句的特点是先执行循环体,然后判断循环语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为条件是否成立。其一般形式为do 语句语句 while (表达式表达式);它是这样执行的:先执行一次指定的语句它是这样执行的:先执行一次指定的语句(即循环体即循环体),然后判别表达式,当表达式的值为非零,然后判别表达式,

76、当表达式的值为非零(“真真”) 时,返回重新执行循环体语句,如此反复,直到表达时,返回重新执行循环体语句,如此反复,直到表达式的值等于式的值等于0为止,此时循环结束。可以用图为止,此时循环结束。可以用图3.11表表示其流程。示其流程。3.11.2 用用do-while语句构成循环语句构成循环 图图3.11 图图3.12例例3.11 用用do-while语句求语句求1+2+3+100。先画出流程图,见图先画出流程图,见图3.12。可编写出下面的程序:可编写出下面的程序: #include using namespace std;int main( )int i=1,sum=0; do sum=s

77、um+i; i+; while (i=100); coutsum=sumendl; return 0;运行结果与例运行结果与例3.10相同。相同。可以看到:对同一个问题可以用可以看到:对同一个问题可以用while语句处理,也语句处理,也可以用可以用dowhile语句处理。语句处理。dowhile语句结构语句结构可以转换成可以转换成while结构。图结构。图3.11可以改画成图可以改画成图3.13的形的形式,二者完全等价。而图式,二者完全等价。而图3.13中虚线框部分就是一个中虚线框部分就是一个while结构。结构。 图图3.13C+中的中的for语句使用最为广泛和灵活,不仅可以用语句使用最为广

78、泛和灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代不确定而只给出循环结束条件的情况,它完全可以代替替while语句。语句。for语句的一般格式为语句的一般格式为for(表达式表达式1;表达式;表达式2;表达式;表达式3) 语句语句它的执行过程如下:它的执行过程如下:(1) 先求解表达式先求解表达式1。(2) 求解表达式求解表达式2,若其值为真,若其值为真(值为非值为非0),则执行,则执行for语句中指定的内嵌语句,然后执行下面第语句中指定的内嵌语句,然后执行下面第(3)步。若步。若为假为

79、假(值为值为0),则结束循环,转到第,则结束循环,转到第(5)步。步。3.11.3 用用for语句构成循环语句构成循环(3) 求解表达式求解表达式3。(4) 转回上面第转回上面第(2)步骤继续执行。步骤继续执行。(5) 循环结束,执行循环结束,执行for语句下面的一个语句。语句下面的一个语句。可以用图可以用图3.14来表示来表示for语句的执行过程。语句的执行过程。 图图3.14for语句最简单的形式也是最容易理解的格式如下:语句最简单的形式也是最容易理解的格式如下:for(循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量增值) 语句语句 例如例如for(i=1;i=1

80、00;i+) sum=sum+i;它的执行过程与图它的执行过程与图3.10完全一样。它相当于以下语句:完全一样。它相当于以下语句: i=1; while(i=100) sum=sum+i; i+; 显然,用显然,用for语句简单、方便。语句简单、方便。for语句的使用有许多技巧,如果熟练地掌握和运用语句的使用有许多技巧,如果熟练地掌握和运用for语句,可以使程序精炼简洁。语句,可以使程序精炼简洁。说明:说明:(1) for语句的一般格式中的语句的一般格式中的“表达式表达式1”可以省略,此可以省略,此时应在时应在for语句之前给循环变量赋初值。语句之前给循环变量赋初值。(2) 如果表达式如果表达

81、式2省略,即不判断循环条件,循环无省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式终止地进行下去。也就是认为表达式2始终为真。始终为真。 (3) 表达式表达式3也可以省略,但此时程序设计者应另外也可以省略,但此时程序设计者应另外设法保证循环能正常结束。设法保证循环能正常结束。(4) 可以省略表达式可以省略表达式1和表达式和表达式3,只有表达式,只有表达式2,即,即只给循环条件。只给循环条件。(5) 3个表达式都可省略。个表达式都可省略。(6) 表达式表达式1可以是设置循环变量初值的赋值表达式,可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。也可以是与循环变

82、量无关的其他表达式。(7) 表达式一般是关系表达式表达式一般是关系表达式(如如i=100)或逻辑表达或逻辑表达式式(如如ab & xy),但也可以是数值表达式或字符但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。表达式,只要其值为非零,就执行循环体。C+中的中的for语句比其他语言中的循环语句功能强得语句比其他语言中的循环语句功能强得多。可以把循环体和一些与循环控制无关的操作也作多。可以把循环体和一些与循环控制无关的操作也作为表达式为表达式1或表达式或表达式3出现,这样程序可以短小简洁。出现,这样程序可以短小简洁。但过分地利用这一特点会使但过分地利用这一特点会使for语句显得杂

83、乱,可读语句显得杂乱,可读性降低,建议不要把与循环控制无关的内容放到性降低,建议不要把与循环控制无关的内容放到for语句中。语句中。(1) 3种循环都可以用来处理同一问题,一般情况下种循环都可以用来处理同一问题,一般情况下它们可以互相代替。它们可以互相代替。(2) while和和do-while循环,是在循环,是在while后面指定循环条后面指定循环条件的,在循环体中应包含使循环趋于结束的语句件的,在循环体中应包含使循环趋于结束的语句(如如i+,或或i=i+1等等)。 for循环可以在表达式循环可以在表达式3中包含使循环趋于结束的操中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表

84、达式作,甚至可以将循环体中的操作全部放到表达式3中。中。因此因此for语句的功能更强,凡用语句的功能更强,凡用while循环能完成的,循环能完成的,用用for循环都能实现。循环都能实现。(3) 用用while和和do-while循环时,循环变量初始化的操循环时,循环变量初始化的操作应在作应在while和和do-while语句之前完成。而语句之前完成。而for语句可语句可以在表达式以在表达式1中实现循环变量的初始化。中实现循环变量的初始化。3.11.4 几种循环的比较几种循环的比较一个循环体内又包含另一个完整的循环结构,称为循一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还

85、可以嵌套循环,这就是多环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。层循环。3种循环种循环(while循环、循环、dowhile循环和循环和for循环循环)可可以互相嵌套。例如,下面几种都是合法的形式:以互相嵌套。例如,下面几种都是合法的形式:(1) while( ) while( )3.12 循环的嵌套循环的嵌套(2) do dowhile( );while( );(3) for(;) for(;)(4) while( ) dowhile( ); (5) for(; ) while( ) (6) do for (;)while( );在在3.9节中已经介绍过用节中已经介绍过用brea

86、k语句可以使流程跳出语句可以使流程跳出switch结构,继续执行结构,继续执行switch语句下面的一个语句。语句下面的一个语句。实际上,实际上,break语句还可以用于循环体内。语句还可以用于循环体内。break语句的一般格式为语句的一般格式为break;其作用为使流程从循环体内跳出循环体,即提前结束其作用为使流程从循环体内跳出循环体,即提前结束循环,接着执行循环体下面的语句。循环,接着执行循环体下面的语句。break语句只能语句只能用于循环语句和用于循环语句和switch语句内,不能单独使用或用于语句内,不能单独使用或用于其他语句中。其他语句中。3.13 break语句和语句和contin

87、ue语句语句continue语句的一般格式为语句的一般格式为continue;其作用为结束本次循环,即跳过循环体中下面尚未执其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。行的语句,接着进行下一次是否执行循环的判定。continue语句和语句和break语句的区别是:语句的区别是:continue语句只语句只结束本次循环,而不是终止整个循环的执行。而结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循语句则是结束整个循环过程,不再判断执行循环的条件是否成立。如果有以下两个循环结构:环的条件是否成立。如果有以下两个

88、循环结构:(1) while(表达式表达式1) if(表达式表达式2)break (2) while(表达式表达式1 ) if(表达式表达式2) continue; 程序程序(1)的流程图如图的流程图如图3.18所示,而程序所示,而程序(2)的流程如的流程如图图3.19所示。请注意图所示。请注意图3.18和图和图3.19中当中当“表达式表达式2”为真时流程的转向。为真时流程的转向。 图图3.18 图图3.19例例3.12 用下面公式求用下面公式求的近似值。的近似值。/41-1/3+1/5-1/7+直到最后一项的绝对值小于直到最后一项的绝对值小于10-7为止。为止。根据给定的算法很容易编写程序如

89、下:根据给定的算法很容易编写程序如下:#include #include #include using namespace std;int main( )int s=1; double n=1,t=1,pi=0; while(fabs(t)1e-7) pi=pi+t; n=n+2;3.14 编写循环结构的程序编写循环结构的程序 s=-s; t=s/n; pi=pi*4; coutpi=setiosflags(ios fixed)setprecision(6)piendl;return 0;运行结果为运行结果为pi=3.141592注意:注意: 不要把不要把n定义为整型变量,否则在执行定义为整型

90、变量,否则在执行“t=s/n;”时,得到时,得到t的值为的值为0(原因是两个整数相除原因是两个整数相除)。例例3.13 求求Fibonacci数列前数列前40个数。这个数列有如下个数。这个数列有如下特点:第特点:第1、2个数为个数为1、1。从第。从第3个数开始,每个数个数开始,每个数是其前面两个数之和。即是其前面两个数之和。即F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n3)这是一个有趣的古典数学问题:有一对兔子,从出生这是一个有趣的古典数学问题:有一对兔子,从出生后第后第3个月起每个月都生一对兔子。小兔子长到第个月起每个月都生一对兔子。小兔子长到第3个个月后每个月又生

91、一对兔子。假设所有兔子都不死,问月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?每个月的兔子总数为多少?可以从书中表可以从书中表3.4看出兔子数的规律。看出兔子数的规律。根据给出的每月兔子总数的关系,可编写程序如下:根据给出的每月兔子总数的关系,可编写程序如下:#include #include using namespace std;int main( )long f1,f2; int i; f1=f2=1; for(i=1;i=20;i+) coutsetw(12)f1setw(12)f2; /设备输出字段宽度为设备输出字段宽度为12,每次输出两个数,每次输出两个数

92、if(i%2=0) coutendl;/每输出完每输出完4个数后换行,使每行输出个数后换行,使每行输出4个数个数 f1=f1+f2;/左边的左边的f1代表第代表第3个数,是第个数,是第1、2个数之和个数之和 f2=f2+f1;/左边的左边的f2代表第代表第4个数,是第个数,是第2、3个数之和个数之和 return 0; 例例3.14 找出找出100200间的全部素数。间的全部素数。编写程序如下:编写程序如下:#include #include #include using namespace std;int main( )int m,k,i,n=0; bool prime; /定义布尔变量定义

93、布尔变量prime for(m=101;m=200;m=m+2) /判别判别m是否为素数,是否为素数,m由由101变化到变化到200,增量为增量为2 prime=true; /循环开始时设循环开始时设prime为真,即先认为为真,即先认为m为素数为素数k=int(sqrt(m); /用用k代表根号代表根号m的整数部分的整数部分 for(i=2;i=k;i+) /此循环作用是将此循环作用是将m被被2根号根号m除,检查是否能整除,检查是否能整除除if(m%i=0) /如果能整除,表示如果能整除,表示m不是素数不是素数 prime=false; /使使prime变为假变为假break; /终止执行本

94、循环终止执行本循环 if (prime) /如果如果m为素数为素数 coutsetw(5)m; /输出素数输出素数m,字段宽度为字段宽度为5 n=n+1; /n用来累计输出素数的个数用来累计输出素数的个数 if(n%10=0) coutendl; /输出输出10个数后换行个数后换行 coutendl; /最后执行一次换行最后执行一次换行 return 0;例例3.15 译密码。为使电文保密,往往按一定规律将电译密码。为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。文转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母例如,可以

95、按以下规律将电文变成密码:将字母A变变成字母成字母E,a变成变成e,即变成其后的第即变成其后的第4个字母,个字母,W变变成成A,X变成变成B,Y变成变成C,Z变成变成D。见图见图3.20。字母。字母按上述规律转换,非字母字符不变。如按上述规律转换,非字母字符不变。如Wonderful!转换为转换为Asrhivjyp!。输入一行字输入一行字符,要求输出其相应的密码。符,要求输出其相应的密码。 图图3.20程序如下:程序如下:#include using namespace std;int main( )char c; while (c=getchar( )!=n) if(c=a & c=A & cZ & cz) c=c-26; coutc; coutZ| cz) c=c-26;因为所有小写字母都满足因为所有小写字母都满足“cZ”条件,从而也条件,从而也执行执行“c=c-26;”语句,这就会出错。因此必须限制其语句,这就会出错。因此必须限制其范围为范围为“cZ & cz & cz”即可。即可。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号