关关雎鸠南邮C语言课件第4章.ppt

上传人:本田雅阁 文档编号:2216237 上传时间:2019-03-05 格式:PPT 页数:46 大小:1.38MB
返回 下载 相关 举报
关关雎鸠南邮C语言课件第4章.ppt_第1页
第1页 / 共46页
关关雎鸠南邮C语言课件第4章.ppt_第2页
第2页 / 共46页
关关雎鸠南邮C语言课件第4章.ppt_第3页
第3页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、高级语言程序设计 *1 *2 第四章 程序流程控制 主讲: 计算机学院 朱立华 内容提要 n算法的基本概念以及表示方法,简单介绍流程图 nC程序的3种基本流程控制结构:顺序结构、选择结构( 也叫分支结构)、循环结构,每种结构的控制语句: if、switch控制选择结构 for、while、dowhile控制循环结构 break、continue、goto等语句的用法 循环嵌套程序的设计及运行过程 n一些常用算法的基本思想: 分段函数求解问题 判断一个整数是否为质数 求两个正整数的最大公约数 各种求和问题 掷骰子游戏的多种解法 求阶乘 打印规则的图形 穷举问题的多种求解方法 DateDate 3

2、 3 算法与语句 n算法(Algorithm)就是为解决一个具体问题而采取的 有限的操作步骤,算法通过语句来实现 n计算机算法分两类:数值运算算法、非数值运算算法 n程序=数据结构+算法 n算法的正确性衡量标准: 有穷性:算法包含有限步操作 确定性:每一步都应确定无歧义 有效性:每一步都应能有效执行且能得到确定的结果 0或多个输入: 程序允许无输入 1或多个输出:任何程序都必须有输出,哪怕是提示信息 解决求数值解的问题 解决需要用分析推理、逻 辑推理才能解决的问题 数据的描述和组织形式 对操作或行为的描述, 即操作步骤 DateDate 4 4 算法与语句 n常用的算法描述方法有:自然语言、传

3、统流程图、NS 流程图、伪代码等,这里只介绍传统流程图。 n例:求n!的算法思想: nn!=1*2*3*n n由于计算机执行乘法时每次只能求两个数相乘,因此 上面的公式在程序中必定需要通过反复相乘来实现。 n需要设定一个变量n,表明求多少的阶乘; n第二个变量,存当前累乘的结果; n第三个变量存当前将要与累乘器相乘的因子,并且该 因子的变化是从1到n每次增加1 n流程图如下页所示 DateDate 5 5 no 开始 n n#include /包含平方根函数sqrt的声明 nint main( ) n n double a,b,c,s,area; /定义5个double变量 n printf(

4、“Please input a,b,c:n”); /屏幕提示 scanf(“%lf%lf%lf“, /输入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 return 0; n 顺序结构 输入 3 4 5 输出area=6.000000 编程提示:存原始数据的变 量,用读入方式使其获得 的值更灵活,也可赋值, 但是通用性下降 编程提示:如果变量的值需要根据其他 变量或一定的计算规则计算出来,则 使用赋值语句而不能读入 问题1:可能会输入

5、负数 问题2:即使输入的都是正数, 未必能构成一个三角形 顺序结构无法解决需要作出判 断的问题! 动 态 演示 过 程 DateDate 9 9 n选择结构的特点:通过某一个或若干条件的约束,有选 择性地执行特定语句-在符合一定条件时,执行特定 操作;在不符合条件时,不执行操作或执行另外的操作 n选择结构使用的流程控制语句:if语句、switch语句 n优点:保证程序的健壮性、完备性 nifelse语句形式: n if (表达式) 语句块1 n else 语句块2 n执行过程:先计算表达式,若非0(真) n则执行语句块1;如果表达式为0(假) n则执行语句块2 选择结构 不平衡的ifelse

6、语句(单分支if) ifelse语句( 双分支if) 表达式可以是任何类型的 ,条件表达式和逻辑表达 式最常用 语句块通常用复合语 句实现,若复合语句内 只有一条语句,则一对 大括号可以不写 表达式 真假 语句块1 语句块2 不平衡的ifelse 语句(if语句) 不执行操作 DateDate1010 n程序4.1 求任意三角形的面积 n#include n#include /包含平方根函数sqrt的声明 nint main( ) n double a,b,c,s,area; /定义5个double变量 n printf(“Please input a,b,c:n”); /屏幕提示 scanf

7、(“%lf%lf%lf”, /输入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:可能会输入负数 问题2:即使输入的都是正数, 未必能构成一个三角形 顺序结构无法解决需要作出判 断的问题! 程序4.2 改进程序4.1,在构成三角形时求面积,否则给提示信息 if (a0 此else分支不能省略,否则在不能 构成三角形时将没有任何输出, 就不是一个正确的算法了 动 态 演示 过 程 DateDate

8、1111 n程序4.3 生成50以内的两个随机数,比较大小,输出较大者及 两者之差的值。若第1个数大于第2个数,输出you are lucky! n#include n#include /含srand和rand函数的原型 n#include /含time函数的原型 nint main( ) nint a ,b ; /定义两个整型变量a和b nsrand(time(NULL); /调用当前系统时钟产生随机种子 a=rand()%50; /产生一个50以内的随机数赋给a nb=rand()%50; /产生另一个50以内的随机数赋给b nif(ab) /如果a大于b n printf(“the la

9、rger 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语句) 若删除此句,则每次产生的随 机数都是一样的,这是调用系 统时钟产生随机种子 上机运行观察结果 上机测试观察运行结果并分析: (1)删除srand(time(NULL); (2)删除else后的一对大括号 若删除此一对括号,则语句 printf(“b-a=%dn”,b-a);成为 一条不受条件控制的语句 动

10、 态 演示 过 程 DateDate1212 nifelse语句形式: if (表达式) 语句块1 else 语句块2 nif语句形式: if (表达式) 语句块1 n最常用的嵌套ifelse语句形式: if (表达式1) 语句块1 else if (表达式2) 语句块2 else 语句块n 选择结构(if语句) 在语句块处还可以嵌入if或 ifelse语句,形成形式多 样的嵌套if语句,以解决多 分支(=3)的处理问题 else总是与其前面与之最靠近的并且未与其它else 匹配过的if相对应; 每个else都代表了与其对应if完全相反的条件,编 程时应充分利用else所代表的条件简化程序 整

11、个嵌套的ifelse语句从 语法上仍为一条语句 DateDate1313 选择结构(if语句) n程序4.4 用嵌套if进行符号函数求解 n#include nint main( ) n int x,sign; n printf(“Please input x:“); n scanf(“%d“, n if (x0) n sign=1; n else n if (x=0) n sign=0; n else sign=-1; n printf(“x=%d, sign=%dn“,x,sign); n return 0; n 1 sign= 0 -1 /语句2处嵌入ifelse 此else代表的条件是

12、x=0) if (x0) sign=1; else sign=0; else sign=-1; 语句1处嵌入ifelse 此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); /输出百分成绩及等级 n n A 90score100 B 80score100| score= 90) grade=A;

13、 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); n n switch (score/10) /为减少常量的个数 case 10: case 9: grade=A; break; case 8: grade=B; break; case 7: grade=C; break; case 6: grade=D; break; case 5: case 4: case

14、3: case 2: case 1: case 0: grade=E; break; 选择结构(switch语句) 方法二:用switch语句实现百分制转五级分制 这些break都 不能省略 此break 可以省略 在VC+下运行程序观察结果,遗 憾:每次运行程序只能输入一个 成绩,一次运行无法输入多个百 分成绩进行转换! 动 态 演示 过 程 DateDate1717 n循环结构的特点:某些操作在一定条件约束下在程序中 可被重复执行,或者重复执行到满足一定的条件时停止 n循环结构使用的流程控制语句: for语句、while语句、dowhile语句; n辅助语句:break语句、continu

15、e语句 nfor语句形式: for(表达式1;表达式2;表达式3) 语句块 n执行过程见右边流程图 n注意:for语句中的3个表达式可以省略 1个或多个,最多3个都可省略,但是 分号不能省,且应保证执行结果不变,不能死循环 循环结构 当型循环 直到型循环 用于求初值, 只计算一次 用来作为控制循环的条件, 非0值则执行语句块;若为0 ,则结束for语句 语句块执行结束后自动执 行此表达式,然后再重新 计算表达式2就是循环体,通常用复合语 句,只能是一条语句 整个for语句在语法 上就是一条语句 假 表达式2 真 语句块 表达式1 表达式3 DateDate1818 循环结构(for语句) n程

16、序4.6 从键盘上输入一个非负整数n,求n! n#include nint main( ) n int n,i; /定义两个整型变量,i表示乘数 n double fac=1; n printf(“Please input n:n“); /提示输入数据的信息 n scanf(“%d”, /从键盘上输入一个整数值 n if (n=0 n for (i=1;i 输出结果为:Error input! 若输入为:4 输出结果为: 4!=2.400000e+001 若输入为:100 输出结果为: 100!=9.332622e+157 查 看 流 程 fac的类型应当定义为double类型,因 为阶乘的结

17、果很容易非常大,应当定义 范围最广的数据类型作为累乘器的类型 ,并且一定要初始化为1 对n作判断,保证程序的健壮性 用%e以指数形式输出一个 较大的结果比较合理 执行的操作不变, 但是变量是在不断 变化的 for语句中表达式省略示例 =1; +; fac*=i+; if (in) break; 循环次 数确定 动 态 演示 过 程 DateDate1919 n程序4.7 输入1个正整数m,判断m是否为质数,输出判断结果 n质数的概念:除了1和它自己外,不能被任何其他整数所整除 n算法思路: 设一个变量prime表示结果,值为1表示是质数,值为0则不是质数 最初可以先假定m是质数,即prime初

18、值为1,设一个变量i作为除 数,从2变化到m-1,只要其中有一个能被m整除(即满足m%i=0), 就说明m不是质数,立即修改prime为0,否则继续取下一除数计算 n除数终值到底取多少:除数的终值需要到m-1吗?数学已上证明 ,除数最大只要到sqrt(m)就已经保证所有可能的因子均已被判断 n循环条件的控制:本题是循环次数不可确定的循环问题,用for 语句也可以解决.以上分析表明循环终止有两种可能:(1)被某一 个i整除,(2)i的值已变到终值处.因此循环条件体现为两个条件 共同控制,即:prime n scanf(“%d“, n if (mk而终止,前 者表明m不是质数,后者表明m 是质数,

19、prime保持初值1 判断m是否能被i整除,若能则 prime赋值为0,不是质数循环终止时prime可能为1可能为 0,根据其值输出不同的结论 循环体是这一条if语句 动 态 演示 过 程 DateDate2121 nwhile语句:与for语句一样能控制当型循环 nwhile语句的形式: while(表达式) 语句块 n执行过程见右边流程图 nfor语句与while语句的等价关系: (1)for中的表达式1相当于出现在 while之前的对循环变量的初始化 (2)for语句的表达式2相当于while语句的表达式,都表示 当该表达式为真时执行循环体 (3)for语句的语句块和表达式3一起,相当于

20、while循环的 语句块,是被反复执行的循环体 循环结构(while语句) 假 表达式 真 语句块 循环控制条件 循环体,通常用一 条复合语句 DateDate2222 循环结构(while语句) n程序4.6 从键盘上输入一个非负整数n,求n! n#include nint main( ) n int n,i; n double fac=1; n printf(“Please input n:n“); n scanf(“%d”, n if (n int main( ) int i,n; /定义两个整型变量i,n,变量先定义后使用 n=578; /通过赋值语句使n获得一个3位整数值 i=n%1

21、0; /对10取余求得个位数 printf(“%d“,i); /输出个位数 i=n/10%10; /先整除10再对10取余求得十位数 printf(“%d“,i); /输出十位数 i=n/100; /用整除100求得百位数 printf(“%dn“,i); /输出百位数 return 0; 该程序显然不具有通用性,不能处理任 意位数的整数按位分离问题 DateDate2424 循环结构(while语句) n程序4.8 从键盘读入任意位的非负整数,按位分离后逆序输出 n#include nint main( ) n int i,n; n scanf(“%d”, /读入n n if (n=0 nw

22、hile (n) n n i=n%10; /求余 n printf(“%d“,i); /输出 n n=n/10; /n降阶 n nprintf(“n“); n return 0; n 算法思想: 在被处理的数不等于0时: (1)利用对10取余得到个位数 (2)输出该个位数 (3)对被分离的数利用整除10 降一阶,若不为0回到步骤(1) 若为0停止处理 等价于 n!=0 用循环求解问题的关键: (1)以什么作为控制循环的条件 (2)重复不断地执行的是哪些 操作,即循环体是什么 (3)在循环体内对变量如何变化 每个变量的意义要明确 动 态 演示 过 程 DateDate2525 循环结构(whil

23、e语句) n程序4.9 从键盘读入两个正整数,用辗转相除法求最大公约数 n #include nint main( ) n int dividend,divider,remainder; n /读入dividend,divider n remainder=dividend%divider; n while (remainder) n n dividend=divider; n divider=remainder; n remainder=dividend%divider ; n nprintf (“hcd: %dn“,divider); n return 0; n 算法思想: (1)将两个正整

24、数分别作为被除数 (dividend)和除数(divider) (2)被除数整除除数得余数(remainder) (3)若余数不为0,则除数转为被除数, 余数转为除数,继续步骤(2) (4)若余数为0则结束循环,使余数 为0的除数就是最大公约数 余数不为0 为循环条件 上一次的除数作为 下次的被除数 上一次的余数作为 下次的除数 求新的余数 使余数为0的除数就 是最大公约数 第一次求余数 动 态 演示 过 程 DateDate2626 nwhile语句与for语句都控制当型循环,共同特点:先判断 循环条件,为真才执行循环体,故循环体最少执行0次 ndowhile语句控制直到型循环,其特点是:先

25、执行循 环体,再判断条件,当条件为真时继续执行循环体,条 件为假,循环结束。因此循环体至少执行1次。 ndowhile语句的形式: do 语句块 while(表达式); n执行过程见右边流程图 循环结构(dowhile语句) 假 表达式 真 语句块 循环控制条件 循环体,可以 是多条语句 此处一定要 有分号 DateDate2727 循环结构(dowhile语句) n程序4.10 模拟投骰子,以6点为目标,投中目标两次获胜,最多 允许投10次(方法1:用dowhile语句) n#include n#include n#include nint main( ) n int count=0,y=0

26、,dice; n srand(time(0); n do n n dice=1+rand()%6; n count+; n if(dice=6) y+; n while(count n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n do n n dice=1+rand()%6; n count+; n if(dice=6) y+; n while(count nint main(void) n int sign,i; n double item,pi,sum=0; n sign=1; n fo

27、r(i=1;i #include int 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-4); pi=4*sum; printf(“pi=%fn“, pi) ; return 0; 动 态 演示 过 程 DateDate3131 ndowhile语句一个非常实用的用法:保证读入的数据符合要求, 也就是说,如果读入的数不符合要求,则提示重新读入,直到满 足要求为止 n例4.7:判断

28、一个输入的正整数m是否为质数 n当时对输入的m,如果小于等于0,则简单地返回不做任何处理。 现在使用dowhile可以要求读到m大于0为止。 n nint main( ) n int m,i,k,prime=1; n scanf(“%d“, n if (m0:n“); scanf(“%d“, while (m nint main( ) nint i,j,n; ndouble f,sum=0; ndo n printf(“Please input n:n“); n scanf(“%d“, nwhile (n nint main( ) n int i ,j ; n n for (i=1;i nin

29、t main(void) n n int x,y,z; n for(x=0;x int main(void) int x,y,z; for (x=0;x n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n while(count n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n while(count n#include n#include nint main( ) n int count=0,

30、y=0,dice; n srand(time(0); n do n n dice=1+rand()%6; n count+; n if(dice=6) n y+; n while(count用if或switch求解多分支问题 判断某一个整数是否为质数-寻找一定范围内所有的质数 ,哥德巴赫猜想 求两个整数的最大公约数-求两数的最小公倍数,多个数 的最大公约数 按位分离十位数的每一位数字-进制转换问题 项数确定或要求精度的格里高利公式求和-求和题的解法 模拟投骰子游戏的多种实现-猜字谜游戏的灵活设计 打印等腰三角形-规则图形的打印方法 百鸡百钱问题的多种解法-穷举题的一题多解及算法效率 n掌握一些实用技术: 用dowhile语句保证读入符合特定要求的数据 调用srand(time(NULL)产生随机种子,保证数的随机性 调用rand()函数产生一定范围的随机整数 DateDate4545 *46 The end of chapter 4

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1