1 / 22

知识回顾

知识回顾. 常见数据类型: int , float , char 等; 常见的运算符:赋值、算术、关系、逻辑,逗号等; 常见表达式:赋值、算术、关系、逻辑,逗号等; 三种基本结构:顺序、选择、循环; 三种基本的选择语句; 三种基本的循环语句;. 本讲知识要点. 嵌套循环; 理解掌握嵌套循环的执行顺序; 基本算法策略(穷举、迭代与递推); 较复杂、综合的程序设计;. 一、循环的嵌套. 循环的嵌套:一个循环体内又包含另一个完整的循环结构。 3 种循环( while 、 do…while 、 for 循环)可以相互嵌套。 可参见谭浩强版教材 P121. 9 行.

Download Presentation

知识回顾

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 知识回顾 • 常见数据类型:int ,float,char 等; • 常见的运算符:赋值、算术、关系、逻辑,逗号等; • 常见表达式:赋值、算术、关系、逻辑,逗号等; • 三种基本结构:顺序、选择、循环; • 三种基本的选择语句; • 三种基本的循环语句;

  2. 本讲知识要点 • 嵌套循环; • 理解掌握嵌套循环的执行顺序; • 基本算法策略(穷举、迭代与递推); • 较复杂、综合的程序设计;

  3. 一、循环的嵌套 • 循环的嵌套:一个循环体内又包含另一个完整的循环结构。 • 3种循环(while、do…while、for循环)可以相互嵌套。可参见谭浩强版教材P121

  4. 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++)

  5. 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”); //每一行各列输出完后,要换行 } } //参考源程序 外循环循环体 内循环循环体

  6. 例:素数的判断问题(教材P116例题)。编程输出100~200之间所有的素数。例:素数的判断问题(教材P116例题)。编程输出100~200之间所有的素数。 • 分析: • 素数:除了1以外,不能被其他任何数整除的数。 • 对于100~200之间的每一个数都要做判断---是否为素数,即其不能被从2开始到自身的每一个数整除;

  7. for 100 to 200 对于每一个数m,从2开始挨个进行整除判断,如果在2~m之间没有被整除的数,则m为素数;否则,该数不为素数。 算法流程图

  8. 源程序 #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); } }

  9. /*另解*/ #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); } }

  10. //另解,引入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); } }

  11. 二、基本算法 1.穷举法 • 穷举法:待解问题的答案“隐藏”在多个可能之中,对这多种可能的情形一一进行测试,从而找出符合条件的解。

  12. 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;

  13. 穷举过程 • 依次对cocks,hens,chicks取值范围内的各数一一进行试探,找出满足前面两个方程的组合解。

  14. 源程序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); } }

  15. 另解 #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); } }

  16. 基本算法 2.迭代与递推 • 迭代:用不断变化的新值替代旧值;如银行存款利率计算。 • 递推:由一个变量的值推出另外变量的值;如fibonacci数列问题; • 两者没有严格的区别。 • 使用迭代与递推关键是通过观察、分析,找出前项与后项之间的关系---迭代或递推的关系。

  17. 例:编程输出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);

  18. 源程序 正推 #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); } }

  19. 例:猴子吃桃问题。课本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),此即为相邻两项的关系。

  20. 源程序 反推 #include<stdio.h> main() { int day=9,peach=1; while(day>0) { peach=(peach+1)*2; //当天的桃子数等于前一天的2倍加1; day--; } printf("第一天的桃子数为:%d",peach); }

  21. 用for循环实现 #include<stdio.h> main() { int day,peach=1; for(day=9;day>0;day--) { peach=(peach+1)*2; } printf("第一天的桃子数为:%d",peach); }

  22. 作业 • P126 4.3 4.5 4.6 4.12 • 4:将1元钱分别换成1分、2分和5分的硬币,编程求出有多少种不同的分法及每种分法各种硬币的数量。 • 认真复习、总结前面所学的知识(课件+课本);

More Related