算法与程序设计基础.ppt_第1页
算法与程序设计基础.ppt_第2页
算法与程序设计基础.ppt_第3页
算法与程序设计基础.ppt_第4页
算法与程序设计基础.ppt_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

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

文档简介

1,第3章算法与程序设计基础,3.1算法3.2算法的常用表示方法3.3结构化程序设计方法3.4C语句概述补充:顺序结构程序设计3.5选择结构程序设计3.6循环程序设计3.7综合程序应用举例,目录,实验三,实验四,2,3.1算法,3.1.1算法的概念3.1.2算法的特性,本章,3,3.1.1算法的概念当我们要编写一个程序的时候,我们总要首先想好程序是干什么的?应该如何实现这些目标?(应该先进行什么处理、后进行什么处理?)所处理的数据的格式是什么?遇到一些复杂的问题,我们可能还需要考虑采用什么数学方法。这一切都涉及一个专业名词“算法”。算法为解决一个实际问题而采取的方法和步骤很多时候,程序设计者所面临的问题就是寻找一个合适的算法。例如,一个熟练的程序员,要设计一个下“五子棋”的游戏程序,对他而言,C语言的编程规则已经清楚。他所面对的核心问题是寻找一种可以模拟人下棋的算法。因此,算法在软件设计中具有重要的地位。正如著名的计算机科学家沃思(NikiklausWirth)所指出的如下公式:,程序=数据结构+算法,4,【例3.1】求1+2+3+4+100=?算法1步骤1:1+2=3步骤2:3+3=6步骤3:6+4=10步骤99:4950+100=5050算法2步骤1:0+100=100步骤2:1+99=100步骤3:2+98=100步骤50:49+51=100步骤51:100*50=5000步骤52:5000+50=5050算法3步骤1:k=1,s=0步骤2:如果k100,则算法结束,s即为所求的和,输出s;否则转向步骤3步骤3:s=s+k,k=k+1步骤4:转向步骤2,本节,5,3.1.2算法的特性一个方法要成为我们可以在程序设计中所使用的算法,需要具备如下特征:1.有穷性一个算法要在有限的步骤内解决问题(这里所说的步骤是指计算机执行步骤)。计算机程序不能无限地运行下去(甚至不能长时间地运行下去),所以一个无限执行的方法不能成为程序设计中的“算法”。例如,求某一自然数N的阶乘:n!=1*2*3*n这是一个算法。因为对任何一个自然数而言,无论这个数多大,总是有限的。用这个公式计算n!总是需要有限的步骤。但是,以下计算公式则不能作为算法,因为其计算步骤是无限的:sum=1+1/1+1/2+1/3+1/n+,6,2.确定性算法中操作步骤的顺序和每一个步骤的内容都应当是确定的,不应当是含糊不清的。它也不能有不同的解释存在,即不能具有“二义性”,不应当产生两种或多种以上的含义。3.可行性每一个算法是可行的,即算法中的每一个步骤都可以有效地执行,并得到确定的结果。(例如:b=0,执行a/b)4.有零个或多个输入输入就是从外界取得必要的信息。一个算法可以有零个或多个输入,例如:输入一个年份,判断其是否是闰年。同时一个算法可以没有输入,例如:计算出5!是多少。5.有一个或多个输出算法的目的就求解,“解”就是我们想要得到的最终结果。输出是同输入有着某些特定关系的量。一个算法得到的最终结果就是输出。没有输出的算法是没有意义的。,本节,7,3.2算法的常用表示方法,3.2.1自然语言表示法3.2.2流程图3.2.3N-S结构流程图3.2.4伪代码表示法3.2.5用计算机语言表示算法,本章,8,3.2.1自然语言表示法自然语言是指人们在日常生活中使用的语言,如汉语、英语等。比如对于以下这句话:如果A大于B,就给它加1。在理解时就可能出现歧义,是给A加1?还是给B加1。对于以上的一段话,如果我们用C语言进行编程则为:if(AB)A=A+1;对于某些程序员来说,自然语言通俗易懂。缺点是:很冗长,不直观,而且容易发生歧义。【例3.2】求m!如果m=6,即求123456。我们先设s代表累乘之积,以t代表乘数,自然语言表示m!的算法为:使s=1,t=1。使st,得到的积仍放在s中。使t的值加1。如果tm,返回第步重新执行。如果tm,则不再返回,而停止循环,此时s中的值就是m!,输出s。,本节,9,3.2.2流程图流程图表示法就是用各种图框表示各种操作。这种表示法的优点是直观易于理解。流程图表示法是美国国家标准化协会ANSI(AmreicanNationalStandardInstitute)规定的。一些常用的流程图符号在Word中都可以通过“绘图”命令来绘制。结构化程序设计中采用三种基本结构,即顺序结构、选择结构和循环结构,这三种基本结构有以下共同特点:只有一个入口;只有一个出口;结构内的每一部分都有机会被执行到;结构内不存在“死循环”(无终止的循环)。,10,顺序结构A和B两个框是顺序执行的。选择结构选择结构或称分支结构,条件结构。此结构中必包含一个判断框,根据给定的条件P是否成立来进行选择。若P成立,则执行A框中的操作,否则,执行B框中的操作。循环结构循环结构又称重复结构,有两种:当型循环、直到型循环。,11,用流程图表示例3.2:,本节,12,3.2.3N-S结构流程图1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法都是在一个矩形框内,在该框内还包含其它的从属于它的框。或者说由一些基本的框组成一个大框。这种方法就以这两位学者的名字缩写而成,被称为“N-S图”。N-S图可以表示的三种典型结构:,13,用N-S结构流程图表示例3.2:,本节,14,3.2.4伪代码表示法伪代码是用介于自然语言和计算机语言之间的文字和符号来表示算法,即计算机程序设计语言中具有的语句关键字用英文表示,其他的可用汉字,也可用英文,只要便于书写和阅读就可。用伪代码表示算法并无固定的、严格的语法规则,只要求把意思表达清楚,并且书写的格式清晰易懂即可。【例3.3】求m!,用伪代码表示的算法如下:开始从键盘输入一个正整数给m置s的初值为1置t的初值为1当t=大于或等于=等于!=不等于用关系运算符将两个表达式连接起来的式子,称关系表达式。如:ab,a+bb+c,(a=3)(b=5),ab)(bb值为1(ab)=c值为1d=abd的值为1f=abcf的值为0,本节,优先级相同(高),优先级相同(低),30,3.5.2逻辑运算符和逻辑表达式C语言提供3种逻辑运算符:!逻辑非功能:如果表达式的值为真,做语句的内容;否则什么都不做。,任何类型,35,【例3.7】输入一个字符c,若c是字母,则输出“Yes!”。#includevoidmain()charc;c=getchar();if(c=a运行情况:,xYes!,思考题:完善【补充例1】。,36,例:#includevoidmain()ints;printf(nInputyourscore:);/*输入提示信息*/scanf(%d,/*如果s=60,输出pass!*/运行结果:,Inputyourscore:70yourscore=70,pass!,37,【补充例3】已知两个变量x和y,比较它们的大小,使得x中的值大于y。#includevoidmain()intx,y,t;printf(x=);scanf(%d,x,y,两个数交换过程,思考题:从键盘输入3个整数a、b和c,编写程序将它们按从大到小排序。,38,【补充例】从键盘输入3个整数a、b和c,编写程序将它们按从大到小排序。#includevoidmain()inta,b,c,temp;printf(Pleaseinputthreenumbers:);scanf(%d,%d,%d,39,格式2:if(表达式)语句1;else语句2;其意义为:若表达式的值为真,则执行“语句1”,否则执行“语句2”。若“语句1”或“语句2”为一条语句时,则可以去掉相应的。例:if(hb?a:b相当于max=(ab)?a:b)ab?a:b+1相当于(ab)?a:(b+1)条件运算符的结合方向为“自右至左”。例:ab?a:cd?c:d相当于ab?a:(cd?c:d)例:if(a=b)max=a;elsemax=b;可以用条件运算符来表示为:max=ab?a:b,本节,52,3.5.6switch语句判断语句可以实现两个分支的程序流程。但编程中往往要求实现多个分支的程序流程,这就要使用多分支语句。其一般形式为:switch(表达式)case常量表达式1:语句1;case常量表达式2:语句2;.case常量表达式n:语句n;default:语句n+1;,整型、字符型、枚举型,53,执行过程是:1.首先计算表达式的值,然后把表达式的值与其后的常量表达式值逐个相比较。2.当表达式的值与某个常量表达式的值相等时,即执行该case后的语句。3.如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。4.若没有default语句,则退出此开关语句。注意:程序在执行完毕相应的case语句后不能退出,而是继续执行其后的其它语句。格式中的表达式的作用为控制程序的流程。它的数值类型必须与case语句中常量表达式的类型一致。所有常量表达式的类型必须相同,而它们的值必须不同。,54,若要执行完一个case的语句后,转到switch后的语句去执行,则要在该case语句的最后加上break语句(跳转语句),跳转到switch后的语句去执行。,switch语句与break语句连用图解,55,【例3.14】编写一个程序,要求输入学生的分数,输出其成绩的分数段,用A、B、C、D、E分别表示90分以上、8089分、7079分、6069分和不及格(059分)5个分数段。#includevoidmain()intscore,grade;printf(nInputascore(0100):);scanf(%d,56,case6:printf(grade=D!n);break;case7:printf(grade=C!n);break;case8:printf(grade=B!n);break;case9:case10:printf(grade=A!n);break;default:printf(Thescoreisoutofrange!n);,运行结果如下:Inputascore(0100):50grade=E!再运行一次:Inputascore(0100):90grade=A!,57,【例3.15】从键盘输入一个日期,判断这一天是这一年中的第几天?#includevoidmain()intday,month,year,sum,leap;printf(nPleaseinputyear,month,dayn);scanf(%d,%d,%d,58,case12:sum=31+28+31+30+31+30+31+31+30+31+30;break;default:printf(inputerrorofmonth);sum=sum+day;/*再加上该月的天数*/if(year%400=0|(year%4=0,本节,运行结果如下:Pleaseinputyear,month,day2008,7,19Itisthe201thday.,59,3.5.7选择结构程序设计举例【例3.16】求一元二次方程ax2+bx+c=0的实数解,并显示结果,假设a0。#include#includevoidmain()floata,b,c,d;scanf(%f%f%f,60,【例3.17】输入两个正整数a、b。其中a不大于31,b最大不超过三位数。使a在左,b在右,拼成一个新的数c。例如a=23,b=30,则c为2330。若a=1,b=15,则c为115。算法分析:抽象分析出以下数学模型,决定c值的计算公式如下:当b为一位数时,c=a*10+b当b为二位数时,c=a*100+b当b为三位数时,c=a*1000+b求c的公式:c=a*k+b。(k的取值可以为:10,100或1000),61,#includevoidmain()inta,b,c,k;printf(nInputtwopositiveintegernumber:);scanf(%d,%d,62,【例3.18】个体工商户的生产经营所得,以每一纳税年度的收入总额,减除成本、费用以及损失后的余额,为全年应纳税所得额。其所得税税率表如下:级数全年应纳税所得额税率(%)1不超过5000元的52超过5000元至10000元的部分103超过10000元至30000元的部分204超过30000元至50000元的部分305超过50000元的部分35#includevoidmain()longintr;ints;doublef;printf(Inputaintegertor:);scanf(%ld,63,if(r0)s=(r-1)/5000;switch(s)case0:f=r*0.05;break;case1:f=5000*0.05+(r-5000)*0.1;break;case2:case3:case4:case5:f=5000*0.05+5000*0.1+(r-10000)*0.2;break;case6:case7:case8:case9:f=5000*0.05+5000*0.1+20000*0.2+(r-30000)*0.3;break;default:f=5000*0.05+5000*0.1+20000*0.2+20000*0.3+(r-50000)*0.35;printf(f=%f,f);elseprintf(Inputadataerror!);,64,【例3.19】编程,输入两个实数a、b,再输入一个运算符(可以是+、-、*或/)。根据运算符计算并输出a、b两个数的和、差、积和商。#includevoidmain()floata,b;charc;scanf(%f%f,65,【例3.20】给一个不多于5位的正整数,编程求:它是几位数,逆序打印出各位数字,若为两位以上的数,则判断该数是否为回文数。#includevoidmain()inta,b,c,d,e;longx;doprintf(nPleaseinputapositiveintegernumbertox:);scanf(%ld,/*分解出个位数*/,66,if(a0)printf(thereare5,%d%d%d%d%dn,e,d,c,b,a);if(e=a,67,elseif(c0)printf(thereare3,%d%d%dn,e,d,c);if(e=c)printf(thisnumberisahuiwenn);elseprintf(thisnumberisnotahuiwenn);elseif(d0)printf(thereare2,%d%d%dn,e,d);if(e=d)printf(thisnumberisahuiwenn);elseprintf(thisnumberisnotahuiwenn);elseif(e0)printf(thereare1,%dn,e);,本节,68,3.6循环程序设计,循环结构就是当给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。在C语言中提供了四种实现循环结构的方法:(1)用if语句和goto语句构成的循环(2)用while语句(3)用do-while语句(4)用for语句,69,3.6.1goto语句以及用goto语句构成的循环3.6.2while语句3.6.3dowhile语句3.6.4for语句3.6.5多重循环3.6.6break语句3.6.7continue语句3.6.8循环程序设计举例,本章,70,3.6.1goto语句以及用goto语句构成的循环在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱。能避免使用goto则应避免使用,确实不得不用时,才使用goto。goto语句称为无条件转向语句,其一般格式如下:goto语句标号;goto语句的语义是改变程序流向,立即跳转到标号所标识的语句。语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,并不影响该语句的执行,标号只起与goto句配合的作用。C语言不限制程序中使用标号的次数,但各标号不得重名。一般情况下,使用goto语句有两种情况:与if语句一起构成循环结构;从循环体中跳转到循环体外。,71,使用goto语句时应该注意以下几点:跳转到一个循环内是非常危险的,应该极力避免这样做;不能跳转到本函数外;goto语句越少用越好;通常不主张向程序的前面跳转;【例3.21】用if语句和goto语句构成循环,求i。#includevoidmain()inti=1;/*存放自然数*/intsum=0;/*存放和*/loop:if(i=100)sum+=i;i+;gotoloop;printf(n1+2+3+100=%d,sum);运行结果:,1+2+3+100=5050,本节,72,3.6.2while语句while语句(当循环语句),其形式如下所示:while(表达式)循环体语句;或while(表达式)循环体语句;其中表达式是循环条件。while语句的执行过程:计算表达式的值若表达式的值为真(非0)时,则转到第步若表达式的值为假(0),转到第步执行循环体语句转到第步执行结束循环,执行while语句后的第一条语句,73,【例3.22】用while语句来实现求i。#includevoidmain()inti=1;intsum=0;while(i=100)sum+=i;i+;printf(n1+2+3+100=%d,sum);说明:while语句一般用于事先不知道循环次数,在循环执行的过程中,根据条件来决定循环是否结束。在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复合语句则要用花括号括起来。在循环体语句中,一定要有改变循环条件的语句,使循环能终止。,本节,74,3.6.3dowhile语句dowhile语句(直到型循环),其一般形式为:do循环体语句;while(表达式);其中表达式是循环条件。do-while语句的执行过程是:执行循环体语句,判别表达式的值,若表达式的值为真(非0),则转到第步若表达式的值为假(0),则转到第步结束循环,执行dowhile语句后的第一条语句。,75,【例3.23】用dowhile语句来实现求i。#includevoidmain()inti=1;intsum=0;dosum+=i;i+;while(i=100);printf(n1+2+3+100=%d,sum);,76,说明:dowhile语句一般用于事先不知道循环次数,在循环执行的过程中,根据条件来决定循环是否结束。在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复合语句则要用花括号括起来。在循环体语句中,一定要有改变循环条件的语句,使循环能终止。while(表达式)的后面一定要加分号,表示dowhile语句的结束。do-while语句和while语句的区别在于:dowhile是先执行后判断,即dowhile至少执行一次循环体。while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。while语句和do-while语句一般都可以相互改写。,77,【例3.24】while循环和dowhile循环的比较。#include#includevoidmain()voidmain()intm,n=1;intm,n=1;scanf(%d,程序运行结果:5n=46,m=11再运行一次的结果:11n=12,m=12,程序运行结果:5n=46,m=11再运行一次的结果:11n=1,m=11,本节,78,3.6.4for语句for语句也是一种循环语句,其功能是把某些语句重复执行若干次,不仅可以用于循环次数确定,而且也可以用于循环次数不确定的循环。其一般形式为:for(表达式1;表达式2;表达式3)循环体语句for语句的执行过程:计算表达式1的值;计算表达式2的值若表达式2的值为真(非0),则执行循环体,然后转到第步;若表达式2的值为假(0),则转到第步;计算表达式3的值,转回第步重复执行;循环结束,执行for语句后面的第一条语句。在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。,79,【例3.25】求1000以内的奇数和。#includevoidmain()inti;longintsum=0;for(i=1;i1000;i+=2)sum+=i;printf(nsum=%ldn,sum);,80,说明:for语句可用如下易理解的形式来描述:for(循环变量初值;循环条件;循环变量增值)循环体语句也即表达式1相当于给循环变量赋初值,表达式2是一个条件表达式,表达式3是改变循环变量的值。for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。表达式1省略,其后的分号不能省略。执行时跳过“求解表达式1”这一步,其它不变。#includevoidmain()inti=1;longintsum=0;for(;i=1000)break;/*break跳转语句,跳出for循环语句*/sum+=i;printf(nsum=%ldn,sum);,82,“表达式3”也可省略,此时应在循环体中有语句可以改变循环变量的值。否则循环也会变成死循环。#includevoidmain()inti;longintsum=0;for(i=1;i1000;)sum+=i;i+=2;printf(nsum=%ldn,sum);,83,表达式1,表达式2,表达式3可以省略一个或两个,也可同时全部省略。如:for(;)循环体语句表达式1,2,3可以是任何类型的表达式,包括逗号表达式。可以是与循环变量有关的表达式,也可以是与循环变量无关的表达式。如:for(sum=0,i=1;ivoidmain()inti;charc;for(i=0;(c=getchar()!=n;i+);/*printf(%c,c);*/printf(Thesumis%dn,i);循环体可以是空语句。空语句可以用来实现延时,也就是在程序执行中等待一定的时间。如下为延时程序:for(i=1;i1000,i+);,84,【例3.28】中国剩余定理:“有物不知几何,三三数余一,五五数余二,七七数余三,问:物有几何?”。编程求1000以内所有解。编程思路:采用”穷举法”来解此题。具体做法是:从所有可能解中,逐个进行试验,若满足条件,就得到一个解,否则不是,直到条件满足或判别出无解为止。,#includevoidmain()intm,count=0;for(m=1;m=1000;m+)if(m%3=1/*每行输出5个数*/,运行结果如下:52157262367472577682787892997,85,【补充例6】输出所有水仙花数,水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如,153是一个水仙花数,因为153=13+53+33。(穷举法)#includevoidmain()intm;intx,y,z;for(m=100;m=999;m+)x=m/100;/*分解出百位数*/y=m/10%10;/*分解出十位数*/z=m%10;/*分解出个位数*/if(x*x*x+y*y*y+z*z*z=m)printf(%dn,m);,153370371407,本节,86,3.6.5多重循环在循环语句中又包含另一个循环语句时,我们称其为循环嵌套。在多重循环中,处于内部的循环称为内循环,处于外部的循环称为外循环。按循环嵌套的层数,可分别称二重循环、三重循环等等。语言规定,内循环必须完全嵌套于外循环中,内、外循环不能交叉,并且内、外循环的循环控制变量不能同名。在C语言中,凡是可以出现语句的地方,都可以出现循环语句。【例3.29】打印如图下图所示的“九-九”乘法表。,87,算法分析:外循环是输出行(用i作为循环控制变量i=19)内循环是输出列(用j作为循环控制变量j=19)#includevoidmain()inti,j;for(i=1;i=9;i+)/*外循环,控制行*/for(j=1;j=9;j+)/*内循环,控制列*/printf(%d*%d=%dt,i,j,i*j);printf(n);,88,#includevoidmain()inti,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%d*%d=%dt,i,j,i*j);printf(n);,思考题:在屏幕上输出如下图所示乘法口诀表。,要保证输出的是三角的格式,必须满足列坐标(j)不大于行坐标(i),即(j=i),如何输出?,89,【补充例】输出所有水仙花数。(多重循环、穷举法)算法分析:设这三位数的百位数为x,十位数为y,个位数为z。按水仙花数的定义有:x3+y3+z3=100 x+10y+z(1x9,0y9,0z9,且x,y,z都是整数)#includevoidmain()intx,y,z;for(x=1;x=9;x+)for(y=0;y=9;y+)for(z=0;z=9;z+)if(x*x*x+y*y*y+z*z*z=100*x+10*y+z)printf(“%dn”,100*x+10*y+z);,153370371407,90,【例3.30】有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?#includevoidmain()inti,j,k,count=0;printf(n);for(i=1;i5;i+)/*以下为三重循环*/for(j=1;j1000);printf(1+3+5+%d=%dn,i,sum);,本节,continue,break,98,3.6.8循环程序设计举例,【补充例8】男、女生总计18个人,在一家饭店里吃饭,共花了74元,每个男生各花5元,每个女生各花3元。利用穷举法编程计算男、女生各有多少人。(穷举法)算法分析:设男生x人,女生y人,根据题意有:x+y=185x+3y=74且x、y应为整数,并满足下列条件:1x,y18#includevoidmain()intx,y;for(x=1;x=18;x+)/*男生人数的取值*/for(y=1;y=18;y+)/*女生人数的取值*/if(x+y=18,思考题:鸡兔同笼问题:已知鸡和兔总头数为30,总脚数为90,求鸡兔各有多少只?,男生:10女生:8,99,【补充例】求鸡兔同笼问题:已知鸡和兔总头数为30,总脚数为90,求鸡兔各有多少只?算法分析:设鸡有x只,兔有y只,则鸡兔同笼有:x+y=302x+4y=90且x、y应为整数,并满足下列条件:1x,y30#includevoidmain()intx,y;for(x=1;x=30;x+)/*鸡数的取值*/for(y=1;y=30;y+)/*兔数的取值*/if(x+y=30,鸡:15兔:15,100,【例3.35】某人想将手中一张100元的人民币换成5元、1元和0.5元面值的零钞,但要求最后的零钞总数为100张,且要求每种零钞的数量不少于1张。问有哪几种组合?算法分析:这是一个数学问题,我们先抽取它的数学模型:设5元的票i张,1元的票j张,0.5元票k张。可以列出:i+j+k=1005i+j+0.5k=100(也可写成:10i+2j+k=200)三个变量只能列出两个方程式,不能解。通过计算机用穷举法。,5元1元5角i=1j=1k=198j=2k=198j=94k=198i=2j=1k=198j=94k=198i=19,101,#includevoidmain()inti,j,k;printf(nijkn);for(i=1;i20;i+)for(j=1;j95;j+)for(k=1;k=98;k+)if(i+j+k=100),运行结果如下:ijk1918282163732446432555406464873756828649197210108011188,思考题:百鸡问题:一只公鸡5元,一只母鸡3元,三只小鸡1元。现要求用100元买100只鸡,且要求每种鸡的数量不少于只。问公鸡、母鸡、小鸡各买多少只?,102,【补充例】百鸡问题:一只公鸡5元,一只母鸡3元,三只小鸡1元。现要求用100元买100只鸡,且要求每种鸡的数量不少于只。问公鸡、母鸡、小鸡各买多少只?算法分析:假设买公鸡x只,买母鸡y只,买小鸡z只,根据题意得方程组:x+y+z=100(按100只鸡计算)5x+3y+z/3=100(按100元钱计算)且x、y、z应为整数,并满足下列条件:1x19(公鸡5元一只,其总数不能超过19只)1y31(母鸡3元一只,其总数不能超过31只)3z96(小鸡1元三只,其总数不能超过96只)根据上面的分析,可以采用对x、y、z三个变量在各自的范围内,用各种不同的组合方式逐个计算,看是否满足条件的结果输出来。,103,#includevoidmain()intx,y,z;for(x=1;x=19;x+)/*公鸡的取值*/for(y=1;y=1e-6;n+)e=e+t;/*累加运算*/p*=n;/*做阶乘运算*/t=1/p;printf(e=%fn,e);,e=2.7182820,110,3.7综合程序应用举例,【例3.37】对一批货物征收税金。价值在1万元以上的货物征收5%的税金,在5000元以上,1万元以下的货物征收3%的税金,在1000元以上,5000元以下的货物征收2%的税金,1000元以下的货物免税。编写程序,读入货物价格,计算并输出税金。price1000对应01000price5000对应1、2、3、45000price10000对应5、6、7、8、910000price对应10、11、12、,price/1000,111,#includevoidmain()longx,price;floaty;printf(pleaseenterprice:);scanf(%d,112,【例3.38】编程打印楼梯,同时在楼梯上方打印两个笑脸。用音符代表台阶,如图所示。#includevoidmain()inti,j;printf(%c%cn,1,1);/*输出两个笑脸*/for(i=1;i11;i+)for(j=1;j=i;j+)printf(%c%c,14,14);/*输出两个音符*/printf(n);,笑脸的ASCII值是1音阶的ASCII值是14,113,【补充例9】打印如下所示的图案。#include#defineN7voidmain()inti,j;for(i=1;i=N;i+)for(j=1;j=2*i-1;j+)printf(*);printf(n);,算法分析:每个星号的个数可由行和列确定。设变量i为行,变量j为第i行所对应的星号的个数,则:j=2*i-1外循环控制行数,内循环控制每行星号的个数,114,【补充例10】打印如下所示的图案。#include#include#defineN7voidmain()inti,j;for(i=1;i=N;i+)for(j=1;j=N-abs(N-(2*i-1);j+)printf(*);printf(n);,算法分析:设变量i为行,变量j为第i行所对应的星号的个数,则:j=7-|7-(2i-1)|,N必须是奇数,115,【补充例11】编写一个循环程序,打印出如下图案。#include#include#defineN7voidmain()inti,j;for(i=1;i=N;i+)for(j=1;j=abs(N+1)/2-i);j+)printf();for(j=1;j=a,117,【例3.40】任何一个整数的立方都可以写成一串相邻奇数之和。著名的尼科梅彻斯(Nicomachus)定理。如:13=123=3+533=7+9+1143=13+15+17+19编程,从键盘输入一个整数n,求n3是哪些奇数之和。【分析】从上面各式可以看出以下的规律:n3是n个相邻的奇数之和。如果知道各式的第一个奇数则也就知道所有的奇数了。从给出的各式可以看出:组成13的1个奇数的奇数序列中第1个奇数是1,组成23的2个奇数的奇数序列中第1个奇数是3,组成33的3个奇数的奇数序列中第1个奇数是7,组成43的4个奇数的奇数序列中第1个奇数是13,从中我们可以推出:组成x3的x个奇数的奇数序列中第一个奇数为x*(x-1)+1。,118,#includevoidmain()inti,x,t;scanf(%d,运行结果:,1091+93+95+97+99+101+103+105+107+109=1000,119,【例3.43】输入两个整数,用辗转相除法(欧几里德算法)求它们的最大公约数和最小公倍数。#includevoidmain()intm,n,r,p;scanf(%d%d,设两数为m、n,如果m除以n的余数为0,则n就是两数的最大公约数,否则转到执行;m除以n得余数r,令m=n,n=r;转到继续执行。,120,【补充例12】有一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?(假设求前40个月)算法分析:每个月的兔子总数排列起来是Fibonacci(斐波那契)数列,这个数列有如下特点:第1、2个数为1、1,从第3个数开始,每个数是其前两个数之和。即:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n3),121,#includevoidmain()intf1=1,f2=1,f3;inti;printf(%15d%15d,f1,f2);for(i=3;i0;day-)x=(x+1)*2;printf(total=%dn,x);,123,【补充例14】一球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少m?第10次反弹有多高?#includevoidmain()floats=100,h=s/2;intn;for(n=2;n=10;n+)s=s+2*h;h=h/2;printf(s=%fn,s);printf(h=%fn,h);,124,【补充例15】求Snaaaaaaaaa之值,其中a是一个数字,n由键盘输入。例如:222222222222222(此时n=5)。#includevoidmain()inta,n,i;ints=0,x=0;printf(a,n=);scanf(%d,%d,125,【补充例16】一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是完数。编写程序找出1000以内的所有完数,并按下面格式输出其因子:“6Itsfactorsare1,2,3”。#includevoidmain()intm,s,i;for(m=2;m1000;m+)s=0;for(i=1;i=m/2;i+)if(m%i)=0)s=s+i;if(

温馨提示

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

评论

0/150

提交评论