关关雎鸠南邮c语言课件第4章

上传人:m**** 文档编号:568785963 上传时间:2024-07-26 格式:PPT 页数:46 大小:1.30MB
返回 下载 相关 举报
关关雎鸠南邮c语言课件第4章_第1页
第1页 / 共46页
关关雎鸠南邮c语言课件第4章_第2页
第2页 / 共46页
关关雎鸠南邮c语言课件第4章_第3页
第3页 / 共46页
关关雎鸠南邮c语言课件第4章_第4页
第4页 / 共46页
关关雎鸠南邮c语言课件第4章_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《关关雎鸠南邮c语言课件第4章》由会员分享,可在线阅读,更多相关《关关雎鸠南邮c语言课件第4章(46页珍藏版)》请在金锄头文库上搜索。

1、高级语言程序设计 2024/7/2612024/7/262第四章 程序流程控制主讲主讲: : 计算机学院计算机学院 朱立华朱立华内容提要内容提要n算法算法的基本概念以及表示方法,简单介绍流程图的基本概念以及表示方法,简单介绍流程图nC C程序的程序的3 3种基本流程种基本流程控制结构:控制结构:顺序结构、选择结构顺序结构、选择结构(也叫分支结构)、循环结构(也叫分支结构)、循环结构,每种结构的控制语句:,每种结构的控制语句:if、switch控制选择结构控制选择结构for、while、dowhile控制循环结构控制循环结构break、continue、goto等等语句的用法语句的用法循环嵌套程

2、序的设计及运行过程循环嵌套程序的设计及运行过程n一些常用算法的基本思想:一些常用算法的基本思想:分段函数求解问题分段函数求解问题判断一个整数是否为质数判断一个整数是否为质数求两个正整数的最大公约数求两个正整数的最大公约数各种求和问题各种求和问题掷骰子游戏的多种解法掷骰子游戏的多种解法求阶乘求阶乘打印规则的图形打印规则的图形穷举问题的多种求解方法穷举问题的多种求解方法2024/7/262024/7/263 3算法与语句算法与语句 n算法算法(AlgorithmAlgorithm)就是为解决一个具体问题而采取的)就是为解决一个具体问题而采取的有限的操作步骤,算法通过有限的操作步骤,算法通过语句语句

3、来实现来实现 n计算机算法分两类:计算机算法分两类:数值运算算法数值运算算法、非数值运算算法非数值运算算法n程序程序= =数据结构数据结构+ +算法算法n算法的正确性衡量标准:算法的正确性衡量标准:有穷性:有穷性:算法包含有限步操作算法包含有限步操作确定性:确定性:每一步都应确定无歧义每一步都应确定无歧义 有效性:有效性:每一步都应能有效执行且能得到确定的结果每一步都应能有效执行且能得到确定的结果 0 0或多个输入或多个输入: : 程序允许无输入程序允许无输入 1 1或多个输出:或多个输出:任何程序都必须有输出,哪怕是提示信息任何程序都必须有输出,哪怕是提示信息 解决求数值解的问题解决求数值解

4、的问题 解决需要用分析推理、逻解决需要用分析推理、逻辑推理才能解决的问题辑推理才能解决的问题 数据的描述和组织形式数据的描述和组织形式 对操作或行为的描述,对操作或行为的描述,即操作步骤即操作步骤 2024/7/262024/7/264 4算法与语句算法与语句 n常用的算法描述方法有:自然语言、常用的算法描述方法有:自然语言、传统流程图传统流程图、NSNS流程图、伪代码等,这里只介绍传统流程图。流程图、伪代码等,这里只介绍传统流程图。n例:求例:求n!n!的算法思想:的算法思想:nn!=1*2*3*nn!=1*2*3*nn由于计算机执行乘法时每次只能求两个数相乘,因此由于计算机执行乘法时每次只

5、能求两个数相乘,因此上面的公式在程序中必定需要通过上面的公式在程序中必定需要通过反复相乘反复相乘来实现。来实现。n需要设定一个变量需要设定一个变量n n,表明求多少的阶乘;,表明求多少的阶乘;n第二个变量第二个变量,存当前累乘的结果;,存当前累乘的结果;n第三个变量第三个变量存当前将要与累乘器相乘的因子,并且该存当前将要与累乘器相乘的因子,并且该因子的变化是从因子的变化是从1 1到到n n每次增加每次增加1 1n流程图如下页所示流程图如下页所示2024/7/262024/7/265 5no开始开始n0?输入输入n图图4.2 计算计算n! 的传统流程图的传统流程图fac=1,i=1fac=fac

6、*ii= i+1i=n?yes输输 出出 fac值值no结束结束输输 出出 错错 提提示示yes开始开始结束框结束框输入输入/ /输出框输出框判判断断框框一般一般处理框处理框循环循环结构结构3 3种基本结构的种基本结构的特点:单入口,特点:单入口, 单单出口出口流程线流程线选择选择结构结构顺序结构顺序结构查查看看程程序序2024/7/262024/7/266 6C语句分类语句分类nC C语言的语句有语言的语句有五大类:五大类:n(1)9种种控制语句控制语句:这一类语句用于实现流程控制,选择结构和循:这一类语句用于实现流程控制,选择结构和循环结构必须通过控制语句实现。环结构必须通过控制语句实现。

7、 ifelse语句语句:是实现选择结构最常用的语句:是实现选择结构最常用的语句switch语句:语句:用于控制某些多分支的选择结构用于控制某些多分支的选择结构 for( )语句语句:最常用最灵活的循环控制语句,当型循环:最常用最灵活的循环控制语句,当型循环while( )语句语句:循环结构最安全的控制语句,当型循环:循环结构最安全的控制语句,当型循环dowhile( )语句语句:控制先执行后判断的直到型循环结构:控制先执行后判断的直到型循环结构continue语句语句:表示提前结束本次循环,忽略其后循环体中的其他语句:表示提前结束本次循环,忽略其后循环体中的其他语句break语句语句:可用于:

8、可用于switchswitch语句语句( (结束结束switch)switch)或循环体中或循环体中( (结束本层循环结束本层循环) )goto语句语句:流程跳转语句,很灵活,可实现各种结构,建议少用或不用:流程跳转语句,很灵活,可实现各种结构,建议少用或不用 return语句语句:专门用于函数返回,被调函数执行到:专门用于函数返回,被调函数执行到returnreturn就返回到调用点就返回到调用点 n(2)变量声明语句变量声明语句:用来定义变量,形如:用来定义变量,形如:int a,b;n(3)表达式语句表达式语句:C C语言中任何一个表达式最后加上分号构成表达式语句,语言中任何一个表达式最

9、后加上分号构成表达式语句,赋值语句和函数调用语句赋值语句和函数调用语句是最常用的表达式语句是最常用的表达式语句n(4)复合语句复合语句:以一对大括号括起的以一对大括号括起的0 0或多条语句,在语法上仍为一条语句或多条语句,在语法上仍为一条语句 n(5)空语句空语句:只有一个分号构成的语句,表示什么也不做只有一个分号构成的语句,表示什么也不做 2024/7/262024/7/267 7顺序结构顺序结构n顺序结构的特点顺序结构的特点:语句按顺序依次执行,不涉及到任何:语句按顺序依次执行,不涉及到任何条件的判断。条件的判断。n顺序结构所使用的语句顺序结构所使用的语句:变量声明语句、读写函数调用:变量

10、声明语句、读写函数调用语句、赋值语句、语句、赋值语句、returnreturn语句等。无需用其他流程控制语句等。无需用其他流程控制语句语句n优点优点:结构简单易懂:结构简单易懂n缺点缺点:对程序的健壮性、完备性往往无法兼顾:对程序的健壮性、完备性往往无法兼顾n例:例:程序程序4.1 4.1 从键盘上输入从键盘上输入a a,b b,c c的值,并以它们为的值,并以它们为三角形的三条边,求三角形的面积。三角形的三条边,求三角形的面积。 n 算法思想:算法思想:根据数学知识,设一个变量根据数学知识,设一个变量s s用于求三角形用于求三角形周长的一半,即周长的一半,即s=(a+b+c)/2s=(a+b

11、+c)/2,再利用一般三角形求面,再利用一般三角形求面积的公式求解:积的公式求解: 2024/7/262024/7/268 8n程序程序4.1 4.1 求任意三角形的面积求任意三角形的面积n#includen#include /包含平方根函数包含平方根函数sqrt的声明的声明nint main( )nn double a,b,c,s,area; /定义定义5个个double变量变量n printf(“Please input a,b,c:n”); /屏幕提示屏幕提示 scanf(%lf%lf%lf,&a,&b,&c); /输入输入a,b,c的值的值n s=(a+b+c)/2; /求周长的一半求

12、周长的一半n area=sqrt(s*(s-a)*(s-b)*(s-c); /求面积求面积n printf(area=%fn,area); /输出面积输出面积 n return 0;n顺序结构顺序结构输入输入 3 4 5输出输出 编程提示编程提示:存原始数据的变:存原始数据的变量,用读入方式使其获得量,用读入方式使其获得的值更灵活,也可赋值,的值更灵活,也可赋值,但是通用性下降但是通用性下降编程提示编程提示:如果变量的值需要根据其他:如果变量的值需要根据其他变量或一定的计算规则计算出来,则变量或一定的计算规则计算出来,则使用赋值语句而不能读入使用赋值语句而不能读入问题问题1 1:可能会输入负数

13、可能会输入负数问题问题2 2:即使输入的都是正数,即使输入的都是正数,未必能构成一个三角形未必能构成一个三角形顺序结构顺序结构无法解决需要作出判无法解决需要作出判断的问题!断的问题!动动态态演示演示过过程程2024/7/262024/7/269 9n选择结构的特点选择结构的特点:通过某一个或若干条件的约束,有选:通过某一个或若干条件的约束,有选择性地执行特定语句择性地执行特定语句-在符合一定条件时,执行特定在符合一定条件时,执行特定操作;在不符合条件时,操作;在不符合条件时,不执行操作不执行操作或或执行另外的操作执行另外的操作 n选择结构使用的流程控制语句选择结构使用的流程控制语句:ifif语

14、句、语句、switchswitch语句语句n优点优点:保证程序的健壮性、完备性:保证程序的健壮性、完备性nifelseifelse语句形式语句形式: : n ifif ( (表达式表达式) ) 语句块语句块1 1n else else 语句块语句块2 2 n执行过程执行过程: :先计算先计算表达式表达式, ,若若非非0(0(真真) )n则执行语句则执行语句块块1 1; ;如果表达式为如果表达式为0(0(假假) )n则执行语句则执行语句块块2 2 选择结构选择结构不平衡的不平衡的ifelseifelse语句语句( (单分支单分支ifif) ) ifelseifelse语句语句( (双分支双分支i

15、fif) ) 表达式可以是任何类型的表达式可以是任何类型的, ,条件表达式和逻辑表达式条件表达式和逻辑表达式最常用最常用语句块通常用复合语语句块通常用复合语句实现句实现, ,若复合语句若复合语句内只有一条语句内只有一条语句, ,则则一对大括号可以不写一对大括号可以不写表达式表达式真真假假语句块语句块1 1语句块语句块2 2不平衡的不平衡的ifelseifelse语句语句( (ifif语句语句) )不执行操作不执行操作2024/7/262024/7/261010n程序程序4.1 4.1 求任意三角形的面积求任意三角形的面积n#includen#include /包含平方根函数包含平方根函数sqr

16、t的声明的声明nint main( )n double a,b,c,s,area; /定义定义5个个double变量变量n printf(“Please input a,b,c:n”); /屏幕提示屏幕提示 scanf(“%lf%lf%lf”,&a,&b,&c); /输入输入a,b,c的值的值n s=(a+b+c)/2; n area=sqrt(s*(s-a)*(s-b)*(s-c); /求面积求面积n printf(“area=%fn”,area); /输出面积输出面积 n n return 0;n选择结构选择结构(if语句语句)问题问题1 1:可能会输入负数可能会输入负数问题问题2 2:即

17、使输入的都是正数,即使输入的都是正数,未必能构成一个三角形未必能构成一个三角形顺序结构顺序结构无法解决需要作出判无法解决需要作出判断的问题!断的问题!程序程序4.2 4.2 改进程序,在构成三角形时求面积,否则给提示信息改进程序,在构成三角形时求面积,否则给提示信息if (a0&b0&c0&a+bc&a+cb&b+ca) else printf(Error input!n); 此此elseelse分支分支不能省略不能省略,否则在不,否则在不能构成三角形时将没有任何输出,能构成三角形时将没有任何输出,就不是一个正确的算法了就不是一个正确的算法了动动态态演示演示过过程程2024/7/262024/

18、7/261111n程序程序4.3 4.3 生成生成5050以内的两个随机数,比较大小,输出较大者及以内的两个随机数,比较大小,输出较大者及两者之差的值。若第两者之差的值。若第1 1个数大于第个数大于第2 2个数,输出个数,输出you are lucky!you are lucky!n#includen#include /含含srand和和rand函数的原型函数的原型n#include /含含time函数的原型函数的原型nint main( )nint a ,b ; /定义两个整型变量定义两个整型变量a和和bnsrand(time(NULL); /调用当前系统时钟产生随机种子调用当前系统时钟产生

19、随机种子a=rand()%50; /产生一个产生一个50以内的随机数赋给以内的随机数赋给anb=rand()%50; /产生另一个产生另一个50以内的随机数赋给以内的随机数赋给bnif(ab) /如果如果a大于大于bn printf(“the larger number is a:%dn”,a) ; /输出较大者输出较大者n printf(a-b=%dn,a-b); /输出输出a与与b的差值的差值n else /如果如果a不大于不大于b,即即ab) printf(“you are lucky!n”); /if语句语句nreturn 0;n选择结构选择结构(if语句语句)若删除此句,则每次产生的

20、随若删除此句,则每次产生的随机数都是一样的,这是调用系机数都是一样的,这是调用系统时钟产生随机种子统时钟产生随机种子上机运行观察结果上机运行观察结果上机测试观察运行结果并分析:上机测试观察运行结果并分析:(1)(1)删除删除srand(time(NULL); (2)(2)删除删除elseelse后的一对大括号后的一对大括号若删除此一对括号,则语句若删除此一对括号,则语句printf(“b-a=%dn”,b-a);成为成为一条不受条件控制的语句一条不受条件控制的语句动动态态演示演示过过程程2024/7/262024/7/261212nifelseifelse语句形式语句形式: : ifif (

21、(表达式表达式) ) 语句块语句块1 1 elseelse 语句块语句块2 2 nifif语句形式语句形式: : ifif ( (表达式表达式) ) 语句块语句块1 1n最常用的嵌套最常用的嵌套ifelseifelse语句形式语句形式: : ifif ( (表达式表达式1) 1) 语句块语句块1 1 elseelse ifif ( (表达式表达式2) 2) 语句块语句块2 2 else else 语句块语句块n n选择结构选择结构(if语句语句)在语句块处还可以嵌入在语句块处还可以嵌入ifif或或ifelseifelse语句,形成形式多语句,形成形式多样的嵌套样的嵌套ifif语句,以解决多语句

22、,以解决多分支分支( (=3=3) )的处理问题的处理问题elseelse总是与其前面与之最靠近的并且未与其它总是与其前面与之最靠近的并且未与其它elseelse匹配过的匹配过的ifif相对应;相对应;每个每个elseelse都代表了与其对应都代表了与其对应ifif完全相反的条件,编完全相反的条件,编程时应充分利用程时应充分利用elseelse所代表的条件简化程序所代表的条件简化程序整个嵌套的整个嵌套的ifelseifelse语句从语句从语法上仍为一条语句语法上仍为一条语句2024/7/262024/7/261313选择结构选择结构(if语句语句)n程序程序4.4 4.4 用嵌套用嵌套ifif

23、进行符号函数求解进行符号函数求解n#include nint main( )n int x,sign;n printf(Please input x:);n scanf(%d,&x);n if (x0)n sign=1;n elsen if (x=0)n sign=0;n else sign=-1;n printf(x=%d, sign=%dn,x,sign);n return 0;n 1sign= 0 -1/语句语句2 2处嵌入处嵌入ifelseifelse此此else代表的条件是代表的条件是x=0此此else代表的条件是代表的条件是x=0) if (x0) sign=1; else sig

24、n=0;else sign=-1;语句语句1 1处嵌入处嵌入ifelseifelse此此else代表的条件是代表的条件是x100| score= 90) grade=A; nelse if (score = 80) grade=B; n else if (score = 70) grade=C;nelse if (score = 60) grade=D;n else grade=E;nprintf(“%d-%cn”,score,grade); /输出百分成绩及等级输出百分成绩及等级nn. A 90score100 B 80score90grade= C 70score80 D 60score7

25、0 E 0score60 有效的分数应满足有效的分数应满足: 0=score=100此此else代表的条件为代表的条件为: 0=score&score=100 完整的条件为完整的条件为: 90=score&score=100 此此else代表的条件为代表的条件为: 0=score&score90 完整的条件为完整的条件为: 80=score&score90 此此else代表的条件为代表的条件为: 0=score&score80 完整的条件为完整的条件为: 70=score&score80 此此else代表的条件为代表的条件为: 0=score&score70 完整的条件为完整的条件为: 60=

26、score&score70 此此else代表的条件为代表的条件为: 0=score&score100| score= 90) grade=A; nelse if (score = 80) grade=B; n else if (score = 70) grade=C;nelse if (score = 60) grade=D;n else grade=E;nprintf(“%d-%cn”,score,grade); nn.switch (score/10) /为减少常量的个数为减少常量的个数 case 10: case 9: grade=A; break; case 8: grade=B; b

27、reak; case 7: grade=C; break; case 6: grade=D; break; case 5:case 4:case 3:case 2: case 1: case 0: grade=E; break; 选择结构选择结构(switch语句语句)方法二:用方法二:用switchswitch语句实现百分制转五级分制语句实现百分制转五级分制这些这些breakbreak都都不能省略不能省略此此breakbreak可以省略可以省略在在VC+下运行程序观察结果,下运行程序观察结果,遗遗憾:憾:每次运行程序只能输入一个每次运行程序只能输入一个成绩,一次运行无法输入多个百成绩,一次运

28、行无法输入多个百分成绩进行转换!分成绩进行转换!动动态态演示演示过过程程2024/7/262024/7/261717n循环结构的特点循环结构的特点:某些操作:某些操作在一定条件约束下在一定条件约束下在程序中在程序中可被可被重复重复执行,或者执行,或者重复执行到满足一定的条件时停止重复执行到满足一定的条件时停止 n循环结构使用的流程控制语句循环结构使用的流程控制语句: for for语句、语句、whilewhile语句、语句、dowhiledowhile语句;语句;n辅助语句辅助语句:breakbreak语句、语句、continuecontinue语句语句nfor语句形式语句形式: : for(

29、 (表达式表达式1 1;表达式;表达式2 2;表达式;表达式3)3) 语句块语句块n执行过程见右边流程图执行过程见右边流程图n注意:注意:forfor语句中的语句中的3 3个表达式可以个表达式可以省略省略 1 1个或多个个或多个,最多,最多3 3个都可省略,但是个都可省略,但是 分号不能省分号不能省,且应保证执行,且应保证执行结果不变结果不变, ,不能死循环不能死循环 循环结构循环结构当型循环当型循环 直到型循环直到型循环 用于求初值,用于求初值,只计算一次只计算一次用来作为控制循环的条件,用来作为控制循环的条件,非非0 0值则执行语句块;若为值则执行语句块;若为0 0,则结束,则结束forf

30、or语句语句语句块执行结束后自动执行语句块执行结束后自动执行此表达式,然后再重新计算此表达式,然后再重新计算表达式表达式2 2就是循环体,通常用复合语就是循环体,通常用复合语句,只能是一条语句句,只能是一条语句整个整个forfor语句在语法语句在语法上就是一条语句上就是一条语句假假表达式表达式2 2真真语句块语句块表达式表达式1 1表达式表达式32024/7/262024/7/261818循环结构循环结构(for语句语句)n程序程序4.6 4.6 从键盘上输入一个非负整数从键盘上输入一个非负整数n n,求,求n!n! n#includenint main( )n int n,i; /定义两个整

31、型变量,定义两个整型变量,i表示乘数表示乘数 n double fac=1; n printf(Please input n:n); /提示输入数据的信息提示输入数据的信息n scanf(“%d”,&n); /从键盘上输入一个整数值从键盘上输入一个整数值n if (n=0n for (i=1;i=n; i+) /用用for语句实现循环语句实现循环n fac*=i ; /累乘器作为被乘数与乘数累乘器作为被乘数与乘数i相乘相乘n printf(%d!=%en,n,fac); /累乘器中的结果是累乘器中的结果是n!的值的值n n return 0;n若输入为:若输入为:-5 输出结果为:输出结果为:

32、Error input!若输入为:若输入为:4 输出结果为:输出结果为:4!=2.400000e+001若输入为:若输入为:100 输出结果为:输出结果为:100!=9.332622e+157查查看看流流程程facfac的类型应当定义为的类型应当定义为doubledouble类型,因类型,因为为阶乘的结果阶乘的结果很容易非常很容易非常大大,应当定义,应当定义范围最广范围最广的数据类型作为累乘器的类型,的数据类型作为累乘器的类型,并且一定要并且一定要初始化为初始化为1 1 对对n n作判断,保证程序的健壮性作判断,保证程序的健壮性 用用%e%e以指数形式输出一个较以指数形式输出一个较大的结果比较

33、合理大的结果比较合理 执行的操作不变,执行的操作不变,但是变量是在不断但是变量是在不断变化的变化的forfor语句中表达式省略示例语句中表达式省略示例=1;1;+; ; fac*=i+; if (in) break; 循环次循环次数确定数确定动动态态演示演示过过程程2024/7/262024/7/261919n程序程序 输入输入1 1个正整数个正整数m m,判断,判断m m是否为质数,输出判断结果是否为质数,输出判断结果 n质数的概念质数的概念: :除了除了1 1和它自己外,不能被任何其他整数所整除和它自己外,不能被任何其他整数所整除 n算法思路算法思路: : 设一个变量设一个变量prime表

34、示结果表示结果,值为值为1表示表示是是质数质数,值为值为0则则不是不是质数质数 最初可以最初可以先假定先假定m是质数是质数,即即prime初值为初值为1,设一个变量设一个变量i作为除作为除数数,从从2变化到变化到m-1,只要其中有一个只要其中有一个能被能被m整除整除(即满足即满足m%i=0),就说明就说明m不是不是质数质数,立即修改立即修改prime为为0,否则继续取下一除数计算否则继续取下一除数计算 n除数终值到底取多少除数终值到底取多少: :除数的终值需要到除数的终值需要到m-1m-1吗吗? ?数学已上证明数学已上证明, ,除数最大只要到除数最大只要到sqrt(m)sqrt(m)就已经保证

35、所有可能的因子均已被判断就已经保证所有可能的因子均已被判断n循环条件的控制循环条件的控制: :本题是循环本题是循环次数不可确定次数不可确定的循环问题的循环问题, ,用用forfor语句也可以解决语句也可以解决. .以上分析表明循环终止有以上分析表明循环终止有两种可能两种可能:(1):(1)被某一被某一个个i i整除整除,(2)i,(2)i的值已变到终值处的值已变到终值处. .因此循环条件体现为两个条件因此循环条件体现为两个条件共同控制共同控制, ,即即: :prime&i=(int)sqrt(m)prime&i=(int)sqrt(m)n特殊正整数的处理特殊正整数的处理: :当当m为为1时时,

36、直接给出直接给出prime=0,不必循环不必循环循环结构循环结构(for语句语句)2024/7/262024/7/262020循环结构循环结构(for语句语句)n程序程序 从键盘输入一个正整数从键盘输入一个正整数m m,判断,判断m m是否为质数,输出判断结是否为质数,输出判断结果果 n#includen#include /包含包含sqrtsqrt的原型的原型 nint main( )n int m,i,k,prime=1;n scanf(%d,&m);n if (m=0) printf(Input error!n); return 0; n if (m=1) prime=0;n k=(int

37、)sqrt(m); /求求m的平方根的平方根n for (i=2; prime &ikik而终止而终止, ,前前者表明者表明m m不是质数不是质数, ,后者表明后者表明m m是是质数质数,prime,prime保持初值保持初值1 1判断判断m m是否能被是否能被i i整除整除, ,若能则若能则primeprime赋值为赋值为0,0,不是质数不是质数循环终止时循环终止时primeprime可能为可能为1 1可能为可能为0,0,根据其值输出不同的结论根据其值输出不同的结论循环体是这一条循环体是这一条ifif语句语句动动态态演示演示过过程程2024/7/262024/7/262121nwhile语句

38、语句:与与for语句一样能控制语句一样能控制当型循环当型循环nwhile语句的形式语句的形式: while(表达式表达式) 语句块语句块n执行过程见右边流程图执行过程见右边流程图nfor语句与语句与while语句的语句的等价关系等价关系: (1)for中的中的表达式表达式1相当于出现在相当于出现在 while之前之前的对循环变量的的对循环变量的初始化初始化 (2)for语句的语句的表达式表达式2相当于相当于while语句的语句的表达式,表达式,都表示都表示当该表达式为真时执行循环体当该表达式为真时执行循环体 (3)for语句的语句的语句块和表达式语句块和表达式3一起,相当于一起,相当于whil

39、e循环的循环的语句块,语句块,是被反复执行的是被反复执行的循环体循环体循环结构循环结构(while语句语句)假假表达式表达式真真语句块语句块循环控制条件循环控制条件循环体,通常用一循环体,通常用一条复合语句条复合语句2024/7/262024/7/262222循环结构循环结构(while语句语句)n程序程序4.6 4.6 从键盘上输入一个非负整数从键盘上输入一个非负整数n n,求,求n!n! n#includenint main( )n int n,i; n double fac=1; n printf(Please input n:n); n scanf(“%d”,&n); n if (n0

40、 ) printf(Error input!n); n elsen for (i=1;i=n; i+)n fac*=i ; n printf(%d!=%en,n,fac); n n return 0;n方法二:改用方法二:改用whilewhile循环求阶乘循环求阶乘i=1;while (i=n) fac*=i ; i+; 再论再论for与与while:虽然都可处理当型循环,虽然都可处理当型循环,for语句一定可以转化为等效的语句一定可以转化为等效的whie语句,但是并不是所有的语句,但是并不是所有的while都可以等效转为都可以等效转为for。因为在。因为在while语句中,可以有条件地修改循

41、环控制变量的值,而语句中,可以有条件地修改循环控制变量的值,而for语句语句中修改循环控制条件一般通过表达式中修改循环控制条件一般通过表达式3,是无条件执行的。从,是无条件执行的。从这个意义上看,这个意义上看,while的使用范围比的使用范围比for更广,但更广,但for语句更简洁语句更简洁2024/7/262024/7/262323程序:三位的非负整数按位分离输出程序:三位的非负整数按位分离输出程序:三位的非负整数按位分离输出程序:三位的非负整数按位分离输出 #include int main( ) int i,n; /定义两个整型变量定义两个整型变量i,n,变量先定义后使用,变量先定义后使

42、用 n=578; /通过赋值语句使通过赋值语句使n获得一个获得一个3位整数值位整数值 i=n%10; /对对10取余求得个位数取余求得个位数 printf(%d,i); /输出个位数输出个位数 i=n/10%10; /先整除先整除10再对再对10取余求得十位数取余求得十位数 printf(%d,i); /输出十位数输出十位数 i=n/100; /用整除用整除100求得百位数求得百位数 printf(%dn,i); /输出百位数输出百位数 return 0; 该程序显然不具有通用性,不能处理任该程序显然不具有通用性,不能处理任意位数的整数按位分离问题意位数的整数按位分离问题2024/7/2620

43、24/7/262424循环结构循环结构(while语句语句)n程序程序4.8 4.8 从键盘读入任意位的非负整数,按位分离后逆序输出从键盘读入任意位的非负整数,按位分离后逆序输出n#includenint main( )n int i,n; n scanf(“%d”,&n); /读入读入n n if (n=0 nwhile (n) nn i=n%10; /求求余余n printf(%d,i); /输出输出n n=n/10; /n降阶降阶nnprintf(n); n return 0;n算法思想:算法思想:在被处理的数不等于在被处理的数不等于0 0时:时:(1)(1)利用对利用对1010取余得到

44、个位数取余得到个位数(2)(2)输出该个位数输出该个位数(3)(3)对被分离的数利用整除对被分离的数利用整除1010降一阶降一阶, ,若若不为不为0 0回到步骤回到步骤(1)(1)若若为为0 0停止停止处理处理等价于等价于n!=0n!=0用循环求解问题的关键:用循环求解问题的关键:(1)(1)以什么作为控制循环的条件以什么作为控制循环的条件(2)(2)重复不断地执行的是哪些重复不断地执行的是哪些操作,即循环体是什么操作,即循环体是什么(3)(3)在循环体内对变量如何变化在循环体内对变量如何变化每个变量的意义要明确每个变量的意义要明确动动态态演示演示过过程程2024/7/262024/7/262

45、525循环结构循环结构(while语句语句)n程序程序4.9 4.9 从键盘读入两个正整数,用辗转相除法求最大公约数从键盘读入两个正整数,用辗转相除法求最大公约数n #includenint main( )n int dividend,divider,remainder; n . /读入读入dividend,dividern remainder=dividend%divider; n while (remainder) n n dividend=divider; n divider=remainder; n remainder=dividend%divider ; n nprintf (hcd

46、: %dn,divider); n return 0;n算法思想:算法思想:(1)(1)将两个正整数分别作为被除数将两个正整数分别作为被除数(dividend)(dividend)和除数和除数(divider)(divider) (2)(2)被除数整除除数得余数被除数整除除数得余数(remainder)(remainder) (3)(3)若若余数不为余数不为0,0,则除数转为被除数则除数转为被除数, ,余数转为除数余数转为除数, ,继续步骤继续步骤(2)(2)(4)(4)若若余数为余数为0 0则则结束循环结束循环,使余数,使余数为为0 0的的除数除数就是最大公约数就是最大公约数 余数不为余数不

47、为0 0为循环条件为循环条件上一次的除数作为上一次的除数作为下次的被除数下次的被除数上一次的余数作为上一次的余数作为下次的除数下次的除数求新的余数求新的余数使余数为使余数为0 0的的除数除数就就是最大公约数是最大公约数第一次求余数第一次求余数动动态态演示演示过过程程2024/7/262024/7/262626nwhile语句与语句与for语句都控制语句都控制当型循环当型循环,共同特点:共同特点:先判断先判断循环条件循环条件,为真才执行循环体为真才执行循环体,故循环体故循环体最少执行最少执行0次次ndowhile语句控制语句控制直到型循环,直到型循环,其特点是:其特点是:先执行循先执行循环体,再

48、判断条件,当条件为真时环体,再判断条件,当条件为真时继续执行循环体,条继续执行循环体,条件为假,循环结束。因此件为假,循环结束。因此循环体至少执行循环体至少执行1次。次。ndowhile语句的形式语句的形式: do 语句块语句块 while(表达式表达式);n执行过程见右边流程图执行过程见右边流程图循环结构循环结构(dowhile语句语句)假假表达式表达式真真 语句块语句块循环控制条件循环控制条件循环体,可以循环体,可以是多条语句是多条语句此处一定要此处一定要有分号有分号2024/7/262024/7/262727循环结构循环结构(dowhile语句语句)n程序程序4.10 4.10 模拟投骰

49、子模拟投骰子, ,以以6 6点为目标,投中目标两次获胜,最多点为目标,投中目标两次获胜,最多允许投允许投1010次(次(方法方法1 1:用:用dowhiledowhile语句语句) n#includen#includen#includenint main( )n int count=0,y=0,dice; n srand(time(0);n don n dice=1+rand()%6;n count+; n if(dice=6) y+; n while(count10&y2); n printf(%d,%dn,count,y); nreturn 0;n 模拟投骰子模拟投骰子可以通过可以通过调用

50、随机函数调用随机函数产生产生1 1至至6 6之间的随机数之间的随机数. .在程序中必须设置一个在程序中必须设置一个变量变量用来用来统计已经投了多少次统计已经投了多少次,再设另再设另一个变量统计投中了多少次一个变量统计投中了多少次。投骰子的动作肯定要做,且做一次还不能完成,因此适合投骰子的动作肯定要做,且做一次还不能完成,因此适合使用使用dowhiledowhile语句实现。语句实现。循环体应该完成:循环体应该完成:(1 1)调用随机函数产生一个随机数来模拟投骰子;)调用随机函数产生一个随机数来模拟投骰子;(2 2)统计投掷次数的变量无条件加)统计投掷次数的变量无条件加1 1;(3 3)如果随机

51、数的值等于)如果随机数的值等于6 6,则统计投中次数的变量值加,则统计投中次数的变量值加1 1循环条件是:投掷次数小于循环条件是:投掷次数小于1010并且投中次数小于并且投中次数小于2 2记录投中记录投中的次数的次数 记录投掷记录投掷的次数的次数 记录点数记录点数 产生随机种子产生随机种子 生成生成1616随机数随机数模拟投骰子模拟投骰子投掷次数无投掷次数无条件加条件加1 1 如果点数等于如果点数等于6 6,投中次数加投中次数加1 1 投掷次数小于投掷次数小于1010且投中次数小于且投中次数小于2 2为循环条件为循环条件 输出投掷次数输出投掷次数和投中次数和投中次数动动态态演示演示过过程程20

52、24/7/262024/7/262828循环结构循环结构(dowhile语句语句)n程序程序4.10 4.10 模拟投骰子模拟投骰子, ,以以6 6点为目标,投中目标两次获胜,最多点为目标,投中目标两次获胜,最多允许投允许投1010次(次(方法方法1 1:用:用dowhiledowhile语句语句) n#includen#includen#includenint main( )n int count=0,y=0,dice; n srand(time(0);n don n dice=1+rand()%6;n count+; n if(dice=6) y+; n while(count10&y2)

53、; n printf(%d,%dn,count,y); nreturn 0;n while(count10&y2) dice=1+rand()%6; count+; if(dice=6) y+; (方法方法2 2:用:用whilewhile语句语句)此处不能加分号,如果加了此处不能加分号,如果加了分号,语法上正确,表示该分号,语法上正确,表示该循环体为空语句,而语句块循环体为空语句,而语句块就成为一条无条件的语句,就成为一条无条件的语句,结果将出错结果将出错大部分情况下,大部分情况下,dowhiledowhile语句语句可以直接改写成可以直接改写成whilewhile语句,语句,达到同样的效果

54、,需要保证达到同样的效果,需要保证循环体第一次执行不会出错循环体第一次执行不会出错 (方法方法3 3:用:用forfor语句语句)for(;count10&y2;count+) dice=1+rand()%6; if(dice=6) y+; 2024/7/262024/7/262929n程序程序 利用格里高利公式求利用格里高利公式求的近似值的近似值 n格里高利公式为:格里高利公式为:/4=1-1/3+1/5-1/7+ /4=1-1/3+1/5-1/7+ n两种求解要求两种求解要求: :n算法分析算法分析: :先求先求/4/4,最后再乘以,最后再乘以4 4,用一个,用一个累加器累加器进行求和进行

55、求和;n分子无变化分子无变化,分母分母可用项号可用项号i i的表达式:的表达式:2*i-12*i-1表示表示n每一个累加项正负号交替,设一个每一个累加项正负号交替,设一个符号变量符号变量,每项加过以后取负每项加过以后取负n循环体内的主要操作循环体内的主要操作: :n(1)(1)求当前项,即求当前项,即符号变量符号变量* *1.0/(2*i-1)1.0/(2*i-1)n(2)(2)将当前项将当前项加入加入到累加器中到累加器中 n(3)(3)改变符号变量改变符号变量的值,以保证累加项的值,以保证累加项正负号交替正负号交替 n(4)(4)表示第几项的变量表示第几项的变量i i加加1 1 n循环条件根

56、据题目要求设定循环条件根据题目要求设定循环结构循环结构(3种语句种语句)项数确定,适合用项数确定,适合用for语句语句规定求解精度,适合用规定求解精度,适合用whie或或dowhile语句语句2024/7/262024/7/263030n/要求要求1:求前求前50015001项的项的n/累加和作为累加和作为的近似值的近似值n#includenint main(void)n int sign,i; n double item,pi,sum=0; n sign=1; n for(i=1;i=5001;i+) n n item=sign*1.0/(2*i-1); n sum=sum+item; n

57、sign=-sign; n n n pi=4*sum; n printf(pi=%fn, pi) ; n return 0; n /要求要求2:2:求求的近似值直到的近似值直到/最后累加项绝对值小于最后累加项绝对值小于1E-41E-4 #include#includeint main(void) int sign,i=1; double item,pi,sum=0; sign=1; do item=sign*1.0/(2*i-1); sum=sum+item; sign=-sign; i+; while (fabs(item)=1e-(fabs(item)=1e-4);4); pi=4*sum

58、; printf(pi=%fn, pi) ; return 0; 动动态态演示演示过过程程2024/7/262024/7/263131ndowhiledowhile语句一个非常实用的用法:语句一个非常实用的用法:保证读入的数据符合要求,保证读入的数据符合要求,也就是说,如果读入的数不符合要求,则提示重新读入,直到满也就是说,如果读入的数不符合要求,则提示重新读入,直到满足要求为止足要求为止 n例:例:判断一个输入的正整数判断一个输入的正整数m m是否为质数是否为质数n当时对输入的当时对输入的m m,如果小于等于,如果小于等于0 0,则简单地返回不做任何处理。,则简单地返回不做任何处理。现在使用

59、现在使用dowhiledowhile可以要求读到可以要求读到m m大于大于0 0为止。为止。nnint main( )n int m,i,k,prime=1;n scanf(%d,&m);n if (m0:n); scanf(%d,&m); while (m=0); 读到第一个大于读到第一个大于0 0的整数就停止的整数就停止2024/7/262024/7/263232n3 3种控制循环结构的语句在语法上都是种控制循环结构的语句在语法上都是一条语句一条语句 nforfor和和whilewhile语句的循环体要求是一条语句,如果使用复语句的循环体要求是一条语句,如果使用复合语句作循环体,实际上是允

60、许有多条语句的;合语句作循环体,实际上是允许有多条语句的;dowhiledowhile语句本身循环体就可以是多条语句,因此,它语句本身循环体就可以是多条语句,因此,它们的循环体内可以嵌入更深层次的循环控制语句,从而们的循环体内可以嵌入更深层次的循环控制语句,从而构成了循环的嵌套,构成了循环的嵌套,3 3种语句可以互相嵌套。种语句可以互相嵌套。n循环嵌套最主要的是理解其执行过程循环嵌套最主要的是理解其执行过程: :n(1)(1)先对外层循环控制变量取一个值,满足条件进入循环体先对外层循环控制变量取一个值,满足条件进入循环体n(2)(2)执行循环体中的内层循环,内层循环结束后,回到外层执行循环体中

61、的内层循环,内层循环结束后,回到外层 n(3)(3)改变外层循环控制变量的值,回到步骤(改变外层循环控制变量的值,回到步骤(1 1) n(4)(4)当外层循环条件不满足时停止整个循环当外层循环条件不满足时停止整个循环 循环嵌套循环嵌套2024/7/262024/7/263333n例:从键盘上输入例:从键盘上输入1 1个正整数个正整数n n,求,求1!+2!+3!+n!1!+2!+3!+n!的结的结果果n#include nint main( )nint i,j,n;ndouble f,sum=0;ndon printf(Please input n:n);n scanf(%d,&n);nwhi

62、le (n=0); nfor (i=1; i=n;i+)n n f=1; n for (j=1;j=i;j+) f=f*j; n sum+=f; n nprintf(sum=%en,sum); nreturn 0;n 保证输入一个正整数保证输入一个正整数内循环,求内循环,求i!i!外循环,求外循环,求1!+2!+n!1!+2!+n!外层控制外层控制变量变量i值值外层外层条件条件内层循环语句形式内层循环语句形式内层循内层循环次数环次数内层循环内层循环结束时结束时j值值f值值sum值值11for (j=1;j=1;j+) f=f*j; 121.0 1.021for (j=1;j=2;j+) f=f

63、*j;232.0 3.031for (j=1;j=3;j+) f=f*j;346.0 9.040不进入外层循环体,无内层循不进入外层循环体,无内层循 6.0 9.0如果读入如果读入3,结果,结果sum=9.000000E+000动动态态演示演示过过程程2024/7/262024/7/263434循环嵌套循环嵌套n程序程序4.13 4.13 打印一个由打印一个由*号组成的号组成的 五五 行等腰上三角形。行等腰上三角形。 n#includenint main( )n int i ,j ; n n for (i=1;i= 5 ; i+)n n for (j=1;j=(5-i)+14;j+) /+14

64、使图形居中使图形居中n printf(%2c, ); /打印前导空格打印前导空格n for (j=1;j=2*i-1;j+) /打印本行图形打印本行图形nprintf(%2c, * );n printf(n); /换行换行n nreturn 0;n 算法算法: :一般用一般用两层循环两层循环打印一个形状规则的图形打印一个形状规则的图形外层循环控制行变化外层循环控制行变化 外层循环体外层循环体中依次完成下面中依次完成下面3 3个步骤:个步骤: (1 1)根据行数和图形的形状,)根据行数和图形的形状,打印打印每行的每行的前导空格前导空格(确定(确定本行图形的起始位置)。若行号为本行图形的起始位置)

65、。若行号为i i,i i从从1 1开始计,考虑开始计,考虑最后一行(假设为最后一行(假设为n n)前不留前导空格,则第)前不留前导空格,则第i i行前导空格的行前导空格的单位为:单位为: n-i n-i,用一个内层循环控制打印前导空格用一个内层循环控制打印前导空格 (2 2)根据行号与当前行图形的个数及形状的关系进行控制)根据行号与当前行图形的个数及形状的关系进行控制输出当前行的图形输出当前行的图形。等腰三角形,其图形元素个数为。等腰三角形,其图形元素个数为2*i-12*i-1,这里这里i i为当前行的行号,为当前行的行号,用一个内层循环打印图形用一个内层循环打印图形 (3 3)换行换行外层循

66、环控制行的变化外层循环控制行的变化外层循环的循环体外层循环的循环体n,n;scanf(“%d”,&n);nn-i打印一个打印一个n行等腰上三角形行等腰上三角形, ,每行图形依次为每行图形依次为ABCDABCD读入控制的完整代码如教材所示读入控制的完整代码如教材所示, ,用用dowhiledowhile保证保证n n在一定的范围内在一定的范围内i+64);A AB BC C演示演示过过程程动动态态演示演示过过程程2024/7/262024/7/263535n一个用一个用穷举法穷举法解决问题的典型例解决问题的典型例, ,注意注意算法设计算法设计的重要的重要性性, ,同一题有同一题有多种解法多种解法

67、, ,效率不一样效率不一样. .n程序程序 百钱百鸡问题:鸡翁一,值钱百钱百鸡问题:鸡翁一,值钱5 5;鸡母一,值钱;鸡母一,值钱3 3;鸡雏;鸡雏三,值钱三,值钱1 1。百钱买百鸡,问鸡翁、母、雏各几何?。百钱买百鸡,问鸡翁、母、雏各几何? n分析分析: :设公鸡,母鸡和雏鸡的数量分别为设公鸡,母鸡和雏鸡的数量分别为x x,y y,z z,有下,有下列关系成立:列关系成立: x+y+z=100 x+y+z=100 ( (百鸡百鸡) ) 5x+3y+z/3=100 5x+3y+z/3=100 ( (百钱百钱) ) 15x+9y+z=300 15x+9y+z=300 ( (百钱百钱) ) n 3

68、 3个变量的范围个变量的范围: :0=x=200=x=20,0=y=330=y=33,0=z=1000=z=100 循环嵌套循环嵌套为避免小数为避免小数, , 左右左右两边同乘以两边同乘以3 3得到得到2024/7/262024/7/263636n/例百鸡百钱问题方法例百鸡百钱问题方法1n/用用3 3 层循环控制层循环控制n#includenint main(void)nn int x,y,z;n for(x=0;x=20;x+)n for(y=0;y=33;y+)n for(z=0;z=100;z+)n if(x+y+z=100&n 15*x+9*y+z=300) printf(%5d%5d

69、%5d,x,y,z); return 0;n /例百鸡百钱问题方法例百鸡百钱问题方法3 3/用用1层循环控制层循环控制/方法方法: 公式公式-公式公式得到:得到:14x+8y=200 即即: 7x+4y=100由公式由公式,显然显然0=x=14,在在x确知的情况下根据确知的情况下根据可求得可求得y=(100-7*x)/4;y=(100-7*x)/4;再根据公式再根据公式得到得到: z=100-x-y#includeint main(void)int x,y,z;for (x=0;x=14;x+)y=(100-7*x)/4;z=100-x-y;if (15*x+9*y+z=300)printf(

70、%5d%5d%5d,x,y,z); return 0; 满足百鸡满足百鸡满足百钱满足百钱同时满足同时满足2 2两两 z=100-x-y;利用百鸡条件用利用百鸡条件用x,yx,y的表达式表示的表达式表示z,z,从而从而去掉第去掉第3 3层循环层循环if(这时只需要判断百钱这时只需要判断百钱的条件就可以了的条件就可以了 这时只需要判断百钱这时只需要判断百钱的条件就可以了的条件就可以了2024/7/262024/7/263737nbreakbreak语句的用法语句的用法1 1: :用于用于switchswitch语句中语句中, ,表示结束该分支表示结束该分支的操作的操作, ,从而结束从而结束swit

71、chswitch语句语句, ,真正实现了多分支控制真正实现了多分支控制nbreakbreak语句的用法语句的用法2:2:用于用于3 3种循环语句的种循环语句的循环体循环体中中, ,配合配合一定的条件一定的条件, ,执行到执行到breakbreak直接退出本层循环直接退出本层循环, ,从而增加从而增加了了从循环体中结束循环从循环体中结束循环的方式的方式( (此前只能因循环控制条此前只能因循环控制条件为假而终止循环件为假而终止循环) )n程序程序 模拟投骰子问题的模拟投骰子问题的第第4 4种实现方法种实现方法使用使用breakbreak语句语句 模拟投骰子模拟投骰子循环条件是两个循环条件是两个:投

72、掷:投掷次数小于次数小于1010并且投中并且投中次数小于次数小于2 2,前,前3 3种方法都是将这两个条件同时列在控制种方法都是将这两个条件同时列在控制循环的条件表达式中,用循环的条件表达式中,用breakbreak就可以减少一个循环条就可以减少一个循环条件件其他流程控制语句其他流程控制语句(break)2024/7/262024/7/263838程序程序程序程序4.10 4.10 模拟投骰子问题的第模拟投骰子问题的第模拟投骰子问题的第模拟投骰子问题的第4 4种实现方法种实现方法种实现方法种实现方法循环体中使用循环体中使用循环体中使用循环体中使用breakbreak语句语句语句语句 n#inc

73、lude n#includen#includenint main( )n int count=0,y=0,dice; n srand(time(0);n while(count10 & y2)n n dice=1+rand()%6;n count+; n if(dice=6) y+; n n n printf(%d,%dn,count,y); return 0;n 两个条件同时满足两个条件同时满足这是原方法这是原方法2 2的代码,用的代码,用whilewhile语句控制循环语句控制循环if (y=2) break;)减少一个条件减少一个条件breakbreak用于循环体中,用于循环体中,一般要

74、配合一般要配合ifif使用才使用才有意义有意义流程图流程图count10?dice=1+rand()%6count+dice=6?y+y=2?真真真真假假breakbreak真真假假假假增加了从循环体中增加了从循环体中退出循环的出口退出循环的出口动动态态演示演示过过程程2024/7/262024/7/263939ncontinue语句的用法语句的用法:只能用于循环语句的语句块中只能用于循环语句的语句块中ncontinue语句的功能语句的功能:提前结束本次循环,忽略循环体提前结束本次循环,忽略循环体中其后的语句,直接进入下一次条件的判断中其后的语句,直接进入下一次条件的判断n与与break语句不

75、同:语句不同:continue不能退出循环不能退出循环n程序程序 模拟投骰子问题的模拟投骰子问题的第第5种实现方法种实现方法使用使用continue语句语句 模拟投骰子的模拟投骰子的循环体中,循环体中,变量变量y自增自增1是有条件的,必须是有条件的,必须在在dice=6时,换句话说,当时,换句话说,当dice!=6时,时,y+不执行,不执行,这可以用这可以用continue来改写来改写其他流程控制语句其他流程控制语句(continue)2024/7/262024/7/264040程序程序程序程序4.10 4.10 模拟投骰子问题的第模拟投骰子问题的第模拟投骰子问题的第模拟投骰子问题的第5 5种

76、实现方法种实现方法种实现方法种实现方法循环体中使用循环体中使用循环体中使用循环体中使用continuecontinue语句语句语句语句 n#include n#includen#includenint main( )n int count=0,y=0,dice; n srand(time(0);n while(count10 & y2)n n dice=1+rand()%6;n count+; n if(dice=6) n y+; n n printf(%d,%dn,count,y); return 0;n 两个条件同时满足两个条件同时满足这是原方法这是原方法2 2的代码,用的代码,用whil

77、ewhile语句控制循环语句控制循环流程图流程图!continuecount10&y2?dice=1+rand()%6count+dice!=6?y+真真假假continucontinue e真真假假增加了一种提前结束增加了一种提前结束循环体回到循环条件循环体回到循环条件重新判断的方式重新判断的方式动动态态演示演示过过程程2024/7/262024/7/264141ngotogoto语句语句: :为无条件转移语句,它可以在不需要任何条为无条件转移语句,它可以在不需要任何条件的情况下直接使程序转跳到件的情况下直接使程序转跳到语句标号语句标号所标识的语句处所标识的语句处, ,但是通常与但是通常与i

78、fif语句语句配合使用,配合使用,可以实现可以实现顺序结构、选择顺序结构、选择结构和循环结构这结构和循环结构这3 3种流程的控制种流程的控制。 ngotogoto语句的格式语句的格式:goto goto 语句标号语句标号; n语句标号语句标号: :是一个用户自定义标识符,它标识程序的一是一个用户自定义标识符,它标识程序的一个特定位置个特定位置, ,只能在只能在gotogoto语句中引用语句中引用 ngoto语句使用建议:语句使用建议:因自由跳转破坏基本结构,影响可因自由跳转破坏基本结构,影响可读性和和可维护性,读性和和可维护性,不提倡使用不提倡使用gotogoto语句,应合理、有语句,应合理、

79、有节制地使用。节制地使用。 n程序程序 模拟投骰子问题的模拟投骰子问题的第第6种实现方法种实现方法使用使用goto语语句实现循环结构句实现循环结构 其他流程控制语句其他流程控制语句(goto)2024/7/262024/7/264242程序程序程序程序4.10 4.10 模拟投骰子问题的第模拟投骰子问题的第模拟投骰子问题的第模拟投骰子问题的第6 6种实现方法种实现方法种实现方法种实现方法使用使用使用使用gotogoto语句实现循环语句实现循环语句实现循环语句实现循环 n#include n#includen#includenint main( )n int count=0,y=0,dice;

80、n srand(time(0);n don n dice=1+rand()%6;n count+; n if(dice=6) n y+; n while(count10 & y用用if或或switch求解多分支问题求解多分支问题判断某一个整数是否为质数判断某一个整数是否为质数-寻找一定范围内所有的质数,寻找一定范围内所有的质数,哥德巴赫猜想哥德巴赫猜想求两个整数的最大公约数求两个整数的最大公约数-求两数的最小公倍数,多个数求两数的最小公倍数,多个数的最大公约数的最大公约数按位分离十位数的每一位数字按位分离十位数的每一位数字-进制转换问题进制转换问题项数确定或要求精度的格里高利公式求和项数确定或

81、要求精度的格里高利公式求和-求和题的解法求和题的解法模拟投骰子游戏的多种实现模拟投骰子游戏的多种实现-猜字谜游戏的灵活设计猜字谜游戏的灵活设计打印等腰三角形打印等腰三角形-规则图形的打印方法规则图形的打印方法百鸡百钱问题的多种解法百鸡百钱问题的多种解法-穷举题的一题多解及算法效率穷举题的一题多解及算法效率n掌握掌握一些实用一些实用技术:技术:用用dowhiledowhile语句语句保证读入符合特定要求的数据保证读入符合特定要求的数据调用调用srand(time(NULL)srand(time(NULL)产生随机种子,保证数的随机性产生随机种子,保证数的随机性调用调用rand()rand()函数函数产生一定范围的随机整数产生一定范围的随机整数2024/7/262024/7/2645452024/7/2646The end of chapter 4

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号