关关雎鸠南邮C语言课件第4章.ppt
《关关雎鸠南邮C语言课件第4章.ppt》由会员分享,可在线阅读,更多相关《关关雎鸠南邮C语言课件第4章.ppt(46页珍藏版)》请在三一办公上搜索。
1、2023/8/1,1,高级语言程序设计,第四章 程序流程控制,主讲:计算机学院 朱立华,2023/8/1,3,内容提要,算法的基本概念以及表示方法,简单介绍流程图C程序的3种基本流程控制结构:顺序结构、选择结构(也叫分支结构)、循环结构,每种结构的控制语句:if、switch控制选择结构for、while、dowhile控制循环结构break、continue、goto等语句的用法循环嵌套程序的设计及运行过程一些常用算法的基本思想:分段函数求解问题判断一个整数是否为质数求两个正整数的最大公约数各种求和问题,掷骰子游戏的多种解法,求阶乘,打印规则的图形,穷举问题的多种求解方法,2023/8/1,
2、4,算法与语句,算法(Algorithm)就是为解决一个具体问题而采取的有限的操作步骤,算法通过语句来实现 计算机算法分两类:数值运算算法、非数值运算算法程序=数据结构+算法算法的正确性衡量标准:有穷性:算法包含有限步操作确定性:每一步都应确定无歧义 有效性:每一步都应能有效执行且能得到确定的结果 0或多个输入:程序允许无输入 1或多个输出:任何程序都必须有输出,哪怕是提示信息,解决求数值解的问题,解决需要用分析推理、逻辑推理才能解决的问题,数据的描述和组织形式,对操作或行为的描述,即操作步骤,2023/8/1,5,算法与语句,常用的算法描述方法有:自然语言、传统流程图、NS流程图、伪代码等,
3、这里只介绍传统流程图。例:求n!的算法思想:n!=1*2*3*n由于计算机执行乘法时每次只能求两个数相乘,因此上面的公式在程序中必定需要通过反复相乘来实现。需要设定一个变量n,表明求多少的阶乘;第二个变量,存当前累乘的结果;第三个变量存当前将要与累乘器相乘的因子,并且该因子的变化是从1到n每次增加1流程图如下页所示,2023/8/1,6,3种基本结构的特点:单入口,单出口,2023/8/1,7,C语句分类,C语言的语句有五大类:(1)9种控制语句:这一类语句用于实现流程控制,选择结构和循环结构必须通过控制语句实现。ifelse语句:是实现选择结构最常用的语句switch语句:用于控制某些多分支
4、的选择结构 for()语句:最常用最灵活的循环控制语句,当型循环while()语句:循环结构最安全的控制语句,当型循环dowhile()语句:控制先执行后判断的直到型循环结构continue语句:表示提前结束本次循环,忽略其后循环体中的其他语句break语句:可用于switch语句(结束switch)或循环体中(结束本层循环)goto语句:流程跳转语句,很灵活,可实现各种结构,建议少用或不用 return语句:专门用于函数返回,被调函数执行到return就返回到调用点(2)变量声明语句:用来定义变量,形如:int a,b;(3)表达式语句:C语言中任何一个表达式最后加上分号构成表达式语句,赋值
5、语句和函数调用语句是最常用的表达式语句(4)复合语句:以一对大括号括起的0或多条语句,在语法上仍为一条语句(5)空语句:只有一个分号构成的语句,表示什么也不做,2023/8/1,8,顺序结构,顺序结构的特点:语句按顺序依次执行,不涉及到任何条件的判断。顺序结构所使用的语句:变量声明语句、读写函数调用语句、赋值语句、return语句等。无需用其他流程控制语句优点:结构简单易懂缺点:对程序的健壮性、完备性往往无法兼顾例:程序4.1 从键盘上输入a,b,c的值,并以它们为三角形的三条边,求三角形的面积。算法思想:根据数学知识,设一个变量s用于求三角形周长的一半,即s=(a+b+c)/2,再利用一般三
6、角形求面积的公式求解:,2023/8/1,9,程序4.1 求任意三角形的面积#include#include/包含平方根函数sqrt的声明int main()double a,b,c,s,area;/定义5个double变量 printf(“Please input a,b,c:n”);/屏幕提示 scanf(%lf%lf%lf,顺序结构,输入 3 4 5输出area=6.000000,编程提示:存原始数据的变量,用读入方式使其获得的值更灵活,也可赋值,但是通用性下降,问题1:可能会输入负数问题2:即使输入的都是正数,未必能构成一个三角形顺序结构无法解决需要作出判断的问题!,2023/8/1,
7、10,选择结构的特点:通过某一个或若干条件的约束,有选择性地执行特定语句-在符合一定条件时,执行特定操作;在不符合条件时,不执行操作或执行另外的操作 选择结构使用的流程控制语句:if语句、switch语句优点:保证程序的健壮性、完备性ifelse语句形式:if(表达式)语句块1 else 语句块2 执行过程:先计算表达式,若非0(真)则执行语句块1;如果表达式为0(假)则执行语句块2,选择结构,不平衡的ifelse语句(单分支if),ifelse语句(双分支if),表达式可以是任何类型的,条件表达式和逻辑表达式最常用,不平衡的ifelse语句(if语句),不执行操作,2023/8/1,11,程
8、序4.1 求任意三角形的面积#include#include/包含平方根函数sqrt的声明int main()double a,b,c,s,area;/定义5个double变量 printf(“Please input a,b,c:n”);/屏幕提示 scanf(“%lf%lf%lf”,选择结构(if语句),问题1:可能会输入负数问题2:即使输入的都是正数,未必能构成一个三角形顺序结构无法解决需要作出判断的问题!,程序4.2 改进程序4.1,在构成三角形时求面积,否则给提示信息,if(a0&b0&c0&a+bc&a+cb&b+ca),else printf(Error input!n);,此e
9、lse分支不能省略,否则在不能构成三角形时将没有任何输出,就不是一个正确的算法了,2023/8/1,12,程序4.3 生成50以内的两个随机数,比较大小,输出较大者及两者之差的值。若第1个数大于第2个数,输出you are lucky!#include#include/含srand和rand函数的原型#include/含time函数的原型int main()int a,b;/定义两个整型变量a和bsrand(time(NULL);/调用当前系统时钟产生随机种子a=rand()%50;/产生一个50以内的随机数赋给ab=rand()%50;/产生另一个50以内的随机数赋给bif(ab)/如果a大
10、于b printf(“the larger number is a:%dn”,a);/输出较大者 printf(a-b=%dn,a-b);/输出a与b的差值 else/如果a不大于b,即ab)printf(“you are lucky!n”);/if语句return 0;,选择结构(if语句),若删除此句,则每次产生的随机数都是一样的,这是调用系统时钟产生随机种子,上机运行观察结果,上机测试观察运行结果并分析:(1)删除srand(time(NULL);(2)删除else后的一对大括号,若删除此一对括号,则语句printf(“b-a=%dn”,b-a);成为一条不受条件控制的语句,2023/8
11、/1,13,ifelse语句形式:if(表达式)语句块1 else 语句块2 if语句形式:if(表达式)语句块1最常用的嵌套ifelse语句形式:if(表达式1)语句块1 else if(表达式2)语句块2 else 语句块n,选择结构(if语句),else总是与其前面与之最靠近的并且未与其它else匹配过的if相对应;每个else都代表了与其对应if完全相反的条件,编程时应充分利用else所代表的条件简化程序,整个嵌套的ifelse语句从语法上仍为一条语句,2023/8/1,14,选择结构(if语句),程序4.4 用嵌套if进行符号函数求解#include int main()int x,
12、sign;printf(Please input x:);scanf(%d,/语句2处嵌入ifelse,此else代表的条件是x=0,此else代表的条件是x0,if(x=0)if(x0)sign=1;else sign=0;else sign=-1;,语句1处嵌入ifelse,此else代表的条件是x0,此else代表的条件是x=0,显然左边的方法更直观,此题还有多种其他写法请读者思考,2023/8/1,15,选择结构(if语句),程序4.5 根据输入的百分制成绩score,转换成相应的五分制成绩grade并打印输出。转换标准为:.int score;char grade;/定义两个变量sc
13、anf(%d,/输出百分成绩及等级.,有效的分数应满足: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=score&score70,此else代表的条件为:0=score&score60,2023/8/1,16,选择结构(swi
14、tch语句),switch语句是控制选择结构流程的又一主要语句,某些嵌套的if-else语句可以改用switch语句switch case的语句格式为:switch(表达式)case 常量表达式1:语句系列1case 常量表达式2:语句系列2case 常量表达式n:语句系列ndefault:语句系列n+1,表达式类型可以是整型、字符型、枚举型,但不能是实型,常量表达式是switch中的表达式可能得到的有限个常量值,类型应与switch中的表达式一致,每个case后只能有1个常量表达式,switch中的表达式计算得到的结果与哪一个常量表达式的值相等,程序流程就从该常量后开始,执行其后的语句系列,
15、default分支语法上可以省略,但是建议要有,这表示switch后的表达式与以上n个常量表达式都不相等的时候所进行的处理,有利于提高程序的健壮性,break语句和switch最外层的右大括号就是该选择结构的出口,遇到第一个break结束,如果没有break则到右大括号才结束,2023/8/1,17,程序4.5 根据输入的百分制成绩score,转换成相应的五分制成绩grade并打印输出。转换标准为:.int score;char grade;/定义两个变量scanf(%d,.,选择结构(switch语句),方法二:用switch语句实现百分制转五级分制,此break可以省略,在VC+下运行程序
16、观察结果,遗憾:每次运行程序只能输入一个成绩,一次运行无法输入多个百分成绩进行转换!,2023/8/1,18,循环结构的特点:某些操作在一定条件约束下在程序中可被重复执行,或者重复执行到满足一定的条件时停止 循环结构使用的流程控制语句:for语句、while语句、dowhile语句;辅助语句:break语句、continue语句for语句形式:for(表达式1;表达式2;表达式3)语句块执行过程见右边流程图注意:for语句中的3个表达式可以省略 1个或多个,最多3个都可省略,但是 分号不能省,且应保证执行结果不变,不能死循环,循环结构,当型循环,直到型循环,用于求初值,只计算一次,用来作为控制
17、循环的条件,非0值则执行语句块;若为0,则结束for语句,语句块执行结束后自动执行此表达式,然后再重新计算表达式2,就是循环体,通常用复合语句,只能是一条语句,整个for语句在语法上就是一条语句,假,表达式2,真,语句块,表达式1,表达式3,2023/8/1,19,循环结构(for语句),程序4.6 从键盘上输入一个非负整数n,求n!#includeint main()int n,i;/定义两个整型变量,i表示乘数 double fac=1;printf(Please input n:n);/提示输入数据的信息 scanf(“%d”,若输入为:-5 输出结果为:Error input!若输入为
18、:4 输出结果为:4!=2.400000e+001若输入为:100 输出结果为:100!=9.332622e+157,fac的类型应当定义为double类型,因为阶乘的结果很容易非常大,应当定义范围最广的数据类型作为累乘器的类型,并且一定要初始化为1,对n作判断,保证程序的健壮性,用%e以指数形式输出一个较大的结果比较合理,执行的操作不变,但是变量是在不断变化的,for语句中表达式省略示例,=1;,+;,fac*=i+;if(in)break;,循环次数确定,2023/8/1,20,程序4.7 输入1个正整数m,判断m是否为质数,输出判断结果 质数的概念:除了1和它自己外,不能被任何其他整数所
19、整除 算法思路:设一个变量prime表示结果,值为1表示是质数,值为0则不是质数 最初可以先假定m是质数,即prime初值为1,设一个变量i作为除数,从2变化到m-1,只要其中有一个能被m整除(即满足m%i=0),就说明m不是质数,立即修改prime为0,否则继续取下一除数计算 除数终值到底取多少:除数的终值需要到m-1吗?数学已上证明,除数最大只要到sqrt(m)就已经保证所有可能的因子均已被判断循环条件的控制:本题是循环次数不可确定的循环问题,用for语句也可以解决.以上分析表明循环终止有两种可能:(1)被某一个i整除,(2)i的值已变到终值处.因此循环条件体现为两个条件共同控制,即:pr
20、ime&i=(int)sqrt(m)特殊正整数的处理:当m为1时,直接给出prime=0,不必循环,循环结构(for语句),2023/8/1,21,循环结构(for语句),程序4.7 从键盘输入一个正整数m,判断m是否为质数,输出判断结果#include#include/包含sqrt的原型 int main()int m,i,k,prime=1;scanf(%d,对prime的初始化不能缺少,如果m是负数,则返回不再进行判断,对于特殊正整数1直接给出不是质数的结论,变量k存除数的上界,变量i是每一次参与运算的除数,从2变化到k,增加步长为1,用两个条件共同控制,循环必将因为prime为0或ik
21、而终止,前者表明m不是质数,后者表明m是质数,prime保持初值1,判断m是否能被i整除,若能则prime赋值为0,不是质数,循环终止时prime可能为1可能为0,根据其值输出不同的结论,循环体是这一条if语句,2023/8/1,22,while语句:与for语句一样能控制当型循环while语句的形式:while(表达式)语句块执行过程见右边流程图for语句与while语句的等价关系:(1)for中的表达式1相当于出现在 while之前的对循环变量的初始化(2)for语句的表达式2相当于while语句的表达式,都表示当该表达式为真时执行循环体(3)for语句的语句块和表达式3一起,相当于whi
22、le循环的语句块,是被反复执行的循环体,循环结构(while语句),假,表达式,真,语句块,循环控制条件,循环体,通常用一条复合语句,2023/8/1,23,循环结构(while语句),程序4.6 从键盘上输入一个非负整数n,求n!#includeint main()int n,i;double fac=1;printf(Please input n:n);scanf(“%d”,方法二:改用while循环求阶乘,i=1;while(i=n)fac*=i;i+;,再论for与while:虽然都可处理当型循环,for语句一定可以转化为等效的whie语句,但是并不是所有的while都可以等效转为fo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 雎鸠 语言 课件
链接地址:https://www.31ppt.com/p-5608996.html