1
第五章选择结构程序设计学习 C语言的重要性拿到 计算机二级等级考试证书是找工作、进入北京、上海等大城市 必备 证书之一。
计算机等级考试简介全国计算机等级考试一年有 两次 。
上半年时间为 3月 28日至 4月 1日进行,
下半年为 9月 19日至 23日进行。
上午考笔试,下午考上机。
考试方式
1.笔试,满分 100分,其中含公共基础知识部分的 30
分。
2.上机,满分 100分。
上机操作包括,( 1)填空。 ( 2)改错。 ( 3)编程。
4
5.1 复合语句复合语句:用{ }括起来的若干语句。
如,{



}
if(a>b)
{
a=b;
b=a;
}
if(a>b)
{
temp=a;
a=b;
b=temp;
}
5
分支流程控制语句
循环流程控制语句控制语句能控制程序的流程,根据判断决定运行什么不运行什么。
6
1) if (表达式 ) 语句 ;
2) if (表达式 ) 语句 1;
else 语句 2;
If语句就是根据判断条件是否满足来决定执行给出的二种操作中那一种。
一、条件语句的二种形式,表达式语句
Y
N
5.2 if 语句表达式语句 1
Y
语句 2
N
7
例 5.1 输入两个整数,将大数送 max
main()
{ int a,b,max;
scanf("%d%d",&a,&b) ;
max=b;
if ( a>max) max=a;
printf("max=%d\",max) ;
}
printf("input tow int number:");main(){ int a,b,max;
scanf("%d%d",&a,&b) ;
if ( a>b) max=a;
else max=b;
printf("max=%d\",max) ;
}
8
课堂练习,以下 if 语句中正确的是,______
A) if (a>b) b++ else a++;
B) if (a>b) ;
{ b++;printf("%d",b); }
else {a++;printf("%d",a); }
C) if (a>b) b++; printf("%d",b);
else a++; printf ("%d",a);
D) if (a>b) { b++; printf("%d",b);}
else { a++; printf("%d",a);};
{
}
D
{
}
9
若变量都已正确说明,则以下程序段输出为 。
a=10;b=50;c=30;
if(a>b)a=b,
b=c;
c=a;
printf(“a=%d b=%d c=%d\n”,a,b,c);
A)a=10 b=50 c=10 B) a=10 b=30 c=10
C)a=50 b=30 c=10 D)a=50 b=30 c=50
A
10
下面的程序 。
main()
{
int x=3,y=1,z=0;
if(x=y+z) printf(“* * * * \n”);
else printf(“# # # # \n”);
}
A)有语法错误不能通过编译
B)输出 * * * *
C)可以通过编译,但是不能通过连接,因而不能运行
D)输出 # # # #。
B
11
比较下面两个程序,执行结果是否相同。
main()
{int a=3,b=2;
if(a<b)
{printf(“a<b\n”);
a++;b++;
}
printf(“a=%d,”,a);
printf(“b=%d\n”,b);
}
main()
{int a=3,b=2;
if(a<b)
printf(“a<b\n”);
a++;b++;
printf(“a=%d,”,a);
printf(“b=%d\n”,b);
}
a=3,b=2 a=4,b=3
12
例 5.1 输入两个整数 a和 b,如果 a小于 b,则将它们的值互换。例如,输入 a为 5,b为 7,互换后,a为 7,
b为 5。
#include<stdio.h>
void main()
{ int a,b,t;
scanf("%d%d",&a,&b) ;
if ( a<b ) {t=a;a=b;b=t;}
printf(“the result is,a=%d,b=%d\n”,a,b) ;
}
printf("input tow int number:");
13
c (较大者)
a( 较小者)
1、变量说明
2、输入三个数
3、按大小排序
4、按次序输出
b (较大者)
a (较小者)
b (较小者)
1
3
c,b,a
a
b
c
c (较大者) 2a
5.2 输入三个数,按从大到小顺序输出算法:
14
程序如下:
#include<stdio.h>
void main( )
{float a,b,c,t;
scanf("%f%f%f",&a,&b,&c);
if (a>b)
{t=a; a=b; b=t;}
if (a>c)
{t=a;a=c;c=t;}
if (b>c)
{t=b;b=c;c=t;}
printf("%5.2f,%5.2f,%5.2f",c,b,a);
}
若一个语句不能完成该操作可以使用复合语句用 { }括起来的多个语句组成一个复合语句
15
条件运算符条件运算符,?,
条件运算符需要 3个操作对象,条件表达式的一般形式为,
表达式 1? 表达式 2,表达式 3
条件表达式的运算顺序为,
首先计算 表达式 1 的值若表达式 1的值为 非 0,则计算 表达式 2 的值,其结果为条件表达式的值若表达式 1的值为 0,则计算 表达式 3 的值,其结果为条件表达式的值例如 if (a>b) max=a; else max=b;?max=(a>b?a:b)
(c>=?a?&&c<=?z?)?c-32:c)
(m>0?1:(m==0?0:-1))
16
如:求 b 的绝对值,
if (b<0)
abs_b= -b;
else abs_b= b;
abs_b= -b
abs_b= b
:b(b<0)?,b;
请练习:写出计算 c=a+|b| 的条件表达式,
if (b<0) c=a-b;
else c=a+b; c=b<0?a-b:a+b;
条件语句与条件运算符之间的关系条件运算符的优先级别高于赋值运算符
17
二,if语句的嵌套假表达式 1
语句块 2
真语句块 1
表达式 2
真假表达式 3
假真语句块 3
……
语句块 1
表达式 1真 假语句块
2
表达式 2真 假真 假表达式 3
语句块
3 ……
N-S流程图
if(表达式 1) 语句块 1
else if(表达式 2) 语句块 2
else if(表达式 3) 语句块 3
:
:
else if(表达式 m) 语句块 m
else 语句块 n
18
例 5,4:有一函数:
y=
-1 (x<0)
0 (x=0)
1 (x>0)
编一程序,输入一个 x值,输出 y值。
有以下几种写法,请大家判断那些正确?
程序 1:
main( )
{int x,y;
scanf("%d",&x);
if (x<0) y=-1;
else if (x==0) y=0;
else y=1;
printf("x=%d,y=%d\n",x,y);
}
程序 2:
.,,,,,
if (x>=0)
if (x>0) y=1;
else y=0;
else y=-1;
.,,,,,
X>=0
X>0
X==0
X<0
19
程序 3:
.,,,,
y=-1;
if (x!=0)
if (x>0) y=1;
else y=0;
.,,,,,
程序 4:
.,,,,
y=0;
if (x>=0)
if (x>0) y=1;
else y= -1;
.,,,,,
X<0 X=0
else else
程序 1结果:
x<0 y=-1
x=0 y=0
x>0 y=1
程序 2结果:
x<0 y=-1
x=0 y=0
x>0 y=1
程序 3结果:
x<0 y=0
x=0 y=-1
x>0 y=1
程序 4结果,
x<0 y=0
x=0 y=-1
x>0 y=1
对 对 错 错
20
例题 5.3 判断某年是闰年 (该年为 year)
能被 4整除且不能被 100整除 能被 400整除能被 4整除 不能被 100整除 能被 400整除且 或
year%4==0 year%100! =0 year%400==0&& ||
C语言表达式为,
( year%4==0&&year%100! =0) ||year%400==0
21
year能被 4整除
year能被 100整除
year能被 400整除真 假真 假真 假真 假flag
flag=1 flag=0
flag=1 flag=0
输出,闰年” 输出“非闰年”
N - S 流程图:
22
程序如下:
#include<stdio.h>
void main()
{
int year,flag;
scanf("%d",&year);
if(year%4==0)
{ if(year%100==0)
{ if(year%400==0) flag=1;
else flag=0;
}
else flag=1;
}
else flag=0;
if (flag)
printf("%d is a leap year.\n",year);
else
printf("%d is not a lear year.\n",year);
}
#include<stdio.h>
void main()
{
int year;
scanf("%d",&year);
if( year%4==0&&year%100! =0||year%400==0)
printf("%d is a leap year.\n",year);
else
printf("%d is not a lear year.\n",year);
}
23
if语句是在二种情况中作出选择,一旦要选择的条件比较多,
用 if层层嵌套就比较麻烦。 Switch语句可以对 多分支 进行选择。
格式,switch (表达式)
{ case 常量表达式 1:语句 1;
case 常量表达式 2:语句 2;
.,,,,,
case 常量表达式 n:语句 n;
default,语句 n+1;
}
5.3 switch语句执行过程
( 1)当 switch后面“表达式”的值,与某个 case后面的“常量表达式”的值相同时,就执行该 case后面的语句(组);当执行到 break语句时,跳出 switch语句,转向执行 switch语句的下一条。
( 2)如果没有任何一个 case后面的“常量表达式”的值,与
“表达式”的值匹配,则执行 default 后面的语句(组)。然后再执行 switch语句的下一条。
24
若要每执行一条语句即跳出 switch语句,必须使用
break格式:
switch (表达式)
{
case 常量表达式 1:语句 1; break;
case 常量表达式 2:语句 2; break;
.,,,,,
case 常量表达式 n:语句 n; break;
default,语句 n+1;
}
25
例题 5.4,用整数 0~ 6依次表示星期日至星期六。由键盘输入一个整数,输出对应整数的英文表示。如果输入的整数在 0~ 6 之外,输出 "输入数据错误 "信息。
main( )
{ int day;
scanf("%d",&day);
switch(day)
{ case 0,printf("Sunday\n"); break;
case 1,printf("Monday\n"); break;
case 2,printf("Tuesday\n"); break;
case 3,printf("Wednesday\n"); break;
case 4,printf("Thursday\n"); break;
case 5,printf("Friday\n"); break;
case 6,printf("Saturday\n"); break;
default,printf("The number is wrong!\n");
}
}
26
使用 switch语句时应注意:
条 件表达式的类型与其后常量表达式类型应一致,条件表达式的类型只能使用 整型 或 字符 型。
2,case后的常量表达式应为常数,也可以是不含变量的常数表达式,
但不能为变量,也不能为逗号表达式。
3.case 后的常量表达式的值不能有相同的,如果有相同就意味着有两个入口,使程序产生混乱 。
4.“case 常量表达式:”只起标号作用,而不是在该处进行条件判断,
在执行 switch语句时,系统根据 switch后面表达式的值找到匹配的入口标号,并由此 下滑 执行,不再进行判断 。
switch (x )
{ case 9.5:语句 1;
case 8.5:语句 2;
}
switch (score/10)
{ case 6,7,8,9,10:输出合格;
case 0,1,2,3,4,5:输出不合格;
}
× ×
27
课堂练习:找出下面程序中的错误。
main( )
{ int a;
float x;
scanf("%d%f ",&a,&x);
switch (x) {
case3.14,printf("PI=%f \n",x);
case a,b,printf("a=%d\n",a);
case 'a'+1,printf("It is %c \n",x);
break;
default,printf("Unknown ! \n ");
break;
case 98,printf("It is %c \n",x);
break;
}
}
条件表达式的类型只能是整型或字符型常量表达式不能为变量或逗号表达式常量表达式的值不能有相同的
case?与常量表达式之间必须空格
28
执行下列程序段后,变量 i 的正确结果是:
int i=10;
switch(i)
{case 9:i+=1;
case 10:i+=1;
case 11:i+=1;
case 12:i+=1;
}
A)10
B)11
C)12
D)13
练习:
29
例 5.5 已知某公司员工的保底薪水为 500,某月所接工程的利润
profit( 整数 ) 与利润提成的关系如下 ( 计量单位:元 ),
profit≤1000 没有提成;
1000< profit≤2000 提成 10%;
2000< profit≤5000 提成 15%;
5000< profit≤10000 提成 20%;
10000< profit 提成 25%。
算法设计要点:
为使用 switch语句,必须将利润 profit与提成的关系,转换成某些整数与提成的关系 。 分析本题可知,提成的变化点都是 1000的整数倍 ( 1000,2000,5000,…… ),如果将利润 profit整除 1000,则当:
profit≤1000 对应 0,1
1000< profit≤2000 对应 1,2
2000< profit≤5000 对应 2,3,4,5
5000< profit≤10000 对应 5,6,7,8,9,10
10000< profit 对应 10,11,12,……
30
为解决相邻两个区间的重叠问题,最简单的方法就是:利润
profit先减 1( 最小增量 ),然后再整除 1000即可:
profit≤1000 对应 0
1000< profit≤2000 对应 1
2000< profit≤5000 对应 2,3,4
5000< profit≤10000 对应 5,6,7,8,9
10000< profit 对应 10,11,12,……
main()
{long profit;
int grade;
float salary=500;
printf("Input profit,");
scanf("%ld",&profit);
grade= (profit – 1) / 1000;/*将利润 -1,再整除 1000,
转化成 switch语句中的 case标号 */
31
switch (grade)
{ case 0,break; /*profit≤1000 */
case 1,salary += profit*0.1; break; /*1000< profit≤2000 */
case 2:
case 3:
case 4,salary += profit*0.15; break; /*2000< profit≤5000 */
case 5:
case 6:
case 7:
case 8:
case 9,salary += profit*0.2; break; /*5000< profit≤10000 */
default,salary += profit*0.25; /*10000< profit */
}
printf("salary=%.2f\n",salary);
}
32
习题 5.9 根据学生成绩等级划分成绩段。
main( )
{char grade;
scanf("%c",&grade);
if (grade>=0&&grade<=100)
{ if (grade>85)
printf(“very good.\n");
else if (grade>=60) printf(“good.\n");
else printf(“no good.\n");
}
else printf(“data error.\n");
}
33
习题 5.10
#include "math.h"
main()
{ float x,y,z;
scanf("%f",&x);
if(x<=2.5) y=x*x+1;
else y=x*x-1;
switch ((int)x)
{ case 1,z=3*x+5; break;
case 2,z= 2*sin(x)-1; break;
case 3,
case 4:z=sqrt(1+x*x); break;
case 5:
case 6:
case 7:z=x*x-2*x+5; break;
default,z=0;
}
printf("x=%f,y=%f,z=%f \n",x,y,z);
}