第4章控制结程序设计_第1页
第4章控制结程序设计_第2页
第4章控制结程序设计_第3页
第4章控制结程序设计_第4页
第4章控制结程序设计_第5页
已阅读5页,还剩151页未读 继续免费阅读

下载本文档

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

文档简介

1、 现实问题总是复杂的,面对各种需要解决现实问题总是复杂的,面对各种需要解决的问题,人们必须首先对各类问题进行分的问题,人们必须首先对各类问题进行分析,确定解决问题的方法和步骤即算法,析,确定解决问题的方法和步骤即算法,再借助具体编程语言编制好一组让计算机再借助具体编程语言编制好一组让计算机执行的指令(即程序),让计算机按人们执行的指令(即程序),让计算机按人们指定的步骤有效地工作。指定的步骤有效地工作。 根据算法,依据某种编程语言的语法规则根据算法,依据某种编程语言的语法规则编写计算机执行的命令序列,就是程序设编写计算机执行的命令序列,就是程序设计。计。 著名计算机科学家沃思(著名计算机科学家

2、沃思(nikiklaus wirth)提出了一个公式:提出了一个公式:“数据结构算法程数据结构算法程序序”,即程序设计包括算法设计和数据存,即程序设计包括算法设计和数据存储。除此之外,还有结构化程序设计方法储。除此之外,还有结构化程序设计方法和计算机语言。和计算机语言。 问题的提出问题的提出 闰年问题:闰年问题:一年一年12个月,共个月,共365天,这是我天,这是我们说得最多的。但事实上,每年不完全是们说得最多的。但事实上,每年不完全是365天。在中国农历中有闰月的说法,而公天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,历也有闰年的说法。一般情况下,2月是月是28天,而闰年时

3、是天,而闰年时是29天,何年的天,何年的2月是月是29天呢,天呢,这就是闰年问题。编程判断一个年份是否这就是闰年问题。编程判断一个年份是否为闰年。为闰年。 求根问题:编程求解一元二次方程的根。求根问题:编程求解一元二次方程的根。本章内容本章内容l 算法的基础知识算法的基础知识 l 大小写字母转换问题大小写字母转换问题 顺序结构程序的概念顺序结构程序的概念 字符数据的输入输出字符数据的输入输出l 闰年问题闰年问题 选择结构程序的概念选择结构程序的概念 if语句语句 switch语句语句 l 统计多名学生成绩问题统计多名学生成绩问题 循环结构程序的概念循环结构程序的概念 自增自减运算符与逗号表达式

4、自增自减运算符与逗号表达式 while循环循环 dowhile循环循环 for循环循环 嵌套循环嵌套循环 l 应用实例应用实例4.1 算法的基础知识算法的基础知识 算法是灵魂,是问题求解过程中的精确描算法是灵魂,是问题求解过程中的精确描述;数据结构是加工对象;语言是工具;述;数据结构是加工对象;语言是工具;编程需要采用合适的方法。编程需要采用合适的方法。 算法:是对特定问题求解步骤的一种描述。算法:是对特定问题求解步骤的一种描述。程序:是用具体的计算机语言来描述算法程序:是用具体的计算机语言来描述算法的代码,可以输入计算机并产生结果。的代码,可以输入计算机并产生结果。常用算法常用算法 递推化算

5、法递推化算法(牛顿迭代法、二分法、梯形法、穷举法等牛顿迭代法、二分法、梯形法、穷举法等); 排序算法排序算法(选择法、冒泡法选择法、冒泡法); 查找算法查找算法(顺序查找、折半查找顺序查找、折半查找); 有序数列的插入、删除操作;有序数列的插入、删除操作; 存储区的动态分配与释放,单向线性链表的建立、查找、存储区的动态分配与释放,单向线性链表的建立、查找、插入、删除操作;插入、删除操作; 初等数论问题求解的有关算法初等数论问题求解的有关算法(最大公约数、最小公倍数、最大公约数、最小公倍数、素数等素数等); 递归算法递归算法(求最大公约数、阶乘等求最大公约数、阶乘等); 字符串的处理字符串的处理

6、(字符和字符串的插入、删除、字符串的连字符和字符串的插入、删除、字符串的连接、比较等接、比较等)。 算法的五个特性算法的五个特性 有穷性:对任何合法的输入值,算法中每个步骤由计算有穷性:对任何合法的输入值,算法中每个步骤由计算机执行的次数及时间都是有限的。机执行的次数及时间都是有限的。 确定性:算法中每个步骤含义明确,无二义性。在任何确定性:算法中每个步骤含义明确,无二义性。在任何条件下,相同的输入,必有相同的输出。条件下,相同的输入,必有相同的输出。 可行性:算法中描述的操作都可通过有限次的基本运算可行性:算法中描述的操作都可通过有限次的基本运算来实现。来实现。 输入:一个算法应具有零个或多

7、个输入。输入:一个算法应具有零个或多个输入。 (无输入情况:如求:无输入情况:如求:1*2*3*4*5)。 输出:一个算法应具有一个或多个输入。输出:一个算法应具有一个或多个输入。算法的设计目标算法的设计目标正确性:设计的算法应当满足具有输入、输出和加工处理等明确的无歧义正确性:设计的算法应当满足具有输入、输出和加工处理等明确的无歧义 性的描述的具体问题的需求。验证正确性通常有性的描述的具体问题的需求。验证正确性通常有4 4个层次:个层次: 程序不含语法错误;程序不含语法错误; 程序对于几组输入数据能够得出满足规格说明要求的结果;程序对于几组输入数据能够得出满足规格说明要求的结果; 程序对于精

8、心选择的典型、苛刻而带有刁难性的几组输入数程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据据 能够得出满足规格说明要求的结果;能够得出满足规格说明要求的结果; 程序对于一切合法的输入数据能够得出满足规格说明要求的程序对于一切合法的输入数据能够得出满足规格说明要求的结结 果。果。 一般情况至少通过第一般情况至少通过第层的验证。层的验证。 可读性:算法主要是为了阅读与交流,其次才是机器执行。可读性好有助可读性:算法主要是为了阅读与交流,其次才是机器执行。可读性好有助 于人对算法的理解;难懂的程序易于隐藏较多错误,难以调试于人对算法的理解;难懂的程序易于隐藏较多错误,难以调试和和 修改。修改。

9、 健状性:当输入非法数据时,算法也能适当地做出反应或进行处理,而不健状性:当输入非法数据时,算法也能适当地做出反应或进行处理,而不 会产生莫名其妙的输出结果。会产生莫名其妙的输出结果。效率与低存储量的需求:主要指算法执行时的最长时间与所需的最大存储效率与低存储量的需求:主要指算法执行时的最长时间与所需的最大存储 空间。空间。算法的描述方法算法的描述方法 自然语言自然语言 流程图流程图 n-s图图 pad图图 伪代码伪代码用自然语言表示算法用自然语言表示算法 自然语言就是人们日常使用的语言,可以自然语言就是人们日常使用的语言,可以是汉语、英语或其他语言。用自然语言表是汉语、英语或其他语言。用自然

10、语言表示通俗易懂,但文字冗长,容易出现示通俗易懂,但文字冗长,容易出现“歧歧义性义性”。除了简单问题外,一般不用自然。除了简单问题外,一般不用自然语言描述算法。例如:语言描述算法。例如: 【例【例4-1】输入三个数,然后输出其中最大】输入三个数,然后输出其中最大的数。的数。 (1) 输入输入a,b,c。 (2) 若若a b,则,则max=a;否则;否则max=b。 (3) 若若c max,则,则max=c。 (4) 输出输出max,max即为最大数。即为最大数。例:用自然语言写出求例:用自然语言写出求 1-1/2+1/3-1/4+1/99-1/100 的算法。的算法。1001991.41312

11、11(1 1)sign=1 /sign=1 /* * 数值的符号数值的符号 * */ /(2 2)sum=1 /sum=1 /* * 累加和累加和 * */ /(3 3)deno=2 /deno=2 /* * 分母值分母值 * */ /(4 4)sign=(-1)sign=(-1)* *signsign(5 5)term=signterm=sign* *(1/deno) /(1/deno) /* * 某一项的值某一项的值* */ /(6 6)sum=sum+termsum=sum+term(7 7)deno=deno+1denojij输出输出maxmaxkmaxkmaxmax=imax=ima

12、x=jmax=jmax=kmax=k结束结束y yn ny yn n流程图举例流程图举例用流程图表示出求用流程图表示出求1001991.4131211的算法。的算法。开始1 = sign1 = sum2 = denoadeno+1 = deno(-1)*sign = signsign*(1/deno) = termsum+term = sumdeno100nyab结束打印打印sumb算法的描述算法的描述n-s图图 既然用基本结构的顺序组合可以表示任何复杂的算法结构,那么,基本既然用基本结构的顺序组合可以表示任何复杂的算法结构,那么,基本结构之间的流程线就属多余的了。结构之间的流程线就属多余的了

13、。19731973年美国两学者年美国两学者i.nassii.nassi和和b.shneidermanb.shneiderman提出了一种新的流程图形式,并以他们的名字命名为提出了一种新的流程图形式,并以他们的名字命名为n ns s结构结构化流程图。这种流程图完全去掉了带箭头的流程线,全部算法写在一个矩形化流程图。这种流程图完全去掉了带箭头的流程线,全部算法写在一个矩形框内,在该框内还可以包括其他的从属于它的框,即由一些基本的框组成一框内,在该框内还可以包括其他的从属于它的框,即由一些基本的框组成一个大框。这种个大框。这种n ns s流程图十分适合结构化程序设计,因而很受欢迎。流程图十分适合结构

14、化程序设计,因而很受欢迎。三种基本结构对应的三种基本结构对应的n ns s图符号图符号: a b当当p成立成立a直到直到p成立成立aab成立成立不成立不成立p顺序结构顺序结构 选择结构选择结构 当当(while)型循环结构型循环结构 直到直到(until)型循环结构型循环结构输入输入i i、j j、k k输出输出maxmaxy yy yn nn nijijkmaxkmaxmax=imax=imax=jmax=jmax=kmax=k例例4-4 用用n 素数是指除了素数是指除了1和该数本身和该数本身之外,不能被其他任何整数整之外,不能被其他任何整数整除的数。除的数。 实际上,若要判断一个正整实际上

15、,若要判断一个正整数数m是否为素数,只要将是否为素数,只要将2到到 间的每一个整数去除间的每一个整数去除m,若有一,若有一个能整除个能整除m,则,则m不是素数,若不是素数,若其间的所有整数都不能整除其间的所有整数都不能整除m,则则m为素数。为素数。读入读入mk= mi=2当当i km被被i整除整除真真假假用用break结束循环结束循环i=i+1i k+1真真假假输出输出:m”是素数是素数” 输出输出:m”不是素数不是素数” m算法的描述算法的描述pad图图ab顺序结构的padwhileaa)b)untila循环结构的pad选择结构的padc)abcdi1i2i3i4i=b)paba)papad

16、pad(problem analysis diagramproblem analysis diagram),是近年来在软件开发中被广泛使用的),是近年来在软件开发中被广泛使用的一种算法的图形表示法,与前面介绍的流程图、一种算法的图形表示法,与前面介绍的流程图、n-sn-s图相比,流程图、图相比,流程图、n-sn-s图都是自上而下的顺序描述,而图都是自上而下的顺序描述,而padpad图除了自上而下以外,还有自左向右的图除了自上而下以外,还有自左向右的展开,所以,如果说流程图、展开,所以,如果说流程图、n-sn-s图是一维的算法描述的话,则图是一维的算法描述的话,则padpad图就是图就是二维的,

17、它能展现算法的层次结构,更直观易懂。二维的,它能展现算法的层次结构,更直观易懂。padpad图表示的三种基本结构如下所示:图表示的三种基本结构如下所示:例:求三个数的最大值的例:求三个数的最大值的pad图图max=imax=imax=jmax=jmax=kmax=k输入输入i i、j j、k k输出输出maxmaxijijkmaxkmax算法的描述算法的描述伪代码伪代码 用流程图、用流程图、n-sn-s图、图、padpad图等描述算法,直观易懂,但绘制比较麻烦,在图等描述算法,直观易懂,但绘制比较麻烦,在设计一个算法时,可能要反复修改,而修改流程图是比较麻烦的,因此,流设计一个算法时,可能要反

18、复修改,而修改流程图是比较麻烦的,因此,流程图适合表示算法,但在设计算法过程中使用不是很理想。为了设计算法方程图适合表示算法,但在设计算法过程中使用不是很理想。为了设计算法方便,常使用伪代码工具。便,常使用伪代码工具。 伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。伪代码不用图形符号,书写方便,格式紧凑,便于向计算机语言算法过渡。伪代码不用图形符号,书写方便,格式紧凑,便于向计算机语言算法过渡。因此,实际中常用伪代码描述算法。因此,实际中常用伪代码描述算法。例:求三个数的最大值的伪代码算法描述如下:例:求三个数的最大

19、值的伪代码算法描述如下:l定义三个变量定义三个变量i i、j j、k k,用来存放三个数,定义变量,用来存放三个数,定义变量maxmax存放最大值;存放最大值;l输入三个变量的值;输入三个变量的值;lmax=ij?i:jmax=ij?i:j;lmax=maxk?max:kmax=maxk?max:k;l输出输出maxmax。例:用自然语言写出求例:用自然语言写出求 1-1/2+1/3-1/4+1/99-1/100 的算法。的算法。1001991.4131211(1 1)sign=1 /sign=1 /* * 数值的符号数值的符号 * */ /(2 2)sum=1 /sum=1 /* * 累加和

20、累加和 * */ /(3 3)deno=2 /deno=2 /* * 分母值分母值 * */ /(4 4)sign=(-1)sign=(-1)* *signsign(5 5)term=signterm=sign* *(1/deno) /(1/deno) /* * 某一项的值某一项的值* */ /(6 6)sum=sum+termsum=sum+term(7 7)deno=deno+1deno=deno+1(8 8)若)若deno100deno100返回第返回第(4)(4)步,否则转第步,否则转第(9)(9)步步(9 9)输出)输出sumsum算法的描述算法的描述计算机语言计算机语言 用计算机语

21、言表示算法实际上就是计算机程序。用计算机语言表示算法用计算机语言表示算法实际上就是计算机程序。用计算机语言表示算法必须严格遵守所使用的语言的语法规则。必须严格遵守所使用的语言的语法规则。例:用例:用c c语言表示求三个数的最大值的算法如下:语言表示求三个数的最大值的算法如下:#include #include void main()void main() int i, j, k, max; / int i, j, k, max; /* * 定义变量定义变量 * */ / printf(i, j, k=?n); / printf(i, j, k=?n); /* * 提示信息提示信息 * */ /

22、 scanf(%4d%4d%4d, &i, &j, &k); / scanf(%4d%4d%4d, &i, &j, &k); /* * 输入函数输入函数 * */ / max=ij?i:j; / max=ij?i:j; /* * 求两数的最大值求两数的最大值 * */ / max=maxk?max:k; max=maxk?max:k; printf(the maxmum value of the 3 data is %dn, max); / printf(the maxmum value of the 3 data is %dn, max); /

23、* *输出输出* */ / 在计算机中,有时不区分大小写字母,而在计算机中,有时不区分大小写字母,而且很多高级语言也不区分大小写字母,但且很多高级语言也不区分大小写字母,但是在程序中,如果需要判断字母是否一致是在程序中,如果需要判断字母是否一致时,则必须使用一种标准,这时就必须将时,则必须使用一种标准,这时就必须将大写字母转换成小写字母,或将小写字母大写字母转换成小写字母,或将小写字母转换成大写字母。转换成大写字母。问题的提出问题的提出 从键盘输入一个小写字母,要求在屏幕上从键盘输入一个小写字母,要求在屏幕上输出对应的大写字母。输出对应的大写字母。问题的分析问题的分析 首先输入一个字母(可能是

24、大写字母,也首先输入一个字母(可能是大写字母,也可能是小写字母);然后将输入的字母转可能是小写字母);然后将输入的字母转换成大写字母,从字母的换成大写字母,从字母的ascii码可知,大码可知,大写字母的写字母的ascii码值比小写字母码值比小写字母ascii码值码值小小32,因此,小写字母,因此,小写字母ascii码值减码值减32就就是大写字母;最后输出大写字母即可。是大写字母;最后输出大写字母即可。 这里涉及到字符数据的输入输出问题。这里涉及到字符数据的输入输出问题。回顾回顾 #include void main() char a,b; a=x; b=y; a=a-32; /* char与与

25、int数据间可进行算术运算数据间可进行算术运算 */ b=b-32; printf(%c,%cn%d,%dn,a,b,a,b); 如何从键盘输入字符呢如何从键盘输入字符呢?标准字符输出函数标准字符输出函数 格式:格式: putchar( c ) putchar( c ) 、 putch( c )putch( c ) 参数:参数参数:参数c c为字符常量、字符或整型变量、表达式为字符常量、字符或整型变量、表达式 功能:把字符功能:把字符c c输出到标准输出设备输出到标准输出设备( (即显示器即显示器) )上上 返回值:正常返回,为显示字符的代码值;若出错,返回为返回值:正常返回,为显示字符的代码

26、值;若出错,返回为eof(eof(即即-1)-1)说明:说明: 此函数只能输出单个字符数据。此函数只能输出单个字符数据。 参数参数c c可以是字符常量、转义字符、字符变量、整型常量、可以是字符常量、转义字符、字符变量、整型常量、整型变量。整型变量。 从功能角度来看,从功能角度来看,printf()printf()函数使用函数使用%c%c完全可以代替完全可以代替putchar()putchar()函数和函数和putch()putch()函数。函数。 putchar()putchar()函数和函数和putch()putch()函数的功能完全一样。函数的功能完全一样。 该函数在该函数在stdio.h

27、stdio.h中声明。中声明。标准字符输入函数标准字符输入函数 格式:格式: getchar( ) 、getch( )、getche( ) 功能:从标准的输入设备(如键盘)读一个字符功能:从标准的输入设备(如键盘)读一个字符 返回值:正常,返回读取的字符代码值;若出错,返回为返回值:正常,返回读取的字符代码值;若出错,返回为eof(eof(即即-1)-1)说明:说明: getchar()getchar()函数、函数、getch()getch()函数、函数、getche()getche()函数,都只能接受一个字符。函数,都只能接受一个字符。 getchar()getchar()函数在输入一个或若

28、干个字符后,必须以回车键结束,否则字函数在输入一个或若干个字符后,必须以回车键结束,否则字符不被输入。但只有第一个字符被接受。并且在屏幕上回显全部输入的字符。符不被输入。但只有第一个字符被接受。并且在屏幕上回显全部输入的字符。 getch()getch()和和getche()getche()函数在输入一个字符后,立即被函数接受,不用回车函数在输入一个字符后,立即被函数接受,不用回车键。使用键。使用getch()getch()接受字符时,屏幕上不回显原输入的字符。使用接受字符时,屏幕上不回显原输入的字符。使用getche()getche()接接受字符时,要显示原输入的字符。受字符时,要显示原输入

29、的字符。 利用回显和不回显的特点利用回显和不回显的特点, getch(), getch()和和getche()getche()这两个函数经常用于交互这两个函数经常用于交互输入的过程中完成暂停等功能。输入的过程中完成暂停等功能。 从功能角度来看,从功能角度来看,scanf()scanf()函数使用函数使用%c%c完全可以代替完全可以代替getchar()getchar()、getch()getch()和和getche()getche()函数。函数。 该函数在该函数在stdio.hstdio.h中声明。中声明。例例4-5 问题的实现问题的实现/ /* *li4_5.cli4_5.c* */ /#i

30、nclude #include void main()void main() char c1,c2; char c1,c2; c1=getchar(); / c1=getchar(); /* * 输入小写字母输入小写字母 * */ / printf(%c,%dn,c1,c1); printf(%c,%dn,c1,c1); c2=c1-32; / c2=c1-32; /* * 转变为大写字母转变为大写字母* */ / printf(%c,%dn,c2,c2); / printf(%c,%dn,c2,c2); /* * 输出输出 * */ / 输入字输入字符符不同数据之不同数据之间的运算间的运算同

31、一数据不同一数据不同的输出方同的输出方式式顺序结构程序顺序结构程序 通常的计算机程序总是由若干条语句组成,通常的计算机程序总是由若干条语句组成,从执行方式上看,从第一条语句到最后一从执行方式上看,从第一条语句到最后一条语句完全按顺序执行,就是简单的顺序条语句完全按顺序执行,就是简单的顺序结构。前面我们所编写的程序都是顺序结结构。前面我们所编写的程序都是顺序结构程序。构程序。举一反三举一反三例例4-74-7:鸡兔同笼问题。已知鸡兔总头数为:鸡兔同笼问题。已知鸡兔总头数为h h,总脚数为,总脚数为f f,求鸡兔,求鸡兔各有多少只?各有多少只?【分析】【分析】设鸡有设鸡有x x只,兔有只,兔有y y

32、只,则有方程成立:只,则有方程成立: x+y=h (1)x+y=h (1) 2x+4y=f (2) 2x+4y=f (2)解上述解上述(1)(2)(1)(2)式方程组有解:式方程组有解: x=(4h-f)/2x=(4h-f)/2 y=(f-2h)/2 y=(f-2h)/2本例只需要输入总脚数本例只需要输入总脚数f f、总头数、总头数h h即可求出。需要用到即可求出。需要用到scanf()scanf()和和printf()printf()库函数。库函数。例例4-74-7程序程序/ /* *li4_7.cli4_7.c* */ /#include #include void main(void)v

33、oid main(void) int h,f,x,y; int h,f,x,y; scanf(%d,%d, &h,&f); / scanf(%d,%d, &h,&f); /* * 输入鸡兔总头数输入鸡兔总头数h h,总脚数,总脚数f f * */ / x=(4 x=(4* *h-f)/2; /h-f)/2; /* * 计算鸡的只数计算鸡的只数 * */ / y=(f-2 y=(f-2* *h)/2; /h)/2; /* * 计算兔的只数计算兔的只数 * */ / printf(chicken=%d,rabbit=%dn,x,y); / printf(chicke

34、n=%d,rabbit=%dn,x,y); /* * 输出鸡兔只数输出鸡兔只数 * */ / 为什么没有用显示转换数为什么没有用显示转换数据,或据,或x=(4*h-f)/2.0的形式?的形式?例例4-9:求:求ax2+bx+c=0方程的根方程的根x1=p+q x1=p+q , x2=p-qx2=p-q,x1=x1= -b+ b-b+ b2 2- 4ac- 4ac2a2ax2= x2= -b- b-b- b2 2- 4ac- 4ac2a2a令令2a2ap =p =-b-bb b2 2- 4ac- 4ac2a2aq =q =【分析】【分析】只要保证只要保证b*b-4*a*c大于等于大于等于0,该方

35、程就有实根。,该方程就有实根。/*li4_9.c*/#include #include void main() float a,b,c,disc,p,q,x1,x2; printf(please enter the coefficients a,b,c:); scanf(%f%f%f,&a,&b,&c); /* 输入输入a,b,c */ disc=b*b-4*a*c; /* 计算判别式计算判别式 */ p=-b/(2*a); q=sqrt(disc)/(2*a); x1=p+q; x2=p-q; /* 计算方程的计算方程的2个根个根 */ printf(x1=%fnx2

36、=%fn,x1,x2); /* 输出输出x1和和x2 */问题:如果问题:如果discdiscb b* *b-4b-4* *a a* *c c的值小于的值小于0 0呢?呢? 以上都是顺序结构程序。以上都是顺序结构程序。 问题:问题:如果如果discb*b-4*a*c的值小于的值小于0呢?呢? 如果要判断,那么要用到选择结构程序。如果要判断,那么要用到选择结构程序。选择结构程序选择结构程序 若在程序执行过程当中,根据用户的输入若在程序执行过程当中,根据用户的输入或中间结果去执行若干不同的任务则为选或中间结果去执行若干不同的任务则为选择结构程序。择结构程序。 c提供了一系列的分支语句来实现选择结构

37、提供了一系列的分支语句来实现选择结构程序设计。程序设计。分支语句分支语句 if语句语句 if-else语句语句 if-else if语句语句 switch语句语句if 语句语句“if (表达式表达式) 语句语句”形式形式 语句格式的一般形式为:语句格式的一般形式为: if (表达式表达式) 语句语句;注意:注意:ifif后面的后面的“表达式表达式”一般用于表示一个条一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。达式、字符型表达式等。 格式中的格式中的“语句语句”,可以只包含一个简单语句,也可以是复合语句。可以只包含一

38、个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号如果是复合语句,必须用一对花括号将语句括将语句括起来。如果只有一条语句,则可不用起来。如果只有一条语句,则可不用括起来。括起来。例:例:if (xy) printf(“%d”,x);语句语句表达式表达式ab真真(非非0)假假(0)语句语句真真假假表达式表达式语句功能:执行此语句时,先求表达语句功能:执行此语句时,先求表达式的值,若其值为式的值,若其值为“真真”,则执行语句;若,则执行语句;若其值为其值为“假假”,则在,则在ifif结构体内什么也不执结构体内什么也不执行。而程序直接去执行行。而程序直接去执行ifif语句后面的语句。语句

39、后面的语句。例例4-9程序程序/*li4_9_1.c*/#include #include void main() float a,b,c,disc,p,q,x1,x2; scanf(%f%f%f,&a,&b,&c); disc=b*b-4*a*c; if(disc=0) p=-b/(2*a); q=sqrt(disc)/(2*a); x1=p+q; x2=p-q; printf(x1=%fnx2=%fn,x1,x2); if( ) else 语句语句语句格式的一般形式为:语句格式的一般形式为: if (表达式表达式) 语句语句1; else 语句语句2;注意:注意:i

40、fif后面的后面的“表达式表达式”一般用于表示一个条一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。达式、字符型表达式等。 格式中的格式中的“语句语句”,可以只包含一个简单语句,也可以是复合语句。可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号如果是复合语句,必须用一对花括号将语句括将语句括起来。如果只有一条语句,则可不用起来。如果只有一条语句,则可不用括起来。括起来。语句语句1 语句语句2真真假假表达式表达式语句语句1语句语句2表达式表达式b真真(非非0)假假(0)语句功能:执行此语句时,先

41、求表达式语句功能:执行此语句时,先求表达式的值,若其值为的值,若其值为“真真”,则执行语句,则执行语句1 1;若其;若其值为值为“假假”,则执行语句,则执行语句2 2。最后程序跳出。最后程序跳出ifif语句执行后面的语句。语句执行后面的语句。例:例:if (xy) max=x; else max=y;例例4-9程序程序/*li4_9_2.c*/#include #include void main() float a,b,c,disc,p,q,x1,x2; scanf(%f%f%f,&a,&b,&c); disc=b*b-4*a*c; if(disc=0) p=-b/(

42、2*a); q=sqrt(disc)/(2*a); x1=p+q; x2=p-q; printf(x1=%fnx2=%fn,x1,x2); else printf(“no real root!”); if (表达式表达式) 语句语句1; else 语句语句2; 由于语句由于语句1或语句或语句2可以是各种形式的语句,可以是各种形式的语句,当然也可以是分支语句,因此分支语句可当然也可以是分支语句,因此分支语句可以嵌套。以嵌套。 例例4-9程序程序/*li4_9_3.c*/#include #include void main() float a,b,c,disc,p,q,x1,x2; scanf(

43、%f%f%f,&a,&b,&c); if(a!=0) disc=b*b-4*a*c; if(disc=0) p=-b/(2*a); q=sqrt(disc)/(2*a); if(disc=0) printf(“x1=x2=%fn”,x1=x2=p); else printf(x1=%fnx2=%fn,x1=p+q,x2=p-q); else printf(“no real root!”); else printf(“error.”);在语句在语句1嵌套嵌套例例4-9程序程序/*li4_9_4.c*/#include #include void main() float

44、a,b,c,disc,p,q,x1,x2; scanf(%f%f%f,&a,&b,&c); if(a=0) printf(“error.”); else disc=b*b-4*a*c; if(disc20|x-10) if(yx) printf(good);else printf(bad); 对于上述情况,对于上述情况,c编译系统规定:编译系统规定:else语句语句与最近的一个与最近的一个if语句匹配。语句匹配。 if( ) else if 语句语句 语句格式的一般语句格式的一般形式为:形式为: if (表达式表达式1) 语句语句1; else if (表达式表达式2)

45、 语句语句2; else if (表达式表达式3) 语句语句3; else if (表达式表达式n) 语句语句n; else 语句语句n+1;表达式表达式1表达式表达式2表达式表达式3表达式表达式n语句语句1语句语句2语句语句3语句语句n语句语句n+1 真真(非非0)假假(0)真真(非非0)假假(0)假假(0)假假(0) 真真(非非0) 真真(非非0)例:if (profit1000) index=0.4; else if (profit 800) index=0.3; else if (profit 600) index=0.2; else if (profit 400) index=0.1

46、; else index=0; 例例4-9程序程序/*li4_9_5.c*/#include #include void main() float a,b,c,disc,p,q,x1,x2; scanf(%f%f%f,&a,&b,&c); if(a=0) printf(“error.”); else disc=b*b-4*a*c; if(disc0) printf(“no real root!”); else if(disc=0) printf(“x1=x2=%fn”,x1=x2 =-b/(2*a); else p=-b/(2*a); q=sqrt(disc)/(2*a

47、); printf(x1=%fnx2=%fn,x1=p+q,x2=p-q); if 语句的嵌套语句的嵌套if (expr1) if (expr2) statement1 else statement2内嵌内嵌ifif (expr1) statement1else if(expr3) statement3 else statement4内嵌内嵌ifif (expr1) if (expr2) statement1else statement3 内嵌内嵌ifif (expr1) if (expr2) statement1 else statement2else if(expr3) statement

48、3 else statement4内嵌内嵌if内嵌内嵌if if 语句强调说明语句强调说明如:if(a=b&x=y) printf(“a=b,x=y”); if(3) printf(“ok”); if(a) printf(“%d”,a);uifif后面的表达式类型任意后面的表达式类型任意uif(!x) if(x=0) if(x) if(x!=0)u语句可以是复合语句语句可以是复合语句 例例 考虑下面程序的输出结果考虑下面程序的输出结果: #include void main() int x,y; scanf(“%d,%d”,&x,&y); if(xy) x=y; y=x

49、; else x=x+1; y=y+1; printf(“%d,%dn”,x,y);compile error!ok!4.3 闰年问题闰年问题一年一年1212个月,共个月,共365365天,这是我们说得最多的。但事实上,每年不完全是天,这是我们说得最多的。但事实上,每年不完全是365365天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,2 2月月是是2828天,而闰年时是天,而闰年时是2929天,何年的天,何年的2 2月是月是2929天呢,这就是闰年问题。天呢,这就是闰年问题。例例4-104-10:编程判断一个年份

50、是否为闰年。:编程判断一个年份是否为闰年。【分析】【分析】判断闰年的条件是:能被判断闰年的条件是:能被4 4整除、但不能被整除、但不能被100100整除,或者能被整除,或者能被400400整除。整除。整除的表示:整除的表示:x x能被能被y y整除,则余数为整除,则余数为0 0,即,即x%y=0 x%y=0。因此,该问题需要逻辑判断,涉及逻辑表达式与关系表达式、求余运算符因此,该问题需要逻辑判断,涉及逻辑表达式与关系表达式、求余运算符% %、选择结构等知识。选择结构等知识。关系运算符及其表达式关系运算符及其表达式v关系运算符关系运算符l种类:种类: = !=l结合方向:自左向右结合方向:自左向

51、右l优先级别:优先级别:=!=优先级优先级6(高)(高)优先级优先级7(低)(低)例例 ca+b /c(a+b)ca+b /c(a+b) ab!=c /(ab)!=c ab!=c /(ab)!=c a=bc /a=(bc) a=bc /a=(bc /a=(bc) a=bc /a=(bc)l关系表达式的值:是逻辑值关系表达式的值:是逻辑值“真真”或或“假假”,用,用1和和0表表示示例例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=abc/*表达式值表达式值1*/*表达式值表达式值1*/*表达式值表达式值0*/*d=1*/*f=0*/关系运算符注意事项关系运算符注意

52、事项例例 若若a=0; b=0.5; x=0.3; 则则 a=x278在在c中是允许的,中是允许的, 值为值为0例例 int i=1, j=7,a; a=i+(j%4!=0); 则则a=2例例 a0 结果为结果为 a100 结果为结果为10关系运算符注意事项关系运算符注意事项例例 注意区分注意区分“=”与与“=” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);例例 应避免对实数作相等或不等的判断应避免对实数作相等或不等的判断如如 1.0/3.0*3.0=1.0 结果为结果为可改写为:可改

53、写为:fabs(1.0/3.0*3.0-1.0)1e-60例例4-10 问题的实现问题的实现闰年的条件是:能被闰年的条件是:能被4 4整除、但不能被整除、但不能被100100整除,或者能被整除,或者能被400400整除。整除。 (x(x能被能被y y整除,则余数为整除,则余数为0 0,即,即x%y=0)x%y=0) 输入年份赋给输入年份赋给yaeryear能被能被4整除整除真真真真假假假假year能被能被100整除整除year能被能被400整除整除真真假假leap=1leap=0leap=1leap=0leap真真假假输出输出year是闰年是闰年输出输出year是平年是平年例例4-10 程序程

54、序/ /* *li4_10.cli4_10.c* */ /#include #include void main() void main() int year,leap; int year,leap; printf(please input the year:); printf(please input the year:); scanf(%d,&year); scanf(%d,&year); if (year % 4 = 0) / if (year % 4 = 0) /* *被被4 4整除整除 * */ / if (year%100 = 0) if (year%100 = 0

55、) if (year%400 = 0) if (year%400 = 0) leap = 1; leap = 1; else else leap = 0; leap = 0; else else leap = 1; leap = 1; else else leap = 0; / leap = 0; /* *不能被不能被4 4整除整除 * */ / if (leap) if (leap) printf(%d is a leap yearn,year); printf(%d is a leap yearn,year); else else printf(%d is not a leap yearn

56、,year); printf(%d is not a leap yearn,year); 技巧技巧 在程序中设置状态标志值。如程序中的在程序中设置状态标志值。如程序中的leap!例例4-10的另解的另解#include void main() int y; scanf(%d,&y); if(y%4=0&y%100!=0)|y%400=0) printf(leap year.n); else printf(no leap year.n);#include void main() int y; scanf(%d,&y); if(!(y%4)&y%100|!(y%40

57、0) printf(leap year.n); else printf(no leap year.n);程序中用到了逻辑运程序中用到了逻辑运算符,下面介绍之:算符,下面介绍之:逻辑运算符及其表达式逻辑运算符及其表达式v逻辑运算符逻辑运算符l种类:种类: ! & |l逻辑运算真值表逻辑运算真值表ab!a!ba&ba|b真假真假假假真真真假假假假假真真假假真真真假真真lc c语言中语言中, ,运算量运算量: 0: 0表示表示“假假”, 非非0 0表示表示“真真”, , 运算结果运算结果: 0: 0表示表示“假假”, 1 1表示表示“真真”, ,逻辑运算符逻辑运算符! (2)&

58、; (11)| (12)高高低低例例 a=x & xb&xy a=b|x=y !a|abl优先级:优先级:l结合方向:结合方向:! :从右向左从右向左& :从左向右从左向右| :从左向右从左向右/*(a=x) & (xb)&(xy)*/*(a=b)|(x=y)*/*(!a)|(ab)*/逻辑运算符逻辑运算符! (2)& (11)| (12)高高低低l优先级:优先级:l结合方向:结合方向:! :从右向左从右向左& :从左向右从左向右| :从左向右从左向右例例 a=4;b=5; !a a&b a|b !a|b 4&0|2 53

59、&2|83)&2|(8b)&(n=cd)例例 int x=5; 表达式的值表达式的值 0|+x int x=5; 表达式的值表达式的值 0&+x/*结果结果m=0,n=1*/*结果结果1,x=6*/*结果结果0,x=5*/逻辑运算的短路特性逻辑运算的短路特性l短路特性:逻辑表达式求解时,并非所有的逻辑运算符都短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符式的解时,才执行该运算符abc非非0(真真)非非0(真真)非非0(真真)0(假假)0

60、(假假)0(假假)1(真真)0(假假)a&b&c执行过程执行过程abc非非0(真真)非非0(真真)非非0(真真)0(假假)0(假假)0(假假)1(真真)0(假假)a|b|c执行过程执行过程例例4-12 求一元二次方程的根求一元二次方程的根x1=p+q x1=p+q , x2=p-qx2=p-q,x1= -b+ b2- 4ac2ax2= -b- b2- 4ac2a令2ap =-b b2- 4ac2aq =【分析】【分析】在【例在【例4-94-9】中已求解过一元二次方程的根,但未判断】中已求解过一元二次方程的根,但未判断b b* *b-4b-4* *a a* *c c的值,这里的值,这里就是要完整解决判别式就是要完整解决判别式b*b-4*a*c的三种情况。的三种情况。 当当0时,有两个相等的实根。时,有两个相等的实根。 当当0时,有两个不相等的实根。时,有两个不相等的实根。 当当0时,有两个虚根。时,有两个虚根。例例4-12程序程序/ /* *li4_12.cli4_12.c* */ /#include #include #include #include void main()void main() float

温馨提示

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

评论

0/150

提交评论