
控制结构与语句.ppt
58页第第4章章 控制结构与语句控制结构与语句第第4章章 控制结构与语句控制结构与语句4.1 算法与程序算法与程序4.2 结构化程序设计结构化程序设计4.3 顺序结构顺序结构4.4 选择结构选择结构4.5 循环结构循环结构4.6 多重循环结构多重循环结构4.7 实际应用举例实际应用举例4.1 算法与程序n n著名计算机科学家沃思(Nikiklaus Wirth)提出:数据结构 + 算法 = 程序 数据结构——描述数据的类型、组织形式 算法——描述对数据的操作步骤n n程序=数据结构+算法+程序设计方法程序=数据结构+算法+程序设计方法+语言工具和环境+语言工具和环境 1 算法的概念算法的概念 做事都有做事都有——方法、步骤(顺序)方法、步骤(顺序)——决定事情成败决定事情成败1.1.算法:计算机求解某一问题而采用的具体方法、算法:计算机求解某一问题而采用的具体方法、步骤2.2.两大类计算机算法:数值运算算法(求解值解、两大类计算机算法:数值运算算法(求解值解、成熟)、非数值运算算法(事务管理、广泛)成熟)、非数值运算算法(事务管理、广泛)3.3.算法的描述:有穷性、确定性、有效性等。
算法的描述:有穷性、确定性、有效性等4.4.算法描述:描述算法的方法有多种算法描述:描述算法的方法有多种 归纳为二大归纳为二大类:文字和图形(符号)类:文字和图形(符号)2 常用的算法描述方法常用的算法描述方法 1.1.带序号的自然语言描述——易懂却不直观,不严格2.2.流程图:灵活、自由、形象、直观,可表示任何算法 输入、输出处理判断起止连接点流程线2 常用的算法描述方法常用的算法描述方法3. N-S3. N-S图(盒图):特点:完全去掉带箭头图(盒图):特点:完全去掉带箭头 的流程的流程线,算法的所有处理步骤都写在一个大矩形框线,算法的所有处理步骤都写在一个大矩形框(表示简单、符合结构化思想)(表示简单、符合结构化思想)4. 4. 伪代码:用介于自然语言与计算机语言之间的文伪代码:用介于自然语言与计算机语言之间的文字及符号来描述算法(方便、易懂、便于向计字及符号来描述算法(方便、易懂、便于向计算机语言过渡)算机语言过渡)例例4-1计算计算S=1+2+…+100,,写出其算法写出其算法自然语言描述:1.1.0 0S S单元单元2.2.1 1n n单元单元3.3.S S ++ n n S S4.4.n + 1 n + 1 n n5.5.判断判断n ≤ 100?n ≤ 100?是,转是,转3 3;否则转;否则转6 66. 6. 输出输出S S的值的值流程图描述流程图描述N-SN-S图描述图描述伪代码描述伪代码描述0S1nif n ≤ 100S + n Sn + 1 nprint S4.2 结构化程序的三种基本结构结构化程序的三种基本结构1 1966年提出三种基本结构,用三种基本结构作为表示一种良好算法的基本单元:顺序、选择、循环。
任何复杂的算法都是由这三种基本结构按一定规律组成 a 顺序结构顺序结构如:a = 1; b = 2; c = a + b;b 选择结构选择结构 如:if(x != 0)if(x != 0)y = sin(x)/x;y = sin(x)/x;elseelse y = 1;y = 1;c 循环结构循环结构 n n根据条件根据条件P P决定是否重复循环体中的操作决定是否重复循环体中的操作2 三种基本结构的共同点三种基本结构的共同点1)1)单入口单出口2)2)结构内的每一部分都有机会被执行3)3)不存在“死循环”3 结构化程序设计的优点结构化程序设计的优点用三种基本结构组成的程序是结构化程序n n优点:易编、易读、易懂、易维护n n强调程序设计风格和程序结构的规范化n n核心思想:自顶而下,逐步细化,模块化设计,结构化编码,如学校办公自动化系统4 结构化程序设计过程结构化程序设计过程1)1)确定算法:分析问题,(建立数学模型,选择公式),写出算法描述2)2)编写程序:用计算机语言写出实现算法的程序3)3)上机调试:输出(编辑)程序编译、连接、执行程序输出结果例例4 4--2 2:让某学生解方程:让某学生解方程 axax2 2+bx+c=0+bx+c=0 1 1)分析问题)分析问题 这是一个一元二次方程这是一个一元二次方程2 2)确定解题方案及步骤)确定解题方案及步骤 确定确定a a、、b b、、c c的值的值 求出求出b b2 2 -4ac -4ac的值的值 如果如果 b b2 2 -4ac>0 -4ac>0((双实根)双实根) X1=X1=………… X2=X2=………… 如果如果 b b2 2 -4ac=0 -4ac=0((单实根)单实根) X1=X2=X1=X2=………… 如果如果 b b2 2 -4ac<0 -4ac<0((双复根)双复根) X1=X1=………… X2=X2=…………3 3))根据上述步骤编制程序根据上述步骤编制程序4 4)调试程序,输出结果)调试程序,输出结果5 程序、程序设计和程序设计语言程序、程序设计和程序设计语言n n程序:使用语言给计算机的一组指令序列n n程序设计:为求解特定问题而编写的正确有效的程序n n程序设计语言:编写程序所用的语言4.3 顺序结构程序设计顺序结构程序设计n n 在顺序结构程序中,各语句(或命令)是按照位置的先后在顺序结构程序中,各语句(或命令)是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。
次序,顺序执行的,且每个语句都会被执行到[ [例例4 4--3 3] ] 输入任意三个整数,求它们的和及平均值输入任意三个整数,求它们的和及平均值/*/*案例代码文件名:案例代码文件名:AL3_10.C */AL3_10.C *//*/*功能:设计一个顺序结构程序,求三个整数的和及平均值功能:设计一个顺序结构程序,求三个整数的和及平均值 */ / main() main(){ { intint num1,num2,num3,sum; num1,num2,num3,sum; float aver; float aver; printf(“Pleaseprintf(“Please input three numbers:”); input three numbers:”); scanf(“%d,%d,%d”,&num1,&num2,&num3);/* scanf(“%d,%d,%d”,&num1,&num2,&num3);/*输入三个整数输入三个整数* */ / sum=num1+num2+num3; sum=num1+num2+num3; /* /*求累计和求累计和* */ / aver=sum/3.0; aver=sum/3.0; /* /*求平均值求平均值* */ / printf(“num1=%d,num2=%d,num3=%d\n”,num1,num2,num3); printf(“num1=%d,num2=%d,num3=%d\n”,num1,num2,num3); printf(“sumprintf(“sum=%d,aver=%7.2f\n”,sum,aver);=%d,aver=%7.2f\n”,sum,aver);} } 思考思考思考思考:能否将:能否将“ “aver=sum/3.0;”aver=sum/3.0;”中中“ “3.0”3.0”改为改为“ “3”3”??1 顺序结构程序组成顺序结构程序组成在顺序结构程序中,一般包括以下几个部分:在顺序结构程序中,一般包括以下几个部分: a a..程序开头的编译预处理命令。
程序开头的编译预处理命令 在在程程序序中中要要使使用用标标准准函函数数((又又称称库库函函数数)),,除除printfprintf()()和和scanfscanf()()外外,,其其它它的的都都必必须须使使用用编编译译预预处处理理命命令,将相应的头文件包含进来令,将相应的头文件包含进来 b b..顺顺序序结结构构程程序序的的函函数数体体中中,,是是完完成成具具体体功功能能的的各个语句和运算,主要包括:各个语句和运算,主要包括: ((1 1)变量类型的说明变量类型的说明 ((2 2)提供数据语句提供数据语句 ((3 3)运算部分运算部分 ((4 4)输出部分输出部分2 C语句函数语句函数一、语句用来对数据进行加工(完成操作任务)是构成程序的基本单位,通常一个C程序由若干个函数(系统、用户)组成每一函数由若干条语句组成每条语句总是以“;”结束3、、C语句的分类语句的分类可分为三大类:可分为三大类:简单语句简单语句、、复合语句复合语句、、空语句空语句(-)简单语句(-)简单语句1 1、表达式语句:由一个表达式后跟、表达式语句:由一个表达式后跟“ “;;” ”组成组成赋值语句:赋值表达式加一个;号。
如:赋值语句:赋值表达式加一个;号如:s=3.14159*r*r; i++;s=3.14159*r*r; i++;函数调用语句:函数调用表达式加一个;号如函数调用语句:函数调用表达式加一个;号如printf("hello,worldprintf("hello,world \n"); \n");2 2、、结构控制语句:控制结构控制语句:控制 程序流程程序流程选择语句:选择语句:if...elseif...else循环语句循环语句: for while do...while: for while do...while转向语句:转向语句:continue break return continue break return gotogoto((二)复合语句:将一组语句括在一对二)复合语句:将一组语句括在一对{}{}中中如:如:while(i < 100)while(i < 100){ { sum += i; sum += i; i++; i++;} } 说明:说明:a a、、复合语句的复合语句的{ }{ }之后不能有之后不能有“ “;” ;” b b、、复合语句中的语句可以是简单语句、复合语句、空语句。
复合语句中的语句可以是简单语句、复合语句、空语句三)空语句:(三)空语句:; ; /* /*仅仅只有一个仅仅只有一个";"";"号号* */ /空语句什么也不做有时用作被转向点,或为循环语句提供空体如:空语句什么也不做有时用作被转向点,或为循环语句提供空体如:for(i=0;i<=10;i++)for(i=0;i<=10;i++); ;顺序结构例题顺序结构例题例例4-4:输入华氏温度,将其转化成摄氏温度输出输入华氏温度,将其转化成摄氏温度输出转换公式:转换公式:C==5(F-32)/9 #include
输入字母,指定的字母是三个字母中间的一个字母输入字母,指定的字母是三个字母中间的一个字母输入字母,指定的字母是三个字母中间的一个字母输入的字母不能为的字母不能为的字母不能为的字母不能为A A或或或或Z Z include #include <
4.4 选择结构选择结构(重点重点)n n定义:根据给定条件,从两条或多条路径中 选择下一步要执行的操作路径n n形式:两种形式 if 语句 ,switch语句uu4.4.1 if 4.4.1 if 语句语句 uu(1) (1) 双分支双分支uu(2) (2) 单分支单分支uu(3) (3) 嵌套的嵌套的if if语句语句uu4.4.24.4.2 switchswitch语句语句n n定义:用来判定所给定的条件是否满足,根据判定义:用来判定所给定的条件是否满足,根据判定义:用来判定所给定的条件是否满足,根据判定义:用来判定所给定的条件是否满足,根据判定的结果决定执行给出的两种操作之一的语句定的结果决定执行给出的两种操作之一的语句定的结果决定执行给出的两种操作之一的语句定的结果决定执行给出的两种操作之一的语句n n形式:双分支、单分支、形式:双分支、单分支、形式:双分支、单分支、形式:双分支、单分支、if if语句嵌套语句嵌套语句嵌套语句嵌套((1)双分支形式)双分支形式 ((((if - elseif - else 形式)形式)形式)形式)n nif if ( (表达式表达式表达式表达式) {) {语句语句语句语句1;…;}1;…;}n nelseelse { {语句语句语句语句2;…;}2;…;}表达式语句1语句2……非0为04.4.1 if 语句语句n表达式一般为逻辑或者关系表达式n语句可以为简单语句、复合语句例4.4-1: 输入一个学生的C语言考试成绩给整型变量grade,确定是否需重修该课程,如果成绩大于等于60分,则输出“Pass”;否则输出“Fail”。
include " stdio.h "void main( ){ int grade; scanf (“%d”, &grade); if (grade>=60) printf(“Pass\n”); else printf(“Fail\n”);}grade>=60输出Pass输出Fail非0为0((2)单分支形式)单分支形式 ((if 形式)形式) nif (表达式表达式) {语句语句1;…;}表达式表达式语句语句1…非0例4.4-2: 输入两个实数分别给变量a、b,要求编程实现由小到大输出include " stdio.h " void main( ){ float a,b,t; scanf("%f,%f",&a,&b); if (a>b) {t=a; a=b; b=t;} printf("%5.2f,%5.2f\n",a,b);}n复复合合语语句句a>b非0两数交换两数交换输出a、b输入a、bt=aa=bb=t例例4.4-3 三数比较大小三数比较大小任给任给a a、、b b、、c c三个数,按从大到小的顺序输出。
三个数,按从大到小的顺序输出分析:1)对于任意两个数a、b: 若a>b,则输出a、b 否则输出b、a2)对于三个数,有6种可能: a>b>c, a>c>b b>a>c, b>c>a c>a>b, c>b>a3)使用判断—交换法若ab>c交换方法:设a=5, b=8, a=b; b=a需引入中间变量:t=a;a=b; b=a;atb例例4.4-3的的盒图和程序盒图和程序#include <#include n1、一般形式:单分支嵌套,双分支嵌套例例4.4-44.4-4 :: 给一个成绩,要求输出成绩等级给一个成绩,要求输出成绩等级90分分及以上为及以上为‘A’,,80-89分为分为’B’,,70-79分为分为’C’,,60-69分为分为’D’,,60分以下为分以下为’E’ S>=90打印‘A’S>=80打印‘B’S>=70打印‘C’S>=60打印‘D’打印‘E’TFFFFTTT例例4.4-44.4-4程序代码程序代码 #include “stdio.h” void main( ) { int s; scanf(“%d”,&s); if(s>=90) printf(“A”); else if(s>=80) printf(“B”); else if(s>=70) printf(“C”); else if(s>=60) printf(“D”); else printf(“E”); }2、匹配规则:、匹配规则:C语言规定,语言规定,else总是总是和它上面离它最近和它上面离它最近的未配对的的未配对的if配对。 配对1、书写格式:递缩格式、书写格式:递缩格式同层语句行对齐,内层同层语句行对齐,内层向右缩进若干字符向右缩进若干字符2、、if双分支嵌套及其变形双分支嵌套及其变形if(P1)if(P1) if(P2) A if(P2) A else B else Belseelse if(P3) C if(P3) C else D else Dif(P1)if(P1) if(P2) A if(P2) A else B else Belse Celse Cif(P1) Aif(P1) Aelseelse if(P3) C if(P3) C else D else D例例4.4-54.4-5 : 编写程序,输入一个编写程序,输入一个x值,输出对应的值,输出对应的y值函数为函数为 -1 (x<0) y= 0 (x=0) 1 (x>0) 在在在在if if子句中嵌套子句中嵌套子句中嵌套子句中嵌套在在在在elseelse子句中嵌套子句中嵌套子句中嵌套子句中嵌套if (x<=0) if (x<0) y=-1; else y=0;else y=1;if (x<0) y=-1;else if (x==0) y=0; else y=1;if(P1)if(P1) if(P2) A if(P2) A else B else Bif(P1)if(P1) { if(P2) A } { if(P2) A }else Belse B比较:if(x) { if(y) printf(“1”);}else printf(“2”);if(x)if(y) printf(“1”);else printf(“2”);与由此可以看出,通过“{}”,可以改变流程else的层位,从而强制改变程序的执行流程。 nP1,P2为真,执行AnP1为真,P2为假,执行BnP1,P2为真,执行AnP1为假,执行Bnx,y不为0,输出1nx为不为0,y为0,输出2nx,y 不为0,输出1nx不为0,输出23、选择结构程序执行顺序的强制改变、选择结构程序执行顺序的强制改变nif (x>0) ; y=3x+2; n if (x=2) printf(“y>0”); n if (1<=x<=9) y=x-1;((4)常见问题)常见问题:此处加逗号此处加逗号,表示空语表示空语句为分支语句句为分支语句应为应为x==2应为应为x>=1&&x<=94.4.2 switch语句语句 亦称多分支选择语句它比用嵌套的亦称多分支选择语句它比用嵌套的if if语句实现多路分支语句实现多路分支问题,其程序结构清晰、易读问题,其程序结构清晰、易读switch语句的基本格式:语句的基本格式:switch (switch (表达式表达式表达式表达式) ){ case { case C1C1::::语句语句语句语句1 1;[break;];[break;] case case C2C2::::语句语句语句语句2 2;[break;];[break;] … … … … case case CnCn::::语句语句语句语句n n;[break;];[break;] default default ::::语句语句语句语句n+1; n+1; /* /*可缺省可缺省可缺省可缺省* */ /} }/*–表达式(整型、字符型或枚举型)*/C1~Cn 常量(整数、字符)常量表达式(如3+4)不含变量或函数语句1~语句n 可为简单语句,复合语句或空语句。 说明:说明:1 1、、计算表达式计算表达式计算表达式计算表达式e e的值,若与常量表达式的值,若与常量表达式的值,若与常量表达式的值,若与常量表达式cici值一致,值一致,值一致,值一致,则从语句则从语句则从语句则从语句i i,,,,开始执行;直到遇到开始执行;直到遇到开始执行;直到遇到开始执行;直到遇到breakbreak语句语句语句语句或或或或switchswitch语句的语句的语句的语句的“ “}”}”2 2、、若与任何常量表达式值均不一致时,则执行若与任何常量表达式值均不一致时,则执行若与任何常量表达式值均不一致时,则执行若与任何常量表达式值均不一致时,则执行defaultdefault语句或执行后续语句语句或执行后续语句语句或执行后续语句语句或执行后续语句3 3、、常量表达式常量表达式常量表达式常量表达式cici仅起语句标号作用,不作求值判仅起语句标号作用,不作求值判仅起语句标号作用,不作求值判仅起语句标号作用,不作求值判断断断断每个每个casecase的常量表达式的值必须互不相同的常量表达式的值必须互不相同4 4、各个、各个casecase的出现次序不影响执行结果的出现次序不影响执行结果。 5 5、、多个多个多个多个casecase语句可共用一组执行语句语句可共用一组执行语句语句可共用一组执行语句语句可共用一组执行语句 示例示例示例示例1 1include 而各case实际上只是一个跳转处的标记当程序跳转到某个case处时,并非只执行此case行的程序组,而是从此处开始一直向下执行各条语句,直到整个switch开关体结束(“}”) 如果要使每个case处相当于一种if(s)else的效果,必须在其语句组最后加上break语句输入“C”,观察输出结果示例示例示例示例1 1解决方法——break语句:include 示例示例示例示例2 2include 计算运输费吨公里运价吨公里运价运输距离运输距离折扣折扣货重货重<<250(公里公里) d=0250≤≤s<<500 d=0.02500≤≤s<<1000 d=0.051000≤≤s<<2000 d=0.082000≤≤s<<3000 d=0.103000≤≤s d=0.15用不带else的if语句、if-else语句完成上述例题, 并做对比 ??要根据运输距离计算折扣d,关键是要构造switch后的表达式,根据题目,选择 c=s/250 来求c的值 if (s>=3000) c=12; else c=s/250;程序中当c的值为2,3时,d的值都是0.05,则这两个case语句可以共同使用一个语句分析说明#include 百钱买百钱五,鸡母一值钱三,鸡雏三值钱一百钱买百鸡,问鸡翁、母、雏各几何?鸡,问鸡翁、母、雏各几何?1 1))分析:分析: cocks + hens + chicks =100cocks + hens + chicks =1005 * cocks + 3*hens + chicks/3 = 1005 * cocks + 3*hens + chicks/3 = 100其中:其中:0 ≤ cocks ≤ 19 0 ≤ hens ≤ 33 0 ≤ chick ≤ 1000 ≤ cocks ≤ 19 0 ≤ hens ≤ 33 0 ≤ chick ≤ 100思路:依次取思路:依次取cockscocks的值域中的值,然后求其余两的值域中的值,然后求其余两数,看是否合乎题意可采用累试法数,看是否合乎题意可采用累试法 枚举法枚举法 细化过程细化过程算法描述:算法描述:cocks = 0cocks = 0当当cocks ≤19cocks ≤19时时{ hens = 0{ hens = 0当当hens ≤33hens ≤33时时{ { 找满足题意的找满足题意的chickschicks数数 henshens加加1 1} }cockscocks加加1 1} }算法描述:算法描述:cocks = 0cocks = 0当当cocks ≤19cocks ≤19时时{ { 找满足题意的找满足题意的henshens、、chickschicks数数 cockscocks加加1 1} }算法描述:算法描述:cocks = 0cocks = 0当当cocks ≤19cocks ≤19时时{ { hens = 0hens = 0当当hens ≤33hens ≤33时时{chicks=100-cocks-hens{chicks=100-cocks-hens 如果(如果(5*cocks+3*hens+chicks/35*cocks+3*hens+chicks/3)=)=100100则输出则输出 henshens加加1 1} }cockscocks加加1 1} }程序清单程序清单void main()void main(){ { intint cocks=0, hens, chicks; cocks=0, hens, chicks;while(cocks <= 19)while(cocks <= 19){ hens=0;{ hens=0; while(hens <= 33) while(hens <= 33){ { chicks = 100 – cocks – hens;chicks = 100 – cocks – hens; if(5.0*cocks + 3.0 *hens + chicks/3.0 ==100 if(5.0*cocks + 3.0 *hens + chicks/3.0 ==100 ) )printf(“%dprintf(“%d %d %d \n”, cocks, hens, chicks); %d %d \n”, cocks, hens, chicks); hens++; hens++;} } cocks++; cocks++;} }} }。
