第三章程序的流程控制.ppt_第1页
第三章程序的流程控制.ppt_第2页
第三章程序的流程控制.ppt_第3页
第三章程序的流程控制.ppt_第4页
第三章程序的流程控制.ppt_第5页
已阅读5页,还剩185页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章 程序设计知识,3.1 程序的概念,程序是可以被计算机处理的指令序列。通常,程序是为完成一项任务、由汇编语言或高级语言编写的代码的集合。程序设计是根据所提出的任务,用某种程序设计语言编制一个能正确完成该任务的计算机程序。,3.1.1 程序的特性,著名的计算机科学家沃思(Nikiklaus Wirth)提出一个公式:程序=数据结构+算法。 现在又有很多专家对这个公式加以扩充:程序=算法+数据结构+程序设计方法+语言工具和环境。,所有程序(包括计算机程序)都有一些共同的性质,这些性质主要包括: (1)指令是顺序执行的。 (2)程序的执行都有一个结果。 (3)程序总是要对某些对象进行操作。 (

2、4)有的程序要加入对操作对象的说明。 (5)有时指令要求执行者做出判断。 (6)一条或一组指令可能需要执行多次。,程序设计离不开算法,算法指导程序设计,算法是程序的灵魂。因此程序设计的大致步骤如下。 (1)问题定义 (2)算法设计 (3)算法表示 (4)程序编制 (5)程序调试、测试及资料编制,3.2 算 法,精确地讲,算法是被精确定义的一系列规则,这些规则规定了解决特定问题的一系列操作顺序,以便在有限步骤内产生出所求问题的解答。,3.2.1 算法的特点,算法特性: (1)有效性。 (2)确定性。 (3)有穷性。 (4)有零个或多个输入。 (5)有一个或多个输出。,有效性指算法所规定的操作都应

3、当是能够有效执行的。,确定性一是:所描述的操作应当具有明确的意义,不应当有歧义性。 二是: 操作作序列只有一个初始动作,序列中每一动作仅有一个后继动作;,有穷性指算法所规定的操作序列必须在允许的时间内结束。,【例3-1】从键盘输入三个数,找出其中最大的那个数。,分析:从键盘输入的三个数值必须用三个变量来保存,假定这三个变量分别为a、b、c,另外,还需要一个变量max来装最大的那个数。 先比较a和b的值,把数值大的放入max中,再将max与c比较,又把数值大的放入max中。 经过两次比较,max中已存放的是a,b,c三个数中最大的数,把max的值输出就是所需结果。,算法步骤:,1输入三个数,其值

4、分别赋给三个变量a,b,c。,2把a与b中较大的那个数放入变量max中。,3把c与max中较大的那个数放入变量max中。,4输出最后结果max的值。,三个数比较大小,#include void main() int a,b,c,max; printf(请输入三个数的值:); scanf(%d%d%d, ,1流程图表示法,流程图表示法常用图例,3.2.2 算法的表示,求三个数最大值问题的流程图表示,2.N-S图描述,灵活的流线是程序中隐藏错误的祸根。针对这一弊病,1973年美国学者I. Nassi和B. Shneiderman提出了一种无流线的流程图,称为N-S图。,N-S图表示法,求三个数中最

5、大值问题的N-S图表示,常用的流程图符号,一顺序结构 顺序结构是一种简单的线性结构,根据流程线所示的方向,各矩形框按顺序执行。 如:右图 语句的执行顺序为:ABC,NS图表示的顺序结构,顺序结构流程图,二选择结构 选择结构是对给定的条件进行判断,根据判断结果的真假而分别执行不同的框的内容。 有两种选择(分支)结构的流程图:,(a)的执行顺序为:先判断条件,当条件为真时,执行A,否则执行B。 (b)的执行顺序为:先判断条件,当条件为真时,执行A,否则什么也不执行。,三循环结构 循环结构是在某个条件为真的情况下,重复执行某个框中的内容。循环结构有两种基本形态:while型循环和do_while型循

6、环。,while型(当型)循环的流程图 while型循环的执行顺序为:重复判断条件、如果条件为真则执行A,一但条件为假,则跳出循环。,do-while(直到型)型循环的流程图 do_while型循环的执行顺序为:先执行A,再判断条件,若条件为真则重复执行A,一但条件为假,则跳出循环。,循环结构注意:,1、在循环体中,必须对条件要烦判断的值进行修改,使得经过有限次循环后,循环一定能结束。,2、while型循环中循环体可能一次都不执行,而do_while型循环则至少执行一次循体。,3、do_while型循环可以很方便地转化为while型循环,而while型循环不一定能转化为do_while型循环。

7、,伪码是用介于自然语言和计算机语言之间的文字和符号来描述算法,类似一篇短文,它把算法的思想表达清楚。,3伪码表示法,关 系 运 算,关系运算是指对两个运算量之间的大小比较。,C语言中提供的关系运算符有: (大于) =(大于或等于) (小于) =(小于或等于) = =(等于) !=(不等于),说明:(1)关系运算符的优先级低于纯算术类, 高于赋值类。,(2)关系运算符的结合方式为自左至右。每个 关系运算的操作数可以是任一表达式。,例如:a+bc+d,应理解为(a+b)(c+d),关 系 运 算,(3)关系表达式的值只有两个: 关系表达式成立,即为“真”,C语言中以“1”表示;关系表达式不成立,即

8、为“假”,C语言中以“0”表示。,例如:对于声明语句:int x=2 , y=3;,表达式 x= =y 的值为0;表达式 xy 的值为1。,关 系 运 算,表达式 z=3-1=x+1=y+2 中 z 的值为1。,z=2=3=5,“算术”优先,z=0=5,“关系”优先,z=1,z的值为1,“赋值”,关 系 运 算,注意:1. 要说明x在区间a,b中,数学中使用表达式 axb。 但C语言中的表达式“a=x=b” 的含义与之不同。,假设a=0;b=0.5。若x=0.3,则执行a=x=b时 先求出“a=x”的值得1,再进行“1=b”得0(假)。,因此,为了判断x是否在a,b范围内,应写成: a=x ,

9、表达式 x= =y 的值为0;表达式 xy 的值为1。,表达式 z=3-1=x+1=y+2 中 z 的值为1。,z=2=3=5,“算术”优先,z=0=5,“关系”优先,z=1,z的值为1,“赋值”,关 系 运 算,4. 字符数据的比较按其ASCII码值进行。,例如:a0 的值为1(真);A100的值为0(假)。,5. 在判定两个浮点数是否相等时,由于存储上的误差, 会得出错误的结果。,例如:1.0/3.0*3.0= =1.0 的值为0(假),注:应避免对两个实数表达式作“相等”或“不相等”的判别。因此上式可改写为:fabs(1.0/3.0*3.0-1.0)1e-5,逻 辑 运 算,C语言有三个

10、逻辑运算符,它们是: ,逻 辑 运 算,#include int main() int x,y; printf(Enter an integer:); scanf(%d, ,例 求一个数的绝对值,数的绝对值,【例】 从键盘任意输入两个实数,然后按其代数值从小到大输出这两个数。,先制定算法的流程图,如图所示,虚线框为if结构。,根据流程图写出解决这个问题的程序。,/*按升序输出两个数*/ #include main() float a,b,t; scanf(%f%f, ,升序输出两个数,选择型程序设计 if语句(条件选择语句),形式二: 格式:if (expression) statement1

11、 else statement2 执行过程:,例:if (xy) max=x; else max=y;,#include int main() int a,b; printf(Enter integer a:); scanf(%d, ,例 输入两个数并判断两数是否相等,判断相等,形式三: 格式:,if ( expr1 ) statement1 else if (expr2 ) statement2 else if (expr3 ) statement3 . else statementn ,执行过程:,例:if (salary1000) index=0.4; else if (salary80

12、0) index=0.3; else if (salary600) index=0.2; else if (salary400) index=0.1; else index=0;,#include int main() char c; printf(Enter a character:); c=getchar(); if(c=0 ,例 判断输入字符种类,判断输入字符种类,【例】 从键盘输入+、-、*、/中的任一个,输出对应的英文单词:plus 、minus、mutiply、divide,若输入的不是这四个字符中的任一个,则输出“error”。,算法的流程图如图所示,虚线框所示为if_else的

13、规则嵌套:,#include int main() char ch; ch=getchar(); if (ch=+) printf(plusn); else if (ch=-) printf(minusn); else if(ch=*) printf(multiplyn); else if (ch=/) printf(dividen); else printf(errorn);return 0; ,运算符号判断,例 根据百分制分数决定成绩的等级: 80分以上为A级; 70分及以上,80分以下,B级; 60分及以上,70分以下,C级; 60分以下,D级。,下次实验,if语句嵌套: 一般形式:,/

14、*输入两数并判断其大小关系*/ #include main() int x,y; printf(Enter integer x,y:); scanf(%d,%d, ,【例】 计算阶跃函数y的值:,/* 计算阶跃函数y的值*/ #include main( ) float x,y; printf(input x:n); scanf(%f, ,对多重if,最容易犯的错误是if与else配对错误, else总是与离它最近的上一个if配对。,阶跃函数,if else 配对原则:缺省 时,else总是和它上面离它最近的未配对的if配对,例: if (a=b) if(b=c) printf(“a=b=c”

15、); else printf(“a!=b”);,修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,实现if else 正确配对方法:加 ,例 考虑下面程序输出结果: int main() int x=100,a=10,b=20; int v1=5,v2=0; if(ab) if(b!=15) if(!v1) x=1; else if(v2) x=10; x=-1; printf(%dn,x);return 0; ,结果:-1,If_else配对,if语句适合两种分支情况进行选择。 如果多种分支的情况,可采用嵌套的if语句结构。

16、 存在的问题: 当嵌套的分支较多时,程序的效率和可读性降低。 解决方案:用switch结构处理多路分支的情形。,Switch结构,当嵌套if分支较多时,程序变得复杂冗长,可读性降低。C语言提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。,switch语句的一般形式为:,switch() case:语句序列1; case:语句序列2; case:语句序列n; default: 语句序列(n+1); ,switch语句一般形式的流程图:,先计算的值,再从上到下地判断与哪一个的值相等,如果的值等于的值,则从语句序列i开始执行,直到语句序列(n+1)为止;若的值不等于任何一个的值,是

17、执行default后面的语句序列(n+1)。,常量表达式: 值必须是整型、字符型或者枚举类型 语句序列: 允许有多条语句 : case表达式应当是整型常数表达式,不能含有变量与函数的常数表达式。,例:某班级准备周末举行一个班级活动,但活动内容要根据表中所示的天气情况来决定:,分析: 分别用整数1、2、3、4代表晴天、有风无雨、下雪和下雨这4种天气情况。 通过输入天气情况weather的值,来确定活动场所。,/* 根据天气情况决定活动场所*/ #include main( ) int weather; scanf(%d, ,活动确定,使用switch结构须注意以下几点: (1) 一个switch

18、结构的执行部分是一个由一些case子结构与一个可缺省的default子结构组成的复合语句,它们位于一对花括号之中。 (2) switch的判断表达式只能对整数求值,可以使用字符或整数,但不能使用浮点表达式。case表达式应当是整型常数表达式,不能含有变量与函数的常数表达式。例如可以是:,case 3+4:,但不允许写为: int x=3,y=4; switch (z) case x+y: ,(3) 一个switch结构中不可以出现两个具有相同值的常量表达式。,case 3+2: case 8-3:,(4)switch的匹配测试,只能测试是否相等,不能测试关系或逻辑。 (5)C89要求C编译系统

19、应当实现一个switch最少可以包含257个case子结构,而C99要求最少支持1023个case子结构。,结论: 程序不完全正确; 不能正确表达每一种情况。 存在的问题: 程序不能正确分支; 解决方案: 使用分支语句break。,break语句在switch语句中的作用 break语句起中断和跳出的作用。 可以用在switch分支语句和循环语句中。 使用方法: 在switch语句中,在需要独立执行的后面加上一条分支语句:break;,switch(表达式) case 常量表达式1: 语句序列1 break; case 常量表达式2: 语句序列2 break; case 常量表达式n: 语句序

20、列n break; default: 语句序列n+1 break; ,【例】改写成具有独立分支的switch结构。,#include main( ) int weather; scanf(%d, ,程序运行时,任何一种天气情况都只会对应出现一种运动场所.,例下程序的输出结果: void main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; case 1: b+; break; case 2: a+;b+; break; case 3: a+;b+; printf(“na=%d,b=%d”,a,b);

21、 ,运行结果:a=2,b=1,【例】运输费用的计算问题。距离S越远,每公里的运费越低。设每公里每吨货物的基本运费为P,货物重量为W(吨),距离为S,折扣为d,则总运输费用f的计算公式为:f=P*W*S*(1-d)。其中折扣数d与距离有关,具体标准如下:,0S250km 没有折扣 250S500 折扣2 500S1000 折扣5 1000S2000 折扣8 2000S3000 折扣10 3000S 折扣15,分析:折扣点的变化处都发生在距离为250的倍数上,如表所示。,流程图简图如左图,#include main() int c,s; float p,w,d,f; printf(please i

22、nput p,w,s:n); scanf(%f,%f,%d, switch (c) ,case 0:d=0;break; case 1:d=2;break; case 2: case 3:d=5;break; 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; f=p*w*s*(1-d/100); printf(Total freight is:%10.2fn,f); ,程 序 范 例,求解一元二次方程ax2+bx+c=0的根(a0)

23、,a、b、c均为实数,其值由键盘输入。 分析:一元二次方程的一般解为:,方程的求解需要考虑以下3种情况: b24ac0,方程有两个不等的实根:,其中a的值不能等于0,否则方程无解。,程 序 范 例, b24ac=0 方程有两个相等的实根:, b24ac0 方程有两个共轭复根:,程 序 范 例,条 件 运 算,条件运算是一种在两个表达式的值中选择一个的操作。,它的一般形式为: e1?e2:e3 被称为“条件表达式”,它的操作过程为: 若e1为真(非0),则此条件表达式的值为e2; 若e1为假(0),则表达式取e3的值。,注:条件运算符“ ? : ”共要求三个运算量, 是C语言中唯一的三元运算符。

24、,条 件 运 算,例1:计算a+|b|的值。,main( ) float a, b ; printf(“input 2 reals please :”); scanf(“%f %f”, ,条 件 运 算,例2 输入两数,输出大者。,main( ) float a,b,max; printf(“input 2 reals please :”); scanf(“%f %f”, ,条 件 运 算,说明:1. 条件运算符的优先级很低,仅仅比赋值运算 符的级别高。,2. 条件运算符的结合方式与赋值运算符一样是 自右至左的。,例如:a=35?6:4= =7?1:0,相当于a=(35?6:(4= =7?1:

25、0),条 件 运 算,注意:1. C语言程序设计中,要求尽量避免使用“多余的临时变量”,尽量把程序表示得简洁。如上述程序中可以省去一个变量max,写为,main( ) float a,b; printf(“input 2 reals please:”); scanf(“%f %f”, ,条 件 运 算,2. 在条件表达式e1?e2:e3中,e1应为算术表达式,e2,e3可以是任意类型的表达式。条件表达式的值的类型为e2与e3二者中类型较高的。,如:表达式y3?-1.0:1的值应为实型。,小结:,本节主要介绍了程序分支结构的几种形式,它包括有if语句,if_else语句,if嵌套语句和switc

26、h语句 。,共同特点是:先进行条件判断,再根据判断结果决定下一步做什么。,switch是一种“多路开关”语句,用它可更好地完成多路选择任务,只是在使用中应注意break语句的正确使用,以使程序能正常地从switch分支中跳出。,循环结构,导入循环,从键盘输入10个数,求10个数中的最大数?,从键盘输入n个数,求n个数中的最大数?,从键盘输入3个数,求3个数中的最大数?,引例:编写程序,输入10个数,输出其中最大者。,分析:,循环结构,循环就是重复地执行某些语句。 程序中的循环次数是有限的,由循环条件决定可以确定循环次数。 C语言提供了3种循环结构语句:, for语句 while语句 do_wh

27、ile语句,while语句 一般形式:,while(表达式) 循环体语句;,执行流程:,while() 循环语句; 循环变量表达式; 关于while语句的几点说明。 1循环变量表达式不可缺少,其作用是更新计算循环变量的值,使循环能正常结束。 2若没有循环变量表达式,则有可能会使程序出现无限循环而发生错误。 3由于while循环是先判断的值,后决定是否执行循环体语句,因此,循环体语句有可能一次也没有执行。,特点:先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇break,return,goto

28、 无限循环: while(1) 循环体;,#include stdio.h void main() int a,max,i; printf(请输入第1个值); scanf(%d, ,?试用while语句编写程序:求输入十个数中的最大值。,十个数最大值,例 用while循环求,#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum); ,求100个整数的和,计算10年后人口增长的C程序。,/* 计算人口增长 */ #include int main(void) double m=13; int i=1

29、; while(i=10) m=m*(1+0.002); i+; printf(Population after 10 yers is:%fn,m); return 0; ,人口增长,将输入的字符原样输出,/* 测试字符结束符 */ #include int main(void) int c; while (c=getchar()!=EOF) putchar(c); return 0; ,程序中的“EOF”是一个符号常数,称为文件结束标志,它是在文件stdio.h中定义的: define EOF -1 当从键盘输入(Ctrl+Shift+z)或遇文件结束标记,c的值得到-1,等于EOF。,字符

30、输入输出,求阶乘 n!,求p=1234n (n10),初始值: p=1; i=1;,p=p*i; i+;,思考,即:s=1+3+5+n,求1n的奇数累加和,s=s+i; i=i+2;,s=0; i=1;,初始值:,思考,即:s=2+4+6+n,求1n的偶数累加和,s=s+i; i=i+2;,s=0; i=2;,初始值:,dowhile语句 一般形式:,do 循环体语句; while(表达式);,执行流程:,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,用dowhile循环求,#include main() int i,sum=0; i=1;

31、 do sum+=i; i+; while(i=100); printf(%d,sum); ,while和dowhile比较,#include main() int i,sum=0; scanf(%d, ,#include main() int i,sum=0; scanf(%d, ,写法不同 实现的功能相同,第一次运行: 1 再运行一次: 11,sum=55,sum=11,第一次运行: 1 再运行一次: 11,sum=55,sum=0,While结构运行情况:,dowhile结构运行情况:,结论:while 和dowhile结构何时相同?何时不同?,例 显示110的平方,#include m

32、ain() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; ,平方,找出100到200之间能被3整除的自然数,#include main() int n; n=100; do if (n%3=0) printf(“%dt,n); n+; while(n=200); ,被3整除的自然数,/* 测试字符结束符 */ include stdio.h int main(void) int c; do c=getchar(); putchar (c); while (c!=EOF); return 0; ,一般形式:,while(表达式) 循环体语

33、句;,执行流程:,While小结,一般形式:,do 循环体语句; while(表达式);,执行流程:,Do While小结,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,循环结构的三个基本要素,循环变量初始化,如:i=1; s=0; 循环条件,如:i=100 循环趋向结束语句,如:i+;,for语句 一般形式:,for(expr1 ; expr2 ; expr3) 循环体语句;,for语句,执行流程:,expr1; while(expr2) 循环体语句; expr3; ,for语句一般应用形式:,for(循环变量赋初值;循环条件;循环变量增

34、值) 循环体语句; ,说明: for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省 无限循环: for(;) for语句可以转换成while结构,while( ) 循环体语句; ,for(expr1; expr2; expr3) 循环体语句; ,do 循环体语句; while( );,expr1;,expr2,expr3;,expr1;,expr2,expr3;,例 用for循环求,#include main() int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(%d,sum); ,#include void main

35、() int i,s=0; i=1; while(i=100) s=s+i; i+; printf(%dn,s); ,#include main( ) int i=0; for(;i10;i+) putchar(a+i); ,#include main( ) int i=0; for(i=0;i10;i+) putchar(a+i); ,例:从a开始输出十个字符。,输出十个字符,#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; ,missing ; before ,main() int i,j,k; for(i=0,j=100;i=j;

36、i+,j-) k=i+j; printf(%d+%d=%dn,i,j,k); ,#include main() char c; for(;(c=getchar()!=n;) printf(%c ,c); ,#include main() int i,c; for(i=0;(c=getchar()!=n;i+=3) printf(%c ,i+c); ,关于for循环的说明:,(1)expr1可以省略,但是其后的分号不能省略。如:,for(i=1;i=100;i+) sum+=i;,i=1; for(;i=100;i+) sum+=i;,等价于,(2)expr3可以省略,但是其前的分号不能省略。如

37、:,for(i=1;i=100;) sum+=i; i+; ,关于for循环的说明:,for(i=1;i=100;i+) sum+=i;,等价于,(3) 可以同时省略expr1和expr3。如:求1100的和,i=1; for(;i=100;) sum+=i; i+; ,关于for循环的说明:,for(i=1;i=100;i+) sum+=i;,等价于,关于for循环的说明:,(4)若expr2省略,会导致死循环。如:,for(i=1;i+) sum+=i;,等价于,i=1; while(1) sum+=i; i+; ,所以,从功能上讲:expr2不能省略,(5) expr1, expr2 ,

38、 expr3也可以包含其他功能的表达式。,关于for循环的说明:,/求1100的和 s=0; for(i=1;i=100;i+) s=s+i;,/求1100的和 for(s=0,i=1;i=100;s=s+i,i+) ;,expr2一般是循环条件表达式,也可以包含其他功能的表达式。,#include void main() char ch; printf(输入一串字符,回车键结束:); ch=getchar(); for(;ch!=n;) printf(%cn,ch); ch=getchar(); ,在获取值的同时进行判断,for(;(ch=getchar()!=n;) printf(%cn,

39、ch);,while的循环条件中也可以包含其他表达式,#include void main() char ch; printf(输入一串字符,回车键结束:); for(;(ch=getchar()!=n;) printf(%cn,ch); ,在获取值的同时进行判断,while(ch=getchar()!=n),循环的嵌套,定义:一个循环体内又包含另一个完整的循环结构。,一般形式:, while(条件表达式) 循环体语句组; , do 循环体语句组; while(条件表达式) ; ,外层,内层, for(expr1;expr2;expr3) 循环体语句组; , while (条件表达式) 循环体

40、语句组; ,执行过程:,执行一次外层循环时:,内层循环要执行到条件不满足时,(内层循环是多个小循环,外层循环是一个大循环),基本原则:,1、外层循环的“变量初始化”在外层循环之前;,2、内层循环的“变量初始化”在外层循环之内(适当位置)内层循环之前;,内层循环可以尽量使用for结构,#include void main() int i, j; long s,p; /s存放和值,p存放阶乘 /i外层循环变量,j内层循环变量 for(s=0,i=1; i=10; i+) for(j=1,p=1;j=i;j+) p=p*j; s=s+p ; printf(result=%ld ,s); ,循环的嵌套

41、 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程,(1) while() while() . ,(2) do do while( ); . while( );,(3) while() do while( ); . ,(4) for( ; ;) do while(); while() . ,嵌套循环的跳转 禁止: 从外层跳入内层 跳入同层的另一循环 向上跳转,例 循环嵌套,输出九九乘法表,for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j);,#include main() int i,

42、j; for(i=1;i10;i+) printf(%4d,i); printf(n-n); for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j); ,九九乘法表,break语句,作用:,从循环体内跳出循环体外,强制性提前结束循环。,一般形式:,break;,特点:,通常与if语句搭配使用;,只能用于循环结构和switch结构。不能用于其他语句中,while(循环条件表达式) if(表达式x) break; ,break执行示意,for(表达式1;表达式2;表达式3) if(表达式x) break; ,例 break举例:输出圆面积

43、,面积大于100时停止,#define PI 3.14159 main() int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); ,九九乘法表,例 break举例:小写字母转换成大写字母,直至输入非小写字母,#include main() int i,j; char c; while(1) c=getchar(); if(c=a ,小写字母转成大写字母,作用:,提前结束本次循环,判断是否成立。,continue语句,一般形式:,continue;,特点:,通常与if语句搭配使用;,与break的区别:不是

44、终止整个循环的执行,只是提前结束本次循环;,while(循环条件表达式) if(表达式y) continue; ,continue执行示意,for(表达式1;表达式2;表达式3) if(表达式y) continue; ,例 求输入的十个整数中正数的个数及其平均值,main() int i,num=0,a; float sum=0; do scanf(%d, ,十个正数的和,main() int i,num=0,a; float sum=0; for(i=0;i10;i+) scanf(%d, ,找出100到200之间能被3整除的自然数,#include main() int n; for(n=

45、100;n=200;n+) if(n%3!=0) continue; printf(%d, ,n); ,#include main() int n; n=100; do if (n%3=0) printf(“%dt,n); n+; while(n=200); ,continue_3整除,18:08,132/44,break语句和continue语句在程序中的区别,/* break的作用*/ main() int x; for(x=1;x=10;+x) if(x=5) break; printf(%d,x); ,运行结果: 1,2,3,4,/* continue的作用*/ main() int

46、x; for(x=1;x=10;+x) if(x=5) continue; printf(%d,x); ,运行结果:1,2,3,4,6,7,8,9,10,18:08,133/44,三种循环结构:for、while和do_while循环。,当循环次数是肯定的情况下,用for循环比较方便。,while循环和for循环都要先判断条件再执行循环语句体,因此,有可能一次也不执行循环语句体。 do_while循环不论怎样都会先执行一次循环语句体。,注意避免以下几个方面的问题:,1循环语句体为复合语句,但没有使用花括号。 2使程序发生无限循环。 3混淆break 语句与continue语句的功能。,小结,案

47、例分析,九九乘法表 仅输出,for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j);,if(j!=9) printf(%4d,i*j); else printf(%4dn,i*j);,i=1 j=1 to 9 i=2 j=2 to 9 i=9 j=9,第1行 从第1个位置输出%4d 无空 第2行 从第2个位置输出%4d 空1个空 第3行 从第3个位置输出%4d 空2个空 第9行 从第9个位置输出%4d 空8个空,九九乘法表 右下方,for(i=1;i10;i+) if (i!=1) for(k=1;ki;k+) printf(%4c,

48、 ); for(j=i;j10;j+) printf(j=9)?%4dn:%4d,i*j); ,注意:有个空格,前6行: 第1行1个* 空5个空 第2行3个* 空4个空 第3行5个* 空3个空 第6行11个* 无空,第1行*的个数 2*1-1 第1行空的个数 6-1,第2行*的个数 2*2-1 第2行空的个数 6-2,第6行*的个数 2*6-1 第6行空的个数 6-6,for(i=1;i=6;i+) for(k=1;k=6-i;k+) printf(%c, ); for(j=1;j=2*i-1;j+) printf(%c,*); printf(n); ,输出*,输出空格,星号输出,后7到11行

49、: 第7行9个* 空1个空 第8行7个* 空2个空 第9行5个* 空3个空 第11行1个* 空5个空,第7行*的个数 2*5-1 第7行空的个数 7-6,第8行*的个数 2*4-1 第8行空的个数 8-6,第11行*的个数 2*1-1 第11行空的个数 11-6,for(i=7;i=11;i+) for(k=1;k=i-6;k+) printf(%c, ); for(j=1;j=2*(12-i)-1;j+) printf(%c,*); printf(n); ,输出空格,输出*,星号输出,前5行: 第1行1个A 空4个空 第2行3个B 空3个空 第3行5个C 空2个空 第5行9个E 无空,第1行

50、A的个数 2*1-1 第1行空的个数 5-1 输出A+1-1,第2行B的个数 2*2-1 第2行空的个数 5-2 输出A+2-1,第5行E的个数 2*5-1 第5行空的个数 5-5 输出A+5-1,for(i=1;i=5;i+) for(k=1;k=5-i;k+) printf(%c, ); for(j=1;j=2*i-1;j+) printf(%c,A+i-1); printf(n); ,输出字符,输出空格,字符输出,后6到9行: 第6行7个F 空1个空 第7行5个G 空2个空 第8行3个H 空3个空 第9行1个I 空4个空,第6行F的个数 2*4-1 第6行空的个数 6-5 输出A+6-1

51、,第7行G的个数 2*3-1 第7行空的个数 7-5 输出A+7-1,第9行I的个数 2*1-1 第9行空的个数 9-5 输出A+9-1,for(i=6;i=9;i+) for(k=1;k=i-5;k+) printf(%c, ); for(j=1;j=2*(10-i)-1;j+) printf(%c,A+i-1); printf(n); ,输出字符,输出空格,字符输出,前6行: 第1行1个A 空5个空 第2行3个B 空4个空 第3行5个C 空3个空 第6行11个F 无空,第1行A的个数 2*1-1 第1行空的个数 6-1 输出A+1-1,第2行B的个数 2*2-1 第2行空的个数 6-2 输

52、出A+2-1,第6行F的个数 2*6-1 第6行空的个数 6-6 输出A+6-1,for(i=1;i=6;i+) for(k=1;k=6-i;k+) printf(%c, ); for(j=1;j=2*i-1;j+) printf(%c,A+i-1); printf(n); ,输出字符,输出空格,对称字符输出,后7到11行: 第7行9个E 空1个空 第8行7个D 空2个空 第9行5个C 空3个空 第11行1个A 空5个空,第7行E的个数 2*5-1 第7行空的个数 7-6 输出A+4,第8行D的个数 2*4-1 第8行空的个数 8-6 输出A+3,第11行A的个数 2*1-1 第11行空的个数

53、 11-6 输出A+1-1,for(i=7;i=11;i+) for(k=1;k=i-6;k+) printf(%c, ); for(j=1;j=2*(12-i)-1;j+) printf(%c,A+11-i); printf(n); ,输出字符,输出空格,对称字符输出,程 序 范 例,例1.输入两个正整数m和n,求最大公约数和最小公倍数,求最大公约数主要有两种方法: * 定义法 * 辗转相除法(扩展版),定义法的基本原理,最大公约数(greatest common divisor GCD): m和n的共有因子中最大的一个(如12和8的GCD为4 ) ( GCD ) 如:12和5的GCD为1,

54、 12和4的GCD为4 。 最小公倍数 (lease common multiple LCM): m和n的共有倍数中最小的一个(如12和8的LCM为24 ) ( LCM ) 如:12和5的LCM为60 ,12和4的LCM为12 。,m和n中的较小者,m和n中的较大者,1,m*n,辗转相除法求“最大公约数GCD”的基本思路,(1)确定n和m的大小关系,如:mn,(2)求大数除以小数的余数,如:r=m%n,2.1若r=0,则本次被除数n即为GCD,2.2若r0,则大数等于原来的小数、小数等于原来的余数,继续求余数。即:,m=n; n=r; r=m%n;, 用伪码描述: input m, n if

55、mn then 交换m 和 n r=mod (m,n) while r0 do m=n n=r r=mod (m,n) end do print n 其中,符号mod(m,n)代表m除以n的余数。,N-S图描述,流程图描述,#include void main() int p,r,n,m,temp; printf(请输入不等的两个正整数m, n:); scanf(%d,%d, ,最大公约数,1 穷举法 穷举法又称枚举法、试探法。如果问题解的值域是有限的、确定的和有序的,则可以把其中每一个值都拿来试一下,看是否符合所给条件。,程 序 范 例,例2. 百鸡问题。用100元钱买100只鸡,已知每只公

56、鸡5元,每只母鸡3元,3只小鸡1元,问能买的公鸡、母鸡和小鸡各是多少只? 设能买公鸡x只,母鸡y只,小鸡z只,按题意可列出下列方程组:,程 序 范 例,公鸡x的取值范围是0到20 ,同样母鸡y的取值范围是0到33;小鸡z没有取值的主动权,它只能在x和y的值确定之后方可决定自己的值,z=100 xy。 当x、y、z各取一值之后,还要验证是否符合总钱数的限制条件: 100=5x+3y+(100 xy)/3,流程图,N-S图,#include void main() int cocks,hens,chicks; for(cocks=0;cocks=20;cocks+) for(hens=0;hens=33;hens+) chicks=100-cocks-hens; if(5.0*cocks+3.0*hens+chicks/3.0=100.0) printf(%8d%8d%8dn,cocks,hens,chicks); ,百钱百鸡,#include int main(void) int cocks=0,hens,chicks; printf(%8s%8s%8sn,cocks,hens,chicks); while(cocks=20) hens=0; while(hens=33) chicks=100-cocks-hens; if(5.0*cocks+3.0

温馨提示

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

评论

0/150

提交评论