《C语言课件 第4章基本结构程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言课件 第4章基本结构程序设计.ppt(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章C语言的3种基本结构4.1 C语句概语句概述述o高级语言源程序的基本组成单位是语句。语句按功能可以分为两类:n描述计算机要执行的操作运算(如赋值语句)n控制上述操作运算的执行顺序(如选择语句)。C语言的语句可以分为如下五类:(1)表达式语句:)表达式语句:表达式后面加一个分号就构成了一个表达式语句。例如:sum=a+b;/*赋值语句*/i+;/*自加运算表达式语句*/x=1,y=2;/*逗号表达式语句*/(2)函数调用语句:)函数调用语句:函数调用语句由一个函数加一个分号构成。例如:printf(“This is a C statement.”);(3)空语句:)空语句:只有一个分号(只
2、有一个分号(;)的语句称为空语句。)的语句称为空语句。在程序中空语句经常被用作循环体,比如常见的用于延时的一种循环语句。例如:例如:for(i=0;i=1000;i+);4.1 C语句概语句概述述(4)复合)复合语语句:句:用用花花括括号号 将将多多个个语语句句组组合合在在一一起起称称为为复复合合语语句句,又又称称为为语句块(语句块(block)。)。例如:例如:int x,y;z=x+y;printf(“%d”,z);(5)控制)控制语语句句控制程序执行顺序,实现基本结构的语句,有下面九种:控制程序执行顺序,实现基本结构的语句,有下面九种:if-else语语句句(条件语句)switch语语句
3、句(多分支选择语句)for语语句句 (循环语句)while语语句句(循环语句)do-while语语句句(循环语句)continue语语句句(结束本次循环语句)break语语句句(终止执行循环语句或switch语句)goto语语句句(转向语句)return语语句句(函数返回值语句)4.2 顺序结构程序设计顺序结构程序设计C语语言言是是结结构构化化程程序序设设计计语语言言,结结构构化化程程序序设设计计的的结结构构主主要要有:有:顺序结构、选择结构和循环结构顺序结构、选择结构和循环结构三种。三种。1.顺序结构顺序结构顺序结构顺序结构是最基本、最简单的程序结构,是最基本、最简单的程序结构,它由若干语句
4、块从上到下依次排列次序它由若干语句块从上到下依次排列次序顺序执行。顺序执行。顺序结构如图所示,先执行A块,再执行B块,两者是从上到下的顺序执行关系。ABo程序中的语句,按照它们出现的先后顺序逐条执行,这样的程序结构就是顺序结构。顺序结构是程序设计的最基本结构。o#include oint main(void)onprintf(1*n);nprintf(2*n);nprintf(3*n);nprintf(4*n);nprintf(5*n);nprintf(6*n);nreturn 0;oo语句从“printf(1*n);”开始依次按照顺序执行,并最终输出所要求的图形格式。1*2*3*4*5*6*
5、4.3 选择结构设计if语句(三种基本形式)1.if语句(1)if(表达式)语句;(复合语句)例:if(xy)printf(“%d”,x);构成方式,执行方式,例子,注意事项。表达式语句真(非0)假(0)例:输入两个整数,并以由小到大的顺序输出。例:输入两个整数,并以由小到大的顺序输出。#include#include intint main(voidmain(void)intint a,b,t;a,b,t;scanf(%d,%d,&a,&bscanf(%d,%d,&a,&b););if(ab)if(ab)t=a;t=a;a=b;a=b;b=t;b=t;printf(printf(%d,%dn
6、%d,%dn,a,b,a,b););return 0return 0;ynabT=aA=bB=t 4.3 if语句(2)if(表达式)语句1 else 语句2例:if(xy)printf(“%d”,x);else printf(“%d”,y);改写上面的例子 条件条件 语句句1 语句句2YN 4.3 if语句(3)if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 else if(表达式m)语句m else 语句nelse if 例子/*print out the type of character*/#include main()char c;prin
7、tf(Enter a character:);c=getchar();if(c=0&c=A&c=a&c=z)printf(The character is a lower lettern);else printf(The character is other charactern);运行:Enter a character:The character is a control character运行:Enter a character:8 The character is a digit运行:Enter a character:D The character is a capital lett
8、er运行:Enter a character:h The character is a lower letter运行:Enter a character:F1 The character is other character3.If语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。形式:If()if()语句1else 语句2Elseif()语句3else 语句4内嵌内嵌ifif嵌套if语句 匹配规则:Else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。例:If()if()语句1elseif()语句2else 语句3例:If()if()语句1elseif()语
9、句2else 语句3当当ifif和和elseelse数目不同时,可以加数目不同时,可以加花括号花括号来确定配对关系。来确定配对关系。If语句的嵌套例:if(a=b)if(b=c)printf(“a=b=c”);else printf(“a!=b”);修改:if(a=b)if(b=c)printf(“a=b=c”);else printf(“a!=b”);实现if else 正确配对方法:加 例子:-1 (x0)算法逻辑:算法逻辑:输入x 输入x若x0,则y=-1 若x0,则y=1 若x=0,则y=0输出y 若x0,则y=1 输出y#includevoid main()int x,y;scanf
10、(“%d”,&x);程序段 printf(“x=%d,y=%dn”,x,y);一些细节问题oIf(3)printf(“OK”);oIf(a)printf(“OK”);o表达式的值的判断依据,非零即真oelse不能单独使用,必须同if连用;但是if可以单独使用o可以将多条语句放在一起使用,后面不需要加;号多分支oIf else if else举例举例根据输入的考试成绩等级打印出百分制分根据输入的考试成绩等级打印出百分制分数段。数段。A:90100 B:8089 C:7079 D:7079 E:60switch语句oswitch语句的格式:oswitch(表达式)oo case常量表达式:case
11、常量表达式:语句;o o case常量表达式:语句;o default:语句;o 说明:1.switch后面括弧内的后面括弧内的“表达式表达式”,标准允许它为任何类型标准允许它为任何类型;最常见的是整数,最常见的是整数,字符或者枚举类型的表达式。字符或者枚举类型的表达式。2.当表达式的值与某一个当表达式的值与某一个case后面的常量表达后面的常量表达式的值相等时,就执行此式的值相等时,就执行此case后面的语句,后面的语句,若所有的若所有的case中的常量表达式的值都没有与中的常量表达式的值都没有与表达式的值匹配的,就执行表达式的值匹配的,就执行default后面的后面的语句。语句。3.每一个
12、每一个case的常量表达式的值必须互不相同,的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。同一个值,有两种或多种执行方案)。4.各个各个case和和default的出现次序不影响执行结的出现次序不影响执行结 果。例如,可以先出现果。例如,可以先出现“default:”,再出现,再出现 “case:”,然后是,然后是“case:”。5.执行完一个执行完一个case后面的语句后,流程控制转移到后面的语句后,流程控制转移到下一下一 个个case继续执行。继续执行。“case常量表达式常量表达式”只是只是起语
13、句标号作用,并不是在条件判断。在执行起语句标号作用,并不是在条件判断。在执行 switch语句时,根据语句时,根据switch后面表达式的值后面表达式的值 找到匹配的入口标号,就从此标号开始执行下去,找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。不再进行判断。应该在执行一个应该在执行一个case分支后分支后,可以可以用一个用一个break语句来终止语句来终止switch语句的执行。语句的执行。6.多个可以共用一组执行语句。多个可以共用一组执行语句。例题:o给出成绩打印A,B,Co难点:n如何构造“常量表达式”n如何处理100分的问题。例题:o运输公司对用户计算运费。路程()越远,每
14、公运输公司对用户计算运费。路程()越远,每公里运费越低。标准如下:里运费越低。标准如下:o 没有折扣没有折扣o 折扣折扣o 折扣折扣o 折扣折扣o 折扣折扣o 折扣折扣o设每公里每吨货物的基本运费为,货物重为,设每公里每吨货物的基本运费为,货物重为,距离为,折扣为,则总运费的计算公式为:距离为,折扣为,则总运费的计算公式为:*()()分析折扣变化的规律性:分析折扣变化的规律性:o折扣的折扣的“变化点变化点”都是的倍数都是的倍数 o在横轴上加一种坐标,在横轴上加一种坐标,c的值为的值为s/250。oc代表代表250的倍数。的倍数。o,无折扣;,无折扣;o,折扣;,折扣;o,;,;o,;,;o,;
15、,;o ,。,。oswitch(switch(s/250s/250)o case 0:d=0;break;case 0:d=0;break;case 1:d=2;break;case 1:d=2;break;case 2:case 2:o case 3:d=5;breakcase 3:d=5;break;case 4:case 4:o case 5:case 5:o case 6:case 6:o case 7:d=8;break;case 7:d=8;break;case 8:case 9:case 10:case 8:case 9:case 10:case 11:d=10;break;ca
16、se 11:d=10;break;case 12:d=15;break;case 12:d=15;break;o 思考题:根据按键,输出其内容o输入a,s,d,f,spc c,分别输出,“LEFT”,”RIGHT”,”DOWN”,”UP”,”JUMP”,”CROUCH”等内容。4.4循环结构o以往的程序,执行一次就退出了,如何让它不停的重复执行?4.4循环结构思考思考求求1100的累加和。的累加和。分析分析换一种思路:换一种思路:sum=1+2+100;首先设置一个累计器首先设置一个累计器sum,其初值为其初值为0,利用,利用sum+=n来计算(来计算(n依次取依次取1、2、100),只),只
17、要解决以下要解决以下3个问题即可:个问题即可:(1)将)将n的初值置为的初值置为1;(2)每执行)每执行1次次“sum+=n;”后,后,n增增1;(3)当)当n增到增到101时,停止计算。此时,时,停止计算。此时,sum的值就是的值就是1100的累计和。的累计和。sum=sum+n;格式格式goto 语句标号语句标号说明说明(1)与与if 语句一起构成循环结构。语句一起构成循环结构。(2)不符合结构化程序设计原则,一般不用。不符合结构化程序设计原则,一般不用。#include void main()int n=1,sum=0;loop:sum+=n;n+;if(n=100)goto loop;
18、printf(“sum=%dn”,sum);举例举例使用使用goto语句与分语句配合构成循环结构,实现求语句与分语句配合构成循环结构,实现求1100的累加和。的累加和。作用:使系统转向标号所在的语句行执行。作用:使系统转向标号所在的语句行执行。标号的定名规则标号的定名规则与变量名相同。与变量名相同。一、一、goto语句语句格式格式while (表达式表达式)循环体语句循环体语句 说明说明1。循环体如果包含一个以上的语句,必须使用复合语句形式。循环体如果包含一个以上的语句,必须使用复合语句形式。2。在循环体中,必须有使循环条件趋向于不满足(假)的语句。在循环体中,必须有使循环条件趋向于不满足(假
19、)的语句。3。先判断表达式,后执行语句。先判断表达式,后执行语句。?含义含义当表达式为真(非当表达式为真(非0值)时,执行值)时,执行while语句中的内嵌语句。语句中的内嵌语句。执行执行过程过程表达式表达式循环体语句循环体语句假假 真真 循环体语句循环体语句当当表达式值为真表达式值为真N-S图表示图表示二、二、while语句语句sum=55举例举例求求110的累加和。的累加和。i=1 sum=0当当i=10sum=sum+ii+输出输出suminclude void main()int i,sum;i=1;sum=0;while (i=10)sum=sum+i;i+;printf(“sum=
20、%5dn”,sum);思考思考1。如果去掉循环体中的大括号,执行过程将会怎样变化?。如果去掉循环体中的大括号,执行过程将会怎样变化?2。在循环体中,使循环条件趋向于不满足(假)的语句是哪条。在循环体中,使循环条件趋向于不满足(假)的语句是哪条??1 求求15的累加和的累加和.2 求求110的奇数和的奇数和.3 求求110的偶数和的偶数和.二、二、while语句语句格式格式do 循环体语句循环体语句while (表达式表达式);说明说明1。循环体如果包含一个以上的语句,必须使用复合语句形式。循环体如果包含一个以上的语句,必须使用复合语句形式。2。在循环体中,必须有使循环条件趋向于不满足(假)的语
21、句。在循环体中,必须有使循环条件趋向于不满足(假)的语句。3。先执行循环体语句,后判断表达式的值。先执行循环体语句,后判断表达式的值。?含义含义执行执行do-while语句中的内嵌语句,直到表达式为假(语句中的内嵌语句,直到表达式为假(0)才跳出循环。)才跳出循环。执行执行过程过程表达式表达式循环体语句循环体语句假假真真循环体语句循环体语句当当表达式值为真表达式值为真N-S图表示图表示至少执至少执行一次行一次三、三、do-while语句语句sum=55举例举例求求110的累加和。的累加和。include void main()int i,sum;i=1;sum=0;do sum=sum+i;i
22、+;while (i=10);printf(“sum=%5dn”,sum);i=1 sum=0当当i10)输出输出sumsum=sum+ii+思考思考1。如果去掉循环体中的大括号,执行过程将会怎样变化?。如果去掉循环体中的大括号,执行过程将会怎样变化?2。在循环体中,使循环条件趋向于不满足(假)的语句是哪条?。在循环体中,使循环条件趋向于不满足(假)的语句是哪条?三、三、do-while语句语句举例举例while和和do-while循环的比较。循环的比较。include void main()int i,sum;scanf(“%d”,&i);while(i=10)sum=sum+i;i+;pr
23、intf(“sum=%dn”,sum);include void main()int i,sum;scanf(“%d”,&i);do sum=sum+i;i+;while(i=10)printf(“sum=%dn”,sum);输入:输入:1 输入:输入:11 sum=55输出:输出:sum=55sum=0输出:输出:sum=11此此程序的程序的功能?功能?什么情况下两什么情况下两者结果相同?者结果相同?三、三、do-while语句语句格式格式for (表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句 for (循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量
24、增值)语句语句 执行执行过程过程(1)先求解表达式先求解表达式1;(2)求解表达式求解表达式2,若其值为真,则,若其值为真,则 执行循环体语句,然后执行第(执行循环体语句,然后执行第(3)步;)步;若为假,则结束循环,转到第(若为假,则结束循环,转到第(5)步;)步;(3)求解表达式求解表达式3;(4)转向步骤(转向步骤(2););(5)循环结束,执行循环结束,执行for语句下面的一语句下面的一个语句。个语句。表达式表达式2循环体语句循环体语句假假 真真求解表达式求解表达式1求解表达式求解表达式3四、四、for语句语句举例举例求求110的累加和。的累加和。sum=0for i=1 to10su
25、m=sum+i输出输出suminclude void main()int i,sum;sum=0;for(i=1;i=10;i+)sum=sum+i;printf(“sum=%5dn”,sum);?1 求求15的累加和的累加和.2 求求110的奇数和的奇数和.3 求求110的偶数和的偶数和.四、四、for语句语句for (表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句 说明说明三个表达式都可三个表达式都可以省略。以省略。表达式表达式2循环体语句循环体语句假假 真真求解表达式求解表达式3表达式表达式1省略省略循环体语句循环体语句求解表达式求解表达式1求解表达式求解表达式3表达式表达
26、式2省略省略表达式表达式2循环体语句循环体语句假假 真真求解表达式求解表达式1表达式表达式3省略省略四、四、for语句的灵活性语句的灵活性说明说明1i=1;for(;i=10;i+)sum=sum+i;2for (i=1;i+)sum=sum+i;?3for (i=1;i=10;)sum=sum+i;i+;for(i=1;i=10;i+)sum=sum+i;表达式表达式1可以省略,可以省略,但其后的分号不但其后的分号不可以省略。可以省略。没有循环结没有循环结束条件,构束条件,构成了死循环成了死循环for(i=1;i=10;i+)sum=sum+i;四、四、for语句语句说明说明45for(;)
27、sum=sum+i;6表达式表达式1和表达式和表达式3可以是可以是与循环变量无关的表达式。与循环变量无关的表达式。for(;i=10;)sum=sum+i;i+;7表达式表达式2一般是关系表达式,也一般是关系表达式,也可以是数值或字符表达式。可以是数值或字符表达式。while(i=10)sum=sum+i;i+;while(1)sum=sum+i;表达式表达式1和表达式和表达式3可可以同时省略,此时等以同时省略,此时等同于同于while语句。语句。for(sum=0,i=1;i=100,i+)sum=sum+i;例例建议:建议:for语句中只放与语句中只放与循环控制有关的语句。循环控制有关的语
28、句。四、四、for语句语句格式格式for/while(表达式表达式1)if(表达式表达式2)break;举例举例 .sum=0;for(i=1;i5)break;sum=sum+i;printf(“sum=%5dn”,sum);.for/while(表达式表达式1)if(表达式表达式2)conitue;结束结束整个整个循环循环结束结束本次本次循环循环 .sum=0;for(i=1;i=10;i+)if(i=5)continue;sum=sum+i;printf(“sum=%5dn”,sum);.五、五、breakcontinue语句语句说明说明1、三种循环语句在处理循环问题时,一般可三种循环语
29、句在处理循环问题时,一般可以相互替代。以相互替代。2、对于循环次数固定的问题,用对于循环次数固定的问题,用for语句实现语句实现比较简单。比较简单。3、对于循环次数不确定的问题,可用对于循环次数不确定的问题,可用while语语句或句或do-while语句实现。语句实现。4、while语句语句:先判断,后执行。先判断,后执行。do-while语句:先执行,后判断。语句:先执行,后判断。六、几种循环语句的比较六、几种循环语句的比较概念概念一个循环体内又包含另一个完整的循环结构,称为循环嵌套。一个循环体内又包含另一个完整的循环结构,称为循环嵌套。1 2 3 4 2 4 6 8 3 6 9 12 4
30、8 12 16举例举例打印乘法口诀表。打印乘法口诀表。#include void main()int i,j;for(i=1;i=4;i+)for(j=1;j=4;j+)printf(“%4d”,i*j);printf(“n”);i=1,j=1 1*1 j=2 1*2 j=3 1*3 j=4 1*4i=2,j=1 2*1 j=2 i=3i=4for i=1 to 4输出输出i*jfor j=1 to 4换行换行七、循环嵌套七、循环嵌套 1 2 4 3 6 9 4 8 12 16#include void main()int i,j;for(i=1;i=4;i+)for(j=1;j=i;j+)p
31、rintf(“%4d”,i*j);printf(“n”);(一)循环嵌套(一)循环嵌套思考思考1#include void main()int i,j;for(i=1;i=4;i+)for(j=1;j=5-i;j+)printf(“%4d”,i*j);printf(“n”);(一)循环嵌套(一)循环嵌套思考思考2 1 2 3 4 2 4 6 3 6 4#include void main()int i,j;for(i=1;i=4;i+)for(j=1;j=4-i;j+)printf(“”);for(j=5-i;j=4;j+)printf(“%4d”,i*j);printf(“n”);(一)循环
32、嵌套(一)循环嵌套思考思考3 4 6 8 6 9 12 4 8 12 16#include void main()int i,j;for(i=1;i=4;i+)for(j=1;j=i-1;j+)printf(“”);for(j=i;j=4;j+)printf(“%4d”,i*j);printf(“n”);(一)循环嵌套(一)循环嵌套思考思考4 1 2 3 4 4 6 8 9 12 16例例1利用公式:利用公式:/4=1-1/3+1/5-1/7+求求 的近似值,直到某一项的绝对值小于的近似值,直到某一项的绝对值小于10-6为止。为止。#include#include void main()int
33、 s;float n,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)=1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(pi=%10.6fn,pi);(二)(二)程序举例程序举例pi=1-1/3+输出输出4*pis=1(-1)n=1,3,5,7t=s/n例例2求求Fibonacci数列的前数列的前40个数。个数。#include void main()long int f1,f2;int i;f1=1;f2=1;for(i=1;i=3)1 1 2 3 5 8 13 21 34 55 89 144 (二)(二)程序举例程序举例例
34、例3判断判断m是否为素是否为素数。数。素数(质数)素数(质数):只能被只能被1和它本身整除的数。和它本身整除的数。判别方法:判别方法:56:若:若256之间的每一个数都不能被之间的每一个数都不能被56除尽,则除尽,则56为素数,否则为素数,否则56不是素不是素数。数。对于对于m而言而言,令令k=m-1,i=2k:若每一个若每一个 i 的值都不能被的值都不能被m除除尽尽,则则m为素数为素数,否则否则m不是素数。不是素数。flag=1;k=sqrt(m);for(i=2;i=k;i+)if (m%i=0)flag=0;if(flag=1)printf(“yes!”);else printf(“no
35、!”);k=sqrt(m);for(i=2;i=k+1)printf(“yes!”);else printf(“no!”);(二)(二)程序举例程序举例例例3输出输出 101200之间的全部素数。之间的全部素数。for m=101 to 200判断判断m是否为素数是否为素数若若m是素数,则输是素数,则输出并统计个数出并统计个数n.每输出每输出10个个素数,素数,换行换行#include#include void main()int m,k,i,n=0;for(m=101;m=200;m=m+2)k=sqrt(m);for(i=2;i=k+1)printf(%d,m);n=n+1;if(n%10=0)printf(n);printf(n);(二)(二)程序举例程序举例练习练习输出输出100350中可以被中可以被3整除但是不能被整除但是不能被6整除的数字。整除的数字。#include void main()int i=100;while(i=350)if(i%3=0&i%6!=0)printf(“%d”,i);i+;程序练习程序练习需要注意的问题o1.死循环o2.循环的次数o3.break、continue的作用域o4.如何构造循环体o5.如何控制循环条件