第4-5-6-7讲第3章程序和流程控制编程及应用.ppt_第1页
第4-5-6-7讲第3章程序和流程控制编程及应用.ppt_第2页
第4-5-6-7讲第3章程序和流程控制编程及应用.ppt_第3页
第4-5-6-7讲第3章程序和流程控制编程及应用.ppt_第4页
第4-5-6-7讲第3章程序和流程控制编程及应用.ppt_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

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

文档简介

第1、2章回顾,C程序结构:C程序由main函数和若干个其他子函数(标准函数和自定义函数等)构成。函数包括函数头和函数体,C程序语句以分号作为结束标志。关键字、标识符、分隔符、常量、变量、运算符。数据类型的规定以及表达式运算规则。输入输出函数getchar,putchar,scanf,printf的使用。,第3章程序和流程控制,3.1C语言程序的版式及语句3.2结构化程序设计和流程控制3.3if语句3.4switch多分支选择语句3.5循环控制3.6辅助控制语句3.7典型程序编写方法举例3.8小结,C语言流程控制语句,3.1C语言程序的版式及语句,3.1.1C语言程序的版式3.1.2C语言的语句,例3.1/*求二整数之和的程序*/#include/预处理voidmain()/函数定义inta,b;/变量说明intsum;scanf(%d%d,/信息输出该程序的运行结果为:78/输入sum=15,3.1.1C语言程序的版式特征,程序设计主要任务输入处理输出,编写C语言程序一般应包含如下几个部分(1)注释部分:格式为*注释内容*或/注释内容;在函数的最上端,一般都应有一段注释信息,主要说明函数的功能,输入、输出及其限制;如是商品软件还应包含版权信息,在程序的其他部分也可加注释。编程者要养成一边编程序、一边加注释的习惯。一般长段的注释用*注释内容*形式,短段的注释用/注释内容形式。(2)预处理块、全局变量说明等。(参见后面章节)(3)函数定义部分,包括函数类型,函数名及参数表,由于只有一个函数故取名main(),由于无返回值故类型为void,无参数输入时,main()内参数表为空。(4)变量说明部分,对所用的变量进行说明;(5)数据输入部分,对要使用的变量赋初值,可直接或间接输入,有些是在第(4)部分完成(即变量直接初始化);(6)执行部分,它是整个程序的核心,一般是对程序算法用结构化程序设计方法进行描述,然后将其转化成对应的C语言语句;(7)信息输出部分,根据要求输出所求的信息或返回结果;有些是在第(6)部分一边执行一边输出。,如上述程序的执行部分采用函数调用则上述程序应为例3.2/*求二整数之和的程序*/#include/预处理intadd(intx,inty);/函数声明voidmain()/函数定义inta,b;/变量说明intsum;scanf(%d%d,/信息输出,/*求和函数,输入参数为二整数,返回值为其和*/intadd(intx,inty)/函数定义intz;/变量说明z=x+y;/执行部分returnz;/返回结果输入:78该程序的运行结果为:sum=15,语句是C语言程序的基本元素,语句以分号为结束标志。程序中的各函数模块都是由一定含义的语句组成的。例:charch=H;/*分号为语句结束标志*/inty=7;c=a+b;printf(“hello!”);语句的分类:说明语句用来对程序中所使用的各种类型变量及属性进行说明,按其所起作用有时也称为定义语句。执行语句包括表达式语句、流程控制语句、函数调用语句等完成一定运算操作功能的语句。,3.1.2C语言的语句,说明语句用来对程序中所使用的各种类型变量进行说明,也称为定义语句。说明语句的格式:数据类型变量名列表;例:inti,j;/说明了两个整型变量i和j说明语句同时也可以进行初始化赋值,如:charch=H;unsignedlongy=0 x35847412;执行语句中所使用的每一个变量都必须在此前说明过。,2.执行语句。一般包含四大类:表达式语句(包括空语句)复合语句流程控制语句辅助控制语句(1)表达式语句任何一个表达式加上一个分号就是一条表达式语句;/表达式语句,通常是赋值表达式或函数调用表达式。例:c=a+b;sum=add(a,b);/赋值语句printf(“hello!”);/函数调用语句;/空语句,(2)复合语句将若干语句用一对大括号括起来就构成了复合语句。复合语句的一般格式为:说明语句;可执行语句;复合语句在程序结构上是以整体出现,相当于程序块(BLOCK),当一个功能必须用多条语句才能完成时,就需要使用复合语句。采用可以清晰地表达程序的层次结构。,3.2结构化程序设计和流程控制,3.2.1结构化程序设计3.2.2C语言的流程控制语句和辅助控制语句,3.2.1结构化程序设计,结构化程序设计的基本思想,任何程序都可以用三种基本结构表示:顺序结构选择结构循环结构。采用这三种基本结构编写程序的设计风格称为结构化程序设计。,图3.1顺序结构示意图,顺序结构:按语句顺序依次执行。,/通过语句书写顺序自然实现inta,b;/变量说明intsum;scanf(“%d%d”,/输出,选择结构根据条件选择两支或多支程序中的一支执行。,图3.2选择结构示意图,由两分支选择结构可以派生出另一种基本结构,多分支选择结构。,/if,switch语句,选择运算符实现if(a=0)printf(comein!);elseprintf(goaway!);,循环结构在判断条件成立的情况下,反复执行某个程序段。,图3.3循环结构示意图,/while,dowhile以及/for语句来实现while(i=90,2if单路分支形式(选择性执行语该分支),scanf(“%f”,在C语言程序中,还常用如下书写形式:if(x)等价于if(x!=0)if(!x)等价于if(x=0)如变量x为float或double实型变量,则与0比较的if语句建议如下:if(fabs(x)0时,有两个不同的实根,其中x1,x2为其两个根;当b2-4ac0时,有两个相同的实根,其中x1,x2为其两个等根;当b2-4ac4*a*c),x1=(-b+sqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrt(b*b-4*a*c)/(2*a);printf(x1=%.2f,x2=%.2fn,x1,x2);elseif(b*b=4*a*c)x1=x2=(-b+sqrt(b*b-4*a*c)/(2*a);printf(x1=x2=%.2fn,x1);elsex3=-b/(2*a);x4=sqrt(4*a*c-b*b)/(2*a);printf(x1=%.2f+%.2fin,x3,x4);printf(x2=%.2f-%.2fin,x3,x4);,Sample-3-4.c,该程序的运行结果(分5种情况)为:(1)014/输入x=-4/输出(2)004/输入theinputiserror/输出(3)143/输入x1=-1.00,x2=-3.00/输出(4)144/输入x1=x2=-2.00/输出(5)124/输入x1=-1+1.73i/输出x2=-1-1.73i,if多条件分支下的流程控制,if语句的不足条件表达式的结果只有真或假两种结果,由一个条件语句只能提供两个分支供选择。多重if语句可以实现多重分支,但程序结构显得繁琐,欠清晰,执行效率也比较低。,图3.8switch语句的流程控制,3.4switch多分支选择语句,switch分支选择语句,它可以结构清晰地直接表达多分支选择,执行效率更高。,switch(表达式)case判断值1:语句组1;break;case判断值2:语句组2;break;case判断值n:语句组n;default:语句组n+1;break;printf(“theend”);,使用switch语句注意事项1.switch()后面圆括号中的表达式要求结果是整数,各个case判断值要求是整形常量;switch语句比较表达式的值与某个case后常量值相等,则从该case后面的第一个语句开始依次执行2.各个case和及其下面的语句组的顺序是任意的,但各个case后面的判断值必须是不同值,default后无判断值,其功能相当与if语句中的else。,switch语句形式,switch(表达式)case判断值1:语句组1;break;case判断值2:语句组2;break;case判断值n-1:case判断值n:语句组n;default:语句组n+1;break;printf(“theend”);,switch语句使用注意事项3.break语句起着退出switch-case结构的作用,若无此语句,程序将顺序执行下一个case语句组。当表达式的结果值与所有的case的判断值都不一致时,程序才执行default部分的语句组。default部分不是必须的。5.对于表达式的多个结果值执行相同语句组时,程序的形式是多个case重叠。,switch语句形式,#includevoidmain()floata,b,c;intn;printf(“请输入两数据:”);scanf(“%f%f”,case2:c=a-b;break;case3:c=a*b;break;case4:if(b!=0)c=a/b;elseprintf(“dataerror”);break;default:printf(“选择无效”);printf(“结果为:%.2f”,c);,例3.5.0编程实现:用户输入两个数据,选择执行某种四则运算,输出结果。,Sample3-5-0.c,#defineESC0 x11b;#defineF10 x3b00/F1键的键值为0 x3b00#defineF20 x3c00#defineF30 x3d00#defineF40 x3e00#defineF50 x3f00#defineF60 x4000#include#includevoidmain()unsignedintkey_value;key_value=bioskey(0);switch(key_value)caseF1:F1功能处理程序;break;,caseF2:F2功能处理程序;break;caseF3:caseF4:F3,F4相同功能处理程序;break;caseF5:F5功能处理程序;break;caseF6:F6功能处理程序;break;default:默认处理程序;break;,例3.5编一示意性的菜单处理程序,按下一功能键,执行响应的功能处理。,例3.6分段函数计算,输入变量数值x,计算结果。,注意:面对问题,应按计算机程序设计的方式来思考对问题的描述和解决方案:考虑变量的定义(几个变量,数据类型),流程控制语句的选用,再编程实现.,#includevoidmain()floatx,y;printf(inputthenumberx=);scanf(%f,elseif(x=6该程序的运行结果为:1.00/输入2.00/输出,分析:利用多分支的if语句形式来编写:,#includevoidmain()floatx,y;printf(inputthenumberx=);scanf(%f,case4:case5:y=3*x+3;break;case6:case7:y=4*x+4;break;default:printf(errorinputdatan);printf(y=%.2f,y);Sample3-6-2.cpp,利用switch语句同样可以实现上述功能:,/输入学生成绩,判别所属等级Sample-3-3-2.c,#includevoidmain()floatx,y;printf(inputthenumberx=);scanf(%f,case2:y=3*x+3;break;case3:y=4*x+4;break;default:printf(errorinputdatan);break;printf(y=%.2f,y);,更精巧的程序:,3.5循环语句,3.5.1while语句3.5.2for语句3.5.3do-while语句3.5.4循环语句的嵌套(多重循环),循环控制结构是在条件成立时,反复执行循环体内的程序段.C语言中三种循环流程控制语句:,3.5.1while语句,while循环语句是首先判断循环执行条件,当其成立(非0值)时,则反复执行循环体内的程序段.,图3.9while语句的流程及语句形式,while循环的表达式是循环进行的条件。当条件表达式值为真(非零)时,执行循环体,为假(等于0)则循环结束;while(x)等价于while(x!=0);while(!x)等价于while(x=0);条件表达式中一般包括一个能够改变表达式的变量,这个变量称为循环变量。对于循环变量的初始化应在while()语句之前进行。3.当循环体不需要实现任何功能时,可用空语句作为循环体。while(ch=getchar()!=A);4.循环语句应有出口。(通过循环语句的条件判断或循环体中break语句退出循环)。6.while语句中条件表达式与if语句中条件表达式都可以为各种表达式。,inti,sum;sum=0;i=1;while(i=100)sum=sum+i;i+;,While语句使用注意事项,例3.7用while循环语句编写一求和程序#includevoidmain()inti,sum;sum=0;i=1;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);该程序的运行结果为:sum=5050,要求1.n之和?奇数之和?十位数为3的数之和?并输出这些数?,Sample-3-7,3.5.3do-while语句,图3.11do-while语句的流程与语句形式,先执行一次循环体再判断是否循环下一次!,例:inti=0;doprintf(%3d,i+);while(i5);输出:01234,while语句:inti=0;while(i5);printf(%3d,i+);输出:01234,当inti=6;while语句do.while语句分别输出:?,(1)do-while循环类似于while循环,区别在于循环条件判断位置不同。do-while是在执行一次循环体结束时判断是否继续循环。(2)能用while循环和for循环描述的程序大多数情况下都能用do-while循环描述,比如上节中的例子也可用do-while来编写。(3)能用do-while循环描述的程序一定能用while和for循环描述。,do-while语句与while的比较,例3.9利用dowhile循环编写求和程序#includevoidmain()inti=1,sum=0;dosum=sum+i;i+;while(i=100);printf(sum=%dn,sum);该程序的运行结果为:sum=5050,3.5.2for语句,图3.10for语句的流程和语句形式,使用说明:for(i=0;i100;i+=5)printf(%dn,i);,等价于:i=0;for(;i100;)printf(%dn,i);i+=5;,for循环通常用于描述循环范围比较明确。循环变量变化满足“初值、终值、步长”型变化规律.如:for(i=0;i100;i+=5)printf(%dn,i);for循环中表达式1和表达式3还可包含逗号运算表达式。如:for(a=0,b=10;a100;a+=b)printf(%dn,a);,for(表达式1;表达式2;表达式3)语句注意事项:表达式1,表达式2和表达式3可以全部或部分省掉,但是分号不能省,当省略表达式2时相当于永真条件(条件永远成立),即for(;)等同于for(;1;),此种情况下,只有通过循环体中使用break或return语句来控制循环的结束。当for语句省略了表达式1和3时,等效于while(表达式2)循环.(2)循环体也可以为空语句,起延迟一段时间的作用;如:for(inti=0;i10000;i+);或for(inti=0;i10000;i+)(3)在for循环体内一般不要操作循环变量,以防for循环失控。(4)注意for语句循环量取值区间以及条件表达式2的终止循环条件。,Sample-3-7,如下2种写法功能是相同的,都是循环N次,。,示例(a)循环变量属于半开半闭区间示例(b)循环变量属于闭区间for(x=1,a=0;x=N;x+)a+=x;,循环语句编程注意:条件表达式的初始状态和终止条件,在编写程序时应仔细推敲,验算程序执行到此处时各有关参数取值情况.,例3.8我们还是用上一节的例子,利用for循环语句编写程序求1到100的和;#includevoidmain()inti;intsum;for(i=1,sum=0;i=100;i+)sum+=i;printf(sum=%dn,sum);,i=1,sum=0;for(;i=100;)sum+=i;i+;,i=1,sum=0;while(i=100)sum+=i;i+;,Sample-3-7.cpp修改得,循环体部分又包含循环结构时,就形成了多重循环.例如while循环语句如下:while(条件表达式)循环体部分;多重循环:while(条件表达式1)while(条件表达式2)循环体部分2;,3.5.4循环语句的嵌套-多重循环,循环语句组合形成二重循环的几种形式:(1)while()(2)while()while()for(;)(3)for(;)(4)for(;)for(;)while(),编写多重循环时应注意以下问题:(1)对于多重循环,特别要注意循环有关的变量赋初值的位置:只需执行一次的赋初值操作应放在最外层循环开始执行之前。(2)内外循环变量不应该同名,否则将造成循环控制混乱,导致死循环或计算结果错误。(3)正确地区分内外循环体,在内循环执行的所有语句必须用括起来组成复合语句作为内层循环体;属于外循环的语句应放在内层循环体之外,外循环之中。(4)不应该在循环中执行的操作应放在最外层循环进入之前或最外层循环结束后。,例:输出下列由*组成的图案,*,Sample3-10-0,例3.10编程显示输出如下所示的三角形的程序*,算法分析:输出6行*,循环i=16逐行输出字符个数2*i-1字符前空格数6-i,#includevoidmain()inti,j;for(i=0;i6;i+)/共输出n行*字符printf(“n”);/回车换行for(j=0;j32767)break;,3.6.2continue语句,结束本次循环,即跳过循环体后续的语句,进行下一次的循环判定。continue语句和break语句的区别是:continue语句只结束本次循环体后续语句的执行,而不是跳出循环。break语句则是结束整个循环语句,执行程序中后续语句。,for(inti=1;i32767)break;printf(“End”);,for(inti=1;i32767)sum2=0;continue;printf(“End”);,例3.13把0100之间能被5整除的数输出。voidmain()intn;for(n=0;n=100;n+)/n从数字0到100逐个进行测试if(n%5!=0)/是否能整除continue;/不能整除则执行下一次循环printf(%dt,n);printf(“ntheend);,if(n%5=0)printf(%dt,n);,Sample3-13,例3.14.输入一个圆的半径,输出圆的面积。要求:(1).允许反复的输入半径,计算并显示圆的面积,直到输入的半径是0时为止;(2).对输入的半径进行检查,若发现是负数将提示操作者重新输入。,#include#include#definePI3.1415926voidmain()doubler,area;while(1)printf(inputtheradius:);scanf(%lf,area=PI*r*r;printf(theareais:%lfn,area);该程序的运行结果为:inputtheradius:-1/输入theinputiserrorinputtheradius:13.1415926inputtheradius:0/退出整个do-while循环。,Sample3-14.cpp,goto语句和标号page81,程序中使用goto语句时要求和标号配合,一般形式:goto标号;标号:语句;goto语句的功能是,把程序控制转移到标号指定的语句处。既执行goto语句之后,程序从指定标号处的语句继续执行。注意:goto语句常用的用法是用它退出多重循环。用goto语句设计程序存在的问题:1.破坏结构化设计风格。2.goto语句经常带来错误或隐患。所以不提倡使用goto语句,3.7典型问题程序设计举例,程序设计宗旨:结构化程序设计是通过三种流程控制语句的组合来解决将各种问题.算法设计灵活多样,要熟练掌握和应用C语言规则。具体编程思路:分析问题中涉及的数据信息,设计数据输入接口定义所需变量;再设计数据处理程序流程,选择合适的语句书写程序;最后输出处理结果定义变量时注意数据类型取值范围,运算处理过程也要注意数据类型的自动转换等规则,算法设计要灵活运用三种流程结构的组合、嵌套。,一典型问题1-(求数列和)例3.151,3,5,7,9.前二十项之和。算法分析:循环求和运算规律:第1项已知,第i+1项=第i项+2循环条件:前20项,适合用for语句实现.#includevoidmain()inti,sum,t;/sum代表和,t代表某项sum=0;t=1;,for(i=1;i=20;i+)sum+=t;/累加t+=2;/求下一项printf(sum=%d,sum);该程序的运行结果为:sum=400,Sample3-15,例3.16求序列:1!,2!,3!,4!.的前八项之和.算法分析:循环求和运算数列项变化规律:第i+1项=第i项*(i+1);循环条件:适合采用for语句,8项,#includevoidmain()inti;longsum,t;/sum代表和,t代表某项,注意数据类型sum=0;t=1;for(i=1;i=8;i+)sum+=t;/求和t*=(i+1);/求下一项t=(i+1)!printf(sum=%ld,sum);该程序的运行结果为:sum=46233,Sample3-16.c,用for语句双重循环实现:inti;longsum,t;/sum代表和,t为某项阶乘sum=0;for(i=1;i=1e-6,适合采用while语句,#includevoidmain()inti;floatsum=0,a,b;/sum代表和,a为分子,b为分母a=1,b=2;/分子、分母赋初值while(a/b=1e-6)sum=sum+a/b;/累加一项a=a+2;/求下一项的分子b=b*2;/求下一项的分母printf(sum=%f,sum);该程序的运行结果为:sum=2.999999(浮点数的舍入误差造成的现象),例3.18计算并使最后一项的绝对值小于1e-6为止。分析:本数列的项变化包括分子、分母以及符号。算法分析:循环求和数列项变化规律:第i项分子:ai=x2i-1=ai-1*x*x;分母:bi=(2i+1)!=bi-1*2i*(2i+1);符号:s=s*(-1);循环条件:数据项=1e-6,可采用for语句也可采用while语句,用for语句相应程序如下:#include#includevoidmain()inti;/sum代表和,a为分子,b为分母floatx,sum,a,b;chars;/s代表符号printf(pleaseinputx:);scanf(%f,/分母赋初值,for(i=1;a/b=1e-6;i+)sum=sum+s*a/ba=a*x*x;b=b*2*i*(2*i+1);s*=-1;/改变符号位printf(sum=%fn,sum);该程序的运行结果为:pleaseinputx:2sum=0.9092974,用while语句相应程序如下:#include#includevoidmain()inti;/sum代表和,a为分子,b为分母floatx,sum,a,b;chars;/s代表符号printf(pleaseinputx:);scanf(%f,/数列项数,while(a/b=1e-6)sum=sum+s*a/ba=a*x*x;b=b*2*i*(2*i+1);s*=-1;i+;printf(sum=%fn,sum);该程序的运行结果为:pleaseinputx:2sum=0.9092974,二典型问题二(试数法)给定了数据区间,求符合条件的数,可以采用逐个数据进行测试是否符合条件,称为试数法。例3.19求100999之间所有水仙花数。算法分析:从100到999之间循环判断是否符合水仙花数条件#includevoidmain()inti,a,b,c;for(i=100;i=999;i+)a=i/100;/求百位数b=(i-a*100)/10;/求十位数c=i%10;/求个位数,if(a*a*a+b*b*b+c*c*c=i)printf(%6d,i);该程序的运行结果为:153370371407,例3.20加法算式abccba1333a,b,c为一位数,试编程求所有可能a,b,c的值算法分析:算法1:可将abc整体代表的数i作为目标来求符合条件的解;则i的取值范围为100999,(根据特征可定更小范围300999);算法2:将a,b,c作为运算目标来求符合条件的各值,取值范围为09,根据算式特征可确定更小范围a(39),b(16),c39),算法1:整数i=abc作为关键运算对象voidmain()inti;/定义循环变量iinta,b,c;/定义变量保存各位数字for(i=100;i=999;i+)a=i/100;b=(i-a*100)/10;c=i%10;if(1333=a*101+b*20+101*c)printf(a=%db=%dc=%dn,a,b,c);,运行结果:a=4,b=1,c=9a=5,b=1,c=8a=6,b=1,c=7a=7,b=1,c=6a=8,b=1,c=5a=9,b=1,c=4,算法2:个位数a、b、c作为关键运算对象voidmain()inti;/定义循环变量iinta,b,c;/定义变量保存个位数字for(a=3;a=9;a+)for(b=0;b=9;b+)for(c=3;c=9;c+)if(1333=a*101+b*20+101*c)printf(a=%db=%dc=%dn,a,b,c);,Sample3-20.c,例3.21求已知两个正整数的最大公约数。#includevoidmain()inti,a,b;printf(pleaseinputa,b:);scanf(%d%d,例3.223.23判断是否素数的问题,类似解法,判断是否能被其他数整除,例3.24百钱买百鸡问题,用100元钱买100只鸡,其中母鸡每只3元,公鸡每只2元,小鸡1元3只,且每种鸡至少买一只,编程选择购买方案。,分析:设母鸡、公鸡、小鸡各买a,b,c只,钱的总数和鸡的总数必须为100voidmain()inta,b,c;/a,b,c分别代表母鸡,公鸡和小鸡数,可能买1-98只for(a=1;a=98;a+)for(b=1;b=98;b+)for(c=1;c=98;c+)if(a+b+c=100),Sample3-24,24-0,1

温馨提示

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

评论

0/150

提交评论