C语言课件之逻辑思维与逻辑问题(循环)_第1页
C语言课件之逻辑思维与逻辑问题(循环)_第2页
C语言课件之逻辑思维与逻辑问题(循环)_第3页
C语言课件之逻辑思维与逻辑问题(循环)_第4页
C语言课件之逻辑思维与逻辑问题(循环)_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、逻辑思维与逻辑问题-逻辑运算、循环何谓逻辑运算?A和B中至少有一个大于 CA和B全部大于 CA为不大于100的偶数如何用C语言描述问题关系运算是一种比较运算,将两个值(表达式)进行比较,判断比较的结果是否符合给定的条件。逻辑运算?每个表述中都含有两个关系表达式,如何将这两个关系表达式结合起来?通过逻辑运算符何谓逻辑运算?用逻辑运算符将关系运算表达式或逻辑量连接起来构成逻辑表达式回顾:符合下列条件之一都为闰年1、能被400整除(year%400=0)2、能被4整除但不能100整除也可通过逻辑运算符将几个条件整合起来第 4 页逻辑运算数学式子:x0如何写为C语言语句?数学式子的英文表达:x0因此,

2、 C语言约定了语句:x0 注意: 用了二个 &而 and 和 &作用相同【任务3.3】猜比赛结果 一天,湘潭大学ACM/ICPC队的四支候选队展开比赛。比赛完,4名队长问教练Eric最后比赛谁赢了。Eric让他们猜:A说:“不是我们队,也不是C队。”B说:“是我们或者D队。”C说:“是A队,不是B队。”D说:“B猜错了。”Eric说只有一个人猜对了,请问最后是谁赢得了比赛? 逻辑运算与逻辑表达式 说话人说的话写成关系表达式A“不是我们队”winner != A“不是C队”winner != CB“是我们”winner = B“是D队”winner = DC“是A”winner = A“不是B”

3、winner != B每个子句之间的关系和D所说的话,我们没有办法用已学的知识进行处理。在这里我们要引入一个新的计算逻辑运算。 逻辑运算逻辑与&a & ba与b往往是关系表达式,a与b同时为真,则表达式为真,否则为假A0011B0101A&B0001逻辑运算逻辑或|a | ba与b只要有1个为真,则表达式为真,否则为假A0011B0101A|B0111逻辑运算逻辑非!a a为假,则表达式为真,否则为假A01!A10优先级上!最高,&比|高不记得就全部打上括号使用逻辑表达式表示4个人说的话说话人说的话写成逻辑表达式A“不是我们队,也不是C队。”winner != A & winner != CB

4、“是我们或者D队”winner = B | winner = DC“是A,不是B队”winner = A & winner != BD“B猜错了。”!(winner = B | winner = D)枚举法的思路 分析任务4-3,我们可以依次假设A,B,C,D为winner,然后测试A,B,C,D所说的4句话,看是否满足“只有一个人猜对了”的条件,即只有一句话的逻辑表达式结果为真的。如果满足,则我们的假设成立,否则我们的假设错误。 枚举法,又叫穷举法,即把所有可能的情况都进行一次计算,最后得到整个问题的计算结果。 状态赋值表达式1winner= A2winner= B3winner= C4wi

5、nner= D“只有一个人猜对”等价于只有一句话的逻辑表示式结果为真,那么我们可以将这4句话的逻辑结果累加,如果结果为1,则表明只有一句话的逻辑结果为真。 winner=A说话人说的话代入逻辑表达式值Awinner != A & winner != CA != A & A != C0Bwinner = B | winner = DA= B | A = D0Cwinner = A & winner != BA = A & A != B1D!(winner = B | winner = D)!( A = B | A = D)1winner=B说话人说的话代入逻辑表达式值Awinner != A &

6、 winner != CB != A & B != C1Bwinner = B | winner = DB= B | B = D1Cwinner = A & winner != BB = A & B != B0D!(winner = B | winner = D)!( B = B | B = D)0说话人说的话代入逻辑表达式值Awinner != A & winner != CC != A & C != C0Bwinner = B | winner = DC= B | C = D0Cwinner = A & winner != BC = A & C != B0D!(winner = B | w

7、inner = D)!( C = B | C = D)1winner=C笨笨的写法如果题目有100人怎么办?这么写太麻烦了,也没有必要。每次的测试计算是一样,只是winner的值不一样我们需要依次遍历winner的可能状态,即一个一个测试循环结构 循环结构是计算机程序中最常用的结构,它能充分地利用计算机上擅长做重复运算的特点。C语言中可以使用for语句,while语句和do-while语句实现循环结构,其中for是用得最多,也是最灵活的一种 for语句 for(表达式1;表达式2;表达式3)循环体(语句组);for语句中表达式1,2,3都可以缺省但括号中的“;”不能缺少。表达式2缺省时,那么循

8、环判断结束条件为永真。 使用for循环解题的实例 (1) 输入n个整数,求这个n个整数的累加和。一共输入n+1个整数,第一个整数为n。求n(n0)个自然数中最大的一个。一共输入n+1个自然数,第一个整数为n。 解决任务4-3 循环程序设计练习1求100以内的奇数、偶数之和1、需要用到的变量:i被判断的数=100sd: 用于存放奇数的和,se:用于存放偶数的和2、如何判断奇数和偶数?3、哪些内容要作为循环体?4、有无要从键盘输入的数?输出什么数?循环程序设计练习2输出一行字母,所输出的字母和个数从键盘输入例如:输入: C,5 则输出: CCCCC输出一行字母1、需要的变量:ch-存放字母、n-字

9、母的个数、i-循环控制变量2、循环体的内容?3、如果是输出一行数字?循环嵌套如何输出一数字正方形?1111122222333334444455555需要重复执行练习2中的循环即循环嵌套循环嵌套一个循环体内包含着另一个完整的循环结构,就称为循环嵌套。内嵌的循环中又可以嵌套循环,从而构成多重循环嵌嵌套 for 循环套循环如果一个for循环出现在另一个for循环中,则称它为嵌套循环for(i = 1; imax1; i+) for(j = 0; j = max2; j+) 外层循环内层循环嵌套的循环控制变量不能相同内循环变化快,外循环变化慢循环嵌套举例1、数字塔(P50-3.8)2、九九乘法表1*1

10、=12*1=2 2*2=43*1=3 3*2=6 3*3=9:9*1=9 9*2=18 9*3=27 9*9=81循环结构的 3 种类型for 循环while 循环do.while 循环while语句 while(表达式)循环体(语句块);为了使循环测试表达式为假,使得循环结束,那么在循环体中,必须修改表达式中的一些变量的值,使得循环有结束的可能,否则就会出现死循环。while 语句和for语句都是在循环前先判断条件while 语句说明表达式1;while (表达式2) for的循环体语句; 表达式3;把for语句改写成while语句for(表达式1; 表达式2; 表达式3) 循环体语句whi

11、le 和 for 的比较for (i = 1; i = 10; i+) sum = sum + i; i = 1; 循环变量赋初值while (i = 10) 循环条件 sum = sum + i; i+; 循环变量的改变循环体do循环体(语句块); while(表达式);与while不同的是,do-while是先执行一次循环体,再进行循环结束测试,所以它至少会执行一次循环体。 与while不同的是,do-while是先执行一次循环体,再进行循环结束测试,所以它至少会执行一次循环体。 void main( ) int count, number; count = 0;printf(Input

12、a number: );scanf (%d, &number) ;if (number 0) number = -number; do number = number / 10; count +; while (number != 0);printf(It contains %d digits.n, count);程序解析统计一个整数的位数Input a number: 12534It contains 5 digits.Input a number: -99It contains 2 digits.Input a number: 0It contains 1 digits.while (nu

13、mber != 0) number = number / 10; count +; while 是先判别条件,再决定是否循环; do-while 是先至少循环一次,然后再根据循环的结果决定是否继续循环。while 和 do-while 的比较真假表达式循环体语句do-while的下一条语句循环体语句真假while的下一条语句表达式循环体语句例:斐波拉挈数列题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.2.程序源代码:void m

14、ain()long f1,f2;/定义变量int i;f1=f2=1;/给变量赋值for(i=1;i=20;i+)/for循环结构 printf(“%12ld %12ld”,f1,f2);/输出变量f1,f2的值.if(i%2=0) printf(n);/*控制输出,每行四个*/f1=f1+f2; /*前两个月加起来赋值给第三个月*/f2=f1+f2; /*前两个月加起来赋值给第三个月*/求的近似值使用格里高利公式求的近似值,要求精确到最后一项的绝对值小于105。#include void main( ) int flag, t; double item, pi; flag = 1; t =

15、1 ; item = 1.0; pi = 0; while(fabs (item) = 0.00001) item = flag * 1.0 / t; pi = pi + item; flag = -flag; t = t +2; pi = pi * 4; printf ( “pi = %fn”, pi);程序解析求的近似值pi = 3.141613 item=0.0 ?fabs (item) 0.00001break 语句用break语句可以结束switch结构和循环。#include /头文件main () int a, b; /定义变量for(a = 1, b = 0;a =100; a

16、+) /for循环/循环体printf(“ Enter %d b : ”,a); scanf(%d, &b); if(b=100) break; /当b的值为100时,循环终止 Break语句强行结束循环,转向执行循环语句下面的语句。跳转语句 continue 语句让封闭循环进行下一次迭代遇到该语句时,跳过循环体中剩余的语句, 控制权传递给下一次循环在while循环和dowhile循环中,程序控制权传递给条件测试语句在for循环中,continue影响循环的增量部分,然后执行条件测试continue通用语法:可以结束本次循环,即忽略循环体中剩余的语句。continue 语句#include /

17、头文件main () int num; /定义变量for(num = 1; num =100; num+) /for循环 /循环体if(num % 9 = 0) /判断是否是9的倍数continue; /跳过本次循环执行下次循环printf(“%dt”,num); /不是9的倍数则输出 打印1-100之间不能被整除的数【任务3-4】丑数当一个自然数只含有质因子2,3,5,7的时候,我们称这个数为丑数。现在给你一个自然数,请判断这个数是否是丑数。 解题思路(1) 枚举测试2到7的因子,如果为4和6就跳过测试;(2) 不断地用因子去试除自然数x,直到因子不能整除自然数x;(3) 如果x为1,则直接

18、跳出测试,这个数为丑数;(4) 如果所有因子测试完,x不为1,则这个数包含非2,3,5,7的因子,不为丑数。 如果为4和6就跳过测试;continuecontinue语句的意思是循环体后面的工作都不做了,直接跳回循环最前面去 如果x为0,则直接跳出测试breakbreak语句的作用在于跳出本层循环,直接到循环体外。 break语句 和continue语句-练习3输入一个正整数m,判断它是否为素数算法:除了1和m,不能被其它数整除。设 i 取值 2, m-1 如果m不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数只要找到一个i,使m%i为0,则m肯定不是素数m %2 %3 %4 %5 %(m-

温馨提示

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

评论

0/150

提交评论