220 likes | 335 Views
知识回顾. 常见数据类型: int , float , char 等; 常见的运算符:赋值、算术、关系、逻辑,逗号等; 常见表达式:赋值、算术、关系、逻辑,逗号等; 三种基本结构:顺序、选择、循环; 三种基本的选择语句; 三种基本的循环语句;. 本讲知识要点. 嵌套循环; 理解掌握嵌套循环的执行顺序; 基本算法策略(穷举、迭代与递推); 较复杂、综合的程序设计;. 一、循环的嵌套. 循环的嵌套:一个循环体内又包含另一个完整的循环结构。 3 种循环( while 、 do…while 、 for 循环)可以相互嵌套。 可参见谭浩强版教材 P121. 9 行.
E N D
知识回顾 • 常见数据类型:int ,float,char 等; • 常见的运算符:赋值、算术、关系、逻辑,逗号等; • 常见表达式:赋值、算术、关系、逻辑,逗号等; • 三种基本结构:顺序、选择、循环; • 三种基本的选择语句; • 三种基本的循环语句;
本讲知识要点 • 嵌套循环; • 理解掌握嵌套循环的执行顺序; • 基本算法策略(穷举、迭代与递推); • 较复杂、综合的程序设计;
一、循环的嵌套 • 循环的嵌套:一个循环体内又包含另一个完整的循环结构。 • 3种循环(while、do…while、for循环)可以相互嵌套。可参见谭浩强版教材P121
9行 9列 例1:编程输出九九乘法口诀表 输出形式如下: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 … 1*9=9 2*9=18 3*9=27…9*9=81 分析:对于第i行,观察有多少列? 第i行有i列! • 共有9行,所以for(i=1;i<=9;i++) • 对于第i行,共有i列,所以for(j=1;j<=i;j++)
i=1 j=1 i=2 j=1 j=2 i=3 j=1 j=2 j=3 … 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 … … #include<stdio.h> main() { int i,j; for(i=1;i<=9;i++) //共9行 { for(j=1;j<=i;j++) //第i行共有i列 printf("%d*%d=%d ",j,i,i*j); printf(“\n”); //每一行各列输出完后,要换行 } } //参考源程序 外循环循环体 内循环循环体
例:素数的判断问题(教材P116例题)。编程输出100~200之间所有的素数。例:素数的判断问题(教材P116例题)。编程输出100~200之间所有的素数。 • 分析: • 素数:除了1以外,不能被其他任何数整除的数。 • 对于100~200之间的每一个数都要做判断---是否为素数,即其不能被从2开始到自身的每一个数整除;
for 100 to 200 对于每一个数m,从2开始挨个进行整除判断,如果在2~m之间没有被整除的数,则m为素数;否则,该数不为素数。 算法流程图
源程序 #include<stdio.h> main( ) { int m,i; for(m=100;m<=200;m++) { for(i=2;i<m;i++) //去整除从2开始的每一个数 if(m%i==0) break;//如果整除==0,表示此数不是素数,所以结束本次(内层)循环,开始下一轮(外围)循环; if(i==m) //表示没有一个数能够整除,即此数为素数; printf("%d ",m); } }
/*另解*/ #include<stdio.h> #include<math.h> main() { int m,i,k; for(m=100;m<=200;m++) { k=sqrt(m); for(i=2;i<=k;i++) //与上例相比,将判断的范围缩小了 if(m%i==0) break; if(i>=k+1) printf("%d ",m); } }
//另解,引入continue #include<stdio.h> #include<math.h> main() { int m,i,k; for(m=100;m<=200;m++) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i!=0) continue; else break; if(i>=k+1) printf("%d ",m); } }
二、基本算法 1.穷举法 • 穷举法:待解问题的答案“隐藏”在多个可能之中,对这多种可能的情形一一进行测试,从而找出符合条件的解。
P117例:百钱百鸡问题。鸡公值五钱,鸡母值三钱,三小鸡值一钱,凡百钱买百鸡,问鸡公、鸡母、小鸡各多少?P117例:百钱百鸡问题。鸡公值五钱,鸡母值三钱,三小鸡值一钱,凡百钱买百鸡,问鸡公、鸡母、小鸡各多少? • 分析 • 假设鸡公、鸡母、小鸡的数量分别为cocks,hens,chicks, 则可以得出以下模型: 5*cocks+3*hens+chicks/3=100; /*100钱*/ cocks+hens+chicks=100; /*100只鸡*/ 其中0<cock<=20;0<hens<=33;0<chicks<99;
穷举过程 • 依次对cocks,hens,chicks取值范围内的各数一一进行试探,找出满足前面两个方程的组合解。
源程序1 #include<stdio.h> main() { int cocks,hens,chicks; for(cocks=1;cocks<=20;cocks++) /*穷举cock*/ for(hens=1;hens<=33;hens++) /*穷举hen*/ for(chicks=1;chicks<99;chicks++) /*穷举chick*/ { if((5*cocks+3*hens+chicks/3==100)&&(cocks+hens+chicks==100)) printf("cocks=%d,hens=%d,chicks=%d\n",cocks,hens,chicks); } }
另解 #include<stdio.h> main() { int cocks,hens,chicks; for(cocks=0;cocks<=20;cocks++) /*穷举cock*/ for(hens=0;hens<=33;hens++) /*穷举hen*/ { chicks=100-cocks-hens; /*鸡的数量为100*/ if(5*cocks+3*hens+chicks/3.0==100) /*100钱*/ printf("cocks=%d,hens=%d,chicks=%d\n",cocks,hens, chicks); } }
基本算法 2.迭代与递推 • 迭代:用不断变化的新值替代旧值;如银行存款利率计算。 • 递推:由一个变量的值推出另外变量的值;如fibonacci数列问题; • 两者没有严格的区别。 • 使用迭代与递推关键是通过观察、分析,找出前项与后项之间的关系---迭代或递推的关系。
例:编程输出Fibonacci数列前10项 • Fibonacci数列规律:前两项为1,从第3项开始,每项等于前两项的和; 即:F(1)=1,F(2)=1,F(3)=2,F(4)=3…F(n)=F(n-1)+F(n-2); 从第3项开始规律: F(n)=F(n-1)+F(n-2);
源程序 正推 #include<stdio.h> main() { int f1=1,f2=1,f; int i; for(i=3;i<=10;i++) { f=f1+f2; //当前项等于前两项之和 f1=f2; //f1表示当前项的前两项 f2=f; //f2表示当前项的前一项 printf("%d,",f); } }
例:猴子吃桃问题。课本P129 6.10 • 时间 剩余桃子数 吃的桃子数 • 10天 1 • 9天 t • 8天 x x/2+1 • … • 3天 • 2天 • 1天 • 假如第n天剩余桃子数为x,第n+1天剩余的桃子是为t,那么: • x-(x/2+1)=t 即:x=2*(t+1),此即为相邻两项的关系。
源程序 反推 #include<stdio.h> main() { int day=9,peach=1; while(day>0) { peach=(peach+1)*2; //当天的桃子数等于前一天的2倍加1; day--; } printf("第一天的桃子数为:%d",peach); }
用for循环实现 #include<stdio.h> main() { int day,peach=1; for(day=9;day>0;day--) { peach=(peach+1)*2; } printf("第一天的桃子数为:%d",peach); }
作业 • P126 4.3 4.5 4.6 4.12 • 4:将1元钱分别换成1分、2分和5分的硬币,编程求出有多少种不同的分法及每种分法各种硬币的数量。 • 认真复习、总结前面所学的知识(课件+课本);