《C语言程序设计》课程(第3章)课件.ppt
C C语言程序设计语言程序设计 任课教师:任课教师:金金 丹丹 电子邮箱:电子邮箱:第第3 3章章 程序控制结构程序控制结构结构化程序设计程序:由计算机语言组成的语句序列。程序的三种基本结构:顺序结构、选择结构、循环结构。3种基本结构的传统流程图不成立(a)顺序结构ABPAB(b)选择结构成立不成立PA成立AP成立(c)当型循环(d)直到循环3.1 3.1 顺序结构顺序结构如果程序中的语句是按照书写顺序执行的,称为如果程序中的语句是按照书写顺序执行的,称为“顺顺序结构序结构”.例例3.13.1】输输入入三角形的三条三角形的三条边长边长,求三角形面,求三角形面积积。假设:输入的三条边假设:输入的三条边a,b,c a,b,c 能构成三角形。能构成三角形。1.1.将将 a,b,c=a,b,c=?定义数据类型和具体值定义数据类型和具体值(已知信息已知信息)2.2.通过通过:s=s=(a+b+c)/2(a+b+c)/2 (确定算法确定算法)3.3.求求出出:area=area=sqrt(ssqrt(s*(s-a)*(s-b)*(s-c);*(s-a)*(s-b)*(s-c);(描描写写计计算算公式公式)4.4.结果输出结果输出:areaarea#include#include main()float s,a,b,c,area;scanf(%f,%f,%f,&a,&b,&c);s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c);printf(a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn,a,b,c,s);printf(area=%fn,area);运行时输入:运行时输入:3.5,4.6,5.1a=a=3.50,b=3.50,b=4.60,c=4.60,c=5.1,s=5.1,s=6.606.60area=7.834539area=7.834539 图3.2 顺序结构程序举例 计算 area (a)传统流程图(b)N-S流 程图 计算 s 输入,a,b,c 开始 输出 area 结束 输入a,b,c 计算 s 计算 area 输出 area M 3.2 选择结构选择结构 C语言中提供三种类型的选择结构.分别是:if()单分支选择结构 if-else双分支选择结构 switch多分支选择结构3.2.1 3.2.1 单分支选择结构单分支选择结构 格式:if(表达式)语句;功能:计算表达式的值。如果条件为真(非0)则执行“语句”,否则不执行语句。1简单的单分支结构简单的单分支结构 特点特点:简单的单分支结构是指判断条件满足后执行简单的单分支结构是指判断条件满足后执行的语句,可以是一条语句或顺序结构的多条语句,的语句,可以是一条语句或顺序结构的多条语句,无内嵌无内嵌if 语句。语句。【例例3.23.2】输入一个学生成绩,如果及格则输出输入一个学生成绩,如果及格则输出“good!good!”,否则什么也不做。否则什么也不做。#include#include main()main()float g;float g;scanf(scanf(%f%f,&g,&g););if(g=60)if(g=60)printf(printf(good!ngood!n););【例3.3】编程序,将二数(a,b)中的大数存放到a中,小数存b中。算法分析算法分析:设一个中间变量temp暂存数据,其操作步骤为:(1)将a 存入temp,语句为temp=a;(2)将b赋给a,语句为 a=b;(3)将temp赋给b(原来a 的值),语句为 b=temp;#include main()float a,b,temp;scanf(%d,%d,&a,&b);if(ab)temp=a;a=b;b=temp;printf(a=%d,b=%dn,a,b);x0 N Y 开始 输入 x x=0 y=-1 y=0 y=1 N Y 输出 y 结束 2 2嵌套的嵌套的if if 语句语句【例3.4】输入一个整数x,若“x”是在-3x3区间内,则输出“-3AND3”#include main()int x;scanf(%d,&x);if(x=-3)if(x=3)printf(-3AND3n);3.2.2 双分支选择结构格式:if(表达式)语句1;else 语句2;功能:计算表达式的值,如果为真(非0),则执行“语句1”,否则执行“语句2”。说明:(1)语句1和语句2可以是一条语句、复合语句或是内嵌if语句等,也可以是空语句。(2)表达式可以是任何类型,常用的是关系表达式或逻辑表达式;(3)else 后面是if 的子句,与if 配对,不能单独出现;(4)if-else的配对原则是:else 总是与同一层最近的尚未配对的if 语句配对。1.简单的if-else 语句例3.5 输入一个字符,若是字母则输出“YES!”,否则输出“NO!”。【例3.5】输入一个字符,若是字母则输出“YES!”,否则输出“NO!”。#include main()char c;scanf(%c,&c);if(c=a&c=A&c=Z)printf(YES!n);else printf(NO!n);【例3.6】求如下所示分段函数值的方法。#include main()int x,y;scanf(%d,&x);if(x0)y=-1;else if(x=0)y=0;else y=1;printf(nx=%d,y=%dn,x,y);#include#include main()main()intint x,y;x,y;scanf(scanf(%d%d,&x,&x););if(x=0)if(x=0)if(x0)y=1;if(x0)y=1;else y=0;else y=0;else y=-1;else y=-1;printf(printf(nxnx=%d,y=%dn=%d,y=%dn,x,y);,x,y);2.嵌套的if语句ifelse ifelse形式形式 if(表达式表达式1)else if(表达式表达式2)else if(表达式表达式m)else S1=A注意:(1)if-else结构尽量缩格对齐。尽管我们在书写程序时,让else和最外层的if对齐,但它实际上是和内层if配对的。如果要让其和最外层if配对,必须用 将其程序段构成复合语句,如:if(ab)if(b=0&c=Ac&c=a&c=z)printf(c=%c,%cn,c,C);else if(c=)printf(c=%c,%cn,c,D);else if(c=n)rintf(c=%c,%cn,c,E)else printf(c=%c,%cn,c,N);3.2.4 switch语句switch(表达式)case 常量表达式1:语句组1;break;case 常量表达式2:语句组2;break;case 常量表达式3:语句组3;break;case 常量表达式n:语句组n;break;default:语句组n+1;功能:以关键字switch后面“表达式”为判断条件,在多分支中选择一个分支操作。(1)switch后的表达式可以为任何具有整型值的表达式,只要能产生整型或字符型量即可。(2)关键字case后的整型常量表达式可以是整型、字符型和枚举型。注意各case后的整型常量表达式之值必须互不相同。(3)“语句组”可以是一条或多条合法的语句,但不必将它们放在一个复合语句中。(4)break是C 语言的一种语句,其功能是中断正在执行的语句。在switch 语句中的作用是:执行完某个语句组后,将退出该switch语句。如果省略了break语句,则执行完某个语句组后,将继续执行其后边的语句组。【例3.8】输入i,根据i 的值输出信息。#include main()int i;scanf(“%d”,&i);switch(i)case 1:printf(“I am in case 1.n”);break;case 2:printf(“I am in case 2.n”);break;case 3:printf(“I am in case 3.n”);break;default:printf(“I am in default.n”);画出框图如果printf(I am in case 2.n)后缺少break语句,将会连续执行后面的case语句。将上例去掉break语句后,观察执行情况。#include main()int i=2;switch(i)case 1:printf(I am in case 1.n);case 2:printf(I am in case 2.n);case 3:printf(I am in case 3.n);default:printf(I am in default.n);(5)每个case后的常数可以是任意的,并不一定要从1开始从小到大排列。【例3.9】下面再看一看case后跟字符常量的例子。#include main()char c=x;switch(c)case a:printf(I am in case a.n);break;case x:printf(I am in case x.n);break;case z:printf(I am in case z.n);break;default:printf(I am in default.n);(6)允许将相同操作的case及对应的常量表达式连续排列,对应操作的语句组及break只在最后一个case处出现。【例3.10】将百分制成绩分段。#include main()int s;scanf(%d,&s);switch(s/10)case 1:case 2:case 3:case 4:case 5:case 5:printf(printf(E.E.nn);break);break;case 6:case 6:printf(printf(D D.n.n);break);break;case 7:case 7:printf(printf(C C.n.n);break);break;case 8:case 8:printf(printf(B B.n.n);break);break;case 9:break;case 9:break;default:printf(default:printf(A A.n.n););3.3 循环结构3.3.1 当循环结构 while语句格式:格式:while(表达式)语句;功能:计算表达式值,其值若为真(非0)则反复执行语句,直到表达式的值为假时为止。说明:(1)表达式用来描述循环条件的,可以是任何类型,常用的是关系型或逻辑型表达式。(2)重复执行的操作称为“循环体”,在格式中表示为语句,它可以是任何一条或复合语句。(3)在循环体中可以包含“循环语句”,这种程序结构称为循环嵌套,也称为多重循环。(4)while循环执行原则是“先判断,后执行”。即当表达式条件满足时执行循环体,条件不满足时结束循环转去执行循环语句后的下一条语句。结束循环【例3.11】第一行输出数字0,1,2,3,4,并要求每个数字间隔4个字符位,第二行输出“We are out of the loop.”。#include main()int i=0;while(i5)printf(%d ,i+);printf(“nWe are out of the loop.n);0 1 2 3 4We are out of the loop.【例3.12】求s=1+2+3100 分析:(1)设加数为i;i是从1(初值)开始到100(终值)结束;变化规律(步长值)为i=i+1(i+);变量 i满足了三个基本条件,即:有一个明确的初值 明确的终值 明确的步长值 则变量i 可以作为循环控制变量(2)设累加和用sum表示;初值为0 sum 随加数 i 而变化执行sum=sum+i 并由此语句与i=i+1构成了循环体。#include main()int i=1,sum=0;while(i=100)sum=sum+i;i+;printf(%dn,sum);【例】求任意10个实数的代数和。(1)10个数据通过键盘逐个输入,其执行语句是:scanf(%d,x);每当输入1 个x后执行:sum=sum+x(2)设 i 为循环控制变量,只控制循环的次数而不参加运算 i 的初值 为1,终值为10,i 的变化是i+#include#include main()main()intint i=i=1 1,x,sum=0;x,sum=0;while(i10)while(i10)scanf(scanf(%d%d,&x,&x););sum=sum+x;sum=sum+x;i+;i+;printf(printf(%dn%dn,sum,sum););注意:键盘给值的格式注意:键盘给值的格式3.3.2 直到循环结构 do-while语句 do 语句;(循环体)while(表达式);功能:先执行循环体,然后计算表达式值,其值若为真(非0)则继续执行循环体,直到表达式为假时为止。#include main()int i=1,sum=0;do sum=sum+i;i+;while(i=100);printf(%dn,sum);【例例3.13】用用do-while循环改写例循环改写例3.12 【例3.14】while和do-while循环的比较(1)main()(2)main()int i,sum=0;int i,sum=0;scanf(%d,&i);scanf(%d,&i);while(i=10)do sum=sum+i;sum=sum+i;i+;i+;while(i=10);printf(“sum=%dn”,sum);printf(“sum=%dn”,sum);3.3.3 3.3.3 次数循环结构次数循环结构 forfor语句语句格式:格式:for(for(表达式表达式1 1;表达式;表达式2 2;表达式;表达式3)3)语句语句;功能:功能:根据循环控制变量的初值、终值和步长值,重根据循环控制变量的初值、终值和步长值,重复执行循环体。复执行循环体。流程图如流程图如 while while 循环循环.【例例3.153.15】将例将例3.13.12 2改用改用forfor语语句句书书写。写。#include#include main()main()intint i,sum=0;i,sum=0;for(i=1;i=100;i+)sum+=i;for(i=1;i=100;i+)sum+=i;printf(printf(sumsum=%d,i=%dn%d,i=%dn,sum,i);,sum,i);说明:(1)for语句中的表达式,分别对应着循环控制中的三个基本组成部分,即:表达式1:循环控制变量的初始化(只执行1次),允许是逗号表达式。表达式2:循环判断条件,是循环的入口,若条件满足则执行循环体,否则结束循环。表达式3:改变循环控制变量操作(循环控制变量的增量),执行完循环体后,执行该语句;执行完毕,转去执行表达式2。(2)循环体由“语句”部分来描述,和其它循环一样。它也可以是一条语句、空语句或复合语句。(3)for循环语句的表达式1 和表达式3 都可以是逗号表达式。表达式3也可以出现在循环体中。如for(x=1;x10;)sum=sum+x;x+;。循环控制变量增量在循环体内完成,但格式中的“;”不能丢。(4)for(;x100;x+=10)其中x的初值在for语句前完成,但格式中的“;”不能丢。应用举例:1.求:sum=5+10+100 for(i=5;i=100;i+=005)2.求:sum=0.1+0.2+1.0for(i=0.1;i=1.0;i+=0.1)sum=100+90+sum=100+90+10+10#include#include main()main()intint i,sum=0;i,sum=0;for(i=100;i=10;i-)for(i=100;i=10;i-)scanf(scanf(%d%d,&x,&x););sum+=x;sum+=x;printf(printf(sumsum=%dn%dn,sum);,sum);三种循环语句的比较1for 语句与while语句执行过程相同,但for语句简洁、清晰,它将初始条件、判断条件和循环变量的在一行书写,显得直观、明了。2while 和do-while语句的循环控制变量初始化是在循环语句之前完成,而for语句循环变量的初始化是在for中(表达式1)中,也可以在for语句前实现。如:x=1;3for语句和while语句是判断条件后执行循环体;而do-while是先执行循环体后判断条件,无论条件是否满足都要执行一次循环体。3.4.4 循环嵌套与多重循环 在一个循环的循环体内又包含另一个循环,称为循环嵌套。两层循环嵌套结构称为双层循环;两层以上的嵌套结构,则称为多重循环。【例】求5学生的3门课程的平均成绩#include main()int i,j;float x,sum=0;for(i=1;i=5;i+)sum=0;for(j=1;j=3;j+)scanf(%f,&x);sum=sum+x;printf(%fn,sum/3);问题1、内循环执行次数,外循环执行次数?2、每门课程的平均成绩?【例3.16】百钱买百鸡。鸡翁1,钱值5;鸡母1,钱值3;鸡雏3,钱值1;何以百钱买百鸡?#include main()int x,y,z;for(x=1;x=20;x+)/*鸡翁*/for(y=1;y=33;y+)/*鸡母*/if(x*5+y*3+(100-x-y)/3)=100)/*三种鸡总数*/z=100-x-y;printf(nx=%d,y=%d,z=%dn,x,y,z);3.4 break语句和continue语句 3.4.1 break语句 格式:break;功能:强制中断当前的循环,不再执后面的循环语句而退出循环(结束循环)。Y break Y 表达式1 N 表达式2 N while循环的下一语句【例3.17】计算半径r=1到10时的面积,直到面积大于100为止#include#define PI 3.1415926main()int r;float area;for(r=1;r100)break;printf(area=%f,area);3.4.2 continue 语句 格式:continue;功能:continue语句的作用是跳过循环体中剩余的语句而转移到执行下一次循环。说明:(1)continue语句只用在for、while、do-while等循环体中,通常与if条件语句一 起使用,用来加速循环。(2)循环体中单独使用continue 语句无意义。continue Y 表达式表达式1 N Y 表达式表达式2 N while循环的下一语句循环的下一语句 【例3.19】输出找出100到200之间能被3整除的自然数#include main()int n;for(n=100;n=200;n+)if(n%3!=0)continue;printf(%d,n);3.5 goto语句及标号语句 格式:goto 语句标号;功能:强制终止本语句行之后的语句,跳转到语句标号对应的标号语句继续执行程序。说明:(1)标号实际上是一个入口地址。用来标明要转移到的那条语句(2)语句标号是一个标识符。其命名规则和变量名相同。语句标号格式要求后加“:”(3)语句标号只在说明它的函数中可见,且不能重名。标号语句的格式为:标号:如:loop:语句;【例3.20】计算s=1+2+3+4+100,使用goto 语句实现#include main()int i=1,s=0;loop:s+=i;+i;if(i=100)goto loop;printf(%dn,s);3.6 综合举例【例3.21】使 用公式/4=1-1/3+1/5-1/7+,求值。要求直到其最后一项的近似值的绝对值小于10-6为止。#include#includemain()int s=1;float n=1.0,t=1,pi=0;while(fabs(t)1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;printf(pi=%10.6fn,pi*4);