• 1. 第4章 顺序和选择结构程序设计
  • 2. 4.1 结构化程序设计三种基本结构: 顺序结构: 一组逐条执行的可执行语句。按书写顺序自上而下执行。 选择结构: 先对给定条件进行判断,再根据判断的结果执行相应的语句。 循环结构: 多次重复执行同一组语句。
  • 3. 4.2 语句和分程序C语言的执行部分由执行语句组成,执行语句的种类主要有: 表达式语句:表达式后加上分号,有效的表达式一般都要有赋值运算 函数调用语句:由函数名、实际参数和分号构成 控制语句:控制程序流程的语句,一般是改变了顺序结构的语句,包括分支、循环和转向语句 复合语句(或称分程序):用{和}把数据说明语句和若干个有序的执行语句组合在一起而构成的,在语法上相当于一个简单语句 空语句:什么也不存在的语句,只有一个分号
  • 4. 4.3 顺序结构程序设计顺序结构程序设计就是将语句按照正确的逻辑规则由上而下逐条编写,执行时按顺序执行。每条语句执行一次。 顺序结构程序设计的步骤: 预处理命令包含头文件或进行宏定义 定义变量 为变量赋值 计算 输出结果
  • 5. 4.4 选择结构程序设计选择结构就是程序中语句按顺序从上到下执行时,其中某些程序可能执行,也可能不执行,需要在程序运行时进行选择。 C语言中实现选择结构程序设计的语句有: if条件语句 if形式 if…else形式 else if形式 if语句的嵌套 switch多分支语句
  • 6. 4.4.1 if形式if形式是最简单的条件语句, 格式是 if(表达式) 语句1; 语句2; 功能:检测表达式,如果表达式的值为非0,则执行语句1,然后执行语句2;如果表达式的值为0,则直接执行语句2。 表达式语句1语句2假真例如: if (x>y) printf("%d",x);
  • 7. 注意: 表达式必须用圆括号括起来,不能省略 表达式可以使用关系表达式,也可以使用逻辑运算符连接关系表达式;还可以是一般表达式,甚至使用一个常量或一个变量,例如if(x),或者if(3) 要注意区分赋值号=和关系运算符== 语句1可以是单个语句,也可以是复合语句。使用单个语句时必须要用分号结束;超过一条语句就必须用复合语句,要用花括号{}将一组带分号的语句扩起来,此时{}外不需要加分号
  • 8. 例4.7 输入两个数a和b,若a>b,则将两个数交换位置,否则保持不变 #include”stdio.h” void main() { int a,b,temp; printf(“\nPlease input two int number:”); scanf(“%d%d”,&a,&b); if(a>b) { temp=a; a=b; b=temp; } printf(“%d,%d”,a,b); } 为什么要定义变量temp?
  • 9. 这种形式允许在条件表达式为假时指定要执行的语句 If (表达式 ) 语句1; else 语句2; 下一条语句; 功能:检测表达式,如果值为真(非0),则执行语句1,然后执行下一条语句;如果值为假(0),则执行语句2,然后执行下一条语句。 4.4.2 if…else形式例: if(x>y) printf("%d", x); else printf(" %d", y);表达式语句1语句2假真下一条语句
  • 10. 编程求 x2+3x-1 (x<=3) Y= x2-2x+5 (x>3) 显然,这应该是一个分支结构的程序。它要根据x的不同取值范围,求得不同的y。判断条件:x<=3 吗?例:求分段函数的解
  • 11. 结构 如下: 如果 x<=3 那么 y=x*x+3*x-1 否则 y=x*x-2*x+5 用c 语言表示: if (x<=3) y=x*x+3*x-1; else y=x*x-2*x+5;输入输出分析: 输入:x 输出:y 变量类型:单精度实型
  • 12. 流程图开始输入xX<=3?y=x*x-2*x+5y=x*x+3*x-1输出y结束YN
  • 13. #include”stdio.h” main() { float x,y; printf(“input x:”); scanf(“%f”,&x); if (x<=3) y=x*x+3*x-1; else y=x*x-2*x+5; printf(“y=%f”,y); }注意程序的书写采用缩进式,也称为锯齿形书写格式。
  • 14. 例:求两个数的商 输入两个数,求两个数的商,要求除数不为零时输出商,除数为零时提示用户输入有误。 #include”sdtio.h” void main() { int a,b; printf(“Please input two int number:”); scanf(“%d%d”,&a,&b); if(b==0) printf(“Divided by zero!\n”); else printf(“%lf\n”,1.0*a/b); }#include”sdtio.h” #include”math.h” void main() { float a,b; printf(“Please input two float number:”); scanf(“%f%f”,&a,&b); if (fabs(b)<=1e-6) printf(“Divided by zero!\n”); else printf(“%f\n”,a/b); }
  • 15. if (表达式1) 语句1; else if (表达式2) 语句2; [else if (表达式3) 语句3;] … [else 语句 n+1;] 下一条语句 4.4.3 else if 形式表达式1语句1语句n+1假真表达式2语句2假真…表达式n语句n假真下一条语句…
  • 16. else if的功能是按表达式的顺序进行判断,最早值为真的表达式i将引起相应的语句i的执行,并且不再判断其他条件(表达式),转到下一条语句执行。若全部表达式为假,则执行语句n+1. 注意条件语句的书写,要考虑到所有情况,最好按照某种顺序书写。建议使用流程图。 例:P74 考试成绩的判断 例:P76 收费站收费标准
  • 17. 4.4.4 嵌套的if语句嵌套的if语句是指if条件语句的三种形式的语句中又包含了一个或者多个if条件语句。 当嵌套if语句时,要注意“悬空else”的问题。 if (y!=0) if(x!=0) result=x/y; else printf(“Error:y is equal to 0\n”); 上面的else究竟属于哪一个if语句呢? C语言的规则是:else子句应该属于离它最近的且还未和其它else匹配的if语句。所以此例中,else子句实际上属于内层的if语句。如果要使else与外层if匹配,可以把内层if语句用大括号括起来。
  • 18. #include”stdio.h” #include "math.h" main( ) { float x,y; printf("input x="); scanf("%f",&x); if (x<=2) y=x*(x-3)+2.5; else if (x<=7) y=sqrt(7-x)+log(x-2); else y=(x-5)/3; printf("x=%7.3f y=%7.3f\n",x,y); }此处不需要写成 X>2 && x<=7例:分段函数
  • 19. 4.5 switch语句语法格式 switch(表达式) { case 常量表达式1:语句1 ;[break;] case 常量表达式2:语句2 ;[break;] : case 常量表达式n:语句n ;[break;] [default :语句序列n+1 ] } 功能: 根据switch后面表达式的值找到匹配的入口处,然后从该入口处开始执行下去,不再进行判断。若没有与表达式相等的常量表达式,则执行default语句后面的语句n+1.default语句可以省略。
  • 20. =常量表达式1语句1语句n+1假真语句2假真…语句n假真下一条语句…计算表达式=常量表达式2=常量表达式n注意: (1)表达式和常量表达式的数据类型应该是整型或字符型,不能是浮点型。 (2)多个case可以共用一组执行语句。 (3)可以用break语句使流程跳出switch结构,即终止switch语句。 例:P82
  • 21. 4.6 条件运算符格式: 表达式1?表达式2:表达式3 功能:先求表达式1的值,若表达式1的值为真,则表达式2的值为整个表达式的值,否则表达式3的值为整个表达式的值。 条件运算符的结合性自右向左,优先级低于逻辑运算符,高于赋值运算和逗号运算符。例如:c=a>b?a:b; 等价于if(a>b) c=a; else c=b;
  • 22. 例4.5main() { char ch; printf("input ch="); scanf("%c",&ch); ch= ch>='a' && ch<='z’ ? ch-32:ch; printf("%c\n",ch); }