版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 循环程序设计,2,回顾,关系运算符 逻辑运算符 掌握if语句的基本使用方法 多重if结构就是在主if块的else部分中还包含其他if块 嵌套if结构是在主if块中还包含另一个if 语句 C语言规定,嵌套if结构中每个else部分总是属于前面最近的那个缺少对应的else部分的if语句 switch结构也可以用于多分支选择。用于分支条件是整型表达式,而且判断该整型表达式的值是否等于某些值(可以罗列的),然后根据不同的情况,执行不同的操作 条件运算符是 ifelse 语句的另一种表现形式,3,教学目标,理解为什么使用循环结构 熟练掌握while循环的使用 熟练掌握do-while循环的使用
2、理解while 和 do-while 循环的区别 熟练使用for循环 理解 break 和 continue 语句的用法 熟练使用嵌套循环,4,循环的必要性,int result; result = 1 * 10; printf(1 10 %d n,result); result = 2 * 10; printf(2 10 %d n,result); result = 3 * 10; printf(3 10 %d n,result); result = 4 * 10; printf(4 10 %d n,result); result = 5 * 10; printf(5 10 %d n,res
3、ult);,1 10 10 2 10 20 3 10 30 4 10 40 5 10 50,输出结果,重复语句,5,循环的必要性,1 10 = 10 2 10 = 20 3 10 = 30 4 10 = 40 5 10 = 50,0 + 1,1 + 1,2 + 1,上个数字 + 1,.,重复 (上个数字 +1) 10,6,C语言中的各种循环,while,do- while,for,需要多次重复执行一个或多个任务的问题考虑使用 循环来解决,7,while循环,while (表达式) 语句; ,while 循环的一般语法:,计算表达式的值,当值为真(非0)时,执行循环体语句,一旦条件为假,就停止执
4、行循环体。如果条件在开始时就为假,那么不执行循环体语句直接退出循环。,工作原理,8,while循环,规则1:, while(循环条件) ,循环条件中使用的变量需要经过初始化,9,while循环,规则2:,while (index 100) . . . . . . index+; ,while 循环主体中的语句必须修改循环条件的值,否则会形成死循环,while (1),10,#include int main (void) int num=1,result; while (num=10) result=num*10; printf(%d 10 %d n,num,result); num+; re
5、turn 0; ,while循环示例,11,while循环示例,问题描述: 写一个程序,要求它从摄氏温度0 度到250 度,每隔20 度为一项,输出一个摄氏温度与华氏温度的对照表,同时要求对照表中的条目不超过10条。,解题思路: 数据结构 整型变量 c,和实型变量 f,及计数器count 设计输出结果 计算公式 f=c * 9 / 5.0 + 32.0 算法 编程 调试,12,#include int main (void) int c=0,count=0; double f; while (c = 250 ,while循环示例,输出: 1: C = 0, F = 32.00 2: C = 2
6、0, F = 68.00 3: C = 40, F = 104.00 4: C = 60, F = 140.00 5: C = 80, F = 176.00 6: C = 100, F = 212.00 7: C = 120, F = 248.00 8: C = 140, F = 284.00 9: C = 160, F = 320.00 10: C = 180, F = 356.00,13,do-while循环,do 语句; while (表达式);,do- while 循环的一般语法:,do . . . . . . scanf(%c,它先执行循环体中的语句,然后再判断条件是否为真,如果为真
7、则继续循环;如果为假,则终止循环。,工作原理,示例,14,问题描述: 猜数游戏。要求猜一个介于110之间的数字,根据用户猜测的数与标准值进行对比,并给出提示,以便下次猜测能接近标准值,直到猜中为止。,do-while循环示例,15,do-while循环示例,int number=5, guess; / number可用随机数来控制 puts(猜一个110之间的数); do printf(请输入您猜测的数:); scanf(%d, ,16,嵌套while循环,嵌套 while 循环的语法,while(i = 10) . . . while (i = j) . . . . . . . . . ,外
8、循环,内循环,只有在内循环完全结束后,外循环才会进行下一趟。,17,问题描述: 用*打印一个直角三角形图案。 图案如下所示: * * * * * * * * * *,嵌套while循环示例,解题思路: 需要打印多少行? nstars(行数变量)为110行。 每行的 “*” 数量? stars(星数变量)为110个,即nstars个。 每行的起始位置 算法:,18,嵌套while循环示例,#include void main() int nstars=1, stars; while(nstars = 10) stars=1; while (stars = nstars) printf(*); s
9、tars+; puts(”); nstars+; ,内层循环控制每行打印*号的个数,外层循环控制打印的行数,输出: * * * * * * * * * *,19,嵌套do-while循环,嵌套 do-while 循环的语法,do . . . do . . . while( . . .); . . . while( . . . );,外循环,内循环,只有在内循环完全结束后,外循环才会进行下一趟。,20,输入字符序列,统计输入的字符数,解题思路: 设置字符计数器 x ,类型; 字符容器 i,类型; 是否输入更多字符序列控制器 ans(Y/N),类型。 每一字符序列结束标志为 “n” , 即以回车结
10、束。 算法: 可采取由里向外的设计思路,先解决一行的字符统计,在解决多行的统计。,21,嵌套do-while循环示例,int x; char i, ans; ans=y; do x=0; printf(n请输入字符序列:); fflush(stdin);/清空输入缓冲区,避免缓冲区内残存读取函数无法取走的内容 do i=getchar(); x+; while( i !=n ); printf(n输入的字符数为:%d, -x); printf(n是否需要输入更多序列 (Y/N) ? ); ans = getchar(); while(ans =Y | ans = y);,输出: 请输入字符序列
11、:GOODMORNING 输入的字符数为: 11 是否需要输入更多序列 (Y/N)?N,内存中的变量 x i ans 0 y,检查条件判断是否按下回车键。如果否, 循环继续执行后续语句;如果是,循环回到开始处。,如按下 Y/y, 则循环从开始处执行,否则循环停止,22,while和do-while比较,while(循环条件) 循环体; ,do 循环体; while( 循环条件);,do-while 循环是先执行后判断,所以,即使开始条件为假,循环体也至少会被执行一次。,while循环是先判断后执行,所以,如果条件为假,则循环体一次也不会被执行。,比较 while 和 do-while 循环的工
12、作原理,23,while和dowhile比较,问题描述: 输入一个正整数,然后,反转输出。如输入 123,输出321. 分析:难点是如何分离出每一位数,并按逆序输出。,24,while和dowhile比较,int value, r_digit; value = 0; do printf(n请输入一个数:); scanf(%d, ,int value, r_digit; value = 0; while( value = 0 ) printf(n请输入一个数:); scanf(%d, ,用do- while循环将数字左右反转,用while 循环将数字左右反转,25,for( 表达式1 ; 表达式
13、2 ; 表达式3 ) 语句; ,for 循环的一般语法:,for循环,counter = 0; inum = 1; cnt = 100;,counter = 10; inum 0,counter +; inum = inum + 1; cnt-,分号用于分隔 for 循环的 三个表达式,1、计算表达式1的值,通常为循环变量赋初值; 2、计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次, 否则跳出循环; 3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第2步重复执行;,工作原理,1,2,3,4,26,for循环示例,问题: 编程计算n!,如5! 分析: 设置变
14、量 任意整数 number 循环变量 count(1number) count= count+1 因子(借用循环变量的值) 累乘积 factorial 初值? factorial= factorial*count,27,for循环示例,#include void main() int n, i, f=1; puts(n输入任意一正整数:); scanf(%d, ,循环执行五次,28,打印输出九九乘法表,#include void main() int i, j; for (i=1; i=9; i +) for (j=1; j=9; j+) printf(%d*%d=%dt, i,j,i*j);
15、 printf(n); ,思考:要想输出下半三角,应如何修改循环?,29,打印输出九九乘法表,#include void main() int i, j; for (i=1; i=9; i +) for (j=1; j=i; j+) printf(%d*%d=%dt, i,j,i*j); printf(n); ,思考:要是想输出上半三角,应如何修改循环?,30,逗号运算符,for(i = 0 , j = max ; i =max ; i+, j-) printf(n%d + %d = %d,i, j, i + j);,for语句中的三个表达式都可以是逗号表达式 逗号表达式就是通过,运算符隔开的
16、多个表达式组成的表达式 逗号表达式从左往右计算。逗号运算符在 C 语言运算符中的优先级最低,31,for循环示例,#include int main(void) int i,j,max; puts(请输入一个值); puts(根据这个值可输出以下加法表:); scanf(%d, ,循环执行max次,初始化语句只执行一次,请输入一个值 根据这个值可以输出以下加法表:5 0 + 5 = 5 1 + 4 = 5 2 + 3 = 5 3 + 2 = 5 4 + 1 = 5 5 + 0 = 5,32,for循环的表达式,for循环中有三个表达式 for语句中的各个表达式都可以省略 分号分隔符不能省略,f
17、or( ; ; ) ; ,可省略,不能省略,33,省略表达式,int num=0; for(; num = 10; num+) printf(%dn,num*2); ,int a=0,n; puts(输入n的值: ); scanf(%d, ,相当于省去了为循环变量赋初值,此时应在for语句之前给循环变量赋初值,34,省略表达式,for(num=1; ; num+) . ,不判断循环条件,也就是认为表达式2始终为真, 这时应在循环体内设法结束循环,否则将成为死循环,35,省略表达式,for(i=1; i=100; ) sum=sum+1; i+; ,省去修改循环变量的值,但此时应在循环体内设法结
18、束循环,36,省略三个表达式,for( ; ; ) puts(这将一直进行下去); i = getchar(); if(i = X | i = x) break; ,即不为循环变量赋初值,不设置循环条件(认为表达式2为真值),不修改循环变量的值,无终止地执行循环体。此时应在循环体内设法结束循环,否则会成为死循环,37,break语句,break语句可以改变程序的控制流 break语句用于do-while、while、for循环中时,可使程序终止循环而执行循环后面的语句 break语句通常在循环中与条件语句一起使用。若条件值为真,将跳出循环,控制流转向循环后面的语句 如果已执行break语句,就
19、不会执行循环体中位于break 语句后的语句 在多层循环中,一个break语句只向外跳一层,38,break语句,跳出for循环 for( ; ; ) puts(这将一直进行下去); i = getchar(); if(i = X | i = x) break; ,跳出while循环 while(1) if(x = 10) break; ,跳出do-while循环 do if (x = 10) break; while (x 15);,39,问题描述: 统计从键盘输入的若干个字符中有效字符的个数,以换行符作为输入结束。有效字符是指第一个空格符前面的字符,若输入字符中没有空格符,则有效字符为除了
20、换行符之外的所有字符。,#include void main() int cnt=0; char c; puts(请输入一行字符:); do c=getchar(); if(c= | c=n) / 32, 10 break; cnt+; while(1=1); printf(n共%d个有效字符。n, cnt); ,break语句示例,H,0,_,请输入一行字符:Hello world,共有 5 个 有效字符,1,循环执行 5 次,5,40,continue语句,continue语句只能用在循环里 continue语句的作用是跳过循环体中剩余的语句而执行下一次循环 对于while和do-whil
21、e循环,continue语句执行之后的动作是条件判断;对于for循环,随后的动作是变量更新,41,continue 语句,while() continue; ,while() break; ,跳出整个循环,继续下一次循环,42,问题描述: 求整数1100的累加值,但要求跳过所有个位为3的数。,#include void main() int i, sum = 0; for(i=1; i=100;i+) if( i%10=3) continue; sum += i; printf(sum=%dn, sum); ,continue 语句示例,null,0,3,1,循环执行到 i = 3,3,输出:
22、 sum = 4570,1,循环执行到 i = 101,101,4570,43,问题描述: 用“*”输出一个菱形图案,图案如下: * * * * * * * * * * * * * * * * * * * * * * * * *,嵌套循环示例,打印的行数 i,i=14,每行打印的空格数 j,j=4-i0,每行打印的*号数 k,k=12*i-1,解题思路(注:上半部):,44,嵌套循环示例,#include void main() int i,j,k; for(i=1;i=4;i+) for(j=1;j=4-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(
23、*); puts(); for(i=1;i=3;i+) for(j=1;j=i;j+) printf( ); for(k=1;k=7-2*i;k+) printf(*); puts(); ,输出: * * * * * * * * * * * * * * * *,* * * * * * * * *,控制打印的行数,控制每行打印的空格数,控制每行打印的*号数,控制打印的行数,控制每行打印的空格数,控制每行打印的*号数,45,问题描述: 打印输出100至200之间的全部素数。 分析:素数是指只能被1和它本身整除的数。算法比较简单,先将这个数被2除,如果能整除,且该数又不等于2,则该数不是素数。如果该
24、数不能被2整除,再看则是否能被3整除。如果被3整除,并且该数不等于3,则该数不是素数,否则再判断是否被4整除,依此类推,该数只要是能被小于本身的某个数整除时,就不是素数。,嵌套循环示例,#include void main() int i,j,n; n=0; for(i=100;i=200;i+) j=2; while(i%j!=0) j+; if(i=j) printf(%d ,i); n+; if(n%8=0) puts(); puts(); ,输出: 从100到200之间所有的素数为: 101 103 107 109 113 127 131 137 139 149 151 157 163
25、 167 173 179 181 191 193 197 199,控制每行输出8个素数,如果第一个能被整除的数等于该数本身,则说明该数为素数,从2到i之间寻找第一个能被整除的数,46,嵌套循环示例,#include void main() int i, num; char c; do puts(请输入一个数:); scanf(%d, ,输出: 请输入一个数: 58 该数是 58 您是否还要输入其他的数(y/n)? y 请输入一个数: 64 该数是 64 您是否还要输入其他的数(y/n)? n Press any key to continue,47,循环综合示例1,用50元钱买了3种水果。各种
26、水果加起来一共100个。西瓜5元一个,苹果1元一个,桔子1元3个,设计一程序输出每种水果各买了几个。 解题思路:本题有2个约束条件。 第1个:3种水果一共100个 第2个:3种水果一共花了50元 可先按第1个约束条件列出所有可行的情况,然后对每个可能解检查它是否满足第2个约束条件 。也可先用第2个约束条件列出所有情况,然后对每个可能解检查它是否满足第1个约束条件 。,48,循环综合示例1,#include void main() int mellon, apple, orange; /分别表示西瓜数、苹果数和桔子数 for (mellon=1; mellon20; +mellon) / 对每种
27、可能的西瓜数 for( apple=1; apple100-mellon; +apple) /当西瓜数给定后可能的苹果数 orange = 100-mellon-apple; / 剩下的钱全买了桔子 if(orange%3=0 ,49,循环综合示例1,#include void main() int mellon, apple, orange; /分别表示西瓜数、苹果数和桔子数 for (mellon=1; mellon10; +mellon) / 对每种可能的西瓜数 for( apple=1; apple 50 - 5 * mellon; +apple) /当西瓜数给定后可能的苹果数 ora
28、nge = 3*(50-5*mellon-apple); / 剩下的钱全买了桔子 if(mellon+apple+orange = 100) / 三种水果数之和是否为100 printf(mellon:%dt,apple:%dt,orange:%dn, mellon,apple,orange); ,50,循环综合示例2,问题: 上地理课时,四个学生回答我国四大湖大小时分别说: A:洞庭最大,洪泽最小,鄱阳第三 B:洪泽最大,洞庭最小,鄱阳第二,太湖第三 C:洪泽最小,洞庭第三 D:鄱阳最大,太湖最小,洪泽第二,洞庭第三 对于每个湖的大小,每个人仅答对一个,试判断四个湖的大小。,51,循环综合示
29、例2,解题思路 如果用a,b,c,d分别表示四个湖的排序。a表示洞庭湖,b表示洪泽湖,c表示鄱阳湖,d表示太湖。可以假设:洞庭最大,洪泽第二,鄱阳第三,太湖第四,然后检查每位同学是否都讲对了一个。如果不是,再尝试下一种情况:洞庭最大,洪泽第二,鄱阳第四,太湖第三,再检查每位同学是否都讲对了一个。尝试所有可能的情况,直到满足每位同学都讲对一个为止。,52,循环综合示例2,解题思路 为了尝试所有情况,需要假设洞庭湖可能是最大,也可能是第二、第三或第四。因此,a的值可能从1变到4。同样,b, c ,d的值也都可能从1变到4。为此,需要一个控制结构,使a, b, c, d的值能自动从1变到4。这种结构
30、就是循环结构。,53,循环综合示例2,#include void main() int a, b, c, d; for (a=1; a=4; +a) for (b=1; b=4; +b) if(a=b) continue; else for (c=1; c=4; +c) if (c=a | c=b) continue; else d=10-a-b-c; if (a=1)+(b=4)+(c=3)=1 ,问题:效率差 解决方法:一旦找到答案就应该结束,54,循环综合示例2,#include void main() int a, b, c, d,flag=0; /flag为标志,一旦找到,则置为1。
31、 for (a=1; a=4; +a) for (b=1; b=4; +b) if(a=b) continue; else for (c=1; c=4; +c) if (c=a | c=b) continue; else d=10-a-b-c; if (a=1)+(b=4)+(c=3)=1 ,改进一,55,循环综合示例2,改进二,#include void main() int a, b, c, d,flag=0; /flag为标志,一旦找到,则置为1。 for (a=1; a=4 ,56,循环综合示例3,列出ABC三个字母的全排列,每种排列中A、B、C不允许重复出现。 #include vo
32、id main() char c1,c2,c3; for(c1=A; c1=C; +c1) for(c2=A; c2=C; +c2) if(c1=c2) continue; else for(c3=A; c3=C;+c3) if (c3=c1 | c3=c2) continue; else printf(%c %c %cn, c1,c2,c3); ,57,循环综合示例4,输入两个正整数m和n,求其最大公约数和最小公倍数。,分析: 1. 用辗转相除法求最大公约数。 m对n求余数为a,若a0, 则 m n, n a, 继续求余; 否则n为最大公约数。 例如,设 m=12, n=21.,次数 被除数
33、 除数 余数,1 12 21 12,2,21,12,9,3,12,9,3,4,9,3,0,3,注意 保留m、n的原始值, 以便求最小公倍数,2. 循环条件:a!=0,58,循环综合示例4,#include void main( ) int m,n,m1,n1,a; printf(输入两个正整数:n); scanf(%d%d, ,/*保存m、n的值*/,/*循环变量赋初值*/,/*辗转相除*/,59,循环综合示例5,编程由计算机想一个110000之间的数请人猜,最多猜10次。如果猜对了,则提示“Right!”,否则提示“Wrong!”,并告诉人所猜的数是大(Too high)还是小(Too lo
34、w),要求每次运行程序时机器所想的数都不能一样。,60,循环综合示例6,先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,且结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。,61,循环综合示例7,国王的许诺:相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着88共64格的象棋盘说:陛下,请您赏给我一些麦子吧,
35、就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e8粒) 总粒数为:sum=1+2+22+23+263,62,循环综合示例7,#define CONST 1.42e8 #include #include void main() int n; double term, sum = 0; /* 累加求和变量赋初值 */ for (n=1; n=64; n+)
36、term = pow(2, n-1); /* 根据累加项的规律计算累加项 */ sum = sum + term; /* 累加运算 */ printf(“sum = %en”, sum); /* 打印总麦粒数 */ printf(“volum = %en”, sum/CONST); /* 折合总麦粒体积数 */ ,方法一,63,循环综合示例7,#define CONST 1.42e8 #include void main() int n; double term = 1, sum = 1; /* 累乘求积累加求和变量赋初值 */ for (n=2; n=64; n+) term = term
37、* 2; /* 根据后项总是前项的2倍计算累加项 */ sum = sum + term; /* 累加运算 */ printf(“sum = %en”, sum); /* 打印总麦粒数 */ printf(“volum = %en”, sum/CONST);/* 折合总麦粒体积数 */ ,方法二,64,循环综合示例8,马克思手稿中的趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人? 解方程组,65,循环综合示例8,#include void main() int x,y,z;
38、puts(Man t Women t Childern); for (x=0; x=30; x+) for (y=0; y=30; y+) for (z=0; z=30; z+) if (x+y+z = 30 ,方法一:穷举法,66,循环综合示例8,#include void main() int x,y,z; puts(Man t Women t Childern); for (x=0; x=16; x+) for (y=0; y=25; y+) z = 30-x-y; if (3*x+2*y+z = 50) printf(%3d t %5d t %8dn, x,y,z); ,改进,67,循
39、环综合示例9,计算自然常数e的值 解题思路: 这是个级数计算问题,求n+1项累加和;用循环实现。循环终止的条件是 第n项可以写成 u = u / n,即 累加和放在e中,可以写成 e = e + u 要设一个计数器n,每循环一次, n = n + 1,68,循环综合示例9,#include void main() double e = 1.0, u = 1.0; int n= 0; do n+; u = u/n; e = e+u; while(u=1.0E-6); printf(e=%lf(n=%d)n, e,n); ,69,循环综合示例10,求水仙花数:如果一个三位数的个位数、十位数和百位数
40、的立方和等于该数自身,则称该数为水仙花数。编一程序求出所有的水仙花数。 153 = 13 + 53 + 33 370 = 33 + 73 + 03 371 = 33 + 73 + 13 407 = 43 + 03 + 73,70,循环综合示例10,解题思路 用穷举法对100999之间的每个数进行验证。 验证公式为: hdn= h3 + d3 + n3 关键是如何分解一个3位数的百位、十位和个位? 百位 = n / 100 十位 = (n / 10 )% 10 个位 = n % 10 例: 371 h = 371/100 = 3 d = (371/10)%10 = 37 % 10 = 7 n =
41、 371 % 10 = 1,71,循环综合示例10,#include void main() int n, i, j, k; for(n=100; n=999; n=n+1) i = n/100; / n的百位数 j = (n/10)%10; / n的十位数 k = n%10; / n的个位数 if(n=i*i*i+j*j*j+k*k*k) printf(%d=%d3+%d3+%d3n, n,i,j,k); ,72,循环综合示例11,斐波那契数列:一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如所有的兔子都不会死,求前24个月中每月的兔子数。 F1 =
42、 1(最初的一对兔子) F2 = 1(第2个月,最初的一对兔子长成,但尚未生育) F3 = 2(最初的兔子开始生育) Fn = Fn-1+Fn-2 (兔子数量的通项公式,即每月兔子数等于上两个月兔子数之和) 从而形成了如下数列:1,1,2,3,5,8,13,21,34,55,,73,循环综合示例11,#include int main(void) int f1=1, f2=1; int i; for(i=1; i=12; i+) printf(%dt%dt, f1,f2); f1=f1+f2; / 赋值号左边的f1代表第3个数,是第1、2个数之和 f2=f1+f2; / 赋值号左边的f2代表第
43、4个数,是第2、3个数之和 ,74,循环综合示例12,谁打烂了玻璃:有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。 A说:不是我 B说:是C C说:是D D说:他胡说 现已知3个小孩说的是真话,一个小孩是假话。根据这些信息,编程找出打烂玻璃的孩子。,75,循环综合示例12,解题思路: 如何求解逻辑问题? 如何根据案例的问题描述给出对应的数学模型? 用什么样的控制结构能够从许多种可能性中找出其中的一种或多种正确的解?,76,循环综合示例12,数学模型:设变量k表示打烂玻璃的孩子,A说:不是我B说:是CC说:是DD说:他胡说现已知3个人说的是真话,一个人是假话。,k!=1 k=3 k=4 k
44、!=4,(k!=1)+(k=3)+(k=4)+(k!=4)=3,77,循环综合示例12,按照这4种状态假定,逐一测试4个人的话有几个为真,如果不满3句为真,就否定这一假定,换下一个状态来试,78,循环综合示例12,#include void main() int k; for(k=1; k=4; k+) if(k!=1)+(k=3)+(k=4)+(k!=4)=3) printf(打烂玻璃者为:%c, 64+k); ,79,循环综合示例12,考虑更加一般的情况,即本案例出现没有解或有多个解,要为上面的程序增加什么机制,怎么修改程序? 如果题目改为有3个小孩说假话,1个小孩说真话,则打烂玻璃的孩子
45、又是谁?,80,循环综合示例13,某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: A、B 至少有1人作案; A、E、F 3人中至少有2人参与作案; A、D 不可能是同案犯; B、C 或同时作案,或与本案无关; C、D 中有且仅有一人作案; 如果 D 没有参与作案,则 E 也不可能参与作案。 试编一程序,将作案人找出来。,81,逻辑与,运算符为 else printf(A是罪犯);,循环综合示例13,95,循环综合示例14,A、B、C、D、E 5人合伙夜间捕鱼,凌晨时都疲惫不堪,各自在湖边的树丛中找地方睡着了。日上三竿,A第一个醒来,他将鱼平分作5份,把多余的一条扔回湖中,拿自己的一份回家去了
46、。B第二个醒来,也将鱼平分为5份,扔掉多余的一条,只拿走自己的一份。接着C、D、E依次醒来,也都按同样的办法分鱼。问五人至少合伙捕到多少条鱼?每个人醒来后看到的鱼数是多少条? 解题思路: 根据题意,总计将所有的鱼进行了5次平均分配,每次分配时的策略是相同的,即扔掉一条后剩下的鱼正好分为5份,然后拿走自己的一份,余下其他四份。 假定鱼的总数为X,则X可以按照题目的要求进行五次分配:X-1后可被5整除,余下的鱼为4(X-1)5。若X满足上述要求,则X就是题目的解。,96,循环综合示例15,对于任意给定的一个正整数n,统计n!末尾中0的个数。 小明有5本新书,要借给A、B、C3位小朋友,若每人每次只能借1本,则可以有多少种不同的借法? 按照下面格式打印杨辉三角。,97,循环综合示
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 马鞍山职业技术学院《国际商务谈判》2025-2026学年期末试卷
- 南昌大学共青学院《中国古典园林史》2025-2026学年期末试卷
- 长春工业大学人文信息学院《哲学概论》2025-2026学年期末试卷
- 南昌工学院《公共部门人力资源管理》2025-2026学年期末试卷
- 泉州海洋职业学院《保险法》2025-2026学年期末试卷
- 护士安全职责指南讲解
- 女生职业规划书模板
- 广东省惠州市2026届高三语文第二次调研考试试卷(含答案)
- 学校教学管理规范制度
- 电线电缆交联工班组建设模拟考核试卷含答案
- 混凝土可行性研究报告范文
- 林下经济种植协议书
- 《猪病毒性疾病》课件
- 2024北京丰台区高一(下)期中数学(A卷)及答案
- 瓦克夏燃气发动机基础知识
- 2025年保安证考试答题技巧与试题答案
- 酒店自助早餐接待流程
- 湖南省2025届高三九校联盟第二次联考生物试卷(含答案解析)
- 2024年辽宁省中学生生物学竞赛(初赛) 真题(学生版+解析版)
- ISO14001-2015环境管理体系风险和机遇识别评价分析及应对措施表(包含气候变化)
- 语言运用与综合性学习-2025年中考语文专项复习(湖北专用)(原题版)
评论
0/150
提交评论