第2页流程控制语句习题课本习题课的目的◆通过程序复习基本语句◆进行编程练习◆通过例题开阔思路◆介绍程序设计的基本思想穷举法的基本思路和关键输出简单图形第3页程序设计的一般步骤1.分析题意,明确问题的性质◆数值计算/事务处理/逻辑分析/等2.建立问题的描述模型◆数学模型/过程模型3.设计/确定算法◆数学问题:分析解/数值解的求解算法◆非数学问题:数据结构/算法分析与设计一般方法:穷举/递推/递归/分治/回溯/…...4.编程调试5.分析运行结果,如有必要,进一步优化第4页典型数值问题-例1例1:怎样存钱获利最多银行定期存款:假设不同期限的月息利率分别为:0.63%期限=一年0.66%期限=二年0.69%期限=三年0.75%期限=五年0.84%期限=八年利息=本金×月息利率×12×存款年限现在某人手中有2000元,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那部分时间不付利息)。第5页典型数值问题-例1问题分析与算法设计为了得到最多的利息,存入银行的钱应在到期时马上转存。由于存款的利率不同,所以不同的存款方法(年限组合)得到的利息也是不一样的。设2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,则到期时应得的本利合计:2000*(1+r1)i1*(1+r2)i2*(1+r3)i3*(1+r5)i5*(1+r8)i8根据题意还可得到以下限制条件:0=i8=20/80=i5=(20-8*i8)/50=i3=(20-8*i8-5*i5)/30=i2=(20-8*i8-5*i5-3*i3)/20=i1=20-8*i8-5*i5-3*i3-2*i2可用穷举所有的i8、i5、i3、i2和i1的组合。第6页典型数值问题-例1#includemath.hmain(){inti8,i5,i3,i2,i1,n8,n5,n3,n2,n1;floatmax=0,term;for(i8=0;i8=20/8;i8++)/*穷举全部可能的存款方式*/for(i5=0;i5=(20-8*i8)/5;i5++)for(i3=0;i3=(20-8*i8-5*i5)/3;i3++)for(i2=0;i2=(20-8*i8-5*i5-3*i3)/2;i2++){i1=20-8*i8-5*i5-3*i3-2*i2;term=2000.0*pow(1+0.0063*12,(double)i1)*pow(1+0.0066*12,(double)i2)*pow(1+0.0069*12,(double)i3)*pow(1+0.0075*12,(double)i5)*pow(1+0.0084*12,(double)i8);if(termmax){/*记录可能的年限组合*/max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;}}printf(%d,%d,%d,%d,%d\n,n8,n5,n3,n2,n1);printf(Total:%.2f\n,max);}第7页典型数值问题-例2例1:从键盘上任意输入一个正整数,要求判断该正整数是否是另一个整数的平方。问题分析与算法设计设:输入的正整数为i,若i满足:i==m*m(整数m0)则i为整数的平方。可以采用试探的方法:令m从1开始逐步增加进行试探。m*mi?m=m+1成立不成立输入一个整数i输出m和i开始结束设试探初值m=1m*m==i?成立不成立第8页典型数值问题-例2scanf(”%d”,&i);m=0;while(m*mi){m++;}if(m*m==i)printf(”%d%d”,m,i);m*mi?m=m+1成立不成立输入一个整数i输出m和i开始结束设试探初值m=1m*m==i?成立不成立{inti,m;}第9页典型数值问题-例2#include”stdio.h”intmain(){inti,m;scanf(”%d”,&i);m=1;while(m*mi)m++;if(m*m==i)printf(“%d*%d=%d\n”,m,m,i);return0;}for(m=1;m*mi;m++);如果采用for语句该如何修改?表达式1表达式2表达式3for语句的循环体是什么?循环体为空语句第10页典型数值问题-例3例3:某地,车牌4位数字,首位非0.一辆卡车违犯交通规则逃逸。现场3人目击但都没有记住车号,只记得一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索尝试找出车号。问题分析与算法设计按照题目的要求造出一个前两位数(i)相同、后两位数(j)相同且相互间又不同的整数。0i=90=j=9i!=j(1000+100)*i+(10+1)*j=m*m(m为整数=31)第11页典型数值问题-例30i=90=j=9i!=j1100*i+11*j=m*m(m为整数=31)i=9?j=0成立不成立i=1k=1100*i+11*ji!=j?成立不成立k是平方?成立不成立输出:k,i,jj++j=9?成立不成立i++结束for(i=1;i=9;i++){}for(j=0;j=9;j++){}if(i!=j){}k=1100*i+11*j;判断k是否平方;第12页典型数值问题-例3#include”stdio.hvoidmain(){inti,j,k,m;for(i=1;i=9;i++)/*i:车号前二位的取值*/for(j=0;j=9;j++)/*j:车号后二位的取值*/if(i!=j){/*判断两位数字是否相异*/k=i*1100+j*11;for(m=31;m*mk;m++)/*31*31=961*/;/*判断是否为整数的平方*/if(m*m==k)printf(Lorry_No.is%d.\n,k);}}运行结果:Lorry_No.is7744.第13页典型数值问题-例4-IQ游戏设有一个数X,当X加上100后得到的数Y是一个正整数的平方,然后用Y再加上68,又是另外一个正整数的平方,你能算出X为多少吗?问题分析与算法设计根据题目直接列方程:y=x+100y=m*m①y+68=n*n②取值范围:x0;nm10的整数采用穷举法求解。第14页典型数值问题-例4-IQ游戏voidmain(){intx,y,m,flag;/*flag:标志变量*/for(x=0,flag=1;flag;x++)/*穷举x*/{y=100+x;/*计算y*/for(m=1;m*my;m++);if(m*m==y)/*判断y是否为一个数的平方*/{for(;m*my+68;m++);if(m*m==y+68)/*判断y+68*/{printf(%d\n,x);flag=0;/*flag置0,结束循环*/}}}}例200-IQ第15页典型数值问题-例4-IQ游戏1voidmain(){inty,m,flag;/*flag:标志变量*/for(y=101,flag=1;flag;y++)/*穷举y*/{for(m=1;m*my;m++);if(m*m==y)/*判断y是否为一个数的平方*/{for(;m*my+68;m++);if(m*m==y+68)/*判断y+68*/{printf(”%d\n”,y-100);flag=0;/*flag置0,结束循环*/}}}}例200-IQ1第16页典型数值问题-例4-IQ游戏2#includestdio.hvoidmain(){intm,n,flag;/*flag:标志变量*/for(m=10,flag=1;flag;m++){/*通过穷举m,直接构造平方数y*/for(n=1;n*nm*m+68;n++);/*判断m*m+68是否为平方数*/if(n*n==m*m+68){printf(”%d\n”,m*m-100);flag=0;/*flag置0,结束循环*/}}}例200-IQ2第19页典型数值问题-例6例4:百钱百鸡问题。中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?问题分析与算法设计设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程:x+y+z=100①5x+3y+z/3=100②取值范围:0=x、y、z=100可以采用穷举法求解。将变量x、y、z的所有取值可能代入方程进行计算第20页典型数值问题-例6穷举法基本思路当x=0,y=0,z=0时:是否满足方程z=1时:是否满足方程z=2时:是否满足方程......z=100时:是否满足方程当x=0,y=1,z=0时:是否满足方程z=1时:是否满足方程......z=100时:是否满足方程当x=0,y=2,z=0时:是否满足方程......当x=100,y=100,z=100时:......z=100满足方程?YN输出z++z=0y=100y++y=0x=100x++x=0开始结束第21页典型数值问题-例6程序z=100满足方程?YN输出z++z=0y=100y++y=0x=100x++x=0开始结束#includestdio.hvoidmain(){intx,y,z,j=0;for(x=0;x=100;x++)for(y=0;y=100;y++)for(z=0;z=100;z++)if(x+y+z==100&&5*x+3*y+z/3==100)printf(..,++j,x,y,z);}第22页典型数值问题-例6#includestdio.hvoidmain(){intx,y,z,j=0;for(x=0;x=100;x++)for(y=0;y=100;y++)for(z=0;z=100;z++)if(x+y+z==100&&5*x+3*y+z/3==100)printf(%2d:cock=%2dhen=%2dchicken=%2d\n,++j,x,y,z);}运行结果:1:cock=0hen=25chicken=752:cock=3hen=20chicken=773:cock=4hen=18chicken=784:cock=7hen=13chicken=805:cock=8hen=11chicken=816:cock=11hen=6chicken=837:cock=12hen=4chicken=84例C3第23页典型数值问题-例6丢失重要条件:z应该能够被3整除。#includestdio.hvoidmain(){intx,y,z,j=0;for(x=0;x=20;x++)for(y=0;y=33;y++)for(z=0;z=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf(%2d:cock=%2dhen=%2dchicken=%2d\n,++j,x,y,z);}运行程序,正确的结果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84z+=3)第24页典型数值问题-例6优化程序:for(x=0;x=20;x++)for(z=0;z100;z+=3){y=100-x-z;if(5*x+3*y+z/3==100)printf(%2d:cock=%2dhen=%2dchicken=%2d\n,++j,x,y,z);}优化程序:for(x=0;x=20;x++)for(y=0;y=(100-5*x)/3;y++){z=100-x-y;if(z%3==0&&5*x+3*y+z/3==100)printf(%2d:cock=%2dhen=%2dchicken=%2d