您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 吴文虎《程序设计基础第2版》PPT-02(2-逻辑判断-谁做的好事)
1计算机程序设计基础第二讲逻辑判断2二、逻辑判断清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。A说:不是我。B说:是C。C说:是D。D说:他胡说。已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。问题:谁做的好事?3二、逻辑判断为了解这道题,我们要学习逻辑思维与判断,以及如何解这类问题的思路。1、关系运算符和关系表达式大于小于=大于等于==等于!=不等于4二、逻辑判断请大家看如下程序//程序s2_1.c#includemath.hvoidmain(){intb,c;//整型变量b=3;c=2;//对变量赋值printf(“32是%d\n”,(bc));//输出逻辑值printf(“3=2是%d\n”,(b=c));printf(“3==2是%d\n”,(b==c));printf(“32是%d\n”,(bc));printf(“3!=2是%d\n”,(b!=c));}5二、逻辑判断输出结果是:32是1说明32是真3=2是13=2是真3==2是03==2是假32是032是假3!=2是13!=2是真6二、逻辑判断关系表达式变量1关系运算符变量2例bc,测试bc这种关系是否成立,成立为真,不成立为假。成立——关系表达式的值为1;不成立——关系表达式的值为0。7二、逻辑判断这时在内存中系统找到一个字节。让“==”的含义为“是”让“!=”的含义为“不是”下面,我们把四个人说的四句话写成关系表达式。在声明变量时,让thisman表示要找的人,定义它是字符变量charthisman;thisman地址xxxx8二、逻辑判断A说:不是我。写成关系表达式为(thisman!=‘A’)B说:是C。写成关系表达式为(thisman==‘C’)C说:是D。写成关系表达式为(thisman==‘D’)D说:他胡说。写成关系表达式为(thisman!=‘D’)在C语言中字符也是有数值的,这个数值就是字符的ASCII码值字符ABCDASCII码值656667689二、逻辑判断字符存放在内存中是以ASCII码的形式存放的,因此,用赋值语句thisman=‘A’;thisman=65;两者是等效的,在内存中存的都是65。可以做实验,如下例所示thisman65地址xxxx10二、逻辑判断//例s2_2.c#includemath.h//包含头文件voidmain()//主函数{charthisman;//声明字符变量thisman=‘A’;//thisman赋值为’A’printf(“thisman=%c\n”,thisman);//输出thisman的值printf(“65==‘A’----取值为%d\n”,65==‘A’);//验证//65是否等于‘A’,并输出结果}thisman=A65==‘A’----取值为1编译链接后运行,输出结果为:11二、逻辑判断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)12二、逻辑判断再试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)13二、逻辑判断再试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)这时,我们可以理出头绪,要用所谓枚举法,一个人一个人地去试,四句话中有三句为真,该人即所求。14二、逻辑判断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'的话是否为真……}//循环体,结束15二、逻辑判断我们可以抽象画出下图来表示循环结构for(表达式1;表达式2;表达式3){循环体语句}16二、逻辑判断测试表达式2求解表达式1执行循环体语句求解表达式3for的下一条语句假真循环控制变量置初值测试是否达到终值让循环控制变量增值17二、逻辑判断#includestdio.h//预编译命令,将标准输入//输出加到源文件中voidmain()//主函数{inti,sum;//声明i,sum为整数变量sum=0;//对求和变量sum清零for(i=1;i=100;i=i+1)//循环{sum=sum+i;//累加求和}printf(“sum=%d\n”,sum);//输出累加结果}举例:求自然数1-100之和(s2_3.c)18二、逻辑判断可以改变表达式,看看运行结果。比如:for(i=1;i=1000;i=i+2)为了能够看清每一步,将程序改造为s2_4.c19二、逻辑判断//s2_4.c(1~10的和)……for(i=1;i=10;i=i+1)//控制变量i初值为1,终值为10{printf(i=%d,i);//输出i的值sum=sum+i;//累加i到sum中printf(\tsum=%d\n,sum);//\t跳到下一个Tab位置for(j=1;j=5500;j=j+1)//延时for(k=1;k=10000;k=k+1);//延时}20二、逻辑判断#includestdio.h//预编译命令,将标准输入输出加入源文件voidmain()//主函数{//开始inti,j,k;//声明i,j,k为整型变量longsum;//声明sum为长整数sum=1;//对sum赋初值for(i=10;i=1;i=i-1)//控制变量i初值为10,终值为1{//循环体开始printf(i=%d,i);//输出i的值sum=sum*i;//累乘i,放入sumprintf(\tsum=%d\n,sum);//输出累乘值for(j=1;j=5500;j=j+1)//延时for(k=1;k=10000;k=k+1);//延时}printf(“sum=%d\n”,sum);//输出最终结果}例:计算10!(s2_5.c)21二、逻辑判断从以上这两个例子可以看出for循环是一种计数型循环,可以递增,也可以递减,使用起来很方便。一般是在已知循环次数的情况下使用。for循环的NS图for(i=1;i=100;i=i+2)循环体22二、逻辑判断if(sum==3){printf(Thismanis%c\n,thisman);g=1;}读作:如果sum真的为3时,做下面两件事(1)输出做好事的人;(2)将有解标志置1。其中(sum==)为条件判断语句中的条件,根据其真假使程序分支。分支语句23二、逻辑判断NS图为条件为真吗?是语句块1语句块2否24二、逻辑判断一般格式1if(表达式)语句1;//语句1,只一句如果表达式为真,执行语句1;否则什么都不做2if(表达式){语句块1;}如果表达式为真,做语句块1的内容;否则什么都不做;25二、逻辑判断一般格式3if(表达式)语句1;else语句2;如果表达式为真,执行语句1;否则执行语句24if(表达式){语句块1;}else{语句块2;}26二、逻辑判断举例:实现如图函数xy-1101,00,01,0xyxx是否是否x0y=0y=-1y=1x==027二、逻辑判断//s2_6.c#includestdio.h//预编译命令,将标准输入输出//函数作为头文件voidmain()//主函数{//开始intx,y;//变量x,y为整数类型printf(x=);//提示信息scanf(%d,&x);//键盘输入一个整数放入x中if(x0)y=1;//如果x0,则将1赋给yelseif(x==0)y=0;//否则,如果x==0,则将0赋给yelsey=-1;//否则,将-1赋给yprintf(y=%d\n,y);//输出y的值}//结束28二、逻辑判断NS图是否是否x0y=0y=-1y=1x==0提示和输入整数x输出y29NS图for(k=1;k=4;k=k+1)被试者thisman=64+k;sum=(被试者thisman!=‘A’)+(被试者thisman==‘C’)+(被试者thisman==‘D’)+(被试者thisman!=‘D’);sum==3假真输出该被试者;有解标志g=1;g1假真输出无解信息;有了上述了解之后,我们来看解“谁做的好事”的程序框图根据上述框图写出的程序见s2_7.c30#includestdio.hvoidmain()//主函数{intk,sum,g;//声明变量为整数类型for(k=1;k=4;k=k+1)//循环从k为1到4,//k取1,2,3,4分别代表A,B,C,D{//循环,开始sum=0;//初始化,置0if(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(“Thismanis%c\n”,64+k);//输出g=1;//让有解标志置1}}if(g!=1)printf(“Can’tfound!”);//如g不为1,则输出无解信息}讨论:下面这个程序行不行,从思路上讨论31二、逻辑判断上述程序可以简化为:#includestdio.hvoidmain(){intk,g;//声明变量为整数类型for(k=1;k=4;k=k+1)//这里k既为循环控制变量,//也表示第k个人{if(((k!=1)+(k==3)+(k==4)+(k!=4))==3){//如果4句话有3句为真,则输出该人printf(“Thismanis%c\n”,64+k);g=1;}}if(g!=1)printf(“Can’tfound!\n”);//输出无解信息}
本文标题:吴文虎《程序设计基础第2版》PPT-02(2-逻辑判断-谁做的好事)
链接地址:https://www.777doc.com/doc-7753166 .html