1、第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:比较
2、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) 用伪代码描述算法INPUT a,b,cIF a=b THEN max=a,min=bELSE max=b,min=aIF maxc THEN min=cOUTPUT max, minEND,(3)用流程图描述算法,结构化程序设计有三大基本结构:顺序结构、选择结构、循环结构。,3.2 顺序结构 顺序结构程序是最简单的程序。由计算机硬件直接
3、支持,自上而下顺序执行,无分支、无转移、无循环。 其格式为: 语句1; 语句2; 语句3; 语句 n; 程序执行时先执行语句1,然后执行语句2,接着执行语句3,最后执行语句n。,例: 输入一个三位数,依次输出该数百位,十位,个位数字。#includevoid main() int num,a,b,c; scanf(%d,运行时,从键盘输入:456屏幕显示:百位:4十位:5个位:6,3.3 选择结构,(1)单分支if语句 语句格式: if(表达式) 语句 执行过程:,例: 输入任意两个整数num1、num2,求两个数中的最大值。#include void main()int num1,num2,
4、max;printf(Please input two numbers:); /提示语,提示用户增加交互性scanf(%d,%d,if 语句 (有三种基本结构形式:单分支、双分支和多分支。),(2)双分支 if 语句 语句的格式: if(表达式) 语句1 else 语句2 执行过程:,例: 利用双分支结构实现求两个数中的最大值。 #include void main() int num1,num2,max; printf(Please input two numbers:); /提示语,提示用户增加交互性 scanf(%d,%d,有 if 不一定有 else 有 else 一定有 if,(3)
5、多分支 if 语句 语句格式: if (表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式m) 语句m else 语句n 执行流程:,例3.5 有一函数: 编一个程序,输入一个实型数x值后,输出y值。#include #include void main() float x,y; /定义两个实型变量x,y scanf(%f, ,if 语句的嵌套所谓if语句的嵌套,是指在if语句中又包含一个或多个if语句的情况。 一般格式: if() if() 语句1 else 语句2else if() 语句3 else 语句4 其他格式:if()
6、if( )语句1else语句2,规律:else总是与它最近的未曾配对的if配对。 在实际编程中,为明确匹配关系,避免匹配错误,建议将内嵌的if语句,一律用花括号括起来,如以下形式:if( ) if( ) 语句1 else 语句2 else if( ) 语句3 else 语句4 书本例3.6 便是使用if语句的嵌套形式实现的,请问:else和哪个if配对?,switch 语句基本格式: switch(表达式) case 常量表达式1: 语句序列1 case 常量表达式2: 语句序列2 . case 常量表达式n: 语句序列n default: 语句执行流程: 计算表达式的值,找到与某个case后
7、面的常量表达式的值相等时,执行此case分支中的语句序列,然后继续执行下一个case分支对应的语句序列直至最后。若所有的case中的常量表达式的值都不能与表达式中的值相匹配,则执行default分支中的语句序列。,说明:(1)关键字switch后面的表达式的值是整型或字符型。(2)关键字case后面的常量表达式的值也只能是整型或字符型,并且各case分支的常量表达式的值应各不相同。case与常量表达式之间一定要有空格分隔。(3)语句序列可以是多条语句,不需要像if语句用花括号括起。(4)当所有case的常量表达式都不能与表达式的值匹配时,执行default分支的语句。default分支不要求必
8、须存在,程序员根据具体问题分析是否需要。若需要,在每个switch结构中default分支只能有一个。(5)各case及default分支的先后次序,不影响程序执行结果。(6)多个case也可以共用语句序列,此时不必重复书写,只需将共用语句序列的case情况连续书写,在其中最后一个case后书写语句序列即可。,例: 从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80score90,等级为B;70score80,等级为C;60score70,等级为D;score60,等级为E。,#include void main() int score; printf(
9、Input a score(0100): ); /提示语 scanf(%d, ,程序运行情况如下: Input a score(0100): 75 grade=C grade=D grade=E END,Why?,如何解决?,#include void main() int score; printf(Input a score(0100): ); scanf(%d, ,程序运行情况如下:Input a score(0100): 75grade=C,break语句的作用!break语句也称为间断语句,在此处,若执行break语句将跳出switch语句。,3.4 循环结构 (while语句、do
10、-while语句、for语句以及goto语句),(1)while语句 语句格式: while(表达式) 循环体;执行流程:,例: 编写程序,求1+2+3+100的值。#include void main() int i,sum; /i代表加数,sum作为和,此时两个变量是随机值 i=1; /i赋初值1 sum=0; /sum赋初值0 while(i=100) /循环结束条件i=100 sum=sum+I ; i+ ; /大括号中的两条语句构成循环体 printf(sum=%dn,sum); 程序运行后的输出结果为:sum=5050,注意:(1)while后紧跟圆括号(2)表达式是循环控制条件,
11、避免“死循环”(3)循环体若是多条语句,一定要用“ ”括起,(2)do while 语句语句格式: do循环体 while(表达式) ;执行流程:,例: 用do-while语句求1+2+3+100的值。#includevoid main() int i , sum; i=1; /赋初值 sum=0; /赋初值 do sum=sum+i; i+; while(i=100); printf(sum=%dn,sum); 程序运行后的输出结果为:sum=5050,注意:(1)while后面的分号不要丢失(2)执行流程注意与while语句比较,while语句 等价 ? do-while语句,(3)for
12、 语句语句格式: for(表达式1;表达式2;表达式3) 循环体执行流程:,例: 用for语句求1+2+3+100的值。#includevoid main() int i,sum; for(i=1,sum=0;i=100;i+) sum=sum+i; printf(sum=%dn,sum); 程序运行后的输出结果为: sum=5050,书本中列举了for语句中几种省略表达式的形式。 这些等价形式虽然合法,但实际编程时还是提倡大家使用“经典格式”!,(4)goto 语句语句格式: goto 语句标号;注意:关键字goto和语句标号之间用空格分隔,最后用分号结束。语句标号是任意合法的标识符(遵循标
13、识符命名规则),当在标识符后面加一个冒号,如:“loop:”、“step1:”,该标识符就成了一个语句标号。执行过程: 程序执行到goto语句时,程序无条件地转移到语句标号所标识的语句处,并从该语句继续执行。,例: 用goto语句求1+2+3+100的值。 #include void main() int i=1,sum=0; loop: sum+=i; /语句标号loop: i+; if(i=100) goto loop ; /若满足条件i=100,执行goto语句 printf(%dn,sum); 程序的运行情况是: 5050,初学者 慎用!,(5)break语句和continue语句(用
14、于循环体!),break语句语句格式: break ;功能: 前面提到用break语句可以跳出switch语句体,程序继续执行switch语句体后面的程序。 在循环结构中,也可以用break语句跳出本层循环体,从而提前结束本层循环。例:#include void main() int i=0; /赋初值0 while(i20) i+; if(i%5= =0) break; printf(%d,i); 结果:1,2,3,4,,continue语句语句格式: continue ;功能: conitune语句也是“跳出”,但它只是结束本次循环体的执行,转而继续判断循环控制条件是否为真,从而决定是否继
15、续执行循环体,而不像break语句直接结束整个循环。例:#include void main() int i=0; /赋初值0 while(i20) i+; if(i%5=0) continue; printf(%d,i); 结果:,表达式i%5= =0为真时执行break语句,表达式i%5= =0为真时执行continue语句,1,2 ,3,4,6,7,8,9,11,12,13,14,16,17,18,19,,(6)循环的嵌套,所谓循环嵌套,是指在一个循环体内还可以包含另一个完整的循环语句。 while( ) while( ) do do while( ); while( );,for( ;
16、) for( ;)for( ;) while( ) ,3.5 应用举例,例:输入任意的三个数,判断三个数是否可以构成三角形,若能,可以构成等腰三角形、等边三角形还是其他三角形。分析:三角形要求任意两边之和大于第三边,可以将此条件转换成语句,在满足此条件下,进一步细分出三边相等为等边三角形,任意两边相等为等腰三角形,其余为其他三角形。#include void main() float a,b,c; /定义实型变量a、b、c代表三边 printf(Enter three sides of triangle:); /提示语 scanf(%f,%f,%f, ,程序的运行情况是:Enter three
17、 sides of triangle: 1.5,1.5,1.5是等边三角形,例:从键盘上输入一个整数,然后把这个整数的各位逆序输出。例如,输入123456,输出654321。,分析: 所谓逆序输出,就是先输出整数的个位,再输出十位,依此类推。 此题并没有限定数的位数,如何得到数的每一位? 先通过除10取余的方法获得任意整数的个位数字,例如:当n=123456时,123456%10=6(注意取余数操作后n的值没有变化)。 然后再用n=n/10将n缩小10倍,例如123456/10=12345,可以看到原来的六位数变成了五位数。依此类推。规律:“先n%10再n/10”的操作是反复执行的,直到数n的最高位被得到为止。,#include void main() int n,d; printf(Enter an integer:); scanf(%d,程序的运行情况是:Enter an integer:123456 654321,本章主要讲述了程序设计的三种基本结构,在实际编程中无处不在,非常重要,经常会不同的结构形式结合使用。在实际编程时,应该遵循“先分析题目”-“再设计算法”-“最后编程实现”的思路。积累一些经典的程序算法是非常有帮助的,建议同学们课余时间多看书学习,多上机实践!,