3.1算法与算法的表示方法3.2顺序结构程序设计3.3选择结构程序设计3.4循环结构程序设计第三章程序的控制结构与结构化程序设计方法3.1算法与算法的表示方法本章主要内容:1.了解算法的表示方法及其在程序设计中的重要地位.2.掌握C语言的基本控制结构和基本控制语句.3.掌握用C语言的基本控制语句进行顺序,选择和循环结构程序的设计.4.掌握一些常用的算法,如递推法,迭代法,穷举法等.5.了解结构化程序设计的基本思想算法分类:数值运算算法:解决的是求数值解的问题。非数值运算算法:主要解决关于分析推理、逻辑推理等问题,如排序、查找等。3.1.1算法的概念数据结构+算法=程序数据结构:对数据的描述和组织形式,算法:对操作或行为的描述,即操作步骤。算法——为解决一个具体问题而采取的确定的有限的操作步骤。2、控制结构:操作序列的顺序控制。三种基本控制结构,即:顺序结构、选择结构、循环结构。3.1.1算法的概念算法的组成要素:1、操作:各种运算。如:算术运算、逻辑运算、关系运算等。算法的特性:1、有穷性:在有限的时间内,操作步骤能够终止。2、确定性:每一步操作的含义必须明确。3、有效性:每一步都应当能有效地进行并得到确定的结果。4、有0个或多个输入。5、有1个或多个输出。3.1.1算法的概念例1:求12345。算法一:S1:求12,得2;S2:将S1得的2再乘3,得6;S3:将S2得的6再乘4,得24;S4:将24再乘5,得120,结果。算法二:S1:p=1S2:i=2S3:p=piS4:i=i+1S5:若i5,返回S3,否则结束,得出结果p为5!。比较两个算法:算法一:繁琐,数目大时步骤太多。算法二:利用循环算法,借助两个变量,可求任意数的阶乘,提高通用性。3.1.2简单算法举例3.1.2简单算法举例例2:求1+2+3+4……+100算法:S1:n=1S2:s=0S3:s=s+nS4:n=n+1S5:若n100,返回到S3,否则结束。1+3+5+7+……+992+4+6+8+…..+100思考:S1:n=1S2:s=0S3:s=s+nS4:n=n+2S5:若n100,返回到S3,否则结束。S1:n=2S2:s=0S3:s=s+nS4:n=n+2S5:若n100,返回到S3,否则结束。算法:S1:sign=1S2:n=2S3:s=1S4:sign=(-1)signS5:s=s+signnS6:n=n+1S7:若n100,返回到S4,否则结束。例3:求1-2+3-4……-1003.1.2简单算法举例二、流程图表示处理框输入输出框起止框判断框连接符流程线一、自然语言表示3.1.3算法的表示方法例1中求5!的算法用流程图表示:算法:S1:p=1S2:i=2S3:pipS4:i+1iS5:若i5,返回S3,否则结束,得出结果p为5!。3.1.3算法的表示方法开始P=1i=2P=P*ii=i+1Ni5Y结束打印P优点:既形象直观,又节省篇幅,基本结构及算法的表示均在一个矩形框内,尤其适于表示结构化程序的设计。三、N-S结构化流程图取消改进流程图中的流程线,这种算法被迫只能从上到下顺序执行,从而避免了算法流程的任意转向,保证了程序的质量。所谓结构化程序设计就是由基本结构顺序组成的,基本结构之间无跳转。3.1.3算法的表示方法例1中求5!用N-S图表示:p=1i=2p=p*ii=i+1直到i5为假打印pmain(){inti,p;p=1;i=2;do{p=p*i;i=i+1;}while(i5)printf(“%d”,p);}用C实现3.1.3算法的表示方法伪码是指介于自然语言和计算机语言之间的一种代码,是帮助程序员制定算法的智能化语言,它不能在计算机上运行,但是使用起来比较灵活,无固定格式和规范,只要写出来自己或别人能看懂即可,而且比较容易转换为计算机程序。3.1.3算法的表示方法四、伪代码表示:3.1.3算法的表示方法inputnifn0print“inputerror!”gotoendelsefac=1i=1loop:fac=fac*ii=i+1ifi=ngotoloopprintfacend例:用伪码表示的计算n!的算法返回为了使流程图便于理解和阅读,限制无规律的任意转向,结构化程序设计规定了三种基本结构,即:顺序结构、选择结构、循环结构。然后由这些基本结构按一定规律组成一个算法结构,整个算法的结构由上而下地将各个基本结构顺序排列起来的。三种基本结构:三种基本结构的特点:(1)只有一个入口(2)只有一个出口(3)结构内的每一部分都有机会被执行(4)结构内不存在“死循环”3.2顺序结构程序设计3.2顺序结构程序设计顺序结构是最简单的C语言程序结构,也是C语言程序中最常用的程序结构,主要由表达式语句组成。特点:完全按照语句出现的先后顺序执行程序。一、顺序结构概念:二、顺序结构流程图表示:AB传统流程图:N-S流程图:AB3.2顺序结构程序设计三、应用举例:例3.1:假设银行定期存款的年利率r为2.25%,存款期为n年,存款本金为m元,求n年后可得到的本利之和。用N-S图表示的算法:输入n和m的值利用公式total=m*(1+r)计算本利之和total输出计算结果totaln3.2顺序结构程序设计3.2顺序结构程序设计程序清单:printf(“Pleaseentern,m:”);运行结果:Pleaseentern,m:1,500Total=511.250000main(){}intm,n;floatr=0.0225,total;scanf(“%d,%d”,&n,&m);total=m*pow(1+r,n);printf(“Total=%f\n”,total);#includemath.h注:编译预处理命令不是C语句,每条指令单独占一行,同一行不能有其它的编译指令或C语句。3.2顺序结构程序设计C程序结构框架:以#开始的编译预处理命令行main(){}局部变量说明语句;执行语句序列;包含头文件的方式:#include文件名#include“文件名”3.2顺序结构程序设计例3.2:任意从键盘输入一个三位整数,要求正确分离出它的个位、十位、百位数,分别在屏幕上输出。算法:Step1:输入一个三位整数x;Step2:计算最高位b2=x÷100;Step4:计算最低位b0=x%10或b0=x-b2×100-b1×10;Step3:计算中间位b1=(x-b2×100)÷10或b1=(x÷10)%10;Step5:输出分离结果;程序见eg3_23.2顺序结构程序设计例3.3:编程计算方程ax+bx+c=0的根,a,b,c由键盘输入,假设b-4ac0。22分析:一元二次方程的求根公式:aacbabaacbbx24224222,1abp2aacbq242qpx1qpx23.2顺序结构程序设计算法:Step4:输出x1和x2;Step1:输入a,b,c;2Step2:计算判别式disc=b-4ac;Step3:由于以假设判别式0,所以可直接按求根公式计算两个实根x1和x2;程序见eg3_3返回选择结构的应用场合计算一元二次方程ax+bx+c=0的根b-4ac0有两个不相等的实根b-4ac=0有两个相等的实根b-4ac0有一对共轭复根2222当需要根据不同的判断条件执行不同的操作时。若输入的三角形三边能构成一个三角形,则计算三角形面积计算分段函数的值-xxex0y=1x=0-ex03.3选择结构程序设计选择结构的流程图表示PAB真假N-S流程图PAB入口出口传统流程图真假3.3选择结构程序设计选择结构种类单分支的选择结构双分支的选择结构多分支的选择结构嵌套的if语句或switch语句3.3选择结构程序设计if~else形式if(表达式)语句1else语句2适合于解决双分支选择问题表达式语句假真表达式语句2真假语句1条件语句if形式if(表达式)语句A适合于解决单分支选择问题3.3选择结构程序设计else~if形式if(表达式1)语句1elseif(表达式2)语句2…elseif(表达式m)语句melse语句m+1适合于解决多分支选择问题表达式1表达式2表达式3语句3语句2语句1语句4真真真假假假3.3选择结构程序设计例3.4从键盘输入你和你朋友的年龄,编程判断谁的年龄最大,并打印他的年龄。N-S流程图:读入yours,hisYyours=hisN输出yourshisyoursYN输出his程序见eg3_4_1算法1:用不带else子句的if语句编程。3.3选择结构程序设计算法2:用带有else子句的if语句编程。N-S流程图:读入yours,hisYyours=hisN输出yours输出his程序见eg3_4_23.3选择结构程序设计算法3:用条件表达式实现。条件表达式:表达式1?表达式2:表达式3N-S流程图:读入yours,hisYyours=hisNmax=yoursmax=his输出max程序见eg3_4_33.3选择结构程序设计例3.5体型判断。判断某人是否属于肥胖,可根据身高与体重等因素来判断,按照“体指数”对肥胖程度进行划分:体指数t=体重w/(身高h)(其中,w单位为kg,h单位为m)当t18时,为低体重;当t介于18和25之间时,为正常体重;当t介于25和27之间时,为超重体重;当t27时,为肥胖。23.3选择结构程序设计算法1:用不带else子句的if语句编程。N-S流程图:程序见eg3_5_1算法2:用在if子句中嵌入if语句的形式编程。输入身高h和体重w计算体指数tt27t25t18YYYNNN低体重正常体重超体重肥胖体重程序见eg3_5_23.3选择结构程序设计算法3:用在else子句中嵌入if语句的形式编程。输入身高h和体重w计算体指数tt27t25t18YYYNNN低体重正常体重超体重肥胖体重程序见eg3_5_3N-S流程图:3.3选择结构程序设计使用if-else语句应注意的事项当需要多条语句时必须用复合语句,即把要执行的多条语句用一对大括号括起来。if子句中内嵌if语句时,else子句总是与它前面最近的且没有配对的if相结合,而与书写的缩进格式无关。为避免错误,有两个办法:1、if子句中内嵌的if语句用一对大括号括起来;2、尽量采用在else子句中内嵌if语句的形式编程。3.3选择结构程序设计例3.6编程计算一元二次方程ax+bx+c=0的根,a,b,c由键盘输入,其中,a!=0。算法(用自然语言描述)Step1:输入系数a,b,c;Step2:计算判别式:disc=b-4ac;2Step3:计算p和q,其中:abp2aacbq242Step4:若a==0,则输出“不是二次方程”;Step5:若disc0,则计算并输出两个不相等的实根:x1=p+q,x2=p-q;Step6:若disc=0,则计算并输出两个相等的实根:x1=x2=p;Step7:若disc0,则计算并输出两个共轭复根:x1=p+qi,x2=p-qi;3.3选择结构程序设计程序见eg3_62例3.7编程设计一个简单的猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了则计算机给出提示“right”,否则提示“wrong”,并告诉人所猜的数是大还是小。算法:Step1:通过调用随机函数任意“想”一个数magic;Step2:输入人猜的数guess;Step3:如果guessmagic,则给出提示:“Wrong!Toohigh!”Step4:如果guessmagic,则给出提示:“Wrong!Toolow!”Step5:如果guess==magic,则给出提示:“Right!”,并打印这个数。3.3选择结构程序设计程序见eg3_7开关语句switch当对问题需要分析的情况较多时(一般大于三种),常使用开关语句代替条件语句来简化程序的设计。常用于各种分类统计、菜单等程序的