第3章程序设计基本结构3.1算法及算法描述方法3.2顺序结构3.3选择结构3.4循环结构3.5应用举例3.1算法及算法描述方法算法:编写程序的根本,针对不同问题找到适合表示该问题的算法是编程人员的根本要求算法需要具备以下特点:1.有穷性2.确定性3.可行性4.有0个或多个输入5.有一个或多个输出算法有以下几种常用的描述方法:1.用自然语言描述2.用流程图表示算法3.用代码表示算法例:求出三个整数中的最大数和最小数。(1)用自然语言描述算法(s1、s2……代表算法步骤)S1:输入三个整数a、b和c,定义两个变量max和min用于存放最大数和最小数;S2:比较a和b,如果a大于等于b,把a赋给max,b赋给min;否则a赋给min,b赋给max;S3:比较max和c,如果max小于c,则把c赋给max;S4:比较min和c,如果min大于c,则把c赋给min;S5:输出max作为最大数,输出min作为最小数。(2)用伪代码描述算法INPUTa,b,cIFa=bTHENmax=a,min=bELSEmax=b,min=aIFmaxcTHENmax=cIFmincTHENmin=cOUTPUTmax,minEND(3)用流程图描述算法结构化程序设计有三大基本结构:顺序结构、选择结构、循环结构。3.2顺序结构顺序结构程序是最简单的程序。由计算机硬件直接支持,自上而下顺序执行,无分支、无转移、无循环。其格式为:语句1;语句2;语句3;……语句n;程序执行时先执行语句1,然后执行语句2,接着执行语句3,……,最后执行语句n。例:输入一个三位数,依次输出该数百位,十位,个位数字。#includestdio.hvoidmain(){intnum,a,b,c;scanf(%d,&num);//允许用户从键盘输入一个三位整数,值赋给变量numa=num/100;//计算得到num的百位存入变量a中b=num/10%10;//计算得到num的十位存入变量b中c=num%10;//计算得到num的个位存入变量c中printf(百位:%d\n十位:%d\n个位:%d\n,a,b,c);}运行时,从键盘输入:456↙屏幕显示:百位:4十位:5个位:63.3选择结构(1)单分支if语句语句格式:if(表达式){语句}执行过程:例:输入任意两个整数num1、num2,求两个数中的最大值。#includestdio.hvoidmain(){intnum1,num2,max;printf(Pleaseinputtwonumbers:);//提示语,提示用户增加交互性scanf(%d,%d,&num1,&num2);//允许用户键入两个整数max=num1;if(maxnum2)//单分支if语句结构max=num2;printf(max=%d\n,max);}•if语句(有三种基本结构形式:单分支、双分支和多分支。)(2)双分支if语句语句的格式:if(表达式){语句1}else{语句2}执行过程:例:利用双分支结构实现求两个数中的最大值。#includestdio.hvoidmain(){intnum1,num2,max;printf(Pleaseinputtwonumbers:);//提示语,提示用户增加交互性scanf(%d,%d,&num1,&num2);//允许用户键入两个整数if(num1num2)max=num1;elsemax=num2;//双分支if语句结构printf(max=%d\n,max);}有if不一定有else有else一定有if(3)多分支if语句语句格式:if(表达式1){语句1}elseif(表达式2){语句2}elseif(表达式3){语句3}…elseif(表达式m){语句m}else{语句n}执行流程:例3.5有一函数:编一个程序,输入一个实型数x值后,输出y值。#includestdio.h#includemath.hvoidmain(){floatx,y;//定义两个实型变量x,yscanf(%f,&x);if(x0)y=sqrt(x);//数学函数sqrt()用来求开方elseif(x==0)y=1;elsey=sqrt(-x);//多分支if语句结构printf(x=%f,y=%f\n,x,y);}if语句的嵌套所谓if语句的嵌套,是指在if语句中又包含一个或多个if语句的情况。一般格式:if()if(){语句1}else{语句2}elseif(){语句3}else{语句4}其他格式:if(){if(){语句1}}else{语句2}规律:else总是与它最近的未曾配对的if配对。在实际编程中,为明确匹配关系,避免匹配错误,建议将内嵌的if语句,一律用花括号括起来,如以下形式:if(){if(){语句1}else{语句2}}else{if(){语句3}else{语句4}}书本例3.6便是使用if语句的嵌套形式实现的请问:else和哪个if配对???switch语句基本格式:switch(表达式){case常量表达式1:语句序列1case常量表达式2:语句序列2...case常量表达式n:语句序列ndefault:语句}执行流程:计算表达式的值,找到与某个case后面的常量表达式的值相等时,执行此case分支中的语句序列,然后继续执行下一个case分支对应的语句序列直至最后。若所有的case中的常量表达式的值都不能与表达式中的值相匹配,则执行default分支中的语句序列。说明:(1)关键字switch后面的表达式的值是整型或字符型。(2)关键字case后面的常量表达式的值也只能是整型或字符型,并且各case分支的常量表达式的值应各不相同。case与常量表达式之间一定要有空格分隔。(3)语句序列可以是多条语句,不需要像if语句用花括号括起。(4)当所有case的常量表达式都不能与表达式的值匹配时,执行default分支的语句。default分支不要求必须存在,程序员根据具体问题分析是否需要。若需要,在每个switch结构中default分支只能有一个。(5)各case及default分支的先后次序,不影响程序执行结果。(6)多个case也可以共用语句序列,此时不必重复书写,只需将共用语句序列的case情况连续书写,在其中最后一个case后书写语句序列即可。例:从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A;80≤score90,等级为B;70≤score80,等级为C;60≤score70,等级为D;score60,等级为E。#includestdio.hvoidmain(){intscore;printf(Inputascore(0~100):);//提示语scanf(%d,&score);//允许用户键入成绩switch(score/10)//构造表达式score/10,把连续的数据离散化{case10:case9:printf(grade=A\n);//case10和case9共用语句case8:printf(grade=B\n);case7:printf(grade=C\n);case6:printf(grade=D\n);case5:case4:case3:case2:case1:case0:printf(grade=E\n);//case5到case0共用语句default:printf(END\n);}}程序运行情况如下:Inputascore(0~100):75↙grade=Cgrade=Dgrade=EENDWhy?如何解决?#includestdio.hvoidmain(){intscore;printf(Inputascore(0~100):);scanf(%d,&score);switch(score/10){case10:case9:printf(grade=A\n);break;case8:printf(grade=B\n);break;case7:printf(grade=C\n);break;case6:printf(grade=D\n);break;case5:case4:case3:case2:case1:case0:printf(grade=E\n);break;default:printf(END\n);}}程序运行情况如下:Inputascore(0~100):75↙grade=Cbreak语句的作用!!!break语句也称为间断语句,在此处,若执行break语句将跳出switch语句。3.4循环结构(while语句、do-while语句、for语句以及goto语句)(1)while语句语句格式:while(表达式)循环体;执行流程:例:编写程序,求1+2+3+…+100的值。#includestdio.hvoidmain(){inti,sum;//i代表加数,sum作为和,此时两个变量是随机值i=1;//i赋初值1sum=0;//sum赋初值0while(i=100)//循环结束条件i=100{sum=sum+I;i++;//大括号中的两条语句构成循环体}printf(sum=%d\n,sum);}程序运行后的输出结果为:sum=5050注意:(1)while后紧跟圆括号(2)表达式是循环控制条件,避免“死循环”(3)循环体若是多条语句,一定要用“{}”括起(2)do–while语句语句格式:do循环体while(表达式);执行流程:例:用do-while语句求1+2+3+…+100的值。#includestdio.hvoidmain(){inti,sum;i=1;//赋初值sum=0;//赋初值do{sum=sum+i;i++;}while(i=100);printf(sum=%d\n,sum);}程序运行后的输出结果为:sum=5050注意:(1)while后面的分号不要丢失(2)执行流程注意与while语句比较while语句等价??do-while语句(3)for语句语句格式:for(表达式1;表达式2;表达式3)循环体执行流程:例:用for语句求1+2+3+…+100的值。#includestdio.hvoidmain(){inti,sum;for(i=1,sum=0;i=100;i++)sum=sum+i;printf(sum=%d\n,sum);}程序运行后的输出结果为:sum=5050书本中列举了for语句中几种省略表达式的形式。这些等价形式虽然合法,但实际编程时还是提倡大家使用“经典格式”!(4)goto语句语句格式:goto语句标号;注意:关键字goto和语句标号之间用空格分隔,最后用分号结束。语句标号是任意合法的标识符(遵循标识符命名规则),当在标识符后面加一个冒号,如:“loop:”、“step1:”,该标识符就成了一个语句标号。执行过程:程序执行到goto语句时,程序无条件地转移到语句标号所标识的语句处,并从该语句继续执行。例:用goto语句求1+2+3+…+100的值。#includestdio.hvoidmain(){inti=1,sum=0;loop:sum+=i;//语句标号loop:i++;if(i=100)gotoloop;//若满足条件i=100,执行goto语句printf(%d\n,sum);}程序的运行情况是:5050初学者慎用!!(5)break语句和continue语句(用于循环体!)break语句语句格式:break;功能:前面提到用break语句可以跳出switch语句体,程序继续执行switch语句体后面的程序。在循环结构中,也可以用break语句跳出本层循环体,从而提前结束本层循环。例:#includestdio.hvoidmain(){inti=0;//赋初值0while(i20){i++;if(i%5==0)break;printf(%d,,i);}}结果:1,