《控制结构与语句.ppt》由会员分享,可在线阅读,更多相关《控制结构与语句.ppt(58页珍藏版)》请在三一文库上搜索。
1、第4章 控制结构与语句,第4章 控制结构与语句,4.1 算法与程序 4.2 结构化程序设计 4.3 顺序结构 4.4 选择结构 4.5 循环结构 4.6 多重循环结构 4.7 实际应用举例,4.1 算法与程序,著名计算机科学家沃思(Nikiklaus Wirth)提出:数据结构 算法 程序 数据结构描述数据的类型、组织形式 算法描述对数据的操作步骤 程序数据结构算法程序设计方法语言工具和环境,1 算法的概念,做事都有方法、步骤(顺序)决定事情成败 算法:计算机求解某一问题而采用的具体方法、步骤。 两大类计算机算法:数值运算算法(求解值解、成熟)、非数值运算算法(事务管理、广泛)。 算法的描述:
2、有穷性、确定性、有效性等。 算法描述:描述算法的方法有多种 归纳为二大类:文字和图形(符号)。,2 常用的算法描述方法,带序号的自然语言描述易懂却不直观,不严格 流程图:灵活、自由、形象、直观,可表示任何算法,2 常用的算法描述方法,3. N-S图(盒图):特点:完全去掉带箭头 的流程线,算法的所有处理步骤都写在一个大矩形框(表示简单、符合结构化思想),4. 伪代码:用介于自然语言与计算机语言之间的文字及符号来描述算法(方便、易懂、便于向计算机语言过渡),例4-1计算S=1+2+100,写出其算法。,自然语言描述: 0S单元 1n单元 S n S n + 1 n 判断n 100? 是,转3;否
3、则转6 6. 输出S的值,流程图描述,N-S图描述,伪代码描述,0S 1n if n 100 S + n S n + 1 n print S,4.2 结构化程序的三种基本结构,1 1966年提出三种基本结构,用三种基本结构作为表示一种良好算法的基本单元:顺序、选择、循环。任何复杂的算法都是由这三种基本结构按一定规律组成,a 顺序结构,如: a = 1; b = 2; c = a + b;,b 选择结构,如: if(x != 0) y = sin(x)/x; else y = 1;,c 循环结构,根据条件P决定是否重复循环体中的操作。,2 三种基本结构的共同点,单入口单出口 结构内的每一部分都有
4、机会被执行 不存在“死循环”,3 结构化程序设计的优点,用三种基本结构组成的程序是结构化程序 优点:易编、易读、易懂、易维护 强调程序设计风格和程序结构的规范化 核心思想:自顶而下,逐步细化,模块化设计,结构化编码,如学校办公自动化系统,4 结构化程序设计过程,确定算法:分析问题,(建立数学模型,选择公式),写出算法描述 编写程序:用计算机语言写出实现算法的程序 上机调试:输出(编辑)程序编译、连接、执行程序输出结果,例42:让某学生解方程 ax2+bx+c=0,1)分析问题 这是一个一元二次方程 2)确定解题方案及步骤 确定a、b、c的值 求出b2 -4ac的值 如果 b2 -4ac0(双实
5、根) X1= X2= 如果 b2 -4ac=0(单实根) X1=X2= 如果 b2 -4ac0(双复根) X1= X2= 3)根据上述步骤编制程序 4)调试程序,输出结果,5 程序、程序设计和程序设计语言,程序:使用语言给计算机的一组指令序列 程序设计:为求解特定问题而编写的正确有效的程序 程序设计语言:编写程序所用的语言,4.3 顺序结构程序设计,在顺序结构程序中,各语句(或命令)是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。 例43 输入任意三个整数,求它们的和及平均值。 /*案例代码文件名:AL3_10.C */ /*功能:设计一个顺序结构程序,求三个整数的和及平均值。*/
6、main() int num1,num2,num3,sum; float aver; printf(“Please input three numbers:”); scanf(“%d,%d,%d”,”中“3.0”改为“3”?,1 顺序结构程序组成,在顺序结构程序中,一般包括以下几个部分: a程序开头的编译预处理命令。 在程序中要使用标准函数(又称库函数),除printf()和scanf()外,其它的都必须使用编译预处理命令,将相应的头文件包含进来。 b顺序结构程序的函数体中,是完成具体功能的各个语句和运算,主要包括: (1)变量类型的说明。 (2)提供数据语句。 (3)运算部分。 (4)输出部
7、分。,2 C语句函数,一、语句 用来对数据进行加工(完成操作任务)。是构成程序的基本单位,通常一个C程序由若干个函数(系统、用户)组成。 每一函数由若干条语句组成。每条语句总是以“;”结束。,3、C语句的分类,可分为三大类:简单语句、复合语句、空语句 ()简单语句 1、表达式语句:由一个表达式后跟“;”组成 赋值语句:赋值表达式加一个;号。如:s=3.14159*r*r; i+; 函数调用语句:函数调用表达式加一个;号。如printf(“hello,world n“); 2、结构控制语句:控制 程序流程 选择语句:if.else 循环语句: for while do.while 转向语句:co
8、ntinue break return goto (二)复合语句:将一组语句括在一对中 如:while(i 100) sum += i; i+; 说明:a、复合语句的 之后不能有“;”。 b、复合语句中的语句可以是简单语句、复合语句、空语句。 (三)空语句:; /*仅仅只有一个“;“号*/ 空语句什么也不做。有时用作被转向点,或为循环语句提供空体。如:for(i=0;i=10;i+);,顺序结构例题,例4-4:输入华氏温度,将其转化成摄氏温度输出。转换公式:C5(F-32)/9 #include void main() float f,c; printf(“输入一个华氏温度n”); scanf
9、(“%f”, ,例4-5: 计算任意两个整数的和并输出结果。 求任意两个数和的算法: 输入a,b suma+b 输出sum,#include “stdio.h“ void main( ) int a,b,sum; scanf(“%d,%d“, ,输入a,b,求和,输出和sum,例4-6 给出一个大写字母,要求按字母顺序打印出3个字母,指定的字母是三个字母中间的一个字母。输入的字母不能为A或Z 。 #include main( ) char c1,c2,c; printf(“Please enter a character:n“); c=getchar(); c1=c-1;c2=c+1; put
10、char(c1); putchar(c); putchar(c2); ,例4-7 输入三角形的三边长,要求用下述公式计算三角形的面积:sqrt(s(s-a)(s-b)(s-c) , 其中 s=(a+b+c)/2 #include #include void main( ) float a,b,c,s,area; printf(“enter a,b,c:n“); scanf(“%f,%f,%f“, ,良 好 的 源 程 序 书 写 风 格 顺序程序段左对齐,顺序程序段中的所有语句(包括说明语句),一律与本顺序程序段的首行左对齐。,4.4 选择结构(重点),定义:根据给定条件,从两条或多条路径中
11、选择下一步要执行的操作路径。 形式:两种形式 if 语句 ,switch语句 4.4.1 if 语句 (1) 双分支 (2) 单分支 (3) 嵌套的if语句 4.4.2 switch语句,定义:用来判定所给定的条件是否满足,根据判定的结果决定执行给出的两种操作之一的语句。 形式:双分支、单分支、if语句嵌套 (1)双分支形式 (if - else 形式) if (表达式) 语句1; else 语句2;,4.4.1 if 语句,表达式一般为逻辑或者关系表达式 语句可以为简单语句、复合语句,例4.4-1: 输入一个学生的C语言考试成绩给整型变量grade,确定是否需重修该课程,如果成绩大于等于60
12、分,则输出“Pass”;否则输出“Fail”。,#include “ stdio.h “ void main( ) int grade; scanf (“%d”, ,(2)单分支形式 (if 形式) if (表达式) 语句1;,例4.4-2: 输入两个实数分别给变量a、b,要求编程实现由小到大输出。,#include “ stdio.h “ void main( ) float a,b,t; scanf(“%f,%f“, ,复合语句,例4.4-3 三数比较大小,任给a、b、c三个数,按从大到小的顺序输出。,分析: 1)对于任意两个数a、b: 若ab,则输出a、b 否则输出b、a 2)对于三个数
13、,有6种可能: abc, acb bac, bca cab, cba 3)使用判断交换法 若abc,交换方法: 设a=5, b=8, a=b; b=a 需引入中间变量: ta;a=b; b=a;,a,t,b,例4.4-3的盒图和程序,#include void main() int a,b,c,t; printf(“Input a,b,c:”); scanf(“%d,%d%d”, Input a,b,c:-3,45,0 45 0 -3,单分支嵌套 if () else if () else if () else ,双分支嵌套 if () if () else else if () else ,
14、(3)嵌套的if语句,定义:在if语句中又包含一个或多个if语句称为if语句的嵌套。 1、一般形式:单分支嵌套,双分支嵌套。,例4.4-4 : 给一个成绩,要求输出成绩等级。90分及以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。,例4.4-4程序代码 #include “stdio.h” void main( ) int s; scanf(“%d”, ,2、匹配规则: C语言规定,else总是 和它上面离它最近 的未配对的if配对。,1、书写格式:递缩格式 同层语句行对齐,内层 向右缩进若干字符。,2、if双分支嵌套及其变形,if(P1) if(P2) A e
15、lse B else if(P3) C else D,if(P1) if(P2) A else B else C,if(P1) A else if(P3) C else D,例4.4-5 : 编写程序,输入一个x值,输出对应的y值。函数为 -1 (x0),在if子句中嵌套,在else子句中嵌套,if (x=0) if (x0) y=-1; else y=0; else y=1;,if (x0) y=-1; else if (x=0) y=0; else y=1;,if(P1) if(P2) A else B,if(P1) if(P2) A else B,由此可以看出,通过“”,可以改变流程el
16、se的层位,从而强制改变程序的执行流程。,P1,P2为真,执行A P1为真,P2为假,执行B,P1,P2为真,执行A P1为假,执行B,x,y不为0,输出1 x为不为0,y为0,输出2,x,y 不为0,输出1 x不为0,输出2,3、选择结构程序执行顺序的强制改变,if (x0) ; y=3x+2; if (x=2) printf(“y0”); if (1=x=9) y=x-1;,(4)常见问题:,此处加逗号,表示空语句为分支语句,应为x=2,应为 x=1&x=9,4.4.2 switch语句 亦称多分支选择语句。它比用嵌套的if语句实现多路分支问题,其程序结构清晰、易读。 switch语句的基
17、本格式: switch (表达式) case C1:语句1;break; case C2:语句2;break; case Cn:语句n;break; default :语句n+1; /*可缺省*/ ,/*表达式(整型、字符型或枚举型)*/,C1Cn 常量(整数、字符)常量表达式(如3+4)不含变量或函数,语句1语句n 可为简单语句,复合语句或空语句。,说明: 1、计算表达式e的值,若与常量表达式ci值一致,则从语句i,开始执行;直到遇到break语句或switch语句的“”。 2、若与任何常量表达式值均不一致时,则执行default语句或执行后续语句。 3、常量表达式ci仅起语句标号作用,不作
18、求值判断每个case的常量表达式的值必须互不相同。 4、各个case的出现次序不影响执行结果。 5、多个case语句可共用一组执行语句。,示例1,include void main() char s; scanf(“%c”, ,运行结果: 6069 60 错误输入,输入“C”,观察输出结果。,示例1,解决方法break语句: include void main() char s; scanf(“%c”, ,运行结果: 6069,讨论 switch(s)语句中的s实际上并非真正的条件选择,而只是一种跳转指示(与if语句不同),表示下面应该跳转到什么位置继续执行。而各case实际上只是一个跳转处的
19、标记。当程序跳转到某个case处时,并非只执行此case行的程序组,而是从此处开始一直向下执行各条语句,直到整个switch开关体结束(“”)。 如果要使每个case处相当于一种if(s)else的效果,必须在其语句组最后加上break语句。,输入“C”,观察输出结果。,示例1,解决方法break语句: include void main() char s; scanf(“%c”, ,各个case的出现次序不影响执行结果,运行结果: 6069,输入“C”,观察输出结果。,示例2,include void main() int x=1,y=0,a=0,b=0; switch(x) case 1
20、: switch(y) case 0 : a+;break; case 1 : b+;break; case 2 : a+;b+;break; case 3 : a+;b+; printf(“a=%d,b=%dn”,a,b); ,求程序运行结果。,结果:a=2,b=1。,如果x=2?,结果:a=1,b=1,如果x=3?,结果:a=1,b=1,例3 : 输入两个运算量和一个运算符,完成加、减、乘、除运算,输出运算结果。 #include“stdio.h“ void main( ) int x,y,z; char ch; printf(“Enter an operator(+,-,*,/):n“)
21、; ch=getchar(); printf(“Enter two numbers:“); scanf(“%d,%d“,switch(ch) case +: z=x+y; printf(“x+y=%d n “,z); break; case -: z=x-y; printf(“x-y=%d n “,z); break; case *: z=x*y; printf(“x*y=%d n “,z); break; case /: if (y=0) printf(“division by zeron“); else z=x/y; printf(“x/y=%d“,z); break; default:
22、printf(“The error operator !n “); ,例4: 用公式f=p*w*s*(1-d) 计算运输费。,吨公里运价,运输距离,折扣,货重,250(公里) d=0 250s500 d=0.02 500s1000 d=0.05 1000s2000 d=0.08 2000s3000 d=0.10 3000s d=0.15,用不带else的if语句、if-else语句完成上述例题, 并做对比。,?,要根据运输距离计算折扣d,关键 是要构造switch后的表达式,根据 题目,选择 c=s/250 来求c的值。 if (s=3000) c=12; else c=s/250;,程序中当
23、c的值为2,3时, d的值都是0.05,则这两 个case语句可以共同使用 一个语句。,分析,说明,#include void main () int c, s; float p, w, d, f; scanf (“%f, %f, %d“, ,case 4: case 5: case 6: case 7:d = 8; break; case 8: case 9: case 10: case 11: d = 10; break; case 12: d = 15; break; default: printf (“unknown!“); f = p * w * s * (1 - d / 100.0
24、); printf (“freight = %15.4f“, f); ,100, 20, 300 freight = 588000.0000,小结: 1)算法与程序结构 2)顺序结构 3)选择结构 作业: 习题1(1)(3) 习题4(1)(6),例4-2 百鸡问题,张丘建算经中提出“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母、雏各几何? 1)分析: cocks + hens + chicks =100 5 * cocks + 3*hens + chicks/3 = 100 其中:0 cocks 19 0 hens 33 0 chick 100 思路:依次取co
25、cks的值域中的值,然后求其余两数,看是否合乎题意。可采用累试法 枚举法 。,细化过程,算法描述: cocks = 0 当cocks 19时 hens = 0 当hens 33时 找满足题意的chicks数 hens加1 cocks加1 ,算法描述: cocks = 0 当cocks 19时 找满足题意的hens、chicks数 cocks加1 ,算法描述: cocks = 0 当cocks 19时 hens = 0 当hens 33时 chicks=100-cocks-hens 如果(5*cocks+3*hens+chicks/3)100则输出 hens加1 cocks加1 ,程序清单,void main() int cocks=0, hens, chicks; while(cocks = 19) hens=0; while(hens = 33) chicks = 100 cocks hens; if(5.0*cocks + 3.0 *hens + chicks/3.0 =100 ) printf(“%d %d %d n”, cocks, hens, chicks); hens+; cocks+; ,
链接地址:https://www.31doc.com/p-2594052.html