第三课

一、判断

1.if语句

一个基本的if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果不是零,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。

if语句这一行结束的时候并没有表示语句结束的“;”,而后面的赋值语句写在if的下一行,并且缩进了,在这一行结束的时候有一个表示语句结束的“;”。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句,决定它是否要被执行。

常见的错误:

①忘了{}

②if后面的分号

③错误使用==和=

④使人困惑的else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main()
{
const int pass=60;
int score;

printf("请输入成绩:");
scanf("%d", &score);

printf("你输入的成绩是%d.\n", score);
if ( score < pass )
printf("很遗憾,这个成绩没有及格。");
else
printf("祝贺你,这个成绩及格了。");
printf("再见\n");

return 0;
}

会输出“再见”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
const int pass=60;
int score;

printf("请输入成绩:");
scanf("%d", &score);

printf("你输入的成绩是%d.\n", score);
if ( score < pass )
printf("很遗憾,这个成绩没有及格。");
else {
printf("祝贺你,这个成绩及格了。");
printf("再见\n");
}

return 0;
}

不会输出“再见”

2.否则的话

找钱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int price = 0;
int bill = 0;

printf("请输入金额:");
scanf("%d", &price);
printf("请输入票面:");
scanf("%d", &bill);

if ( bill >= price) {
printf("应该找您:%d\n", bill - price);
} else {
printf("您的钱不够\n");
}

return 0;
}

bill>=price,输出“应该找您:”

bill<price,输出“您的钱不够”

比较大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int a,b;

printf("请输入两个整数:");
scanf("%d %d", &a, &b);

int max = 0;
if ( a > b ) {
max = a;
} else {
max = b;
}

printf("大的那个是%d\n", max);

return 0;
}

内容多,但易懂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main()
{
int a,b;

printf("请输入两个整数:");
scanf("%d %d", &a, &b);

int max = b;
if ( a > b ) {
max = a;
}

printf("大的那个是%d\n", max);

return 0;
}

内容少,但难懂

3.判断的条件关系运算

①当两个值的关系符合关系运算符的预期时,关系运算符的结果为整数1,否则为整数0

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
printf("%d\n", 2==1);
printf("%d\n", 2>1);
printf("%d\n", 2<=1);

return 0;
}

运行结果为:

0

1

0

②所有的关系运算符的优先级比算术运算的低,但是比赋值运算的高

1
2
3
4
5
6
7
8
#include<stdio.h>

int main()
{
printd("%d\n", 3>=1+2);

return 0;
}

运行结果为1

4.条件判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main()
{
int hour1, minute1;
int hour2, minute2;

scanf("%d %d", &hour1, &minute1);
scanf("%d %d", &hour2, &minute2);

int ih = hour2-hour1;
int im = minute2-minute1;
if ( im<0 ) {
im = 60+im;
ih --;
}

printf("时间差是%d小时%d分。、n", ih, im);

return 0;
}

结构

1
2
3
if ( 成立条件 ) {
......
}

二、分支

1.多路分支switch-case语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main()
{
int type;

scanf("%d", &type);

if ( type==1 )
printf("你好");
else if ( type==2 )
printf("早上好");
else if ( type==3 )
printf("晚上好");
else if ( type==4 )
printf("再见");
else
printf("啊,什么啊?");

return 0;
}

等同于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main()
{
int type;

scanf("%d", &type);

switch ( type ) {
case 1:
printf("你好");
break;
case 2:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
break;
default:
printf("啊,什么啊?");
}

return 0;
}

结构

1
2
3
4
5
6
7
8
9
10
11
switch ( 控制变量式 ) {
case 常量:
语句
......
case 常量:
语句
......
case 常量:
语句
......
}

①控制表达式只能是整数型结果

②常量可以是常数,也可以是常数计算的表达式

switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。

2.级联的if-else if

分段函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main()
{
int x;

scanf("%d", &x);

int f=0;
if ( x < 0 ) {
f = -1;
} else {
if ( x == 0 ) {
f = 0;
} else {
f = 2 * x;
}
}

printf("%d\n", f);

return 0;
}

简化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main()
{
int x;

scanf("%d", &x);

int f=0;
if ( x < 0 ) {
f = -1;
} else if ( x == 0 ) {
f = 0;
} else {
f = 2 * x;
}

printf("%d\n", f);

return 0;
}

单一出口,灵活

等同于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int x;

scanf("%d", &x);

if ( x < 0 ) {
printf("%d", -1);
} else if ( x == 0 ) {
printf("%d", 0);
} else {
printf("%d", 2 * x);
}

printf("%d\n", f);

return 0;
}

多个出口,死板

结构

1
2
3
4
5
6
if ( exp1 )
stl;
else if ( exp2 )
st2;
else
st3;

3.嵌套的if-else

比较3个数大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main()
{
int a,b,c;
scanf("%d %d %d", &a, &b, &c);

int max = 0;

if ( a > b ) {
if ( a > c) {
max = a;
} else {
max = c;
}
} else {
if ( b > c ) {
max = b;
} else {
max = c;
}
}

printf("The max is %d\n", max);

return 0;
}

等同于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main()
{
int a,b,c;
scanf("%d %d %d", &a, &b, &c);

int max = 0;

if ( a > b )
if ( a > c)
max = a;
else
max = c;
else
if ( b > c )
max = b;
else
max = c;

printf("The max is %d\n", max);

return 0;
}

判断:当if的条件满足或者不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
const int ready = 24;
int code = 0;
int count = 0;

scanf("%d %d", &code, &count);
if ( code == ready )
if ( count < 20 )
printf("一切正常\n");
else
printf("继续等待\n");

return 0;
}

①else总是和最近的那个if匹配

②缩进格式不能暗示else的匹配

※在if或else后面总是用{},即使只有一条语句的时候