资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机程序设计基础,第二讲 逻辑判断,1,二、逻辑判断,清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。,A,说:不是我。,B,说:是,C,。,C,说:是,D,。,D,说:他胡说,。,已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。,问题:谁做的好事?,2,二、逻辑判断,为了解这道题,我们要学习逻辑思维与判断,以及如何解这类问题的思路。,1,、关系运算符和关系表达式,大于,=,大于等于,=,等于,!=,不等于,3,二、逻辑判断,请大家看如下程序,/,程序,s2_1.c,#include ,void main( ),int,b,c,;/,整型变量,b=3;c=2;/,对变量赋值,printf(“3 2,是,%dn”,(bc); /,输出逻辑值,printf(“3=2,是,%,dn”,(b,=c);,printf(“3=2,是,%,dn”,(b,=c);,printf(“3 2,是,%,dn”,(b, 2,是,1,说明,3 2,是真,3=2,是,13=2,是真,3=2,是,03=2,是假,3 2,是,03 2,是假,3!=2,是,13!=2,是真,5,二、逻辑判断,关系表达式,关系运算符,例,bc,,测试,bc,这种关系是否成立,成立为真,不成立为假。,成 立,关系表达式的值为,1,;,不成立,关系表达式的值为,0,。,6,二、逻辑判断,这时在内存中系统找到一个字节。,让“,=”,的含义为“是”,让“,!=”,的含义为“不是”,下面,我们把四个人说的四句话写成关系表达式。在声明变量时,让,thisman,表示要找的人,定义它是字符变量,char,thisman,;,thisman,地址,xxxx,7,二、逻辑判断,A,说:不是我。写成关系表达式为,(,thisman,!=A,),B,说:是,C,。 写成关系表达式为,(,thisman,=C,),C,说:是,D,。 写成关系表达式为,(,thisman,=D,),D,说:他胡说。写成关系表达式为,(,thisman,!=D,),在,C,语言中字符也是有数值的,这个数值就是字符的,ASCII,码值,字符,ABCD,ASCII,码值,65666768,8,二、逻辑判断,字符存放在内存中是以,ASCII,码的形式存放的,因此,用赋值语句,thisman,= A;,thisman,= 65;,两者是等效的,在内存中存的都是,65,。,可以做实验,如下例所示,thisman,65,地址,xxxx,9,二、逻辑判断,/,例,s2_2.c,#include /,包含头文件,void main( )/,主函数,char,thisman,; /,声明字符变量,thisman,=A;/,thisman,赋值为,A,printf(“thisman,=%,cn”,thisman,);/,输出,thisman,的值,printf,(“ 65=A -,取值为,%dn”,65=A);/,验证,/ 65,是否等于,A,,并输出结果,thisman,=A,65=A-,取值为,1,编译链接后运行,,输出结果为:,10,二、逻辑判断,1,、如何找到该人,一定是“先假设该人是做好事者,然后到每句话中去测试看有几句是真话”。“有三句是真话就确定是该人,否则换下一人再试,”,。,比如,先假定是,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,。,显然,不是,A,做的好事(四个关系表达式值的和为,1,),11,二、逻辑判断,再试,B,同学,让,thisman,=B;,代入到四句话中,思路:,A,说:,thisman,!=A;B!=A,真,值为,1,。,B,说:,thisman,=C;B=C,假,值为,0,。,C,说:,thisman,=D;B=D,假,值为,0,。,D,说:,thisman,!=D;B!=D,真,值为,1,。,显然,不是,B,所为(四个关系表达式值的和为,2,),12,二、逻辑判断,再试,C,同学,让,thisman,=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,做了好事(四个关系表达式值之和为,3,)这时,我们可以理出头绪,要用所谓枚举法,一个人一个人地去试,四句话中有三句为真,该人即所求。,13,二、逻辑判断,2,、从编写程序的角度看,实现枚举最好用循环结构,for(k=1; k=4; k=k+1),/,循环体,开始,thisman,= 64+k;/,产生被试者,依次给,/,thisman,赋值为,A,B,C,D,sum = (,thisman,!=A)+/ A,的话是否为真,(,thisman,=C)+/ B,的话是否为真,(,thisman,=D)+/ C,的话是否为真,(,thisman,!=D);/ D,的话是否为真,/,循环体,结束,14,二、逻辑判断,我们可以抽象画出下图,来表示循环结构,for (表达式1;表达式2;表达式3),循环体语句,15,二、逻辑判断,16,二、逻辑判断,#include /,预编译命令,将标准输入,/,输出加到源文件中,void main( )/,主函数,int,i,sum;/,声明,i, sum,为整数变量,sum=0;/,对求和变量,sum,清零,for(i=1;i=100;i=i+1)/,循环,sum=sum+i;/,累加求和,printf(“sum,=%dn”,sum);/,输出累加结果,举例:求自然数,1,100,之和(,s2_3.c,),17,二、逻辑判断,可以改变表达式,看看运行结果。,比如:,for (i=1; i=1000; i=i+2),为了能够看清每一步,将程序改造为,s2_4.c,18,二、逻辑判断,/ s2_4.c,(,110,的和),for(i=1; i=10; i=i+1)/,控制变量,i,初值为,1,,终值为,10,printf(i,=%d,i);/,输出,i,的值,sum=sum+i;/,累加,i,到,sum,中,printf(tsum,=%dn,sum);,/ t,跳到下一个,Tab,位置,for(j=1;j=5500;j=j+1)/,延时,for(k=1;k=10000;k=k+1);/,延时,19,二、逻辑判断,#include /,预编译命令,将标准输入输出加入源文件,void main( )/,主函数,/,开始,int,i,j,k;/,声明,i,j,k,为整型变量,long sum;/,声明,sum,为长整数,sum=1;/,对,sum,赋初值,for(i=10;i=1;i=i-1)/,控制变量,i,初值为,10,,终值为,1,/,循环体开始,printf(i,=%d,i);/,输出,i,的值,sum=sum*i;/,累乘,i,,放入,sum,printf(tsum,=%dn,sum);/,输出累乘值,for(j=1;j=5500;j=j+1)/,延时,for(k=1;k=10000;k=k+1);/,延时,printf(“sum,=%dn”,sum);/,输出最终结果,例:计算,10!,(,s2_5.c,),20,二、逻辑判断,从以上这两个例子可以看出,for,循环是一种计数型循环,可以递增,也可以递减,使用起来很方便。一般是在已知循环次数的情况下使用。,for,循环的,NS,图,for (i=1; i=100; i=i+2),循环体,21,二、逻辑判断,if (sum = 3),printf(This,man is %,cn,thisman,);,g=1;,读作:如果,sum,真的为,3,时,做下面两件事,(,1,)输出做好事的人;,(,2,)将有解标志置,1,。,其中,(sum=),为条件判断语句中的条件,根据其真假使程序分支。,分支语句,22,二、逻辑判断,NS,图为,23,二、逻辑判断,一般格式,1,if (,表达式)语句1;/ 语句1,只一句,如果表达式为真,执行语句1;否则什么都不做,2,if (,表达式),语句块1;,如果表达式为真,做语句块1的内容;否则什么都不做;,24,二、逻辑判断,一般格式,3,if (,表达式) 语句1;,else,语句2;,如果表达式为真,执行语句1;否则执行语句,2,4 if (,表达式,),语句块,1,;,else,语句块,2,;,25,二、逻辑判断,举例:实现如图函数,26,二、逻辑判断,/ s2_6.c,#include /,预编译命令,将标准输入输出,/,函数作为头文件,void main( )/,主函数,/,开始,int,x,y; /,变量,x,y,为整数类型,printf(x,=); /,提示信息,scanf(%d,&x,); /,键盘输入一个整数放入,x,中,if(x,0)y=1; /,如果,x0,则将,1,赋给,y,else if(x=0) y=0;/,否则,如果,x=0,则将,0,赋给,y,else y=-1;/,否则,将,-1,赋给,y,printf(y,=%dn,y);/,输出,y,的值, /,结束,27,二、逻辑判断,NS,图,28,NS,图,有了上述了解之后,我们来看解“谁做的好事”的程序框图,根据上述框图写出的程序见,s2_7.c,29,#include ,void main(),/,主函数,int,k,sum,g,;,/,声明变量为整数类型,for(k,=1;k=4;k=k+1),/,循环从,k,为,1,到,4,,,/ k,取,1,2,3,4,分别代表,A,B,C,D,/,循环,开始,sum=0;,/,初始化,置,0,if (k!=1) sum=sum+1;,/ A,说的话,如为真,则令,sum,加,1,;,if (k=3) sum=sum+1;,/ B,说的话,如为真,则令,sum,加,1,;,if (k=4) sum=sum+1;,/ C,说的话,如为真,则令,sum,加,1,;,if (k!=4) sum=sum+1;,/ D,说的话,如为真,则令,sum,加,1,;,if (sum=3),/,若有三句话为真话,则做下列两件事,printf(“This,man is %cn”,64+k);,/,输出,g=1;,/,让有解标志置,1,if (g!=1),printf(“Cant,found!”);,/,如,g,不为,1,,则输出无解信息,讨论:下面这个程序行不行,从思路上讨论,30,二、逻辑判断,上述程序可以简化为:,#include ,void main( ),int,k, g;/,声明变量为整数类型,for (k=1; k=4; k=k+1)/,这里,k,既为循环控制变量,,/,也表示第,k,个人,if (k!=1)+(k=3)+(k=4)+(k!=4)=3),/,如果,4,句话有,3,句为真,则输出该人,printf(“Thisman,is %cn”,64+k);,g=1;,if (g!=1),printf(“Cant,found!n”);/,输出无解信息,31,
展开阅读全文