第4章顺序和选择结构程序设计1、运算符(算术、赋值、关系、逻辑、增1/减1、位、逗号、求字节数、指针)2、优先级(逻辑非算数运算符关系运算符逻辑与和逻辑或赋值运算符)3、结合性4、不同数据类型数据间的混合运算(自动转换和强制转换)第2、3章是给编写C程序做了一些准备知识第三章回顾复习4.1.1结构化程序设计思想的产生程序设计最初是追求空间和时间效率的,而现在追求的是程序的清晰度。一个好的程序首先应该具有良好的可读性,以方便检测、修改和维护。1971年NiklausWirth首次提出了结构化程序设计的思想。这个思想的重点是:不要求一步就编制成可执行的程序,而是要分若干步进行,也就是逐步求精。结构化程序设计方法又称为“自顶向下”法或“逐步求精”法。§4.1结构化程序设计4.1.2结构化程序设计的三种基本结构三种基本结构为:顺序结构、选择结构和循环结构。早在1966年就证明了只要有顺序、选择和循环三种形式的控制结构,就足以导出其它各式各样的程序结构。a.顺序结构顺序结构就是一组逐条执行的可执行语句。按照书写的顺序,自上而下的执行。b.选择结构选择结构是一种先对给定的条件进行判断,再根据判断的结果执行相应的命令的结构。4.1.2结构化程序设计的三种基本结构c.循环结构它是指多次重复执行同一组命令的结构。具有循环结构的程序一般必须指定循环的终止条件,以免进入无限循环(死循环)状态。用流程图来表示以上三种结构,更加直观形象、易于理解。本书中使用的是:传统流程图和N-S结构图(盒图)。4.1.2结构化程序设计的三种基本结构1.顺序结构的流程图:P60图4-1ABAB(a)传统流程图(b)N-S流程图实例:“回家”的顺序结构流程图:开锁开门进屋(a)传统流程图(b)N-S流程图开锁开门进屋4.1.2结构化程序设计的三种基本结构2.选择结构的流程图:P60图4-3(a)传统流程图(b)N-S流程图ABP真假P真假AB选择结构流程图的实例:(a)传统流程图(b)N-S流程图电影要开场真假看电影喝咖啡看电影喝咖啡电影要开场真假4.1.2结构化程序设计的三种基本结构3.循环结构有两种:当型循环和直到型循环当型循环结构的流程图:P61图4-5(a)传统流程图(b)N-S流程图AP真假P为真A直到型循环结构的流程图:P61图4-6P62图4-7、4-8实例(a)传统流程图(b)N-S流程图P为真A假AAP真当型循环结构:先判断后执行A直到型循环结构:先执行A后判断直到型循环结构比当型循环结构多执行一次循环体§4.2语句与分程序一、语句:用来对数据进行加工(完成操作任务)。是构成程序的基本单位。通常一个C程序由若干个函数(系统、用户)组成。二、C语句的分类可分为三大类:简单语句、复合语句、空语句(一)简单语句(1)表达式语句:由一个表达式后跟;构成,赋值语句:赋值表达式后加;号如s=3.1415*r*r;++i;(与++i不同)函数调用语句:函数调用表达式加一个;号如:printf(“Helloworld!\n”);(2)结构控制语句:控制程序流向选择语句(2个):if…elseswitch循环语句(3个):forwhiledo…while转向语句:continuebreakreturngoto(一)简单语句(二)复合语句:将一组语句括在一对{}中如:while(i100)//计算1到100的和{sum+=i;i++;}注意:1、复合语句的{}之后不能有;号2、复合语句中可以是简单句、复合语句、空语句(三)空语句:;/*仅有一个;号*/空语句什么也不做。有时用作被转向点,或者循环语句提供空体如:做大系统时,初步给出一个框架,以后再写具体语句如:for(i=0;i=10;i++);//以后编码;或者得到一个i值空语句赋值语句:即赋值表达式后加;号构成要区分赋值表达式与赋值语句如:if((a=b)0)t=a;前-表达式后-语句注意:赋值表达式可包含在其它表达式之中,而赋值语句不行赋值语句只能作为一条单独的语句,或放在符合语句中赋值语句用途很广§4.3顺序结构程序设计顺序结构程序:程序的执行顺序,就是程序的书写顺序顺序程序设计的步骤可以归纳为:(1)用预处理命令包含头文件或进行宏定义(2)定义变量(分配内存空间)(3)为变量赋初值(4)计算(5)输出结果例4.1:编写程序:输入x和y,交换它们的值,并输出交换前后的数。#include“stdio.h”voidmain(){doublex,y,temp;printf(“\npleaseinputtwodouble:”);scanf(“%lf%lf”,&x,&y);printf(“\nbeforechangedx=%6.2lfy=%6.2lf”,x,y);temp=x;//temp变量来完成交换工作x=y;y=temp;printf(“\nafterchangedx=%6.2lfy=%6.2lf”,x,y);}例4.2:编写程序:输入x和y,交换它们的值,并输出交换前后的数,交换时不能使用第三个变量。#include“stdio.h”voidmain(){intx,y,temp;printf(“\npleaseinputtwoint:”);scanf(“%d%d”,&x,&y);printf(“\nbeforechangedx=%3dy=%3d”,x,y);x=x^y;y=y^x;x=x^y;printf(“\nafterchangedx=%3dy=%3d”,x,y);}用到了位操作异或运算的可逆性,只适用于整数§4.4选择结构程序设计C程序中,能实现选择结构程序设计的语句有if条件语句和switch多分支语句。C语言中的if条件语句有三种形式:if形式、if…else形式和elseif形式。4.4.1引例将百分制的成绩转换成总评成绩。选修课:百分制成绩=60总评成绩及格[例4.3]编写程序输入一个学生选修课成绩的分数,输出该生的总评成绩。#include“stdio.h”voidmain(){intscore;printf(“\npleaseinputscore(0=score=100):”);scanf(“%d”,&score);if(score=60)printf(“Passed\n”);}[例4.4]编写程序输入一个学生考察课成绩的分数,输出该生的总评成绩。#include“stdio.h”voidmain(){intscore;printf(“\npleaseinputscore(0=score=100):”);scanf(“%d”,&score);if(score=60)printf(“Passed\n”);elseprintf(“Failed\n”);}[例4.5]编写程序输入一个学生考试课成绩的分数,输出该生的总评成绩。if(score60)printf(“Failed\n”);elseif(score70)printf(“Passed\n”);elseif(score80)printf(“Middling\n”);elseif(score90)printf(“Fine\n”);elseprintf(“Excellent\n”);4.4.2if语句一、if语句的三种形式1、条件执行if(e)Ae是条件,即关系表达式、者逻辑表达式、常量、变量如:if(a0)printf(“Aispositive.\n”);P69-例4.6、4.7、4.82、分支选择if(e)AelseB当e为真值(非0)时执行A,否则执行B或后续语句。如:if(a0)printf(“Aispositive.\n”);elseprintf(“Aisnotpositive.\n”);注意:A或B都可以是单一语句,也可以是复合语句(要用{})else部分不能独立存在。即else前面一定有一个;号,它必定是if语句的一部分。在C语言中,表达式e的值为非0时,系统均按“真值”处理如:if(‘a’)printf(“OK”);x=-5;if(x)printf(“OK”);4.4.2if语句一、if语句的三种形式1、if(e)A2、if(e)AelseBP71-例4.9、4.10如:注意区别==与=的区别y=0;if(y==0)printf(“OK”);if(y)printf(“OK”);3、elseif形式if(P1)S1elseif(P2)S2.elseif(Pn)SnelseSn+14.4.2if语句一、if语句的三种形式3、elseif形式P75-例4.11、例4.12if(P1)S1elseif(P2)S2.elseif(Pn)SnelseSn+1系统从上到下的逐个判断条件P,一旦发现某条件Pi满足时,则执行与它有关的语句Si,并跳过其它剩余的判断。若所有条件均不满足,执行最后一个else语句或后续语句。注意:一般else与其上最近的if匹配If语句的流程图如下表达式语句1下一条语句假真(a)传统流程图(b)N-S流程图表达式真假语句1下一条语句if...else形式的流程图如下(a)传统流程图(b)N-S流程图表达式真假语句1语句2下一条语句表达式语句1下一条语句假真语句24.4.2if语句一、if语句的三种形式二、if语句的嵌套if(P1){if(P2)A==AelseB}else{if(P3)C==BelseD}嵌套的if语句实现了多路分支,注意else与其上最近的if匹配(花括号除外),花括号可以改变else的层位4.4.2if语句一、if语句的三种形式二、if语句的嵌套三、条件运算符与条件表达式1、条件运算符:?和://C语言中唯一的三目运算符2、条件表达式:e1?e2:e3如:ab?a:b3、执行过程:(1)计算e1(2)e1值为非0(真),计算并返回e2的值否则计算并返回e3的值4、运算顺序:高于赋值运算符,低于算术、关系、逻辑运算2、条件表达式:e1?e2:e3如:ab?a:b3、执行过程:(1)计算e1(2)e1值为非0(真),计算并返回e2的值否则计算并返回e3的值4、运算顺序:高于赋值运算符,低于算术、关系、逻辑运算如:y=x==0?1:sin(x)/x;等价于:if(x==0)y=1;elsey=sin(x)/x;5、条件运算符的结合方向是“右结合”如:ab?a:cd?c:d等价于ab?a:(cd?c:d)P86-例4.17、4.18§4.5switch语句(开关语句)也称多分支选择语句,它比用嵌套的if语句实现多路分支问题,其程序结构清晰、易读。一、格式为:P80-81switch(e){caseC1:语句1;(break;)caseC2:语句2;caseC3:语句3;...caseCn:语句n;default语句n+1;}§4.5switch语句(开关语句)switch(e){caseC1:语句1;(break;)caseC2:语句2;caseC3:语句3;...caseCn:语句n;default语句n+1;}其中:表达式e可以是整型、字符型,不能是浮点型常量表达式Ci必须与表达式类型一致(整型与字符型通用)switch(e){caseC1:语句1;(break;)caseC2:语句2;caseC3:语句3;...caseCn:语句n;default语句n+1;}执行过程二、执行过程(P81-例4-14、4-15)1、计算表达式e的值2、若与常量表达式Ci值一致,则从语句i,开始执行;直到遇到break语句或switch语句的“}”3、若与任何常量表达式值均不一致时,则执行default语句,或执行后续语句。注意:1、常量表达式Ci仅起语句标号作用,不作求值判断2、常量表达式的值必须是唯一的,没有先后次序3、多个case语句可共用一组执行语句Switch语句的传统流程图如下所示:常量表达式1常量表达式2常量表达式n计算表达式语句n+1语句2语句n语句1真真真假假假[例4.19]输入一个纳税人的月收入,计算应缴纳的个人所得税。(P87