第3章 程序设计初步_第1页
第3章 程序设计初步_第2页
第3章 程序设计初步_第3页
第3章 程序设计初步_第4页
第3章 程序设计初步_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 第三章第三章 程序设计初步程序设计初步 3.1 基于过程的程序设计和算法基于过程的程序设计和算法 3.2 C+的程序结构和语句的程序结构和语句 3.3 赋值操作赋值操作 3.4 C+的输入与输出的输入与输出 3.5 编写顺序结构的程序编写顺序结构的程序 3.6 关系运算和逻辑运算关系运算和逻辑运算 3.7 选择结构和选择结构和if语句语句 3.8 循环结构和循环语句循环结构和循环语句 2 3.1 基于过程的程序设计和算法基于过程的程序设计和算法 在基于过程的程序设计中在基于过程的程序设计中,程序设计者必须指定程序设计者必须指定 计算机执行的具体步骤计算机执行的具体步骤,程序设计者不仅要考虑

2、程序程序设计者不仅要考虑程序 要要“做什么做什么”,还要解决还要解决“怎么做怎么做”的问题的问题,根据程序根据程序 要要“做什么做什么”的要求的要求,写出一个个语句写出一个个语句,安排好它们的安排好它们的 执行顺序执行顺序 怎样设计这些步骤怎样设计这些步骤,怎样保证它的正确性和具有怎样保证它的正确性和具有 较高的效率较高的效率,这就是算法需要解决的问题这就是算法需要解决的问题 3 3.1.1 算法的概念算法的概念 一个面向过程的程序应包括以下两方面内容一个面向过程的程序应包括以下两方面内容: l(1) 对数据的描述对数据的描述 在程序中要指定数据的类型在程序中要指定数据的类型 和数据的组织形式

3、和数据的组织形式,即数据结构即数据结构 l(2) 对操作的描述对操作的描述 即操作步骤即操作步骤,也就是算法。也就是算法。 l对于面向过程的程序对于面向过程的程序,可以用下面的公式表示可以用下面的公式表示: 程序程序=算法算法+数据结构数据结构 4 l不要认为只有不要认为只有“计算计算”的问题才有算法的问题才有算法 广义地说广义地说, 为解决一个问题而采取的方法和步骤为解决一个问题而采取的方法和步骤,就称为就称为“算法算法” l计算机算法可分为两大类别计算机算法可分为两大类别:数值算法和非数值算法数值算法和非数值算法 数值算法的目的是求数值解数值算法的目的是求数值解 非数值算法包括的面非数值算

4、法包括的面 十分广泛十分广泛,最常见的是用于事务管理领域最常见的是用于事务管理领域 目前目前,计算计算 机在非数值方面的应用远远超过了在数值方面的应用机在非数值方面的应用远远超过了在数值方面的应用 lC+既支持面向过程的程序设计既支持面向过程的程序设计,又支持面向对象的又支持面向对象的 程序设计程序设计 无论面向过程的程序设计还是面向对象的无论面向过程的程序设计还是面向对象的 程序设计程序设计,都离不开算法设计都离不开算法设计 5 3.1.2 算法的表示算法的表示 l1. 自然语言自然语言 用中文或英文等自然语言描述算法用中文或英文等自然语言描述算法 但容易产但容易产 生歧义性生歧义性,在程序

5、设计中一般不用自然语言表示算在程序设计中一般不用自然语言表示算 法法 l2. 流程图流程图 可以用传统的流程图或结构化流程图可以用传统的流程图或结构化流程图 用图的用图的 形式表示算法形式表示算法,比较形象直观比较形象直观,但修改算法时显得不但修改算法时显得不 大方便大方便 l3. 伪代码伪代码 伪代码是用介于自然语言和计算机语言之间的伪代码是用介于自然语言和计算机语言之间的 文字和符号来描述算法文字和符号来描述算法 如如 6 if x is positive then print x else print-x l用伪代码写算法并无固定的用伪代码写算法并无固定的 严格的语法规则严格的语法规则,

6、只需只需 把意思表达清楚把意思表达清楚,并且书写的格式要写成清晰易读的并且书写的格式要写成清晰易读的 形式形式 它不用图形符号它不用图形符号,因此书写方便因此书写方便 格式紧凑格式紧凑,容容 易修改易修改,便于向计算机语言算法便于向计算机语言算法(即程序即程序)过渡过渡 l4. 用计算机语言表示算法用计算机语言表示算法 用一种计算机语言去描述算法用一种计算机语言去描述算法,这就是计算机程这就是计算机程 序序 教材中常用的:教材中常用的:流程图和计算机语言流程图和计算机语言 7 3.2 C+的程序结构和语句的程序结构和语句 由第由第1章已知章已知,一个程序包含一个或多个程序单位一个程序包含一个或

7、多个程序单位 (每个程序单位构成一个程序文件每个程序单位构成一个程序文件) 每一个程序单位每一个程序单位 由以下几个部分组成由以下几个部分组成: l(1) 预处理命令预处理命令 如如#include命令和命令和#define命令命令 l(2)全局声明全局声明 例如对数据类型和函数的声明例如对数据类型和函数的声明,以及对以及对 变量的定义变量的定义 l(3) 函数函数 包括函数首部和函数体包括函数首部和函数体,在函数体中可以包在函数体中可以包 含若干声明语句和执行语句含若干声明语句和执行语句 8 #include /预处理命令预处理命令 using namespace std; /在函数之外的声

8、明部分在函数之外的声明部分 int a=3; /在函数之外的声明部分在函数之外的声明部分 int main( )/函数首部函数首部 float b;/函数内的声明部分函数内的声明部分 b=4.5; /执行语句执行语句 coutab;/执行语句执行语句 return 0; /执行语句执行语句 9 10 C+语句可以分为以下语句可以分为以下4种种: l1. 声明语句声明语句 如如int a,b; 在在C语言中语言中,只有产生实际操作的才称为语句只有产生实际操作的才称为语句,对变对变 量的定义不作为语句量的定义不作为语句,而且要求对变量的定义必须出现而且要求对变量的定义必须出现 在本块中所有程序语句

9、之前在本块中所有程序语句之前 因此因此C程序员已经养成了程序员已经养成了 一个习惯一个习惯: 在函数或块的开头位置定义全部变量在函数或块的开头位置定义全部变量 在在C+中中,对变量对变量(以及其他对象以及其他对象)的定义被认为是一的定义被认为是一 条语句条语句,并且可以出现在函数中的任何行并且可以出现在函数中的任何行,即可以放在其即可以放在其 他程序语句可以出现的地方他程序语句可以出现的地方,也可以放在函数之外也可以放在函数之外 11 2. 执行语句执行语句 通知计算机完成一定的操作通知计算机完成一定的操作 执行语句包括执行语句包括: (1) 控制语句控制语句,完成一定的控制功能完成一定的控制

10、功能 C+有有9种控制语种控制语 句句,即即 if( )else (条件语句条件语句) for( ) (循环语句循环语句) while( ) (循环语句循环语句) dowhile( ) (循环语句循环语句) continue(结束本次循环语句结束本次循环语句) break(中止执行中止执行switch或循环语句或循环语句) switch (多分支选择语句多分支选择语句) goto (转向语句转向语句) return (从函数返回语句从函数返回语句) 12 (2) 函数和流对象调用语句函数和流对象调用语句 函数调用语句由一次函数调用语句由一次 函数调用加一个分号构成一个语句函数调用加一个分号构成

11、一个语句,例如例如: sort(x,y,z);/假设已定义了假设已定义了sort函数函数,它有它有3个参数个参数 coutx100) z=z-100; cout0) cout00) cout0endl; l因为在因为在if的条件中不能包含赋值语句的条件中不能包含赋值语句 C+把赋值把赋值 语句和赋值表达式区别开来语句和赋值表达式区别开来,增加了表达式的种类增加了表达式的种类, 能实现其他语言中难以实现的功能能实现其他语言中难以实现的功能 16 3.4 C+的输入与输出的输入与输出 l输入和输出并不是输入和输出并不是C+语言中的正式组成成分语言中的正式组成成分 C和和 C+本身都没有为输入和输出

12、提供专门的语句结构本身都没有为输入和输出提供专门的语句结构 输入输出不是由输入输出不是由C+本身定义的本身定义的,而是在编译系统而是在编译系统 提供的提供的I/O库中定义的库中定义的 lC+的输出和输入是用的输出和输入是用“流流”(stream)的方式实现的方式实现 的的 17 有关流对象有关流对象cin cout和流运算符的定义等信息是存放和流运算符的定义等信息是存放 在在C+的输入输出流库中的的输入输出流库中的,因此如果在程序中使用因此如果在程序中使用 cin cout和流运算符和流运算符,就必须使用预处理命令把头文件就必须使用预处理命令把头文件 stream包含到本文件中包含到本文件中:

13、 #include C+通过流进行输出的过程通过流进行输出的过程 C+通过流进行输入的过程通过流进行输入的过程 18 *3.4.1 输入流与输出流的基本操作输入流与输出流的基本操作 lcout语句的一般格式为语句的一般格式为 cout表达式表达式1表达式表达式2变量变量1变量变量2变量变量n; l在定义流对象时在定义流对象时,系统会在内存中开辟一段缓冲区系统会在内存中开辟一段缓冲区,用来用来 暂存输入输出流的数据暂存输入输出流的数据 在执行在执行cout语句时语句时,先把插入先把插入 的数据顺序存放在输出缓冲区中的数据顺序存放在输出缓冲区中,直到输出缓冲区满或直到输出缓冲区满或 遇到遇到cou

14、t语句中的语句中的endl(或或n,ends,flush)为止为止,此时将此时将 缓冲区中已有的数据一起输出缓冲区中已有的数据一起输出,并清空缓冲区并清空缓冲区 输出流输出流 中的数据在系统默认的设备中的数据在系统默认的设备(一般为显示器一般为显示器)输出输出 19 一个一个cout语句可以分写成若干行语句可以分写成若干行 如如 coutThis is a simple C+ program.endl; 可以写成可以写成 coutThis is /注意行末尾无分号注意行末尾无分号 a C+ program. endl; /语句最后有分号语句最后有分号 也可写成也可写成多个多个cout语句语句,

15、即即 coutThis is ; /语句末尾有分号语句末尾有分号 cout a C+ ; cout program.; coutendl; 20 注意注意 不能用一个插入运算符不能用一个插入运算符“”插入多个输出项插入多个输出项: couta,b,c; /错误错误,不能一次插入多项不能一次插入多项 couta+b+c; /正确正确,这是一个表达式这是一个表达式. 作为一项在用作为一项在用cout输出时输出时,用户不必通知计算机按何用户不必通知计算机按何 种类型输出种类型输出,系统会自动判别输出数据的类型系统会自动判别输出数据的类型,使输使输 出的数据按相应的类型输出出的数据按相应的类型输出 如

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

17、c1,c2; int a; float b; cinc1c2ab; coutc1,c2,a,bendl; 如果输入如果输入 1234 56.78 也可以按下面格式输入也可以按下面格式输入: 1 2 34 56.78 (在在1和和2之间有空格之间有空格) 输出如下输出如下:1,2,34,56.78 输出同上输出同上 23 注意:注意: 不能用不能用cin语句把空格字符和回车换行符作为字符输语句把空格字符和回车换行符作为字符输 入给字符变量入给字符变量,它们将被跳过它们将被跳过 如果想将空格字符或回车换行符如果想将空格字符或回车换行符(或任何其他键盘上的字或任何其他键盘上的字 符符)输入给字符变量

18、输入给字符变量,可以用可以用getchar函数(函数(3.4.3节介绍)节介绍) 在组织输入流数据时在组织输入流数据时,要仔细分析要仔细分析cin语句中变量的类型语句中变量的类型, 按照相应的格式输入按照相应的格式输入,否则容易出错否则容易出错 24 *3.4.2 在输入流与输出流中使用控制符在输入流与输出流中使用控制符 l上面介绍的是使用上面介绍的是使用cout和和cin时的默认格式时的默认格式 但但 有时人们在输入输出时有一些特殊的要求有时人们在输入输出时有一些特殊的要求,如在输如在输 出实数时规定字段宽度出实数时规定字段宽度,只保留两位小数只保留两位小数,数据向数据向 左或向右对齐等左或

19、向右对齐等 C+提供了在输入输出流中使提供了在输入输出流中使 用的控制符用的控制符(有的书中称为操纵符有的书中称为操纵符),见书中表见书中表3.1 l需要注意的是需要注意的是: 如果使用了控制符如果使用了控制符,在程序单位的在程序单位的 开头除了要加开头除了要加iostream头文件外头文件外,还要加还要加iomanip 头文件头文件 25 浮点数输出举例:浮点数输出举例: double a=123.456789012345;对对a赋初值赋初值 (1) couta; 输出输出: 123.456或或123.457 (2) coutsetprecision(9)a; 输出输出: 123.45678

20、9 (3) coutsetiosflags(ios fixed)setprecision(8)a; 输出输出: 123.45678901 (4) coutsetiosflags(ios scientific)a; 输出输出: 1.234568e+002 (5)coutsetiosflags(ios scientific)setprecision(4)a; 输出输出: 1.2346e+002 注意四舍五入问题,注意四舍五入问题,vc6为后者为后者 26 整数输出举例整数输出举例: int b=123456;对对b赋初值赋初值 (1) coutb; 输出输出: 123456 (2) coutset

21、w(10)b,b; 输出输出: 123456,123456 设置相同宽度设置相同宽度 右对齐右对齐 精度相同精度相同 综合使用综合使用 27 如果在多个如果在多个cout语句中使用相同的语句中使用相同的setw(n), setiosflags(ios right), 可以实现各行数据右对齐。可以实现各行数据右对齐。 使用如果指定相同的精度使用如果指定相同的精度,可以实现上下小数点对齐可以实现上下小数点对齐 例例3.1 各行小数点对齐各行小数点对齐 #include #include using namespace std; int main( ) double a=123.456,b=3.14

22、159,c=-3214.67; coutsetiosflags(ios:fixed)setiosflags(ios:right)setprecision(2); coutsetw(10)aendl; coutsetw(10)bendl; coutsetw(10)cendl; return 0; 输出如下输出如下: 123.46 3.14 -3214.67 统一设置定点形式输出统一设置定点形式输出 取两位小数取两位小数 右对齐右对齐 这些设置对其后的输出均这些设置对其后的输出均 有效有效(除非重新设置除非重新设置),而而setw只对其后只对其后 一个输出项有效一个输出项有效,因此必须在输出因此必

23、须在输出 a,b,c之前都要写之前都要写setw(10) 28 3.4.3 用用getchar和和putchar 函数进行字符的输入和输出函数进行字符的输入和输出 C+还保留了还保留了C语言中用于输入和输出单个字符的函数语言中用于输入和输出单个字符的函数,使使 用很方便用很方便 其中最常用的有其中最常用的有getchar函数和函数和putchar函数函数 1. putchar函数函数(字符输出函数字符输出函数) putchar函数的作用是向终端输出一个字符函数的作用是向终端输出一个字符 例如例如 putchar(c); 它输出字符变量它输出字符变量c的值的值 29 例例3.2 输出单个字符输出

24、单个字符 #include using namespace std; int main( ) char a,b,c; a=B;b=O;c=Y; putchar(a);putchar(b);putchar(c);putchar(n); putchar(66);putchar(79);putchar(89);putchar(10); return 0; 运行结果为运行结果为 BOY BOY 30 putchar(101) (输出字符输出字符A,八进制的八进制的101是是A的的ASCII码码) putchar() (输出单引号字符输出单引号字符) putchar(015) (输出回车输出回车,不换行

25、不换行,使输出的当前位置移到本行开头使输出的当前位置移到本行开头) 31 2. getchar函数函数(字符输入函数字符输入函数) 此函数的作用是从终端此函数的作用是从终端(或系统隐含指定的输入设备或系统隐含指定的输入设备)输入一输入一 个字符个字符 getchar函数没有参数函数没有参数, 函数的值就是从输入设备得函数的值就是从输入设备得 到的字符到的字符 例例3.3 输入单个字符输入单个字符 #include using namespace std; int main( ) char c; c=getchar( ); putchar(c+32); putchar(n); return 0;

26、 在运行时在运行时,如果从键盘输入大写字如果从键盘输入大写字 母母A并按回车键并按回车键,就会在屏幕上输就会在屏幕上输 出小写字母出小写字母a 32 请注意请注意,getchar( )只能接收一个字符只能接收一个字符 getchar函数得到的字符可以赋给一个字符变量或整型函数得到的字符可以赋给一个字符变量或整型 变量变量,也可以不赋给任何变量也可以不赋给任何变量,作为表达式的一部分作为表达式的一部分 例例3.3中的:中的: char c; c=getchar( ); putchar(c+32); putchar(n); 可以用下面程序行代替可以用下面程序行代替: putchar(getchar

27、()+32); putchar(n); 此时不必定义变量此时不必定义变量c 33 假设:假设: char c; 思考下面代码行的功能:思考下面代码行的功能:(输入时敲入输入时敲入A) (1)cout(c=getchar( ); (2)cout(c=getchar( )+32); 可以看到用可以看到用putchar和和getchar函数输出和输入字符十函数输出和输入字符十 分灵活方便分灵活方便,由于它们是函数所以可以出现在表达式中。由于它们是函数所以可以出现在表达式中。 输出输出A 输出输出a 34 3.4.4 用用scanf和和printf函数进行输入和输出函数进行输入和输出 不做要求不做要求

28、 35 3.5 编写顺序结构的程序编写顺序结构的程序 例例3.5 求一元二次方程式求一元二次方程式ax2+bx+c=0的根的根 a,b,c的值在运行时由键盘输入的值在运行时由键盘输入,它们的值满足它们的值满足b2-4ac0 #include #include /由于程序要用到数学函数由于程序要用到数学函数sqrt using namespace std; int main( ) 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=

29、x2endl; return 0; 运行结果如下运行结果如下: 4.5 8.8 2.4 x1=-0.327612 x2=-1.17794 36 3.6 关系运算和逻辑运算关系运算和逻辑运算 往往要求根据某个指定的条件是否满足来决定执往往要求根据某个指定的条件是否满足来决定执 行的内容行的内容 例如例如,购物在购物在1000元以下的打九五折元以下的打九五折,1000元及以元及以 上的打九折上的打九折 C+提供提供if语句来实现这种条件选择语句来实现这种条件选择 /amount代表购物总额代表购物总额,tax代表折扣代表折扣 /pay为实付款为实付款 if (amount1000 ) tax=0.

30、95; else tax=0.9; pay=amount*tax; 37 3.6.1 关系运算和关系表达式关系运算和关系表达式 上面上面if语句中的语句中的“amount1000”实现的不是算术运算实现的不是算术运算, 而是关系运算而是关系运算 实际上是比较运算实际上是比较运算,将两个数据进行比将两个数据进行比 较较,判断比较的结果判断比较的结果 “amount”是一个比较符是一个比较符,称为关系运算符称为关系运算符 C+的关系运算符有的关系运算符有: (小于小于) (大于大于) = (大于或等于大于或等于) = (等于等于) != (不等于不等于) 优先级相同优先级相同 (高高) 优先级相同

31、优先级相同 (低低) 38 关于优先次序关于优先次序: 前前4种关系运算符种关系运算符(,=)的优先级别相同的优先级别相同, 后两种也相同后两种也相同 前前4种高于后两种种高于后两种 例如例如,“”优先于优先于 “=” 而而“”与与“a+b 等效于等效于 c(a+b) ab=c等效于等效于(ab)=c a=bc等效于等效于a=(bc 等效于等效于a=(bc) 用关系运算符将两个表达式连接起来的式子用关系运算符将两个表达式连接起来的式子,称为称为 关系表达式关系表达式 39 关系表达式的一般形式可以表示为关系表达式的一般形式可以表示为 表达式表达式 关系运算符关系运算符 表达式表达式 其中的其中

32、的“表达式表达式”可以是算术表达式或关系表达式可以是算术表达式或关系表达式 逻辑表达式逻辑表达式 赋值表达式赋值表达式 字符表达式字符表达式 例如例如,下面都是合法的关系表达式下面都是合法的关系表达式: ab, a+bb+c,(a=3)(b=5), ab)(b=0”的值为的值为“真真” 在在C和和C+中都用数值中都用数值1代表代表“真真”,用用0代表代表“假假” 如果有以下赋值表达式如果有以下赋值表达式: d=ab 则则d得到的值为得到的值为1 f=abc f得到的值为得到的值为0 40 3.6.2 逻辑常量和逻辑变量逻辑常量和逻辑变量 C+中提供了逻辑型数据中提供了逻辑型数据 逻辑型常量只有

33、两个逻辑型常量只有两个,即即false(假假)和和true(真真) 逻辑型变量要用类型标识符逻辑型变量要用类型标识符bool来定义来定义,它的值只能是它的值只能是 true和和false之一之一 如如 bool found,flag=false; found=true; 由于逻辑变量是用由于逻辑变量是用关键字关键字bool来定义来定义的的,因此又称为因此又称为 布尔变量布尔变量 逻辑型常量又称为布尔常量逻辑型常量又称为布尔常量 设立逻辑类型的目的是为了看程序时直观易懂设立逻辑类型的目的是为了看程序时直观易懂 41 在编译系统处理逻辑型数据时在编译系统处理逻辑型数据时,将将false处理为处理为

34、0,将将true 处理为处理为1 因此因此,逻辑型数据可以与数值型数据进行算术运算逻辑型数据可以与数值型数据进行算术运算 如果将一个非零的整数赋给逻辑型变量如果将一个非零的整数赋给逻辑型变量,则按则按“真真”处理。处理。 如:如: flag=123; /赋值后赋值后flag的值为的值为true cout 算术运算符算术运算符 关系运算符关系运算符 else cout500) cost=0.15; else if(number300) cost=0.10; else if(number100) cost=0.075; else if(number50) cost=0.05; else cost=

35、0; 对应流程图对应流程图 50 说明说明: (1) 3种形式的种形式的if语句都是由一个入口进来语句都是由一个入口进来,经过对经过对“表达表达 式式”的判断的判断,分别执行相应的语句分别执行相应的语句,最后归到一个共同最后归到一个共同 的出口的出口 这种形式的程序结构称为选择结构这种形式的程序结构称为选择结构 在在C+ 中中if语句是实现选择结构主要的语句语句是实现选择结构主要的语句 (2) 3种形式的种形式的if语句中在语句中在if后面都有一个用括号括起来的表后面都有一个用括号括起来的表 达式达式,它是程序编写者要求程序判断的它是程序编写者要求程序判断的“条件条件”,一般是一般是 逻辑表达

36、式或关系表达式逻辑表达式或关系表达式 (3) 第第2 第第3种形式的种形式的if语句中语句中,在每个在每个else前面有一分号前面有一分号,整整 个语句结束处有一分号个语句结束处有一分号 (4) 在在if和和else后面可以只含一个内嵌的操作语句后面可以只含一个内嵌的操作语句(如上例如上例),也也 可以可以有多个操作语句有多个操作语句,此时用花括号此时用花括号“”将几个语句括将几个语句括 起来成为一个复合语句起来成为一个复合语句 51 例例3.6 求三角形的面积求三角形的面积 #include #include /使用数学函数时要包含头文件使用数学函数时要包含头文件cmath #include

37、 /使用使用I/O流控制符要包含头文件流控制符要包含头文件iomanip using namespace std; int main( ) double a,b,c; coutabc; if (a+bc /在复合语句内定义变量在复合语句内定义变量 s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); coutsetiosflags(ios fixed)setprecision(4); coutarea=areaendl; /复合语句结束复合语句结束 else coutit is not a trilateral!b) max=a; else max=b; 可以

38、用条件运算符可以用条件运算符(? :)来处理来处理: max=(ab)?a:b; 56 条件运算符要求有条件运算符要求有3个操作对象个操作对象,称三目称三目(元元)运算符运算符, 它是它是C+中惟一的一个三目运算符中惟一的一个三目运算符 条件表达式的一般形式为条件表达式的一般形式为 表达式表达式1 ? 表达式表达式2 表达式表达式3 条件运算符的条件运算符的执行顺序是执行顺序是:先求解表达式先求解表达式1,若为非若为非0(真真) 则求解表达式则求解表达式2,此时表达式此时表达式2的值就作为整个条件表达的值就作为整个条件表达 式的值式的值 若表达式若表达式1的值为的值为0(假假),则求解表达式则

39、求解表达式3,表达式表达式3 的值就是整个条件表达式的值的值就是整个条件表达式的值 “max=(ab)?a:b” 的执行结果是将条件表达式的值赋给的执行结果是将条件表达式的值赋给 max 也就是将也就是将a和和b二者中的大者赋给二者中的大者赋给max (条件运算符条件运算符 优先于赋值运算符优先于赋值运算符) 57 例例3.7 输入一个字符输入一个字符,判别它是否为大写字母判别它是否为大写字母,如果是如果是, 将它转换成小写字母将它转换成小写字母;如果不是如果不是,不转换不转换 然后输出最然后输出最 后得到的字符后得到的字符 #include using namespace std; int

40、main( ) char ch; cinch; ch=(ch=A /判别判别ch是否大写字母是否大写字母,是则转换是则转换 coutchendl; return 0; 58 3.7.4 多分支选择结构和多分支选择结构和switch 语句语句 switch语句是多分支选择语句语句是多分支选择语句,用来实现多分支用来实现多分支 选择结构选择结构 它的一般形式如下它的一般形式如下: switch(表达式表达式) case 常量表达式常量表达式1:语句语句1 case 常量表达式常量表达式2:语句语句2 . case 常量表达式常量表达式n:语句语句n default:语句语句n+1 59 例如例如,

41、要求按照考试成绩的等级打印出百分制分数段。要求按照考试成绩的等级打印出百分制分数段。 switch(grade) case A: cout85100n; case B: cout7084n; case C: cout6069n; case D: cout60n; default: couterrorn; 说明说明: (1) switch后面括号内的后面括号内的“表达式表达式”,可以为整型类型或字符类型可以为整型类型或字符类型 (2) 当当switch表达式的值表达式的值与某一个与某一个case子句中的常量表达式的值子句中的常量表达式的值 相匹配时相匹配时,就执行此就执行此case子句中的内嵌语

42、句子句中的内嵌语句,若所有的若所有的case子句子句 中的常量表达式的值都不能与中的常量表达式的值都不能与switch表达式的值匹配表达式的值匹配,就执行就执行 default子句的内嵌语句子句的内嵌语句 60 (3) 每一个每一个case表达式的值必须互不相同表达式的值必须互不相同,否则就会否则就会 出现互相矛盾的现象出现互相矛盾的现象(对表达式的同一个值对表达式的同一个值,有两种有两种 或多种执行方案或多种执行方案) (4) 各个各个case和和default的出现次序不影响执行结果的出现次序不影响执行结果 例如例如, 可以先出现可以先出现“default:”,再出现再出现“case D:

43、”,然后是然后是 “case A:” (5) 执行完一个执行完一个case子句后子句后,流程控制转移到下一个流程控制转移到下一个case子子 句继续执行句继续执行 “case常量表达式常量表达式”只是起语句标号作用只是起语句标号作用, 并不是在该处进行条件判断并不是在该处进行条件判断 在执行在执行switch语句时语句时,根据根据 switch表达式的值找到与之匹配的表达式的值找到与之匹配的case子句子句,就从此就从此 case子句开始执行下去子句开始执行下去,不再进行判断不再进行判断 61 switch(grade) case A: cout85100n; case B: cout7084

44、n; case C: cout6069n; case D: cout60n; default: couterrorn; 若若grade的值等于的值等于A,则则 将连续输出将连续输出: 85100 7084 6069 60 error 62 因此因此,应该在执行一个应该在执行一个case子句后子句后,使流程跳出使流程跳出switch 结构结构,即终止即终止switch语句的执行语句的执行 可以用一个可以用一个break 语句语句来达到此目的来达到此目的 将上面的将上面的switch结构改写如下结构改写如下: switch(grade) case A: cout85100n;break; case

45、 B: cout7084n;break; case C: cout6069n;break; case D: cout60n;break; default: couterrorn;break; 在在case子句中虽然子句中虽然 包含一个以上执包含一个以上执 行语句行语句,但可以不但可以不 必用花括号括起必用花括号括起 来来,会自动顺序执会自动顺序执 行本行本case子句中所子句中所 有的执行语句有的执行语句 63 (6) 多个多个case可以共用一组执行语句可以共用一组执行语句,如如 . case A: case B: case C: cout60n;break; . 当当grade的值为的值为

46、A B或或C时都执行同一组语句时都执行同一组语句 64 3.7.5 编写选择结构的程序编写选择结构的程序 例例3.8 编写程序编写程序,判断某一年是否为闰年判断某一年是否为闰年 int main( ) int year; bool leap; coutyear; /输入年份输入年份 if (year%4=0) if(year%100=0) if (year%400=0)/年份能被年份能被400整除整除 leap=true; /闰年闰年 else leap=false; /非闰年非闰年 else /年份能被年份能被4整除但不能被整除但不能被100整除肯定是闰年整除肯定是闰年 leap=true;

47、 /是闰年是闰年,令令leap=true else /年份不能被年份不能被4整除肯定不是闰年整除肯定不是闰年 leap=false; 运行情况如下运行情况如下: 2005 2005 is not a leap year. 1900 1900 is a leap year. 2004 2004 is a leap year. if (leap) coutyear is ; else coutyear is not ; cout a leap year.endl; return 0; 65 也可以用一个逻辑表达式包含所有的闰年条件也可以用一个逻辑表达式包含所有的闰年条件, 将上述将上述if语句用下

48、面的语句用下面的if语句代替语句代替: if(year%4 = 0 else leap=false; 66 例例3.9 运输公司对用户计算运费运输公司对用户计算运费 路程路程(s)越远越远,每公里每公里 运费越低运费越低 标准如下标准如下: s250km 没有折扣没有折扣 250s500 2%折扣折扣 500s1000 5%折扣折扣 1000s2000 8%折扣折扣 2000s3000 10%折扣折扣 3000s 15%折扣折扣 设每公里每吨货物的基本运费为设每公里每吨货物的基本运费为p(price的缩写的缩写),货物重为货物重为 w(wright的缩写的缩写),距离为距离为s,折扣为折扣为d

49、(discount的缩写的缩写),则则 总运费总运费f(freight的缩写的缩写)的计算公式为的计算公式为 f = p * w * s * (1 - d) 67 #include using namespace std; int main( ) int c,s; float p,w,d,f; coutpws; if(s=3000) c=12; else c=s/250; 68 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

50、=8;break; case 8: case 9: case 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 69 3.8 循环结构和循环语句循环结构和循环语句 在人们所要处理的问题中常常遇到需要反复执行某一在人们所要处理的问题中常常遇到需要反复执行某一 操作的情况操作的情况 这就需要用到循环控制这就需要用到循环控制 许多应用程许多应用

51、程 序都包含循环序都包含循环 顺序结构顺序结构 选择结构和循环结构是结构化程序设计的选择结构和循环结构是结构化程序设计的 3种基本结构种基本结构,是各种复杂程序的基本构造单元是各种复杂程序的基本构造单元 因因 此程序设计者必须熟练掌握选择结构和循环结构的此程序设计者必须熟练掌握选择结构和循环结构的 概念及使用方法概念及使用方法 70 3.8.1 用用while语句构成循环语句构成循环 while语句的一般形式如下语句的一般形式如下: while (表达式表达式) 语句语句 其作用是其作用是: 当指定的条件为真当指定的条件为真(表表 达式为非达式为非0)时时,执行执行while语句语句 中的内嵌

52、语句中的内嵌语句 其特点是其特点是:先判断表达式先判断表达式,后执行后执行 语句语句 while循环称为当型循环循环称为当型循环 while语句对应的流程图语句对应的流程图 71 例例3.10 求求1+2+3+100 用流程图表示的算法用流程图表示的算法 #include using namespace std; int main( ) int i=1,sum=0; while (i=100) sum=sum+i; i+; coutsum=sumendl; 运行结果为运行结果为 sum=5050 72 需要注意需要注意: (1) 循环体如果包含一个以上的语句循环体如果包含一个以上的语句,应该用

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

54、(即循环体即循环体),然然 后判别表达式后判别表达式,当表达式的值为非零当表达式的值为非零(“真真”) 时时,返回返回 重新执行循环体语句重新执行循环体语句,如此反复如此反复,直到表达式的值等于直到表达式的值等于 0为止为止,此时循环结束此时循环结束 74 do 语句语句 while (表达式表达式); do-while语句对应的流程图语句对应的流程图 75 例例3.11 用用do-while语句求语句求 1+2+3+100 先画出流程图先画出流程图,见图见图3.12 #include using namespace std; int main( ) int i=1,sum=0; do sum

55、=sum+i; i+; while (i=100); coutsum=sumendl; return 0; 76 3.8.3 用用for语句构成循环语句构成循环 C+中的中的for语句使用最为广泛和灵活语句使用最为广泛和灵活,不仅可不仅可 以用于循环次数已经确定的情况以用于循环次数已经确定的情况,而且可以而且可以 用于循环次数不确定而只给出循环结束条用于循环次数不确定而只给出循环结束条 件的情况件的情况,它完全可以代替它完全可以代替while语句语句 for语句的一般格式为语句的一般格式为 for(表达式表达式1;表达式表达式2;表达式表达式3) 语句语句 它的执行过程如下它的执行过程如下:

56、(1) 先求解表达式先求解表达式1 (2) 求解表达式求解表达式2,若其值为真若其值为真(值为非值为非0),则执则执 行行for语句中指定的内嵌语句语句中指定的内嵌语句,然后执行下然后执行下 面第面第(3)步步 若为假若为假(值为值为0),则结束循环则结束循环,转转 到第到第(5)步步 (3) 求解表达式求解表达式3 (4) 转回上面第转回上面第(2)步骤继续执行步骤继续执行 (5) 循环结束循环结束,执行执行for语句下面的一个语句语句下面的一个语句 for语句对应的流程图语句对应的流程图 77 for语句最简单的形式也是最容易理解的格式如下语句最简单的形式也是最容易理解的格式如下: for

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

58、值语句之前给循环变量赋初值 i=1; for(;i=100;i+) sum=sum+i; (2) 如果表达式如果表达式2省略省略,即不判断循环条件即不判断循环条件,循环无终止地进循环无终止地进 行下去行下去 也就是认为表达式也就是认为表达式2始终为真始终为真 for(i=1; ;i+) sum=sum+i; 相当于:相当于: int i=1,sum=0; while (1) sum=sum+i; i+; (3) 表达式表达式3也可以省略也可以省略,但此时程序设计者但此时程序设计者 应另外设法保证循环能正常结束应另外设法保证循环能正常结束 for (i=1;i=100;) sum=sum+i;

59、i+; (4) 可以省略表达式可以省略表达式1和表达式和表达式3,只有表达式只有表达式2,即只即只 给循环条件给循环条件 for (;i=100;) sum=sum+i; i+; 79 (5) 表达式表达式2一般是关系表达式一般是关系表达式(如如i=100)或或 逻辑表达式逻辑表达式(如如ab (c=getchar()!=n;i+=c) ; 语句语句2:for(;(c=getchar()!=n;) coutc; 80 空语句空语句 循环体内完成的语句循环体内完成的语句 运行结果: Computer Computer 81 C+中的中的for语句比其他语言中的循环语句功能强得多语句比其他语言中的

60、循环语句功能强得多 可以把循环体和一些与循环控制无关的操作也作可以把循环体和一些与循环控制无关的操作也作 为表达式为表达式1或表达式或表达式3出现出现,这样程序可以短小简洁这样程序可以短小简洁 但过分地利用这一特点会使但过分地利用这一特点会使for语句显得杂乱语句显得杂乱,可读性可读性 降低降低,建议不要把与循环控制无关的内容放到建议不要把与循环控制无关的内容放到for语语 句中句中 82 3.8.4 循环的嵌套循环的嵌套 一个循环体内又包含另一个完整的循环结构一个循环体内又包含另一个完整的循环结构,称为循称为循 环的嵌套环的嵌套 内嵌的循环中还可以嵌套循环内嵌的循环中还可以嵌套循环,这就是多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论