算法与程序设计基础课件.ppt

上传人:牧羊曲112 文档编号:3968139 上传时间:2023-03-29 格式:PPT 页数:138 大小:3.94MB
返回 下载 相关 举报
算法与程序设计基础课件.ppt_第1页
第1页 / 共138页
算法与程序设计基础课件.ppt_第2页
第2页 / 共138页
算法与程序设计基础课件.ppt_第3页
第3页 / 共138页
算法与程序设计基础课件.ppt_第4页
第4页 / 共138页
算法与程序设计基础课件.ppt_第5页
第5页 / 共138页
点击查看更多>>
资源描述

《算法与程序设计基础课件.ppt》由会员分享,可在线阅读,更多相关《算法与程序设计基础课件.ppt(138页珍藏版)》请在三一办公上搜索。

1、C语言程序设计(第3版),中国铁道出版社China Railway Publishing House,普通高等教育“十一五”国家级规划教材,主 教 材:C语言程序设计(第三版)书 号:ISBN 978-7-113-09512-3 中国铁道出版社 2009年2月 第3版配套教材:C语言程序设计实验教程书 号:ISBN 978-7-113-09513-0 中国铁道出版社 2009年2月 第1版作者电子邮箱:L,3.1 算法概述,3.3 结构化程序设计方法,3.2 算法的常用表示方法,3.4 C语句概述,3.6 循环结构程序设计,3.7 综合程序应用举例,3.5 选择结构程序设计,第3章 算法与程序

2、设计基础,结束放映,3.1 算法概述,程序(program)是计算机可以执行的指令或语句序列。它是用计算机解决现实生活中的一个实际问题而编制的。设计、编制、调试程序的过程称为程序设计。编写程序所用的语言即为程序设计语言,它为程序设计提供了一定的语法和语义,所编写出的程序必须严格遵守它的语法规则,这样编写出来的程序才能被计算机所接受、运行,并产生预期的结果。,3.1.1 算法的概念,解决一个实际问题而采取的方法和步骤,称之为“算法”。对于同一个问题,可能有不同的方法和步骤,即有不同的算法。【例3.1】求1+2+3+4+100=?,算法1步骤1:1+2=3步骤2:3+3=6步骤3:6+4=10步骤

3、99:4950+100=5 050,算法2步骤1:0+100=100步骤2:1+99=100步骤3:2+98=100步骤50:49+51=100步骤51:100*50=5 000步骤52:5 000+50=5 050,算法3步骤1:k=1,s=0步骤2:如果k100,则算法结束,s即为所求的和,输出s;否则转向步骤3步骤3:s=s+k,k=k+1步骤4:转向步骤2,当然,算法也有优劣之分,有的算法较简练,而有的算法较烦琐。上面三个算法中,算法2比算法1步骤少,算法3比算法2步骤少,算法3的质量最优。一般地说,希望采用方法简单、运算步骤少的方法。,3.1.2 算法的特性,一个算法应具有如下五个特

4、点:1有穷性2确定性3可行性 4有零个或多个输入 5有一个或多个输出,3.2 算法的常用表示方法,3.2.1 自然语言表示法 所谓自然语言,就是人们日常使用的语言,可以是汉语、英语或其他语言。,3.2.2 流程图,流程图是用图形的方式来表示算法,用一些几何图形来代表各种不同性质的操作。ANSI(美国国家标准化协会)规定的一些常用流程图符号(见图3-1)已被大多数国家接受。,1顺序结构 顺序结构的程序是按语句的书写顺序执行的,用图3-2表示2选择结构 选择结构或称分支结构、条件结构,用图3-3表示,3循环结构 循环结构又称重复结构,有两种方式:一种是先判断条件,若条件成立再进入循环体,可用图3-

5、4表示;另一种是先进入循环体执行,再判断条件是否成立。可用图3-5表示。,3.2.3 N-S结构流程图,1973年美国的计算机科学家INassi和BShneiderman提出了一种新的流程图形式。在这种流程图中把流程线完全去掉了,全部算法写在一个矩形框内,在框内还可以包含其他框,即由一些基本的框组成一个较大的框。这种流程图称为N-S结构流程图(以两人名字的头一个字母组成)。,3.2.4 伪代码表示法,伪代码(pseudo code)是用介于自然语言和计算机语言之间的文字和符号来表示算法,即计算机程序设计语言中具有的语句关键字用英文表示,其他的可用汉字,也可用英文,只要便于书写和阅读就可。,3.

6、2.5 用计算机语言表示算法,用计算机语言描述算法必须严格遵循所用语言的语法规则,#includevoid main()int sign,i,n;float sum;printf(n Please input an integer to n:);scanf(%d,程序运行结果如下:Please input an integer to n:5sum=0.738889,3.3 结构化程序设计方法,在拿到一个需要求解的实际问题之后,怎样才能编写出程序呢?以数值计算问题为例,一般应按图3-12所示的步骤进行。要设计出结构化的程序,可采取以下的方法:自顶向下逐步细化模块化结构化编码,【例3.5】输入10

7、个整数(每个数都3),打印出其中的素数。分析:素数又称质数,是指只能被1和它本身整除的整数。本题采用自顶向下、逐步细化方法来处理这个问题。先把这个问题分为三部分(如图3-14所示):输入10个数给x1x10;把其中的素数找出来(或者把非素数除去)打印出全部素数。,对【例3.5】求解步骤进行细化后得到的分步骤流程图。,【例3.5】的完整流程图,3.4 C语句概述,1说明语句说明语句用来定义变量的数据类型。例如:int sign,i,n;/*说明sign,i,n是整型变量*/,2函数调用语句由一个函数调用加一个分号构成函数调用语句。如上例中的:printf(n Please input an in

8、teger to n:);scanf(%d,3表达式语句在C语言中,由一个表达式加上一个分号就构成了一条表达式语句。最典型的是,由赋值表达式加上分号构成赋值语句。例如:sign=1;sum=1;i=1;sign=(-1)*sign;sum=sum+sign/(3.0*i);i=i+1;,表达式能构成语句是C语言的一重要特色。其实函数调用语句也是表达式语句,因为函数调用也属于表达式的一种。,4空语句 仅由一个分号构成的语句就是空语句。例如:;,5复合语句复合语句是由大括号括起来的,在逻辑上相关的一组语句。如上例中的:sign=(-1)*sign;sum=sum+sign/(3.0*i);i=i+

9、1;,6控制语句控制语句用来规定语句执行的顺序,C语言共有9种控制语句。(1)if(条件)else(条件语句)(2)for(条件)(循环语句)(3)while(条件)(循环语句)(4)do while(条件);(循环语句)(5)continue;(结束本次循环语句)(6)break;(结束循环语句或结束switch语句)(7)switch(表达式)(多分支选择语句)(8)goto 标号;(转向语句)(9)return(表达式);(从函数返回语句),3.5 选择结构程序设计,3.5.1 关系运算符和关系表达式,关系表达式 用关系运算符连接起来的表达式称为关系表达式,关系表达式的结果为逻辑值真(用

10、“1”表示)或假(用“0”表示)。例如:ca+b 若a=3,b=4,c=9 则结果为1 a=bc 若b=4,c=9 则a的值为0 两个数值进行比较,是比较其数值的大小,两个字符进行比较,是比较其ASCII码值的大小。,3.5.2 逻辑运算符和逻辑表达式,1逻辑运算符及优先次序,逻辑运算符与其他运算符的运算优先顺序如下图所示:例如:原式 可写为(ab)&(xy)ab&xy(a=b)|(x=y)a=b|x=y(!a)|(ab)!a|ab,2逻辑表达式用逻辑运算符将关系表达式或逻辑表达式连接起来的式子称逻辑表达式。例如,若a=4,b=2,x=6,y=7,则:ab&xy 表达式的结果为0a=b|x=y

11、 表达式的结果为0!a|ab 表达式的结果为1,注意:(1)在C语言中规定:非零为“真”,“真”用1表示;零为“假”,“假”用0表示。例如:a&b 其结果为1!5.34 其结果为0(2)对逻辑表达式的求解,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。,【例3.6】运行下面的程序四次,若分别输入0 0 0,1 0 1,1 2 3,1 0 0,分别写出其对应的输出结果。#include void main()int a,b,c;scanf(%d%d%d,在Visual C+6.0环境下运行,若输入0 0 0 其输出为:e=0,a=1,b=-1

12、,c=0a=2,b=-2,c=1,e=1,a=2,b=-2,c=1e=1,a=2,b=-3,c=0a=2,b=-3,c=-1,e=1在Turbo C2.0环境下运行,若输入0 0 0 其输出为:e=0,a=0,b=0,c=0a=2,b=-2,c=1,e=1,a=2,b=-2,c=1e=1,a=2,b=-2,c=1a=2,b=-3,c=-1,e=1,3.5.3 if语句,C语言提供了两种格式:格式1:if(表达式)语句;该语句的功能是:首先计算表达式的值,然后判断表达式的值是否为非零(真),若为非零(真),则执行语句。其执行过程见图3-22所示,【例3.7】输入一个字符c,若c是字母,则输出“Y

13、es!”。#include void main()char c;c=getchar();if(c=a运行情况如下:xYes!,程序如下:#include#include void main()float x;double z;printf(nx=);scanf(%f,格式2:if(表达式)语句1;else 语句2;该语句的功能是:首先计算表达式的值,然后判断表达式的值是否为非零(真),若非零(真),则执行语句1,否则执行语句2。其执行过程下图,【例3.9】输入两个数并判断两数是否相等。,程序清单如下:#include void main()int a,b;printf(Enter intege

14、r a:);scanf(%d,【例3.10】输入一个整数,若该数不为零,则输出。#include void main()int x;scanf(%d,程序运行结果如下:-5 输入x=-5输出说明:if后面的表达式可以为任何类型的表达式,只要表达式的结果为非零,则表示条件成立,否则表示条件不成立。,总结:1.if后面的表达式可以为任何类型的表达式,只要表达式的结果为非零,则表示条件成立,否则表示条件不成立。2if语句中的语句1,语句2可以是一条语句,也可以是由构成的一个复合语句,如果在该语句处需要写多条语句才能完成所必要的功能时,就使用复合语句的形式。3在格式2中的else前面的语句必须要有一个

15、分号,整个语句结束处有一个分号。如例3.9中的if语句。,3.5.4 if语句的嵌套,在一个if语句中,如果又完全包含了另一个(或者多个)if语句,则称为if语句的嵌套。if嵌套的一般形式如下:if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;if语句的嵌套既可以嵌套在if后面,也可以嵌套在else后面,具体嵌套的位置要根据实际需要而定。,【例3.11】编写程序,求下列分段函数的值。,【例3.11】的程序清单如下:#include#include void main()float x;double z;printf(nx=);scan

16、f(%f,对【例3.11】程序的另一种修改:#include#include void main()float x;double z;printf(nx=);scanf(%f,else的最近配对原则:C语言规定:else总是与它上面最近的且又没有配对的if语句进行配对。,在下面这条嵌套的if语句中 if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;若把else 语句2去掉,变成:if(表达式1)if(表达式2)语句1;else if(表达式3)语句3;else 语句4;第一个else将和哪个if配对?根据else的最近配对原则,第一个

17、else将与第2个if(表达式2)语句1;配对,如图3-27所示。,在下面的if嵌套语句中if(表达式1)if(表达式2)语句1;else if(表达式3)语句3;else 语句4;如果用户希望else只能和if(表达式1)配对,而不是与现在的if(表达式2)语句1;配对,则应该在if(表达式2)语句1;的两端加上花括号,从而确定了新的配对关系,修改后的结果:if(表达式1)if(表达式2)语句1;else if(表达式3)语句3;else 语句4;,【例3.12】写出下面程序的运行结果。#include void main()int a,b,c;a=5;b=3;c=0;if(c)if(ab)

18、printf(n max=%d,a);else printf(n max=%d,b);else printf(n c=%d,c);运行结果如下:c=0,3.5.5 条件运算符和条件表达式,条件运算符(?:)是C语言中唯一的一个三目运算符,其格式如下:表达式1?表达式2:表达式3功能:如果表达式1的值为真,则该条件表达式的结果取表达式2的值,否则取表达式3的值。例如:下述的if语句 if(ab)max=a;else max=b;可以用条件表达式来改写:max=ab?a:b;,条件表达式说明:1.条件表达式的执行顺序:先计算表达式1的值,若表达式1的值为真,则计算表达式2的值,并把该值作为整个条件

19、表达式的结果,表达式3不会计算;否则计算表达式3的值,并把表达式3的值作为整个条件表达式的结果,此时表达式2不会计算。2运算优先级:高于赋值运算符,低于算术运算符和关系运算符。例:max=(ab)?a:b 相当于 max=(ab)?a:b)ab?a:b+1 相当于 ab?a:(b+1)3.条件运算符的结合方向为“自右至左”。如:ab?a:cd?c:d 相当于 ab?a:(cd?c:d),【例3.13】阅读下面的程序,若输入为59,则输出结果是什么?#include void main()int score;char grade;printf(please input a score:n);sc

20、anf(%d,运行结果如下:please input a score:59 59 belongs to C,3.5.6 switch 语句,switch语句属于多分支结构语句,通常用于描述有多种情况的选择,其格式如下:switch(表达式)case 常量表达式1:语句1;case 常量表达式2:语句2;case 常量表达式n:语句n;default:语句(n+1);,上式中的default:和语句(n+1);可以省略不写。switch语句的执行过程如下:首先计算表达式的值,然后用此值来查找各个case后面的常量表达式,直到找到一个等于表达式值的常量表达式,则转向该case后面的语句去执行;若表

21、达式的值与下面任何一个case常量表达式的值都不相等,则自动转去执行default部分的语句;如果没有default部分,退出该switch语句,执行switch语句后面的那条语句。,【例3.14】编写一个程序,要求输入学生的分数,输出其成绩的分数段,用A、B、C、D、E分别表示90分以上、8089分、7079分、6069分和不及格(059分)5个分数段。,【例3.14】的程序清单。,#include void main()int score,grade;printf(nInput a score(0100):);scanf(%d,【例3.14】程序的运行结果:Input a score(01

22、00):50 输入分数grade=E!输出结果再运行一次:Input a score(0100):90 grade=A!输出结果switch语句的补充说明:(1)switch 后的表达式,可以是整型或字符型,也可以是枚举类型,不能是除这三种类型以外的其它类型;,(2)每个case后的常量表达式只能是常量组成的表达式,当switch后的表达式的值与某一个常量表达式的值一致时,程序就转到此case后的语句开始执行;如果没有一个常量表达式的值与switch后的值一致,就执行default部分的语句;(3)每个case后的常量表达式的值必须互不相同,否则程序就无法判断应该执行哪个语句;,(4)case

23、的摆放顺序并不影响执行结果,但通常情况下是将出现频率较高(即较常使用的case部分,尽量往前摆放;另外,default部分也不一定非要放在最后;(5)在执行完一个case后面的语句后,程序流程转到下一个case后的语句开始执行,直至整个switch语句结束,别误解为执行完一个case语句之后,程序就会转到switch后的语句去执行。,(6)如果希望在执行完某个case语句之后,转到执行switch下面的那条语句,则应该在该case语句的最后补上break语句(即跳转语句)。在执行完break语句之后,会跳出switch语句,转去执行switch后面的语句。,【例3.21】从键盘输入一个日期,判

24、断这一天是这一年的第几天?#include void main()int day,month,year,sum,leap;printf(n Please input year,month,dayn);scanf(%d,%d,%d,case 8:sum=212;break;case 9:sum=243;break;case 10:sum=273;break;case 11:sum=304;break;case 12:sum=334;break;default:printf(data error);sum+=day;/*总天数再加上输入的几号*/if(year%400=0|(year%4=0,【例

25、3.15】程序分析:以2008年7月19日为例,首先应该把7月份之前共六个月的总天数加起来,然后再加上本月的19天就得到本年度的第几天。特殊情况下,若该年是闰年且输入月份值大于二月份时,需要考虑多加一天。程序运行结果如下:Please input year,month,day 2008,7,19 输入年月日It is the 201th day.输出,3.5.7 选择结构程序设计举例,【例3.16】求一元二次方程ax2+bx+c=0的实数解,并显示结果,这里假设a0。,图3-29 用嵌套的if语句求一元二次方程的解,#include#include void main()float a,b,c

26、,d;printf(n a=);scanf(%f,【例3.16】的程序清单,【例3.16】程序的运行结果:第一次运行:5 7 2 输入a,b,cx1=-0.400000 输出x2=-1.000000第二次运行:4 4 1 x1=x2=0.500000第三次运行:4 1 4 The equation has no real root!,【例3.17】输入两个正整数a和b,其中a不大于31,b最大不超过三位数。使a在左,b在右,拼成一个新的数c。例如a=23,b=30,则c为2 330。若a=1,b=15,则c为115。分析:根据以上问题,可以从中抽象分析出以下数学模型,决定c的值的计算公式如下:

27、当b为一位数时,c=a*10+b;当b为二位数时,c=a*100+b;当b为三位数时,c=a*1000+b;因此,求c的公式为c=a*k+b(k的取值可以为10、100或1000)。,【例3.17】的流程图。,#include void main()int a,b,c,k;printf(nInput two positive integer number:);scanf(%d,%d,【例3.17】的程序清单,【例3.17】程序运行结果:第一次运行:Input two positive integer number:23,30 a=23,b=30,c=2330有效的结果第二次运行:(2)Inpu

28、t two positive integer number:44,19 Input data error!a=44,b=19,c=-1 无效的结果,因为a31,例3.18:假设个人所得税的计征办法是月收入低于1000元者,不计税,高于1000元低于2000元者,高出部分征收5%;高于2000元低于5000元者,高出部分征收10%;高于5000元低于是10000元,高出部分征收15%,高于10000元的征收35%。输入一个人的月收入,求出其应交的个人所得税。,#includevoid main()long int r;float f;printf(Input an integer to r:);

29、scanf(“%ld”,【例3.18】的程序清单,case 5:case 6:case 7:case 8:case 9:f=1000*0.05+3000*0.1+(r-5000)*0.15;break;default:f=1000*0.05+3000*0.1+5000*0.15+(r-10000)*0.35;printf(“f=%f”,f);输出所得税 else printf(“Input a data error!”);输入数据有误,【例3.19】输入两个实数a,b,再输入一个运算符(可以是+,-,*或/),根据运算符计算并输出a,b两个数的和、差、积和商。#includevoid main

30、()float a,b;char c;scanf(%f%f,【例3.19】运行结果如下:第一次运行:5 8+输入5.000000+8.000000=13.000000输出第二次运行:5 6/输入5.000000/6.000000=0.833333输出,【例3.20】给一个不多于5位的正整数,编程求:它是几位数,逆序打印出各位数字,若为两位以上的数,则判断该数是否为回文数。分析:分解出该数每一个数位上的数字。若万位数大于零,则为5位数;否则,若千位数大于零,则为4位数;否则,若百位数大于零,则为3位数;否则,若十位数大于零,则为两位数;否则,若个位数大于零,则为1位数,否则提示输入错误。所谓回文

31、数,是指左右对称的数,即从左往右读与从右往左读得到的结果一样,譬如161就是回文数。若为5位数,只需判断该数的个位数与万位数是否相同,十位数与千位数是否相同,若两者均相同,则为回文数。对于其他位数的判断,请读者自已归纳。,【例3.20】程序清单如下:#include void main()int a,b,c,d,e;long x;do printf(n Please input a positive integer number to x:);scanf(%ld,/*个位数字*/,if(a0)/*万位数字*/printf(there are 5,%d%d%d%d%dn,e,d,c,b,a);i

32、f(e=a,else if(d0)/*十位数字*/printf(there are 2,%d%dn,e,d);if(e=d)printf(this number is a huiwenn);else printf(this number is not a huiwenn);else/*个位数字*/if(e0)printf(there are 1,%dn,e);【例3.20】程序运行结果:Please input a positive integer number to x:5 4 3 there are 3,3 4 5this number is not a huiwen再运行一次:Pleas

33、e input a positive integer number to x:1 2 1 there are 3,1 2 1this number is a huiwen,3.6 循环结构程序设计,在C语言中提供了四种实现循环结构的方法:(1)goto语句以及用goto语句构成的循环(2)用while 语句(3)用do-while 语句(4)用for 语句,3.6.1 goto语句以及用goto语句构成的循环,goto语句为无条件转向语句,其格式为 goto 语句标号;通常在两种情况下使用goto语句:(1)与if语句一起构成循环结构;(2)从循环体中跳转到循环体外,但在C语言中可以用brea

34、k语句和continue语句跳出本层循环和结束本次循环。,【例3.21】用if语句和goto语句构成循环,求#include void main()int i=1;int sum=0;loop:if(i=100)sum+=i;i+;goto loop;printf(n1+2+3+100=%d,sum);运行结果如下:1+2+3+100=5050说明:处于loop语句标识符和goto loop之间的语句序列构成该程序的循环体,语句标识符loop后面要加冒号(:)。,3.6.2 while 语句,while 语句又称当循环语句,其一般的形式如下:while(表达式)循环体语句;while 语句的执

35、行过程:第1步:计算表达式的值,若表达式的值为真(非0),则执行第二步,若表达式的值为假(值为0),则转到第四步执行。第2步:执行循环体语句,循环体语句可以是简单的一条语句,也可以是由多条语句构成的复合语句。第3步:转到第一步执行。第4步:结束循环,执行while语句后的第一条语句。,【例3.22】用while语句来求100以内偶数的和。#include void main()int sum=0,i=2;while(i=100)sum=sum+i;i=i+2;printf(2+4+100=%d,sum);,有关while循环的说明:(1)while循环的次数可以事先不清楚,因为在循环执行时,能

36、够根据条件来判定循环是否终止;(2)循环体语句可以是简单的语句,也可以是复合语句;若为复合语句,则需要用花括号括起来;(3)在循环体语句中,一定要有改变循环条件的语句,使循环最终能够终止。例如:【例3.22】中的i=i+2;就是控制循环变量i不断地加2,朝着循环的终止条件(i=100)逼近;此处若删除循环控制语句i=i+2;,即i值永远不变,则循环条件(i=100)即2=100永真,此时的无限循环称为死循环,编程时应杜绝死循环的出现。,【例3.23】阅读下面的程序,写出运行结果。#include void main()int i=1,s=1;while(i7)s*=i;printf(n s=%

37、dn,s);显然,本例在循环体中缺少用来控制循环变量的值变化的语句,因此导致程序中出现死循环。若上述程序在Visual C+6.0环境下运行,由于死循环,因此不会出现运行结果,此时应该按下组合键【Ctrl+Break】,或者单击运行窗口上的“关闭”按钮来终止程序的运行,返回到编辑状态对程序进行修改。,3.6.3 do-while 语句,do-while循环语句又称直到型循环语句,但是与Pascal语言中的repeat-until语句又有所不同。C语言中do-while语句的格式:do 循环体语句;while(表达式);,do-while语句的执行过程如下:(1)执行循环体语句,循环体语句可以是

38、简单的一条语句,也可以是由多条语句构成的复合语句;(2)计算表达式的值,如果表达式的值为真(非0),则执行第(1)步,若表达式的值为假(值为0),则转到第(3)步执行;(3)循环结束之后,将执行do-while语句下面的那条语句。,【例3.24】用do-while语句来实现求100以内的奇数和。N-S流程图如下图所示。,【例3.24】的程序清单如下:#include void main()int sum=0,i=1;do sum+=i;i=i+2;while(i=100);printf(n 1+3+99=%dn,sum);运行结果如下:1+3+99=2500,说明:(1)dowhile语句一般

39、也是用于事先不知道循环次数的情况下,在循环执行的过程中,根据条件来决定循环是否结束。(2)在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复合语句则要用花括号括起来。(3)在循环体语句中,一定要有改变循环条件的语句,使循环能终止。如上例中的i=i+2;语句就是使循环变量i增加2,改变循环条件的语句,若没有该语句,则i的值永远不会改变,循环就是一个死循环。(4)在while(表达式)的后面一定要有一个分号,它用来表示do-while语句的结束。(5)dowhile语句和while语句最大的差别就是do-while语句至少要执行一次循环体语句,而while语句可以一次都不执行。请看例3.

40、25。,【例3.25】while循环和dowhile循环的比较。程序如下:void main()void main()int m,n=1;int m,n=1;scanf(%d,程序运行结果如下:程序运行结果如下:5 5 n=46,m=11 n=46,m=11 再运行一次:再运行一次:11 11 n=12,m=12 n=1,m=11,3.6.4 for 语句,for语句的一般形式为:for(表达式1;表达式2;表达式3)循环体语句其执行过程如下:(1)先求解表达式1;(2)求解表达式2,若为真(表达式2的值为非0),则执行for语句中指定的内嵌循环体语句,然后执行第(3)步,若为假(表达式2的值

41、为0),则结束循环,转到第(5)步;(3)求解表达式3;(4)返回第(2)步继续执行;(5)循环结束,执行for语句后面的第一条语句。,图3-35 for语句的执行图解,for语句执行过程的图解形式如图3-35所示。,说明:(1)可以把for循环的格式 for(表达式1;表达式2;表达式3)循环体语句改写为以下容易理解的形式 for(循环变量赋初值;循环条件;循环变量增值)循环体语句(2)for语句中的 表达式1 可以省略,但其后面的分号不能省略,此时应在执行for语句之前,给循环变量赋初值,即 表达式1;for(;表达式2;表达式3)循环体语句(3)表达式2 也可省略,但其后的分号不能省略,

42、即 for(表达式1;表达式3)循环体语句 此时等于没有循环条件,执行for语句时,就不要判断循环条件,也就认为 表达式2 始终为真。此时循环体中一定要有一条语句能够跳出循环,否则将是一个死循环。,(4)表达式3 也可以省略,但它前面的分号不能省略,即 for(表达式1;表达式2;)循环体语句 此时应在循环体中要有用于改变循环变量值的语句,否则循环也会变成死循环;(5)表达式1、表达式2、表达式3 可以省略一个或者两个,也可同时全部省略,但对应的分号不能省略,譬如:for(表达式1;)循环体语句 for(;表达式2;)循环体语句 for(;表达式3)循环体语句 for(;)循环体语句(6)表达

43、式1、表达式2、表达式3可以是任何类型的表达式,包括逗号表达式。既可以是与循环变量有关的表达式,也可以是与循环变量无关的表达式。,【例3.26】求1000以内的奇数和。程序清单如下#include void main()int i;long int sum=0;for(i=1;i1000;i+=2)sum+=i;printf(n sum=%ldn,sum);运行结果如下:sum=250000,【例3.27】从键盘接收字符并显示字符的个数。#include void main()int i;char c;for(i=0;(c=getchar()!=n;i+);printf(The sum is%

44、dn,i);运行结果如下:I am a chinese!输入的字符序列,最后以敲回车结束The sum is 15 请注意:该例中循环体语句为空语句,即什么都不做,其实程序把循环体要执行的工作,全部移到for后面的表达式了。,【例3.28】中国剩余定理:“有物不知几何,三三数余一,五五数余二,七七数余三,问物有几何?”。编程求1000以内的所有解。#include void main()int m,count=0;for(m=1;m=1000;m+)if(m%3=1 程序运行结果如下:52 157 262 367 472 577 682 787 892 997,3.6.5 多重循环,如果在循环

45、结构中又包含另外一个循环结构,称为多重循环,也叫循环的嵌套。【例3.29】打印如图3-36所示的“九-九”乘法表。,【例3.29】的程序清单。#include void main()int i,j;for(i=1;i=9;i+)/*外循环,控制行*/for(j=1;j=9;j+)/*内循环,控制列*/printf(%d*%d=%dt,i,j,i*j);printf(n);本例的N-S流程图如图3-37所示。,如果想打印出以下4种形状的“九九”乘法表,请问该如何编程?第1种图形:,如果想打印出以下4种形状的“九九”乘法表,请问该如何编程?第2种图形:,如果想打印出以下4种形状的“九九”乘法表,请

46、问该如何编程?第3种图形:,如果想打印出以下4种形状的“九九”乘法表,请问该如何编程?第4种图形:,【例3.30】问用1、2、3、4个这四个数字,能够组成多少个互不相同且无重复数字的三位数?它们分别是多少?#include void main()int i,j,k,count=0;for(i=1;i5;i+)/*判断百位数字i*/for(j=1;j5;j+)/*判断十位数字j*/for(k=1;k5;k+)/*判断个位数字k*/if(i!=k,【例3.30】程序的运行结果如下:123 124 132 134 142 143 213 214 231 234241 243 312 314 321

47、324 341 342 412 413421 423 431 432count=24 输出符合条件的总数,3.6.6 循环结构中的break语句,break语句格式:break;break语句的作用是从最内层的switch、for、while或dowhile语句中跳出,终止这些语句的执行,把控制流程转移到被中断的循环语句(或者switch语句)后去执行。通过使用break语句,可以不必等到循环或switch语句执行结束,而是根据情况,提前结束这些语句的执行。,【例3.31】求当半径r为何值时,圆的面积第一次开始大于100?#include void main()int r;float area

48、,pi=3.1415927;for(r=1;r+)area=pi*r*r;if(area100)break;面积开始大于100了 printf(%fn,area);printf(r=%dn,r);,【例3.31】程序运行结果如下:3.14159312.56637128.27433450.26548478.539818r=6 本程序运行后,for循环运行了5次,当运行第6次(r=6)时,area=113.097336100,这时程序不输出area的值,同时中断了for循环语句的继续运行,转到for循环的下一条语句输出r的值。,3.6.7 continue语句,continue语句的形式:cont

49、inue;其作用是提前结束本次循环,即跳过循环体中那些尚未执行的语句,紧接着进行下一次是否执行循环的判断。,【例3.32】从键盘输入整数,显示出其中的正整数,若输入的是0,则退出。#include void main()int x;do scanf(%d,【例3.33】下面程序的作用是求连续的奇数和,当奇数和刚好超过1000时停止计算,并按运行结果输出。程序中有两空,请补充完整,使之能实现上述功能。#include void main()int i,sum=0;for(i=1;i+)if(i%2=0)continue;sum+=i;if(sum1000)break;printf(1+3+5+%

50、d=%dn,i,sum);,【例3.33】程序分析:在程序中,第一空前面的条件表示i为偶数时要执行的情况,由于本题偶数不符合题目累加的条件,故不应执行累加语句。因此,第一空应填continue。第二个空前面的条件表示累加和大于1000,按题目要求应退出循环,因此,第二空应填break。答案:(1)continue(2)break 程序运行结果:1+3+5+63=1024,3.6.8 循环程序设计举例,【例3.34】从键盘输入一个整数n,判断n是否为素数。素数又叫质数,是指只能被1和它本身整除的自然数。在编程时,可以根据素数的定义来进行判断,不过循环次数太多,效率较低。这里介绍一种效率更高的求素

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号