C语言第6章课件南昌大学_第1页
C语言第6章课件南昌大学_第2页
C语言第6章课件南昌大学_第3页
C语言第6章课件南昌大学_第4页
C语言第6章课件南昌大学_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章第六章 循环结构程序设计循环结构程序设计学习内容学习内容Qwhile型循环结构型循环结构Qdo-while型循环结构型循环结构Qfor型循环结构型循环结构Qif-goto型循环结构型循环结构Q常用算法:枚举法,累加法,累乘法常用算法:枚举法,累加法,累乘法枚举型常量、变量定义枚举型常量、变量定义任务6.1Q南大附中有南大附中有4位同学中的一位做了好事,位同学中的一位做了好事,不留名,表扬信来了之后,校长问这不留名,表扬信来了之后,校长问这4位位是谁做的好事。是谁做的好事。A说:不是我。说:不是我。B说:是说:是C 。C说:是说:是D 。D说:他胡说。说:他胡说。Q已知已知3个人说的是真话

2、,一个人说的是假个人说的是真话,一个人说的是假话,现在要根据这些信息,找出做好事话,现在要根据这些信息,找出做好事的人的人6.1 6.1 将将“是是”,“,“否否”写成关系表达式写成关系表达式Q定义字符型变量定义字符型变量为了完成任务为了完成任务6.1,将,将4个人所说的个人所说的4句话写成句话写成关系表达式。为此,要定义一种字符型变量。关系表达式。为此,要定义一种字符型变量。这里用这里用thisman表示要寻找的做了好事的人。表示要寻找的做了好事的人。char thisman;Q让让“”在这里的含义为在这里的含义为“是是”,Q让让“!=”在这里的含义为在这里的含义为“不是不是”利用关系表达式

3、,将利用关系表达式,将4人所说的话表示成下表:人所说的话表示成下表:说话人说话人说的话说的话写成关系表达式写成关系表达式A“不是我不是我”thisman!=AB“是是C”thisman=CC“是是D”thisman=DD“他胡说他胡说”thisman!=D字符型变量在内存中的数据Q在在C语言中字符在存储单元中是以语言中字符在存储单元中是以ASCII码形式存放的码形式存放的Q因此:因此:thisman=A 或或thisman=65 这两个赋值语句都是等效的这两个赋值语句都是等效的Q如:如:printf(65=A-关系表达式的关系表达式的值为值为%dn,65=A);6.2枚举法的思路Q结合任务结合

4、任务4.1分析,分析,A,B,C,D4个人,只有个人,只有一位是做好事者。令一位是做好事者。令做好事者为做好事者为1,未做,未做好事者为好事者为0,可以有,可以有如下如下4种情况:种情况:状状态态ABCD11000201003001040001这四种状态可简化写成:这四种状态可简化写成:状态状态赋值表达式赋值表达式1thisman=A2thisman=B3thisman=C4thisman=DQ 显然第一种情况是假定显然第一种情况是假定A是做好事者,第二种情是做好事者,第二种情况是假定况是假定B是做好事是做好事者,。者,。Q 所谓所谓枚举枚举:是按照这:是按照这4种种假定逐一地去测试假定逐一地

5、去测试4个人个人的话有几句是真话,如的话有几句是真话,如果不满足果不满足3句为真,就否句为真,就否定掉这一假定,换下一定掉这一假定,换下一个状态再试。个状态再试。Q 具体做法如下:具体做法如下:问题分析问题分析Q共有共有4种可能状态:种可能状态:A、B、C、DQ需要测试并统计在需要测试并统计在4种可能状态下的真话种可能状态下的真话数。数。Q假如在某种状态下的真话数值为假如在某种状态下的真话数值为3,则符,则符合题意,找到答案。假如所有状态下的合题意,找到答案。假如所有状态下的真话数值都不等于真话数值都不等于3,则此题无解。,则此题无解。数据需求数据需求Q问题输入问题输入thisman /*做好

6、事的人做好事的人*/sum /*真话数真话数*/flag /*有解标志有解标志*/Q问题输出问题输出打印做好事的人是谁打印做好事的人是谁(1)假定让)假定让thisman=A代入代入4句话中:句话中:说的人说的人 说的话说的话关系表达式关系表达式 值值Athisman!=A;A!=A0Bthisman=C;A=c0Cthisman=D;A=D0Dthisman!=D;A!=D14个关系表达式值的和为个关系表达式值的和为1不为不为3,显然不是,显然不是A做的好事!做的好事!(2)假定让)假定让thisman=B代入代入4句话中:句话中:说的人说的人说的话说的话关系表达式关系表达式值值Athism

7、an!=A; B!=A1Bthisman=C; B=c0Cthisman=D; B=D0Dthisman!=D; B!=D14个关系表达式值的和为个关系表达式值的和为2不为不为3,显然不是,显然不是B做的好事!做的好事!(3)假定让)假定让thisman=C代入代入4句话中:句话中:说的人说的人 说的话说的话关系表达式关系表达式值值Athisman!=A;C!=A1Bthisman=C;C=c1Cthisman=D;C=D0Dthisman!=D;C!=D14个关系表达式值的和为个关系表达式值的和为3,就是,就是C做的好事!做的好事!(3)假定让)假定让thisman=D代入代入4句话中:句话

8、中:说的人说的人 说的话说的话关系表达式关系表达式 值值Athisman!=A;D!=A1Bthisman=C;D=c0Cthisman=D;D=D1Dthisman!=D;D!=D04个关系表达式值的和为个关系表达式值的和为2,不是,不是D做的好事!做的好事!Q综上所述,一个人一个人去试,就是综上所述,一个人一个人去试,就是枚枚举举。Q从编写程序来看,实现枚举最好用从编写程序来看,实现枚举最好用循环循环结构。结构。软件设计软件设计 1用用 goto 语句和语句和 if 语句构造循环语句构造循环 C语言中,实现循环的方式 :goto ifwhile 2用用 while 语句语句do_while

9、 3用用 do-while 语句语句for4用用 for 语句语句如何控制循环?如何控制循环?Q计数控制计数控制Q条件控制条件控制Q标记控制标记控制算法设计算法设计Qbegin设定被试者设定被试者thisman=A;设定解标志设定解标志flag=0;while (thisman=D)统计此种假定下的真话数统计此种假定下的真话数sumif (sum=3) 打印输出打印输出thisman的值的值flag=1;thisman+;if (flag!=1) 打印输出无解打印输出无解Qend框图分析,由两大块组成:Q 第一块是第一块是循环结构循环结构,功能是,功能是产生被试对象,依次为,产生被试对象,依次

10、为,并测试句话,并测试句话有多少句为真,如果有有多少句为真,如果有3句为句为真,则可确定做好事者,同真,则可确定做好事者,同时置有解标志为时置有解标志为1. 细看,在第一块的循环体中有细看,在第一块的循环体中有两小块组成,第一小块由两条两小块组成,第一小块由两条赋值语句构成,第二小块含一赋值语句构成,第二小块含一分支语句分支语句Q 第二块是第二块是分支结构分支结构,功能是,功能是判断是否无解,如果为真,判断是否无解,如果为真,则输出无解信息则输出无解信息thisman=Dsum=(被试者被试者thisman!=A)+ (被试者被试者thisman= =C)+ (被试者被试者thisman= =

11、D)+ (被试者被试者thisman!=D);sum= =3真真假假真真假假flag!=1输出该被试者;输出该被试者;有解标志有解标志flag1;输出无解信息;输出无解信息;thisman=A;flag=0;6.3 while语句语句Q1形式形式 : while(表达式)语句(表达式)语句Q2作用作用 :实现:实现“当型当型”循环循环Q当表达式成立时,执行语句,否则继续判断表当表达式成立时,执行语句,否则继续判断表达式达式Q3特点特点 :先判断表达式,后执行语句先判断表达式,后执行语句Q4. 语句:语句: while (条件表达式)(条件表达式)语句;语句;语句;语句;while (条件表达式

12、)(条件表达式)语句;语句;循环体语句循环体语句条件表达式条件表达式循环体循环体语句语句条件表达式条件表达式while语句的图形表示语句的图形表示真真假假while的后续语句的后续语句例例6-1:用:用 while 语句实现语句实现 1+2+3+100分析分析: 1. 用变量用变量sum存放和存放和 2. 用用i表示累加变量表示累加变量 3. 循环条件循环条件i100程序流程图:程序流程图:开始初始化 sum=0; i=1;判断:i=100 ?sum=sum+i;i=i+1;输出 sum结束真假真sum=sum+i;i=i+1;判断:i=100 ?sum=0; i=1;输出输出sum的值的值i

13、=100 ?sum=sum+i;i=i+1;N-S 盒图表示main( ) int sum=0, i=1; while (i=100) sum=sum+i; i+; printf(sum%dn,sum); 循环体循环体语句语句循环条件循环条件程序程序: i+; sum+=i;i=0;100循环三大要素:循环初值、循环条件、循环体循环三大要素:循环初值、循环条件、循环体例例6- 2求求1到到100之间的奇数之和,偶数之积之间的奇数之和,偶数之积 。sum=0 mul=1 i=100 i能整除2?yesnomul=mul*isum=sum+i输出sum, muli+;i=1main( ) doub

14、le mul=1; int i=1,sum=0; while (i=100) if(i%2=0) mul=mul*i; else sum=sum+i; i+; printf(sum=%dn,sum); printf(mul=%en,mul);例例6-3 6-3 显示显示1 11010的平方的平方#include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; 运行结果:运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100计数控制循环!计数控制循环!

15、例例6-46-4:利用参考级数求出:利用参考级数求出的近似值的近似值。 Q很显然,如果要求很显然,如果要求的精度越高,则计算的的精度越高,则计算的项数越多。我们可以指定一个精度要求,如项数越多。我们可以指定一个精度要求,如10-7。当最后一项的绝对值小于该精度时,。当最后一项的绝对值小于该精度时,就认为达到要求了。就认为达到要求了。47151311条件控制循环!条件控制循环!#include #include main() int sign; double pi,n,temp; n1.0; temp1; sign1; pi0; while(fabs(temp)1e7) pi temp; n 2

16、; signsign; tempsign/n; pi * *4; printf(PIfn,pi); 初始化:初始化:n=1 =0.0 temp1|1/n|=10-7 加上当前项加上当前项temp n= n 2;改变下一项符号;改变下一项符号;计算下一项计算下一项tempsign/n;47151311main() int a,evenmul=1,oddsum=0; scanf(“%d”,&a); while(a!=-1) if(a%2=0) evenmul=evenmul*a; else oddsum=oddsum+a; scanf(%d,&a); printf(evenmul=

17、%d,oddsum=%dn,evenmul,oddsum); 例例6-5:输入一批正整数,求其中的偶数积,奇数和。:输入一批正整数,求其中的偶数积,奇数和。标记控制循环!标记控制循环!如何控制循环结束?使用负数或使用负数或0结束循环结束循环在使用在使用whilewhile语句时要注意:语句时要注意:特点:特点:先判断表达式,后执行循环体先判断表达式,后执行循环体循环体有可能一次也不执行循环体有可能一次也不执行循环体可为任意类型语句循环体可为任意类型语句如果循环体的动作是由多个语句如果循环体的动作是由多个语句完成的,那么,要用花括号把它们括起来,以复合语句的完成的,那么,要用花括号把它们括起来,

18、以复合语句的形式出现。形式出现。下列情况,退出下列情况,退出whilewhile循环循环条件表达式不成立条件表达式不成立(为零)(为零)循环体内遇循环体内遇break,return,gotobreak,return,goto 无限循环无限循环: : while(1) while(1) whilewhile循环结构常用于循环结构常用于循环次数不固定,根据是否满足某个循环次数不固定,根据是否满足某个条件决定循环与否条件决定循环与否的情况的情况 例例6-6 统计从键盘输入一行字符的个数统计从键盘输入一行字符的个数。#include main() int n=0; printf(input a str

19、ing:n); while(getchar()!=n) n+; printf(%d,n);1形式:形式: do 语句;语句; 语句;语句; while (表达式表达式) ; 语句语句3;2作用:实现作用:实现“直到型直到型”循环循环3特点:先执行语句,后判断条件,特点:先执行语句,后判断条件, 直到表达式不成立为止。直到表达式不成立为止。4. 条件控制或计数控制条件控制或计数控制分号不能分号不能省略省略6.4 do-while语句语句dowhile结构一般形式与流程转换:结构一般形式与流程转换:do 循环体语句循环体语句while(判断表达式判断表达式); 假假真真QExample :prin

20、tf(“Input start and end value : “);scanf(“%d %d”, &start, &end);do printf(“%c (%d)n“, start, start);start+; while (start = end) ;_?start?endInput start and end value : _Input start and end value : 65 67_Input start and end value : 65 67A (65)_66 = 67Input start and end value : 65 67A (65)B (

21、66)_67 = 6767Input start and end value : 65 67A (65)B (66)C (67)_68 = 67main( ) int i,sum=0; i=1; do sum=sum+i; i+; while(i=1e-3); printf(sum=%fn,sum); (1)在进入累加前先给累加器赋初值(一般为)在进入累加前先给累加器赋初值(一般为0););(2)用循环语句实现累加;)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。)循环体语句的设计。 累加器当前值累

22、加器当前值=累加器原值累加器原值+循环变量当前值循环变量当前值 ;基本方法基本方法:属于属于“累加器累加器”类型问题。类型问题。 例例6-8:计算表达式:计算表达式12 23 34 n(n+1) 1 1 1 1+ .+.的值,直到某一项的值小于的值,直到某一项的值小于10-3次方为止。次方为止。while循环与循环与do_while循环小结循环小结:1. 循环体内必须有使循环趋于终止的条件循环体内必须有使循环趋于终止的条件 while (i=100) sum=sum+i; i+; do sum=sum+i; i+; while (i=100)2. 注意循环初值与循环条件注意循环初值与循环条件i

23、=1;while (i=100) sum=sum+i; i+; i=0;while (i100) i+; sum=sum+i; do_while 循环的循环体至少执行一循环的循环体至少执行一 次次, while循环的循环体可能一次也不执行。循环的循环体可能一次也不执行。 4. 在循环体至少执行一次的前提下,在循环体至少执行一次的前提下, do_while与与while 循环等价。循环等价。 在一般情况下,用在一般情况下,用while语句和用语句和用do-while语句语句处理同一问题时,若二者的循环体部分是一样处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。的,它们的结果也一样。

24、但是如果但是如果while后面的表达式一开始就为假后面的表达式一开始就为假(0值值)时,两种循环的结果是不同的。时,两种循环的结果是不同的。C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。 1. 一般形式:一般形式: for (表达式表达式1; 表达式表达式2; 表达式表达式3) 语句语句 for 的循环体的循环体括号不可少括号不可少分号不可少分号不可少6.5 for语句语句n当型循环Condition is tested first n计数控制Loop is controlled by

25、a counternSyntaxes (initial value ; condition; update counter) statement;Or (initial value ; condition; update counter) statement;statement; 循环起始条件循环起始条件循环结束条件循环结束条件循环变量增值循环变量增值复合语句复合语句compound statement被当作一条语句看待被当作一条语句看待循环变量控制循环次循环变量控制循环次数,不要在循环体内数,不要在循环体内改变这个变量的值改变这个变量的值求表达式1判表达式2语句求表达式3for语句的下一个语

26、句 真真假假for语句执行过程示意2 . 执行过程执行过程 : 1)计算表达式)计算表达式1,给循环变量,给循环变量赋初值赋初值 ; 2)计算表达式)计算表达式2,判,判循环条件循环条件是否成立是否成立 ; 当表达式当表达式2成立时(非成立时(非0),转),转3);); 当表达式当表达式2不成立时(不成立时(0),转),转5);); 3)执行)执行语句语句 ; 4)计算表达式)计算表达式3,循环变量,循环变量增值增值 , 返回返回2); 5)结束循环)结束循环 。for (i=1;i=10;i+) sum=sum+i;使用使用for循环解题实例循环解题实例Q 1.求自然数求自然数1100之和之

27、和#include void main()int i=0,sum=0;for (i=1;i=100 ;i=i+1 )sum=sum+i;printf(自然数自然数1100之和为之和为%dn,sum);counter initialValuetest counter valueStep nStep xfalsetrueUpdate countercounter initialValue计数控制的循环计数控制的循环思考:Q(1)将原来的将原来的for(i=1;i=100;i=i+1)修改为修改为: for(i=1;i=100;i=i+2)问问:这是哪些自然数在求和这是哪些自然数在求和,答案是多少答

28、案是多少?Q(2)将原来的将原来的for(i=1;i=100;i=i+1)修改为修改为:for(i=1;i=100000;i=i+1)执行程序能够得到正确结果吗执行程序能够得到正确结果吗?如果不能如果不能,自己想办自己想办法解决法解决.使用使用for循环解题实例循环解题实例Q(2)求求10的阶乘的阶乘Q思路思路:将将10!展开为展开为10*9*8*7*6*5*4*3*2*1.让整型变量让整型变量i去表示去表示10,9,1.让长整型变量让长整型变量sum来表示乘积来表示乘积,初始时让其为初始时让其为1将求将求10的阶乘考虑成的阶乘考虑成累乘累乘问题问题,让让i=10去乘去乘sum再将乘积再将乘积

29、存至存至sum中,即中,即sum=sum*i,之后之后,让让i=i-1,再永上式累乘再永上式累乘,不断地反复做这两个运算不断地反复做这两个运算,从从i=10i=1.就完成了求就完成了求10!的的任务任务.恰好计算机擅长做这种重复操作恰好计算机擅长做这种重复操作.for为最佳选择为最佳选择!循环体控制变量循环体控制变量i就是数字就是数字10,9,1.i的初值为的初值为10,终值为终值为1./*程序名程序名: ex5-4.c*/*主要功能:计算主要功能:计算10的阶乘的阶乘*/#include main()int i=0,j=0,k=0;long sum=1;for (i=10;i=1 ;i- )

30、printf(i=%d,i);sum=sum*i; /*每一步乘积每一步乘积*/printf(tsum=%ldn,sum); /*显示每一步乘积显示每一步乘积*/for(j=1;j=5500;j+); /*用用for循环延迟时间循环延迟时间*/for (k=1;k=10000;k+; ) /*用用for循环延迟时间循环延迟时间*/printf(10!=%ldn,sum); /*显示运算结果显示运算结果*/程序运行结果:选择三种循环的一般原则选择三种循环的一般原则Q如果如果循环次数已知,计数控制循环次数已知,计数控制的循环的循环用forQ如果如果循环次数未知,条件控制循环次数未知,条件控制的循环

31、的循环用whileQ如果如果循环体至少要执行一次循环体至少要执行一次用do-whileQ这只是这只是“一般一般”原则,不是原则,不是“原则原则”注意注意Q在在for和和while语句之后一般没有分号语句之后一般没有分号Q有分号表示循环体就是分号之前的内容有分号表示循环体就是分号之前的内容空语句,表示循环体内什么都不做 while (i 100); i+; for (i = 0; i 100; i+); printf(%d, i);Q延时用空循环延时用空循环逗号运算符逗号运算符Q 多数情况下,并不使用整个逗号表达式的值,更常见的多数情况下,并不使用整个逗号表达式的值,更常见的情况是要分别得到各表

32、达式的值情况是要分别得到各表达式的值Q 主要用在循环语句中,同时对多个变量赋初值等主要用在循环语句中,同时对多个变量赋初值等 for (i = 1 , j = 100; i j; i+, j-)循环起始条件循环变量增值循环结束条件 任务任务6.1的程序框图(的程序框图(for结构)结构)for(k=1;k=4;k+)被试者被试者thisman=64+k;sum=(被试者被试者thisman!=A)+ (被试者被试者thisman= =C)+ (被试者被试者thisman= =D)+ (被试者被试者thisman!=D);sum= =3真真假假真真假假flag!=1输出该被试者;输出该被试者;有

33、解标志有解标志flag1;输出无解信息;输出无解信息;任务任务6.1 循环结构的使用循环结构的使用Q 使用循环结构的部分程序:使用循环结构的部分程序:for(k=1;k=4;k=k+1)thisman=64+k; sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D);/*判断判断sum的值并决定是否有解;的值并决定是否有解;*/for(thisman=A;thisman=D;thisman+)Q为了完成任务为了完成任务6.1,光有循环结构不行光有循环结构不行,还要有判断是还要有判断是否已经有否已经有3个人的话是真话的分支结构个人的话是真话的

34、分支结构.Q这个程序段如下这个程序段如下:if(sum=3)printf(“this man is %cn”,64+k); /*输出做好事的人输出做好事的人*/g=1; /*将本题的有解标志置为将本题的有解标志置为1*/任务任务6.1 分支结构的使用分支结构的使用6.5任务5.1的参考程序Q程序一程序一/*程序名:程序名:ex5-5.c*/#include main()int k=0,sum=0,g=0;char thisman;for(k=1;k=4;k=k+)thisman=64+k;sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D)

35、;if(sum=3)printf(做好事者为做好事者为%cn,64+k);g=1;if(g!=1)printf(cant found!);运行结果:做好事者为运行结果:做好事者为C6.5任务6.1的参考程序Q 程序二程序二/*程序名:程序名:ex5-6.c*/#include main()int k=0,sum=0,g=0;for(k=1;k=4;k=k+)sum=0;/*循环体内初始化循环体内初始化*/if(k!=1) sum=sum+1; /*如如A的话为真,则让的话为真,则让sum加加1*/if(k=3) sum=sum+1; /*如如B的话为真,则让的话为真,则让sum加加1*/if(

36、k=4) sum=sum+1; /*如如C的话为真,则让的话为真,则让sum加加1*/if(k!=4) sum=sum+1; /*如如D的话为真,则让的话为真,则让sum加加1*/ if(sum=3)printf(做好事者为做好事者为%cn,64+k);g=1;if(g!=1)printf(cant found!);程序二还可以简化为:程序二还可以简化为:/*程序名:程序名:ex5-7.c*/*功能:谁做的好事判断功能:谁做的好事判断*/#include main()int k=0,g=0;for(k=1;ky & c例:例:main( ) int a= -5,i,j,k,l,m; f

37、loat b=0.01; i= !a;j=a & b; k= a | | b; l=(5 3 & 2 | | 84- !0); m= a 9 ; printf (“i=%d,j=%d,k=%d, l=%d, m=%dn”, i, j, k,l, m); 运行结果:运行结果: i=0, j=1, k=1, l=1, m=0在在计算逻辑表达式计算逻辑表达式过程中,并过程中,并不一定不一定需要需要计算所有逻辑计算所有逻辑运算符运算符。只要能确定表达式的逻辑值,即结束表达式计算只要能确定表达式的逻辑值,即结束表达式计算。 (1) 逻辑与运算符:逻辑与运算符: &如有逻辑表达式:

38、如有逻辑表达式:a & b & c执行过程是:执行过程是:当当a为为0时,时,b和和c不用再判断不用再判断了,了, 逻辑与运算符将不再执行,结果为逻辑与运算符将不再执行,结果为0,否则还要继续后边的运算。否则还要继续后边的运算。 abc 0(假)假)非非0(真)真)0(假假)非非0(真)真)1(真)(真)0(假假)0(假假)(2) 逻辑或运算符:逻辑或运算符:| | 如有逻辑表达式:如有逻辑表达式:a | | b | | c 执行过程是:执行过程是: 当当a为非为非0时,时,b和和c不用再判断不用再判断了,逻辑或运算符将不了,逻辑或运算符将不 再执行,其结果为再执行,其结果为1

39、,否则继续执行后面的运算。,否则继续执行后面的运算。 abc0非非0(真)真)非非0(真真)非非0(真真)0(假)(假)1(真真)0例:例:main( ) int a, b=0, c=0, d=0; scanf(“%d”,&a); d = a & (b=5) & (c=3); printf (“a=%d, b=%d, c=%d, d=%dn”, a, b, c, d); 输入:输入: 1 输出:输出:a=1, b=5, c=3, d=1 0 a=0, b=0, c=0, d=0 例例: main( ) int a, b=0, c=0, d=0; scanf(“ %d”,

40、&a); d=a | | (b=5) | | (c=3) ; printf (“a=%d, b=%d, c=%d, d=%d, n”,a, b, c, d); 输入:输入: 1 输出:输出:a=1, b=0, c=0, d=1 0 a=0, b=5, c=0, d=1在在C中,中,巧妙地使用逻辑表达式巧妙地使用逻辑表达式,可以表示一个复杂的问题,可以表示一个复杂的问题 如:关于闰年问题:符合下列条件之一,均为闰年。如:关于闰年问题:符合下列条件之一,均为闰年。 (1)能被)能被4整除并且不能被整除并且不能被100整除整除 (2)能被)能被4整除并且能被整除并且能被400整除整除 其逻辑

41、表达式为:其逻辑表达式为: (year % 4=0 & year % 100!=0) | | (year % 400=0 & year % 4=0)由于能被由于能被400 整除的年份一定能被整除的年份一定能被4 整除,所以可省去后一部分,整除,所以可省去后一部分,即:即: (year % 4 = =0 & year % 100 != 0) | | (year % 400 =0 ) 若判断非闰年,只在闰年表达式前加若判断非闰年,只在闰年表达式前加 ! , 即:即: !(year % 4 = = 0 & year % 100 != 0) | | ( year % 4

42、00 = = 0)逻辑问题的解题思路逻辑问题的解题思路Q将案情的每一条写成将案情的每一条写成逻辑表达式逻辑表达式,从第从第1到到第第6条依次用条依次用cc1,cc6表示表示.cc1: A和和B至少有一个至少有一个人作案人作案.令令A变量表示变量表示A作案作案,B变量表示变量表示B作案作案.显然这是显然这是或或的关系的关系.因此因此有有:CC1=(A|B)ABCC1000101011111逻辑问题的解题思路逻辑问题的解题思路Qcc2: A和和D不可能是不可能是同案犯同案犯.A如果是案犯如果是案犯,D一定一定不是案犯不是案犯,写成写成 A&(!D)D如果是案犯如果是案犯,A一定一定不是案犯

43、不是案犯,写成写成 D&(!A)这两者是这两者是或或的关系的关系.因此因此有有:CC2=!(A&D)ADA&D CC21001111000010101逻辑问题的解题思路逻辑问题的解题思路Q cc3: A、E、F至少有至少有2人人涉嫌作案涉嫌作案.Q 三种可能:三种可能:A和和E作案作案,写成写成 (A&E)A和和F作案作案,写成写成 (A&F)E和和F作案作案,写成写成 (E&F)这三种可能性是这三种可能性是或或的关系的关系.因因此有此有:CC3=(A&E)| (A&F) |(E&F)AEFCC31111110110110

44、1 110010010010000000逻辑问题的解题思路逻辑问题的解题思路Q cc4: B和和C同时作案,或都与本案无关同时作案,或都与本案无关Q 两种可能:两种可能: 同时作案同时作案,写成写成 (B&C) 都与本案无关都与本案无关,写成写成 (!B&!C)这两种可能性是这两种可能性是或或的关系的关系.因此有因此有:BC!B!CB&C !B&!CCC31100100100100001100000011011CC4 =(B&C)| (!B&!C)逻辑问题的解题思路逻辑问题的解题思路Qcc5: C和和D中有且仅有一人作案,写成中有且仅有一人作案,

45、写成Q两种可能:两种可能:C作案同时作案同时D不作案不作案,写成写成 (C&!D)D作案同时作案同时C不作案不作案,写成写成 (D&!C)这两种可能性是这两种可能性是或或的关系的关系.因此有因此有:CC5= (C&!D)|(D&!C)逻辑问题的解题思路逻辑问题的解题思路Qcc6: 如果如果D没有参与作案,则没有参与作案,则E也不可能参与也不可能参与作案。作案。Q分析这一条比较麻烦一些,可列出真值表再归分析这一条比较麻烦一些,可列出真值表再归纳。纳。DE!ECC6 含义含义分析分析1101D作案,作案,E也作案也作案可能可能1011D作案,作案,E不作案不作案可能

46、可能0011D不作案,不作案,E也不可也不可能作案能作案可能可能0100D不作案,不作案,E却作案却作案不可能不可能CC6 =D| (!E)逻辑问题的解题思路逻辑问题的解题思路Q将案情分析的将案情分析的6条归纳成一个破案综合判条归纳成一个破案综合判断条件断条件CC。QCC=CC1&CC2&CC3&CC4&CCC5&CC6Q当当CC为为1时时,说明说明6条的每一条都满足了条的每一条都满足了,可以结案了可以结案了.采取枚举方法采取枚举方法Q定义定义6个整型的变量个整型的变量A、B、C、D、E、F,分别表示分别表示6个嫌疑人。让变量的取值为个嫌疑人。让变量的取

47、值为0表示不是作案人,为表示不是作案人,为1表示是作案人,每表示是作案人,每个人都有作案和没作案两种可能,个人都有作案和没作案两种可能,Q作为作为6个人的一个整体,存在个人的一个整体,存在26种可能,种可能,依次为第依次为第0种可能到第种可能到第63种可能。种可能。枚举法的思路:枚举枚举法的思路:枚举ABCDEF,看哪一种,看哪一种情况使得情况使得CC的逻辑值为的逻辑值为1NABCDEF100000020000013000010 63 111111QN为组合数,为组合数,n为为0的的情况是情况是6个人没作案,个人没作案,n为为63的情况是的情况是6个人个人都是作案者。都是作案者。Q枚举枚举AB

48、CDEF,让整,让整个整体从个整体从000000111111,又,又要用到要用到循环结构循环结构。枚举法的思路:枚举枚举法的思路:枚举ABCDEF,看哪一种,看哪一种情况使得情况使得CC的逻辑值为的逻辑值为1NABCDEF100000020000013000010 63 111111Q对于对于F,n每次加每次加1,F变号(从变号(从0变变1,从,从1变变0)Q对于对于E,n每次加每次加2,E变号(从变号(从0变变1,从,从1变变0)Q对于对于D,n每次加每次加4,D变号(从变号(从0变变1,从,从1变变0)枚举法的思路:枚举枚举法的思路:枚举ABCDEF,看哪一种,看哪一种情况使得情况使得CC

49、的逻辑值为的逻辑值为1NABCDEF100000020000013000010 63 111111Q对于对于C,n每次加每次加8,C变号(从变号(从0变变1,从,从1变变0)Q对于对于B,n每次每次16,B变号(从变号(从0变变1,从,从1变变0)Q对于对于A,n每次每次32,A变号(从变号(从0变变1,从,从1变变0)Q可见,可见,F变化最快,变化最快,A变化最慢。可以用变化最慢。可以用6重循环。重循环。6重循环:重循环:Q循环控制变量分别是循环控制变量分别是A、B、C、D、E、F,初值为初值为0,终值为,终值为1。QA循环在最外层,循环在最外层,F循环在最里层,如左循环在最里层,如左图。图

50、。for (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+)循环体循环体for (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+ )循环体循环体for (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=

51、1;E+ )for (F=0;F=1 ;F+ )循环体循环体设计输出信息设计输出信息Q 为了给出每个人是否为罪犯的信息,可以定义一个字为了给出每个人是否为罪犯的信息,可以定义一个字符类型的二维数组符类型的二维数组Q char info216=“is not criminal”,“ is a criminal”Q char是说,是说,info数组的元素为字符数组的元素为字符,2为下标,表示有为下标,表示有两个字符串,每个字符串最多有两个字符串,每个字符串最多有16-1个字符。每一字个字符。每一字符串后面自动跟一个空字符符串后面自动跟一个空字符0isn 0t criminal0isacrimina

52、l012345678910111213141516按上述分析使用按上述分析使用6重循环的程序:重循环的程序:main()int cc1,cc2,cc3,cc4,cc5,cc6;int A,B,C,D,E,F;char info216=is not criminal,is a criminal; for(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)|(D&!A);cc3=(A&E)|(A&F)|(E&F);cc4=(B&C)|(!B&!C);cc5= (C&!D

温馨提示

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

评论

0/150

提交评论