程序设计基础

上传人:xins****2008 文档编号:183743484 上传时间:2023-01-31 格式:PPT 页数:87 大小:654.50KB
收藏 版权申诉 举报 下载
程序设计基础_第1页
第1页 / 共87页
程序设计基础_第2页
第2页 / 共87页
程序设计基础_第3页
第3页 / 共87页
资源描述:

《程序设计基础》由会员分享,可在线阅读,更多相关《程序设计基础(87页珍藏版)》请在装配图网上搜索。

1、11程序设计基础程序设计基础谌谌 卫卫 军军清华大学软件学院清华大学软件学院2006年秋季年秋季第第 五五 章章22第第 五五 章章 循环控制循环控制33西绪福斯的故事西绪福斯的故事 西绪福斯是希腊神话中的人物,他因为触犯西绪福斯是希腊神话中的人物,他因为触犯了宙斯,死后被打入地狱受惩罚。每天清晨,他了宙斯,死后被打入地狱受惩罚。每天清晨,他都必须将一块沉重的巨石从平地搬到山顶上去。都必须将一块沉重的巨石从平地搬到山顶上去。每当他自以为已经搬到山顶时,石头就突然顺着每当他自以为已经搬到山顶时,石头就突然顺着山坡滚下去,于是西绪福斯只好重新回头去搬石山坡滚下去,于是西绪福斯只好重新回头去搬石头,

2、而石头再滚下山,头,而石头再滚下山,如此循环往复,没,如此循环往复,没有穷尽。有穷尽。44在程序设计中,当我们需要重复地去执行某一在程序设计中,当我们需要重复地去执行某一段代码时,可使用段代码时,可使用循环(循环(loop)的方法。一个的方法。一个循环就是一组重复执行的语句。循环就是一组重复执行的语句。x =x+1;sum=sum+x;scanf();循环体循环体551.for 语句语句2.while 语句语句3.do-while 语句语句4.break 语句和语句和 continue 语句语句5.程序举例程序举例本章的组织结构本章的组织结构665.1 for 语句语句如图所示,显示前如图所示

3、,显示前100个整数的平方和立方。个整数的平方和立方。问题描述:问题描述:1 1 12 4 83 9 274 16 645 25 125 77问题分析:问题分析:笨方法:对这笨方法:对这100个整数分别进行计算个整数分别进行计算。printf(“%d%d%dn”,1,1*1,1*1*1);printf(“%d%d%dn”,2,2*2,2*2*2);printf(“%d%d%dn”,3,3*3,3*3*3);printf(“%d%d%dn”,4,4*4,4*4*4);共需要共需要100条语句。条语句。88问题分析:问题分析:需要对这个问题进行抽象,归纳为一种需要对这个问题进行抽象,归纳为一种统一

4、的形式,然后采用循环语句来重复地执统一的形式,然后采用循环语句来重复地执行一定的次数。行一定的次数。对于对于1100当中的每一个整数当中的每一个整数 x,其平,其平方为:方为:x*x,其立方为:,其立方为:x*x*x,可以采,可以采用用for 语句来重复地执行语句来重复地执行100次,每一次处理次,每一次处理一个整数一个整数。99一般形式:一般形式:(1)先求解表达式)先求解表达式1(循环变量赋初值);(循环变量赋初值);(2)求解表达式)求解表达式2(循环条件测试),若其值为非(循环条件测试),若其值为非0(真),则(真),则 执行内嵌的语句块,然后转(执行内嵌的语句块,然后转(3);若其值

5、为);若其值为0(假),则(假),则 结束循环,执行结束循环,执行for语句后面的一个语句;语句后面的一个语句;(3)求解表达式)求解表达式3(循环变量增值);(循环变量增值);(4)转()转(2),继续执行;),继续执行;执行过程:执行过程:真真假假结束循环结束循环各部分最少被执行几次?各部分最少被执行几次?1010 /显示前显示前100个整数的平方和立方个整数的平方和立方#include void main()int i;for (i =1;i =100;i+)printf(“%d%d%dn”,i,i*i,i*i*i);循环变量循环变量11111 1 12 4 83 9 274 16 64

6、5 25 1256 36 2167 49 3438 64 5129 81 72910 100 100011 121 1331运行结果:运行结果:1212 /显示前显示前100个整数的平方和立方个整数的平方和立方#include void main()int i;for (i =1;i =100;i+)printf(“%3d%5d%7dn”,i,i*i,i*i*i);1313 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331新的结果:新的结果:1414(一

7、)对于(一)对于 for 语句的一般形式中的语句的一般形式中的“表达式表达式1”,(1)它可以被省略,此时应在它可以被省略,此时应在 for 语句之前给循环变量语句之前给循环变量赋初值。当它被省略时,其后的分号不能省略;赋初值。当它被省略时,其后的分号不能省略;例如:例如:for(;i =100;i+)sum =sum +i;(2)它可以是设置循环变量初值的赋值表达式,也可它可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。以是与循环变量无关的其他表达式。例如:例如:for(sum=0;i=100;i+)sum=sum+i;(3)它可以是一个简单的表达式,也可以是它可以是

8、一个简单的表达式,也可以是逗号表达逗号表达式式,即包含多个简单表达式,中间用逗号隔开。,即包含多个简单表达式,中间用逗号隔开。如:如:for(sum=0,i=1;i=100;i+)sum=sum+i;几点说明几点说明1515(二)对于(二)对于 for 语句的一般形式中的语句的一般形式中的“表达式表达式2”,(1)它可以被省略,即不判断循环条件,循环无终止地它可以被省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式进行下去。也就是认为表达式2的值始终为真。此的值始终为真。此时程序设计者应另外设法保证循环能正常结束;时程序设计者应另外设法保证循环能正常结束;例如:例如:for(i =

9、1;i+)sum =sum +i;(2)它一般是关系表达式(如它一般是关系表达式(如 i=100)或逻辑表达式)或逻辑表达式(如(如(a b)&(x y)),但也可以是数值表达式),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。或字符表达式,只要其值为非零,就执行循环体。例如:例如:for(i=0;(c =getchar()!=n;i+=c);1616(三)对于(三)对于 for 语句的一般形式中的语句的一般形式中的“表达式表达式3”,(1)它也可以被省略,即没有循环变量增值,此时程它也可以被省略,即没有循环变量增值,此时程序设计者也应能保证循环能正常结束;序设计者也应能保证

10、循环能正常结束;例如:例如:for(i=1;i=100;)sum=sum+i;i+;(2)与表达式与表达式1一样,它可以是一个简单的表达式,也一样,它可以是一个简单的表达式,也可以是逗号表达式。可以是逗号表达式。例如:例如:for(i=0,j=100;i=j;i+,j-)k=i+j;(3)它一般是作为循环变量增值,但也可以是对循环它一般是作为循环变量增值,但也可以是对循环变量进行减值,而且每一步不一定非要加变量进行减值,而且每一步不一定非要加1或减或减1,也可以是其他的常量。也可以是其他的常量。1717高斯的难题高斯的难题 德国数学家高斯,在上小学的时候,老师出了德国数学家高斯,在上小学的时候

11、,老师出了一道难题,一道难题,计算计算1+2+3+100,高斯很快就在,高斯很快就在自己的小石板上写出了答案自己的小石板上写出了答案5050,老师非常惊讶,老师非常惊讶,高斯怎么算得这么快呢?原来,高斯不是一个数一高斯怎么算得这么快呢?原来,高斯不是一个数一个数按部就班地加起出来的,而是发现这些数字有个数按部就班地加起出来的,而是发现这些数字有一个规律,一头一尾依次两个数相加,它们的和都一个规律,一头一尾依次两个数相加,它们的和都是一样的:是一样的:1+100=101,2+99=101,一直到,一直到50+51=101,一共是,一共是50个个101,所以,他很快就把,所以,他很快就把答案算出来

12、了。答案算出来了。1818基本思路:基本思路:把问题抽象为一种统一的形式,然后采把问题抽象为一种统一的形式,然后采用循环语句来重复地计算。用循环语句来重复地计算。用一个变量用一个变量sum来保存总和,对于来保存总和,对于1、2、3、100 中的每一个整数中的每一个整数 i,依次把它加,依次把它加入到入到sum当中,即当中,即 sum =sum+i。1919#include void main()int i,sum;sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“sum=%d”,sum);sum0i=11i=235050i=10020201.将原来的将原来的fo

13、r(i=1;i=100;i+)修改为修改为for(i=1;i=100;i=i+2)问:这是在计算哪些整数的和,答案是多少问:这是在计算哪些整数的和,答案是多少?2.将原来的将原来的for(i=1;i=100;i+)修改为修改为for(i=1;i=100000;i+)问:程序执行后能够得出正确结果吗?如果问:程序执行后能够得出正确结果吗?如果不能,自己想办法解决。不能,自己想办法解决。思考题:在程序中做如下的修改思考题:在程序中做如下的修改21215.2 while 语句语句问题描述:问题描述:显示前若干个整数的平方和立方,只要其立方值显示前若干个整数的平方和立方,只要其立方值小于小于10000

14、。1 1 12 4 83 9 274 16 645 25 125 2222问题分析:问题分析:与与for语句的例子有些类似,但不完全相语句的例子有些类似,但不完全相同。前者指定了需要处理的整数个数,而这同。前者指定了需要处理的整数个数,而这里是要求最大的那个整数,其立方必须小于里是要求最大的那个整数,其立方必须小于某个固定的值。某个固定的值。循环体内的语句无须变化,完成的是相循环体内的语句无须变化,完成的是相同的功能同的功能。区别在于循环结束条件的判定。区别在于循环结束条件的判定。可以用可以用while语句来完成。语句来完成。2323 while (表达式表达式)语句块;语句块;一般形式:一般

15、形式:先判断表达式,如果表达式的值为非先判断表达式,如果表达式的值为非 0(真),那么执行(真),那么执行 while 语句中的内嵌语句语句中的内嵌语句块,然后又回到表达式的判断;如果表达式块,然后又回到表达式的判断;如果表达式的值为的值为 0(假),那么结束循环。(假),那么结束循环。执行过程:执行过程:假假结束循环结束循环真真各部分最少被执行几次?各部分最少被执行几次?2424 /显示前若干个整数的平方和立方,只要其立方值显示前若干个整数的平方和立方,只要其立方值 /小于小于10000。#include void main()int i;while (i*i*i 10000)printf(

16、“%3d%5d%7dn”,i,i*i,i*i*i);i =1;i+;2525 /显示前若干个整数的平方和立方,只要其立方值显示前若干个整数的平方和立方,只要其立方值 /小于小于10000。#include void main()int i;for(i =1;i*i*i 0)printf(“平均值是:平均值是:%.1f”,(double)TotalValue/Num);累加模式累加模式3434while().while()break;.跳出最近的循环。跳出最近的循环。3535while().while()continue;结束本次循环,即跳过循环体中尚未执行的语句,直接结束本次循环,即跳过循环体

17、中尚未执行的语句,直接回到循环条件的判别。回到循环条件的判别。continue语句语句36365.5 程序举例程序举例5.5.1 计算计算 7!问题描述:问题描述:计算计算7!。在数学当中,!。在数学当中,N!的定义为:!的定义为:N!N (N 1)(N 2)21,因此,我们可以把因此,我们可以把7!展开为:!展开为:7!7654321,我们的目标即,我们的目标即计算这计算这7个整数之积。个整数之积。3737思路分析:思路分析:1.从程序的扩展性和通用性来看,不宜采用算从程序的扩展性和通用性来看,不宜采用算术表达式的方法;术表达式的方法;2.本题涉及到多个本题涉及到多个连续的连续的整数的相乘(

18、具有明整数的相乘(具有明显的规律性和一致性),因此可以考虑采用显的规律性和一致性),因此可以考虑采用循环语句的方法;循环语句的方法;3.循环语句的关键在于循环语句的关键在于循环控制条件循环控制条件和和循环体循环体语句语句的设计;的设计;4.循环控制条件的设计:可令整型变量循环控制条件的设计:可令整型变量 i 去表去表示示7、6、5、1,初始值为,初始值为7或或1,然后依,然后依次递减或递增,直到遍历所有整数;次递减或递增,直到遍历所有整数;3838思路分析(续):思路分析(续):5.循环体语句的设计:让整型变量循环体语句的设计:让整型变量sum来表示来表示乘积,其初值为乘积,其初值为1。对于每

19、一个当前的整数。对于每一个当前的整数i,将其乘以将其乘以sum,再将乘积保存在,再将乘积保存在sum中,即中,即sum =sum *i当循环结束后,当循环结束后,sum中的值即为所求;中的值即为所求;6.在设计好循环控制条件和循环体语句之后,在设计好循环控制条件和循环体语句之后,可以根据方便与否和个人的喜好,采用任意可以根据方便与否和个人的喜好,采用任意一种循环语句(一种循环语句(for语句、语句、while语句或语句或do-while语句)来编程,因为它们在功能上是语句)来编程,因为它们在功能上是等价的。等价的。3939 初始时初始时 sum=1,i=1 7 6 5 4 3 2 1sum=1

20、*1=1isum =sum *isum=1*2=2sum=2*3=6sum=720*7=50404040/计算计算7!#include void main()int i=1,sum=1;for(i=1;i=7;i+)sum=sum*i;printf(“7!=%d”,sum);用用for 语句来实现语句来实现/计算计算7!#include void main()int i=1,sum=1;while(i 1e-6)pi =pi +c;/累加每一项累加每一项 num =num+1;/总项数加总项数加1 a =a +2.0;/计算下一项的分母计算下一项的分母 b =-b;/分子变正负号分子变正负号

21、c =b/a;/计算下一项计算下一项 pi =4.0 *pi;printf(pi =%.6fn,pi);printf(num =%dn,num);444445455.5.3 求两个整数的最小公倍数求两个整数的最小公倍数问题分析:问题分析:假设这两个整数为假设这两个整数为x,y,且,且 x y,令它们的最,令它们的最小公倍数为小公倍数为 z。1.z 一定会大于或等于一定会大于或等于 x;2.z =kx,k=1,2,;3.z 一定会被一定会被 y 整除。整除。4646基本思路:基本思路:令令 k=1,2,3,4,,则,则 kx x,2x,3x,4x,,即以即以 x 为公差的等差数列,那么为公差的等

22、差数列,那么 z 即为该数列即为该数列当中能被当中能被 y 整除的最小整数。因此,我们可以整除的最小整数。因此,我们可以用循环语句来寻找该数。用循环语句来寻找该数。4747举例来说:举例来说:x=5,y=3.4848 int x,y,z,temp,k;printf(请输入两个整数,用空格隔开:请输入两个整数,用空格隔开:);scanf(%d%d,&x,&y);if(x y)temp =x;x =y;y =temp;/x=y;y=x;?for(k=1;k+)z =k*x;if(z%y =0)break;printf(最小公倍数为:最小公倍数为:%dn,z);实现方法之一实现方法之一4949 in

23、t x,y,z,temp;printf(请输入两个整数,用空格隔开:请输入两个整数,用空格隔开:);scanf(%d%d,&x,&y);if(x y)/让让 x 表示两者中的大数表示两者中的大数 temp =x;x =y;y =temp;z =x;while(z%y !=0)/当当z不能被不能被y整除时,就让整除时,就让z累加累加x z =z +x;printf(最小公倍数为:最小公倍数为:%dn,z);实现方法之二实现方法之二505051515.5.4 显示二维图形显示二维图形问题描述:问题描述:在屏幕上显示下列二维图形。在屏幕上显示下列二维图形。*5252*问题分析:问题分析:假设有假设有

24、 m 行行 n 列,对于每一行来说,都需要连列,对于每一行来说,都需要连续画续画 n 个个*,似乎用一重循环已经无法满足题,似乎用一重循环已经无法满足题目要求,需要在循环里面再嵌套一层循环,即目要求,需要在循环里面再嵌套一层循环,即多重循环多重循环。5353重复重复 m 遍做以下的事情遍做以下的事情 重复重复 n 遍做以下的事情遍做以下的事情 打印一个打印一个*号号 换到下一行;换到下一行;基本思路:基本思路:5454int m=3,n=6,i,j;for(i=1;i=m;i+)/外循环,打印外循环,打印3行行 for(j=1;j=n;j+)/内循环,打印内循环,打印1行行 printf(“*

25、”);printf(“n”);/换行换行嵌套的循环嵌套的循环5555问题描述:问题描述:在屏幕上显示下列二维图形。在屏幕上显示下列二维图形。*另一个二维图形另一个二维图形有何规律?有何规律?5656int row=5,i,j;for(i=1;i=row;i+)/外循环,打印外循环,打印5行行 for(j=1;j=i;j+)/内循环,每行内循环,每行i个个*printf(“*”);printf(“n”);/换行换行5757问题描述:问题描述:在屏幕上显示下列二维图形。在屏幕上显示下列二维图形。*再一个二维图形再一个二维图形对于第对于第i行,先打印行,先打印(i 1)个空格;再打个空格;再打印印(

26、5 i+1)个星号。个星号。5858int row=5,i,j;for(i=1;i=row;i+)/外循环,打印外循环,打印5行行 for(j=1;j=i 1;j+)/打印打印i-1个空格个空格 printf(“”);for(j=i;j=row;j+)/打印打印row i+1个个*printf(“*”);printf(“n”);/换行换行5959for(j=1;j=i 1;j+)printf(“”);/打印打印i-1个空格个空格for(j=i;j=row;j+)printf(“*”);/打印打印rowi+1个个*i=1(第一行第一行):for(j=1;j=0;j+)printf(“”);/0

27、个空格个空格for(j=1;j=row;j+)printf(“*”);/5 个星号个星号i=2(第二行第二行):for(j=1;j=1;j+)printf(“”);/1 个空格个空格for(j=2;j=row;j+)printf(“*”);/4 个星号个星号i=5(第五行第五行):for(j=1;j=4;j+)printf(“”);/4 个空格个空格for(j=5;j=row;j+)printf(“*”);/1 个星号个星号60605.5.5 谁做的好事?谁做的好事?清华附中有四位同学中的一位做了好事,不留名,清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事

28、。表扬信来了之后,校长问这四位是谁做的好事。A A说:不是我。说:不是我。B B说:是说:是C C。C C说:是说:是D D。D D说:他胡说。说:他胡说。已知三个人说的是真话,一个人说的是假话。现在已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。要根据这些信息,找出做了好事的人。问题描述:问题描述:注:这个例子和本课程的其他一些例子,来自于吴文虎老师的讲义,在此表示感谢。注:这个例子和本课程的其他一些例子,来自于吴文虎老师的讲义,在此表示感谢。6161下面,我们把四个人说的四句话写成关系表达下面,我们把四个人说的四句话写成关系表达式。在声明变量时,让式。在声明变

29、量时,让 thisman 表示要找的人,表示要找的人,定义他为字符型变量。定义他为字符型变量。char thisman;让让“=”=”的含义为的含义为“是是”让让“!=”!=”的含义为的含义为“不不是是”6262A A说:不是我。写成关系表达式为(说:不是我。写成关系表达式为(thisman!thisman!=A=A)B B说:是说:是C C。写成关系表达式为(写成关系表达式为(thisman thisman=C C)C C说:是说:是D D。写成关系表达式为(写成关系表达式为(thisman thisman=D D)D D说:他胡说。写成关系表达式为(说:他胡说。写成关系表达式为(thism

30、an!thisman!=D=D)相应字符的相应字符的ASCIIASCII码值为:码值为:字符字符 AAB B C DC DASCIIASCII码值码值 65 6665 6667 6867 686363显然,不是显然,不是A A做的好事(四个关系表达式值的和为做的好事(四个关系表达式值的和为1 1)思路分析思路分析(1)(1):如何找到该人,一定是如何找到该人,一定是“先假设某人是做好事者,先假设某人是做好事者,然后到每句话中去测试看有几句是真话然后到每句话中去测试看有几句是真话”。“有三句有三句是真话就确定是该人,否则换下一人再试是真话就确定是该人,否则换下一人再试”。比如,。比如,先假定是先

31、假定是A同学,让同学,让thisman=A,代入到四句话中:,代入到四句话中:A说:说:thisman !=A;A !=A 假,值为假,值为0。B说:说:thisman =C;A =C 假,值为假,值为0。C说:说:thisman =D;A =D 假,值为假,值为0。D说:说:thisman !=D;A !=D 真,值为真,值为1。6464思路分析思路分析(2)(2):显然,不是显然,不是BB所为(四个关系表达式值的和为所为(四个关系表达式值的和为2 2)再试再试B B同学,让同学,让thisman=Bthisman=B;代入到四句话中;代入到四句话中A说:说:thisman !=A;B !=

32、A 真,值为真,值为1。B说:说:thisman =C;B =C 假,值为假,值为0。C说:说:thisman =D;B =D 假,值为假,值为0。D说:说:thisman !=D;B !=D真,值为真,值为1。6565再试再试C C同学,让同学,让thisman=Cthisman=C;代入到四句话中;代入到四句话中A说:说:thisman !=A;C !=A 真,值为真,值为1。B说:说:thisman =C;C =C 真,值为真,值为1。C说:说:thisman =D;C =D 假,值为假,值为0。D说:说:thisman !=D;C !=D真,值为真,值为1。显然,就是显然,就是C做了好

33、事(四个关系表达式值的和做了好事(四个关系表达式值的和为为3),这时,我们可以理出头绪,要用所谓的),这时,我们可以理出头绪,要用所谓的枚枚举法举法,一个人一个人地去试,四句话中有三句为,一个人一个人地去试,四句话中有三句为真,该人即为所求。真,该人即为所求。思路分析思路分析(3)(3):6666/thisman 分别赋值为分别赋值为A,B,C,D for(thisman =A;thisman =D;thisman+)sum =(thisman !=A)/A的话是否为真的话是否为真 +(thisman =C)/B的话是否为真的话是否为真 +(thisman =D)/C的话是否为真的话是否为真

34、+(thisman !=D);/D的话是否为真的话是否为真 if(sum =3)printf(“This man is%cn”,thisman);break;从编写程序的角度看,实现枚举最好用循环结构。从编写程序的角度看,实现枚举最好用循环结构。67675.5.6 案件分析案件分析问题描述:问题描述:某地刑侦大队涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队涉及六个嫌疑人的一桩疑案进行分析:A A、B B至少有一人参与该案件;至少有一人参与该案件;A A、D D不可能是同案犯;不可能是同案犯;A A、E E、F F三人中有两人参与该案件;三人中有两人参与该案件;B B、C C或同时参与,或与本

35、案无关;或同时参与,或与本案无关;C C、D D中有且仅有一人参与该案件;中有且仅有一人参与该案件;如果如果D D没有参与该案件,则没有参与该案件,则E E也不可能参与。也不可能参与。试编写一程序,将犯罪嫌疑人找出来。试编写一程序,将犯罪嫌疑人找出来。6868思路分析思路分析(1)(1):显然这是或的关系,因此有显然这是或的关系,因此有 CC1=(A|B)CC1=(A|B)将案情的每一条线索写成逻辑表达式,第一条用将案情的每一条线索写成逻辑表达式,第一条用CC1表示,第二条用表示,第二条用CC2表示,表示,ABCC1000101011111CC1:CC1:A A、B B至少有一人参与该案件至少

36、有一人参与该案件令变量令变量A A表示表示A A是否参与该案件,是否参与该案件,A A0,10,1;变量变量B B表示表示B B是否参与该案件,是否参与该案件,B B0,10,1;6969思路分析思路分析(2)(2):ADCC2001101011110CC2:CC2:A A、D D不可能是同案犯不可能是同案犯 A A是案犯,是案犯,D D不是案犯,写成不是案犯,写成 A&(!D)A&(!D)D D是案犯,是案犯,A A不是案犯,写成不是案犯,写成 D&(!A)D&(!A)A A、D D都不是案犯,写成都不是案犯,写成 (!A)&(!D)(!A)&(!D)这三者是或的关系,因此有:这三者是或的关

37、系,因此有:CC2 (A&(!D)|(D&(!A)|(!A)&(!D)等价于:等价于:CC2 !(A&D)(!A|!D)7070思路分析思路分析(3)(3):CC3:CC3:A A、E E、F F三人中有两人参与该案件。分析有三三人中有两人参与该案件。分析有三 种可能:种可能:第一种,第一种,A A和和E E参与,参与,F F不参与,写成不参与,写成 A&E&(!F)A&E&(!F)第二种,第二种,A A和和F F参与,参与,E E不参与,写成不参与,写成 A&F&(!E)A&F&(!E)第三种,第三种,E E和和F F参与,参与,A A不参与,写成不参与,写成 E&F&(!A)E&F&(!A

38、)这三者是或的关系,因此有:这三者是或的关系,因此有:CC3 (A&E&(!F)|(A&F&(!E)|(E&F&(!A)7171A E F A&E&(!F)A&F&(!E)E&F&(!A)CC3A E F A&E&(!F)A&F&(!E)E&F&(!A)CC31 1 1 0 0 0 01 1 1 0 0 0 01 1 0 1 0 0 11 1 0 1 0 0 11 0 1 0 1 0 11 0 1 0 1 0 10 1 1 0 0 1 10 1 1 0 0 1 10 0 1 0 0 0 00 0 1 0 0 0 00 1 0 0 0 0 00 1 0 0 0 0 01 0 0 0 0 0 01

39、 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0CC3 的真值表的真值表7272思路分析思路分析(4)(4):CC4:CC4:B B、C C或同时参与,或与本案无关,分析有两种或同时参与,或与本案无关,分析有两种 可能:可能:第一种,同时参与,写成第一种,同时参与,写成 B&CB&C 第二种,都与本案无关,写成第二种,都与本案无关,写成 !B&!C!B&!C这两者是或的关系,因此有:这两者是或的关系,因此有:CC4 (B&C)|(!B&!C)CC5:CC5:C C、D D中有且仅有一人参与该案件,可分析为;中有且仅有一人参与该案件,可分析为;CC5 (C&!D)|(

40、D&!C)7373思路分析思路分析(5)(5):CC6:CC6:如果如果D D没有参与该案件,则没有参与该案件,则E E也不可能参与。也不可能参与。这是一种蕴涵关系,可写成:这是一种蕴涵关系,可写成:!D !E蕴涵关系的规律是蕴涵关系的规律是 P Q等价于等价于!P|Q,因此上式等价于:因此上式等价于:CC6 D|!E以上是案情分析,已经化成了计算机可解的逻辑以上是案情分析,已经化成了计算机可解的逻辑表达式。表达式。7474枚举组合!枚举组合!6 6个人每个人都有作案或不作案两种可能,因此有个人每个人都有作案或不作案两种可能,因此有2 26 6种组合,从这些组合中挑出符合种组合,从这些组合中挑

41、出符合6 6条分析的作案者。条分析的作案者。定义定义6 6个整数变量,个整数变量,A A,B B,C C,D D,E E,F F,分别表示,分别表示6 6个人。个人。枚举每个人的可能性枚举每个人的可能性 00,11 让让0 0表示不是罪犯;表示不是罪犯;让让1 1表示就是罪犯。表示就是罪犯。采取枚举方法,枚举什么呢?采取枚举方法,枚举什么呢?7575for(A =0;A =1;A+)for(B =0;B =1;B+)for(C =0;C =1;C+)for(D =0;D =1;D+)for(E =0;E =1;E+)for(F =0;F =1;F+)CC1 =A|B;CC2 =!A|!D;CC

42、3 =(A&E&!F)|(A&F&!E)|(E&F&!A);CC4 =(B&C)|(!B&!C);CC5 =(C&!D)|(D&!C);CC6 =D|!E;if(CC1 +CC2 +CC3 +CC4 +CC5 +CC6 =6)printf(犯罪嫌疑人是:犯罪嫌疑人是:%c%c%c%c%c%c n,A?A :,B?B :,C?C :,D?D :,E?E :,F?F :);7676犯罪嫌疑人是:犯罪嫌疑人是:A B C F A A、B B至少有一人参与该案件;至少有一人参与该案件;A A、D D不可能是同案犯;不可能是同案犯;A A、E E、F F三人中有两人参与该案件;三人中有两人参与该案件;B

43、 B、C C或同时参与,或与本案无关;或同时参与,或与本案无关;C C、D D中有且仅有一人参与该案件;中有且仅有一人参与该案件;如果如果D D没有参与该案件,则没有参与该案件,则E E也不可能参与。也不可能参与。77775.5.7 求质数求质数问题描述:问题描述:求求100以内的所有质数。以内的所有质数。问题分析:问题分析:(1)对)对100以内的每一个整数,判断其是否为质数;以内的每一个整数,判断其是否为质数;(2)判断整数)判断整数m是否为质数的方法:让是否为质数的方法:让 m 被被 2到到 除,如果除,如果 m 能被其中的任何一个整数整除,则能被其中的任何一个整数整除,则 说明它不是一

44、个质数;否则的话,说明它是一个说明它不是一个质数;否则的话,说明它是一个 质数。质数。m7878int i,j,sq,num;int i,j,sq,num;num =0;num =0;for(i=2;i=100;i+)for(i=2;i=100;i+)sq=(int)sqrt(i);sq=(int)sqrt(i);for(j=2;j=sq;j+)for(j=2;j sq)if(j sq)printf(%2d ,i);printf(%2d ,i);num+;num+;if(num%10=0)printf(n);if(num%10=0)printf(n);7979 2 3 5 7 11 13 17

45、 19 23 2931 37 41 43 47 53 59 61 67 7173 79 83 89 97 80805.5.8 猜数游戏猜数游戏问题描述:问题描述:猜数游戏。计算机随机地选择一个在猜数游戏。计算机随机地选择一个在0999之间的整数,然后让人来猜。如果猜测的数字之间的整数,然后让人来猜。如果猜测的数字大于实际的数字,就提示说太大了;否则就提大于实际的数字,就提示说太大了;否则就提示说太小了。总共只给示说太小了。总共只给10次机会。次机会。8181 随机数随机数说明:说明:1 1、要产生随机数需要在程序开头加入头文件、要产生随机数需要在程序开头加入头文件#include#includ

46、e 2 2、rand()rand()是产生随机数的函数,它可生成是产生随机数的函数,它可生成0 0至至RAND_MAXRAND_MAX的整数,的整数,RAND_MAX=0 x7FFF=32767RAND_MAX=0 x7FFF=327673 3、产生随机数需要设置种子、产生随机数需要设置种子srand(unsigned)time(NULL);srand(unsigned)time(NULL);因为时间每分每秒不同,第一个随机数就不因为时间每分每秒不同,第一个随机数就不会固定。你可以做试验,如去掉此语句,产生会固定。你可以做试验,如去掉此语句,产生十个随机数,每次都会是一样的。十个随机数,每次都

47、会是一样的。8282#include#include void main()int i,x;for(i=0;i 10;i+)x=rand();printf(%dn,x);程序程序1 1:未设置种子:未设置种子4118467633426500191691572411478293582696224464第一次第一次4118467633426500191691572411478293582696224464第二次第二次4118467633426500191691572411478293582696224464第三次第三次8383#include#include#include void main()

48、int i,x;srand(unsigned)time(NULL);for(i=0;i=10)if(+NumGuess=10)printf(“printf(“十次都没猜中,你玩完了!十次都没猜中,你玩完了!n);n);break;break;if(Guess MagicNumber)if(Guess MagicNumber)printf(printf(太小了,再大一点!太小了,再大一点!n);n);elseelseprintf(printf(太大了,再小一点!太大了,再小一点!n);n);8585输入你的猜测数字(输入你的猜测数字(0.999):):500太大了,再小一点!太大了,再小一点!输

49、入你的猜测数字(输入你的猜测数字(0.999):):250太大了,再小一点!太大了,再小一点!输入你的猜测数字(输入你的猜测数字(0.999):):125太大了,再小一点!太大了,再小一点!输入你的猜测数字(输入你的猜测数字(0.999):):60太大了,再小一点!太大了,再小一点!输入你的猜测数字(输入你的猜测数字(0.999):):30太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):45太大了,再小一点!太大了,再小一点!输入你的猜测数字(输入你的猜测数字(0.999):):37太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字

50、(0.999):):41恭喜你猜对了!恭喜你猜对了!第一次第一次结果:结果:8686输入你的猜测数字(输入你的猜测数字(0.999):):500太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):750太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):825太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):900太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):950太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):975太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):987太小了,再大一点!太小了,再大一点!输入你的猜测数字(输入你的猜测数字(0.999):):993太大了,再小一点!太大了,再小一点!输入你的猜测数字(输入你的猜测数字(0.999):):990太大了,再小一点!太大了,再小一点!输入你的猜测数字(输入你的猜测数字(0.999):):989十次都没猜中,你玩完了!十次都没猜中,你玩完了!第二次第二次结果:结果:折半法折半法若若 x 1.N,最多仅最多仅需需log2N次。次。8787 END

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!