C语言程序基本控制结构及其应用.ppt

上传人:tia****nde 文档编号:12805523 上传时间:2020-05-25 格式:PPT 页数:110 大小:1.08MB
返回 下载 相关 举报
C语言程序基本控制结构及其应用.ppt_第1页
第1页 / 共110页
C语言程序基本控制结构及其应用.ppt_第2页
第2页 / 共110页
C语言程序基本控制结构及其应用.ppt_第3页
第3页 / 共110页
点击查看更多>>
资源描述
第3章C语言程序基本控制结构及其应用,3.1算法及结构化程序设计,3.1.1算法及其特征算法,程序的灵魂。一个完整的算法应具有如下特征:有穷性确定性可执行性0个或多个输入;1个或多个输出,什么是程序?一个程序应包括两个方面的内容:对数据的描述:数据结构(datastructure)对操作的描述:算法(algorithm)著名计算机科学家沃思提出一个公式:程序=数据结构+算法完整的程序设计是:数据结构算法程序设计方法语言工具,什么是算法?为解决一个问题而采取的方法和步骤,称为算法。1、计算机算法对于计算机算法应该有一个正确的定位。既不能认为计算机是万能的,如“替我理发”计算机目前是无法做到的,也不能认为计算机只能进行数值运算。2、算法的特性有穷性:有限的操作步骤,不能是无限的。确定性:每一步所执行的操作是唯一确定的,不能有歧义。有零个或多个输入:可以没有输入。有一个或多个输出:算法目的是为了求解,解就是输出。至少有一个输出。没有输出的算法是没有意义的。有效性:可操作,可执行。每一步操作都能有效执行,并得到确定结果。如:除数为0,则不能有效的执行。,算法的描述:1、自然语言2、传统流程图3、N-S结构图4、伪代码5、计算机语言计算机语言:严格遵循计算机语言的语法规则所表示的算法。从而完成实际工作到计算机语言的转化。,1、用自然语言表示算法自然语言就是人们日常使用的语言,可以是汉语或英语或其它语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。因此,除了那些很简单的问题外,一般不用自然语言描述算法。,2、用流程图表示算法美国国家标准化协会ANSI(AmericanNationalStandardInstitute)规定了一些常用的流程图符号:,3.1.2算法的类型与结构,计算机可处理的算法,一般归纳为“数值算法”和“非数值算法”两类。“数值算法”常用于科学计算,而“非数值算法”则广泛用于各类数据的数据处理,它常常要涉及大数据量和复杂的数据结构。,三种基本结构:Bohra和Jacopini提出了以下三种基本结构:顺序结构、选择结构、循环结构用这三种基本结构作为表示一个良好算法的基本单元。,三种基本结构的图示:顺序结构选择结构,循环结构的图示:当型循环结构直到型循环,三种基本结构的共同特点:(1)只有一个入口;(2)只有一个出口;(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)(3)结构内的每一部分都有机会被执行到;(4)结构内不存在“死循环”(无终止的循环)。,不正确的流程表示:,图中没有一条从入口到出口的路径通过A框。,流程内的死循环,扩展:只要具有上述四个特点的都可以作为基本结构。可以自己定义基本结构,并由这些基本结构组成结构化程序。,此图符合基本结构的特点,这是一个多分支选择结构,根据表达式的值决定执行路线。虚线框内的结构是一个入口一个出口,并且有上述全部的四个特点。由此构成的算法结构也是结构化的算法。可以认为这是由三种基本结构所派生出来的。,小结流程图是表示算法的较好的工具。一个流程图包括以下几部分:(1)表示相应操作的框;(2)带箭头的流程线;(3)框内外必要的文字说明。由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。,用N-S流程图表示算法1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。这种流程图又称N-S结构化流程图。,N-S流程图用以下的流程图符号:,(1)顺序结构(2)选择结构(3)循环结构,N-S图表示算法的优点比文字描述直观、形象、易于理解;比传统流程图紧凑易画。尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,N-S流程图中的上下顺序就是执行时的顺序。用N-S图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。,题目一将变量a和b中的数交换。(a和b的初值为:a=3b=4),题目二计算z的值。z=|a-b|(输入a、b的值),题目三求1到5的累加和。,算法举例,这三个例题分别是顺序、选择和循环结构的举例。明确一点:计算机只能完成我们告诉它的工作,其他的不会主动去执行。很傻,它没有智能。,题目一S1:a=3S2:b=4S3:t=aS4:a=bS5:b=tS6:输出a和b的值.,题目二S1:输入a和b的值。S2:判断ab?是:S21:z=a-b,到S3步。否:S22:z=b-a,到S3步。S3:输出z的值。,题目三S1:i=1,s=0S2:当ibthenz=a-belsez=b-aendifprint(z),i=1s=0whileib)printf(a);,3.3.1if分支,格式,举例,if(xy)printf(“%d”,x);,if(表达式)语句,单分支,#includevoidmain()floata,b,t=0;scanf(“%f,%f”,3,43.00,4.00,if(ab)t=a;a=b;b=t;,if(ab)t=a;a=b;b=t;,3,44.00,0.00,当某些语句作为一个整体出现的时候,必须是复合语句的形式。,if(条件表达式)程序块1;else程序块2;,3.3.2if-else分支,例3-4输入一个字符,判断它是否是09之间的字符。#includevoidmain()charc;printf(inputacharacter:);c=getchar();if(c=48,格式,if(xy)printf(“%d”,x);elseprintf(“%d”,y);,双分支,#includevoidmain()floata,b,c,p,s;scanf(“%f,%f,%f”,if(表达式)语句else语句,例:输入三角形的三边,求三角形的面积。,3,4,5s=6.00,3,4,8Notatriangle!,条件表达式,举例,if(ab)max=a;elsemax=b;,双分支,表达式?表达式:表达式,max=(ab)?a:b;,条件运算符的使用条件,若if语句中,在表达式为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值,则可以用简单的条件运算符来处理。,取值,表达式1为真,则取值为表达式2的值;表达式1为假,则取值为表达式3的值。,if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3elseif(表达式m)语句melse语句n,3.3.3多分支ifelseifelse形式,例3-5:有一个函数,定义如下:0(x50)#includevoidmain()floatx;scanf(%f,格式,举例,多分支,if(cost3000)cash=500;elseif(cost2000)cash=300;elseif(cost1500)cash=200;elseif(cost1000)cash=100;elsecash=0;,if(表达式1)语句elseif(表达式)语句else语句n,语句本身含分号,if语句的嵌套,多分支,在if语句中又包含一个或多个if语句。,被嵌套的条件语句和嵌套进去的条件语句既可是单分支,也可是双分支。,if(表达式)if(表达式)语句else语句elseif(表达式3)语句3else语句4,注意,If与else的配对原则:Else总是与它上面的最近的未配对的if配对。,举例,多分支,已知a=3b=4c=5d=0,d=?,if(ab)d=a;elseif(cb)d=c;elsed=b;,if(ab)if(cb)d=c;elsed=b;,if(ab)if(cb)d=c;elsed=b;,if(ab)if(cb)d=c;elsed=b;elsed=a;,d=5,d=3,d=0,d=4,选择结构程序举例,例1,输入一年号,判断这一年是否为闰年.,选择结构程序举例,例1,输入一年号,判断这一年是否为闰年.,#includevoidmain()intyear,leap;scanf(%d,运行情况如下:输入:1800输出:1800isnotaleapyear输入:2000输出:2000isaleapyear输入:1996输出:1996isaleapyear,选择结构程序举例,例2,求方程ax2+bx+c=0的解.(各种形式),#include#includevoidmain()floata,b,c,disc,x1,x2,realpart,imagpart;scanf(%f,%f,%f,选择结构程序举例,if(条件表达式a)程序段a1;if(条件表达式b)程序段b1;else程序段b2;程序段a2;else程序段a3;,3.3.4条件分支的嵌套,例3-6求解ax2+bx+c=0的完全解。#include#includevoidmain()floata,b,c,x1,x2,p,q,m;scanf(%f%f%f,else,m=b*b-4.0*a*c;if(m=0)x1=(-b+sqrt(m)/(2.0*a);x2=(-b-sqrt(m)/(2.0*a);printf(x1=%fn,x1);printf(x2=%fn,x2);elsep=-b/(2.0*a);q=sqrt(-m)/(2.0*a);printf(x1=%f+%fin,p,q);printf(x2=%f-%fin,p,q);,switch(表达式e)case常量表达式c1:程序段1;break;case常量表达式c2:程序段2;break;case常量表达式cn:程序段n;break;default:程序段n+1;break;,3.3.5开关语句,例3-7根据学生成绩的等级打印出分数段。#includevoidmain()chargrade;printf(inputthegrade(A,B,C,D,E):);scanf(%c,switch语句也可以嵌套使用,下面是典型的switch嵌套的情形:#includevoidmain()intx,y;scanf(%i%i,开关语句,switch(表达式)case常量表达式1:语句1case常量表达式2:语句2case常量表达式3:语句3case常量表达式n:语句ndefault:语句n+1,多分支,当分支较多时,使用嵌套的if语句层数多,程序冗长而且可读性降低。此时可以考虑使用switch语句(开关语句)来处理多分支。,举例,#includevoidmain()chargrade;printf(“请输入考试等级AD:”);scanf(“%c”,B7079606960Error,根据输入的考试成绩等级打印出百分制分数段。A:80100B:7079C:6069D:60,break;,单步执行,演示程序执行过程,举例,#includevoidmain()chargrade;printf(“请输入考试等级AD:”);scanf(“%c”,B7079,根据输入的考试成绩等级打印出百分制分数段。A:80100B:7079C:6069D:60,最后一行的break可以省略。,思考,#includevoidmain()intscore;printf(“请输入考试成绩0100:”);scanf(“%d”,根据输入的考试成绩(百分制整数)打印出等级水平。(使用ifelse语句实现)A:80100B:7079C:6069D:60,思考:使用switch语句如何实现?,程序,思考,#includevoidmain()intscore;printf(“请输入考试成绩0100:”);scanf(“%d”,根据输入的考试成绩(百分制整数)打印出等级水平。(使用switch语句实现)A:80100B:7079C:6069D:60,思考:本程序有问题么?,程序,思考,#includevoidmain()intscore;printf(“请输入考试成绩0100:”);scanf(“%d”,根据输入的考试成绩(百分制整数)打印出等级水平。A:80100B:7079C:6069D:60,太麻烦了。有没有简单的办法呢?,改进程序1,101种情况,#includevoidmain()intscore,p;printf(“请输入考试成绩0100:”);scanf(“%d”,改进程序2,11种情况,思考:不同case值时执行相同的操作,是否可以合并?,#includevoidmain()intscore,p;printf(“请输入考试成绩0100:”);scanf(“%d”,改进程序3,注意:多个case共用一组执行语句时,共用的执行语句写在最后一个case的后面。,选择结构程序举例,#includevoidmain()intc,s;floatp,w,d,f;scanf(%f,%f,%d,例3,运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:没有折扣2%折扣5%折扣8%折扣10%折扣15%折扣设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为F=p*w*s*(1-d),3.4循环结构程序设计,思考,求1100的累加和。重复执行加法操作。叫循环语句。,分析,换一种思路:,sum=1+2+100;,首先设置一个累加器sum,其初值为0,利用sum+=n来计算(n依次取1、2、100),只要解决以下3个问题即可:(1)将n的初值置为1;(2)每执行1次“sum+=n;”后,n增1;(3)当n增到101时,停止计算。此时,sum的值就是1100的累加和。,sum=sum+n;,根据已有的知识,单独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),C语言提供了3条循环语句来实现,以简化、并规范循环结构程序设计。在语言中,可用以下语句实现循环:(1)用for语句。(2)用do-while语句。(3)用while语句。实现循环结构的控制语句:while语句,do-while语句for语句,goto语句break、continue语句几种循环的比较。,while(条件表达式)程序段;,3.4.1while语句,例3-8:使用while循环求两个正整数的最小公倍数#includevoidmain()intm,n,result;printf(inputtwointegers:);scanf(%d%d,格式,while(表达式)循环体语句,while语句,说明,1、循环体如果包含一个以上的语句,必须使用复合语句形式。2、在循环体中,必须有使循环条件趋向于不满足(假)的语句。3、先判断表达式,后执行语句。如果没有使循环条件趋向于不满足(假)的语句,则循环永远退不出来,称为死循环。,?,含义,当表达式为真(非0值)时,执行while语句中的内嵌语句。,执行过程,while语句,sum=55,举例,求110的累加和。,includevoidmain()inti,sum;i=1;sum=0;while(i=10)sum=sum+i;i+;printf(“sum=%5dn”,sum);,思考,1、如果去掉循环体中的大括号,执行过程将会怎样变化?2、在循环体中,使循环条件趋向于不满足(假)的语句是哪条?,?,1求15的累加和.2求110的奇数和.3求110的偶数和.,do程序段;while(条件表达式);,3.4.2dowhile语句,例3-9:使用dowhile循环求两个正整数的最小公倍数。#includestdio.hvoidmain()intm,n,result;printf(inputtwointegers:);scanf(%d%d,格式,do循环体语句while(表达式);,do-while语句,说明,1、循环体如果包含一个以上的语句,必须使用复合语句形式。2、在循环体中,必须有使循环条件趋向于不满足(假)的语句。3、先执行循环体语句,后判断表达式的值。,?,含义,执行do-while语句中的内嵌语句,直到表达式为假(0)才跳出循环。,执行过程,至少执行一次,do-while语句,sum=55,举例,求110的累加和。,includevoidmain()inti,sum;i=1;sum=0;dosum=sum+i;i+;while(i=10);printf(“sum=%5dn”,sum);,思考,1、如果去掉循环体中的大括号,执行过程将会怎样变化?2、在循环体中,使循环条件趋向于不满足(假)的语句是哪条?,举例,while和do-while循环的比较。,includevoidmain()inti,sum;scanf(“%d”,includevoidmain()inti,sum;scanf(“%d”,sum=55,输出:,sum=55,sum=0,输出:,sum=11,此程序的功能?,什么情况下两者结果相同?,i10,结果不同。,for(语句S1;条件表达式C;语句S2)程序段S;,3.4.3for语句,例3-10:用for循环计算12+22+32+42+1002。其程序如下:#includestdio.hvoidmain()intk;longresult=0;for(k=1;k=100;k+)result+=k*k;printf(result=%ldn,result);,格式,for(表达式1;表达式2;表达式3)循环体语句,for语句,for(循环变量赋初值;循环条件;循环变量增值)循环体语句,执行过程,(1)先求解表达式1;(2)求解表达式2,若其值为真,则执行循环体语句,然后执行第(3)步;若为假,则结束循环,转到第(5)步;(3)求解表达式3;(4)转向步骤(2);(5)循环结束,执行for语句下面的一个语句。,sum=55,举例,求110的累加和。,includevoidmain()inti,sum;sum=0;for(i=1;i=10;i+)sum=sum+i;printf(“sum=%5dn”,sum);,?,1求15的累加和.2求110的奇数和.3求110的偶数和.,for(表达式1;表达式2;表达式3)语句,for语句,说明,三个表达式都可以省略。,for语句,说明,1,i=1;for(;i=10;i+)sum=sum+i;,2,for(i=1;i+)sum=sum+i;,?,3,for(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语句,说明,4,5,for(;)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语句中只放与循环控制有关的语句。,3.4.4三种循环的比较,说明,1、三种循环语句在处理循环问题时,一般可以相互替代。,2、对于循环次数固定的问题,用for语句实现比较简单。,3、对于循环次数不确定的问题,可用while语句或do-while语句实现。,4、while语句:先判断,后执行。do-while语句:先执行,后判断。,3.4.5多重循环,非法的嵌套,合法的嵌套,概念,一个循环体内又包含另一个完整的循环结构,称为循环嵌套。,循环嵌套,举例,打印乘法口诀表。,#includevoidmain()inti,j;for(j=1;j10;j+)for(i=1;ij;i+)printf(“%2d%2d=%3d”,i,j,i*j);printf(“n”);,思考1,输入三角形三边,求三角形的面积。,#include#includevoidmain()floata,b,c,s,p;printf(“请输入三角形的三边:);scanf(%f%f%f,考虑输入的三边不构成三角形,应该怎么改?,思考2,输入三角形三边,求三角形的面积。,#include#includevoidmain()floata,b,c,s,p;printf(请输入三角形得三边:);scanf(%f%f%f,elseprintf(“不构成三角形!”);,希望求多个三角形的面积,而不是每求一次退出,怎么办?,思考3,输入三角形三边,求三角形的面积。,#include#includevoidmain()floata,b,c,s,p;doprintf(请输入三角形得三边:);scanf(%f%f%f,我想退出,怎么办?,#include#includevoidmain()floata,b,c,s,p;charyes_no;doprintf(请输入三角形得三边:);scanf(%f%f%f,思考4,怎么没有起作用?调试看看吧!,#include#includevoidmain()floata,b,c,s,p;charyes_no;doprintf(请输入三角形得三边:);scanf(%f%f%f,思考5,yes_no=getchar();yes_no=getchar();,doscanf(“%c”,124369481216,#includevoidmain()inti,j;for(i=1;i=4;i+)for(j=1;j=i;j+)printf(“%4d”,i*j);printf(“n”);,读程序写结果1,#includevoidmain()inti,j;for(i=1;i=4;i+)for(j=1;j=4-i;j+)printf(“%4c”,);for(j=5-i;j=4;j+)printf(“%4d”,i*j);printf(“n”);,读程序写结果2,4686912481216,#includevoidmain()inti,j;for(i=1;i=4;i+)for(j=1;j=5-i;j+)printf(“%4d”,i*j);printf(“n”);,请同学们写出以下程序的输出结果,1234246364,#includevoidmain()inti,j;for(i=1;i=4;i+)for(j=1;j=i-1;j+)printf(“%4c”,);for(j=i;j=4;j+)printf(“%4d”,i*j);printf(“n”);,123446891216,1、break:退出当前循环或当前switch结构2、continue:用于结束本次循环,3.4.6循环和开关(switch)分支的中途退出,格式,while(表达式1)if(表达式2)break;,break/continue语句,举例,.sum=0;for(i=1;i5)break;sum=sum+i;printf(“sum=%5dn”,sum);.,while(表达式1)if(表达式2)conitue;,结束整个循环,结束本次循环,.sum=0;for(i=1;i=10;i+)if(i=5)continue;sum=sum+i;printf(“sum=%5dn”,sum);.,goto标号;goto语句的使用范围:只局限于一个函数内部;goto语句在程序中最常见的用法有两种:一是实现控制从多重循环内部退出;二是构成循环。,3.4.7goto语句,goto语句,格式,goto语句标号,说明,(1)与if语句一起构成循环结构。(2)不符合结构化程序设计原则,一般不用。,#includevoidmain()intn=1,sum=0;loop:sum+=n;n+;if(n=100)gotoloop;printf(“sum=%dn”,sum);,举例,使用goto语句与标号配合构成循环结构,实现求1100的累加和。,作用:使系统转向标号所在的语句行执行。,标号的定名规则与变量名相同。,例3-14:用户输入一串字符,以n作为结束标志。#includestdio.hvoidmain()charc;printf(inputa$:);doscanf(%c,3.4.8结构化程序设计注意事项,符合完整性要求,不符合完整性要求,符合操作完整性要求,不符合操作完整性要求,例3-17:编程求三个数字x、y、z(09)满足:xyz+zyx=1231。#includestdio.hmain()inti,j,k;for(i=1;i=9;i+)for(j=0;j=9;j+)for(k=0;k1e-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个数。,#includevoidmain()longintf1,f2;inti;f1=1;f2=1;for(i=1;i=3),1123581321345589144,例3,判断m是否为素数。,素数(质数):只能被1和它本身整除的数。,判别方法:57:若256之间的每一个数都除不开56,则57为素数,否则57不是素数。m,k=m-1,i=2k:若每一个i的值都除不开m,则m为素数,否则m不是素数。,flag=1;k=m-1;for(i=2;ia,P68:1、2、3、4;Email:vrlab_bim,作业,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!