前记
C语言中如何表示“真”和“假”? // 0 -- 假
// 1 -- 真
系统如何判断一个量的“真“和“假"? // 0 -- 假
//非0 -- 真
eg:
-1 //数值角度看非0 -- 真
0 //数值角度看0 -- 假
'\0' //数值角度看是0,0 -- 假
'a' //数值角度看是97,非0 -- 真
(优先级)算术 > 关系运算 > 逻辑运算 > 赋值 > 逗号
分支结构的概念
功能:做选择,做选择的核心是判断
判断的过程:通过关系运算构造出判断的条件
语句对比: if //条件判断
switch //值的计算与匹配
关系运算 (大小关系)
>
>=
<
<=
==
!=
eg:
1 > 2 //这是关系运算表达式
//是表达式就会有结果和数据类型
关系运算的结果:
真为1
假为0
eg:
int a = 2;
1<a<3
//由结合性可知,从做向右进行关系运算
//step1: 1<a //结果是1
//step2:1<3 //结果是1
//所以最终的结果是
eg:
练习:
a = 1, b = 2 ,c = 3
a>b==c //0
a+b>c //0
a=(b>c) //给a赋值0
a=b>c //由优先级知,这步是给a赋值0
逻辑运算
作用:用来 组合 多个关系
内容:
与(&&)
规则: 一假则假
格式:表达式1 && 表达式2
或(||)
规则: 一真则真
格式:表达式1 || 表达式2
非(!)
规则:真假相对
格式:!表达式
重点,易错!!!!!!!!!
&&截断特性:表达式从左往右执行,左侧表达式为假,右侧的表达式就不计算了
||截断特性:表达式从左往右执行,左侧表达式为真,右侧的表达式就不计算了
1、 表达式 10!=9 的值是__1__
2、 设x,y,z和t均为int型变量,执行以下语句:
x=y=z=1;
t=++x||++y&&++z;
后t的值为___1___
t = (++x) || ((++y) && (++z));
3、
int a = 0,b = 1;
int value = 0;
value = a && b; //0
value = a || b; //1
value = a++ && b++; //0 1 1
value = --a || b --; //1 -1 1
value = (a + b) || (a - b); //1
value = (a - b) && (a + b); //1
value = !a; //1
printf("value = %d a = %d b = %d",value,a,b);
一、if语句
形式1:
if (表达式) //表达式 做判断的条件
{
语句
}
含义:
首先,判断 "表达式"
真
执行 语句
语句执行完,表示if语句结束,程序继续往下
假
表示不执行if语句,程序继续往下
注意:
if (表达式) ; //格式error,因为这里不加(;)
{
语句;
}
形式2:
if (表达式)
{
语句1
}
else
{
语句2
}
含义:
首先 判断"表达式"
真:
执行 ”语句1"
语句1 执行完,表示if语句结束,程序继续往下
假:
执行 ”语句2"
语句2 执行完,表示if语句结束,程序继续往下
练习:
输入两个数,找出最大值
找出三个中的最大值
eg:找出三个中的最大值
#include<stdio.h>
int main()
{
int a,b,c,d;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
d = a;
if(d>c)
{
printf("%d\n",d);
}
else
printf("%d\n",c);
}
else
{
d=b;
if(d>c)
printf("%d\n",d);
else
printf("%d\n",c);
}
return 0;
}
形式3: 多分支语句
if (表达式1) //注意: 不能加分号
{
语句1
}else if (表达式2) //注意: 不能加分号
{
语句2;
}else if (表达式3)//注意: 不能加分号
{
语句3;
}else if (表达式n)//注意: 不能加分号
{
}else
{
}
含义:
判断 "表达式1"
真 执行 "语句1" 语句1 执行完,表示if语句结束,程序继续往下
假
判断"表达式2"
真 执行 "语句2" 语句2 执行完,表示if语句结束,程序继续往下
假
判断"表达式3"
真 执行 "语句3" 语句3 执行完,表示if语句结束,程序继续往下
假
...
判断"表达式n"
真 执行 "语句n" 语句n 执行完,表示if语句结束,程序继续往下
假
执行 else后面语句 ,执行完,程序继续往下
注意:
1.不存在单独的else语句 ,else出现一定有一个if与之对应
2.else 与 if匹配规则:
a. 一定从最里面开始匹配
b. else 与 最近 前面一个if匹配
3.当if后边不加大括号时,紧跟着if的一个语句会受if限制,其余的按顺序执行
--------------------------练习1-------------------------
学生成绩:
90-100 --- A
80-89 --- B
70-79 --- C
60-69 --- D
<=59 --- E
#include<stdio.h>
int main()
{
int score;
scanf("%d",&score);
if(90 <= score && score <= 100)
{
printf("A");
}
else if(80 <= score && score < 90)
{
printf("B");
}
else if(70 <= score && score < 80)
{
printf("C");
}
else if(60 <= score && score < 70)
{
printf("D");
}
else
{
printf("E");
}
return 0;
}
--------------------------练习2-------------------------
判断一个年份是不是闰年
注:
普通闰年:
公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、2020年就是闰年)。
世纪闰年:
公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。
条件:
1. 能被4整除 同时 不能被100 整除
2. 能被400整除
#include<stdio.h>
int main()
{
int year,Y1,Y2,Y3;
scanf("%d",&year);
Y1 = year%400;
Y2 = year%4;
Y3 = year%100;
if(Y1 == 0 ||(Y2 == 0 && Y3 != 0))
printf("Is leap_year\n");
else
printf("Not leap_year\n");
return 0;
}
--------------------------练习3----------------------------
输入一个月份,输出对应月份的天数
1 3 5 7 8 10 12 -- 31天
4 6 9 11 -- 30天
2 -- 29
28
#include<stdio.h>
int main()
{
int year,month,Y1,Y2,Y3;
scanf("%d%d",&year,&month);
if(1 <= month && month <=7)
{
if(month%2 != 0)
{
printf("30\n");
}
else if((month%2 == 0) && month != 2)
{
printf("31\n");
}
else
{
Y1 = year%400;
Y2 = year%4;
Y3 = year%100;
if(Y1 == 0 ||(Y2 == 0 && Y3 != 0))
printf("29\n");
else
printf("28\n");
}
}
else if(8 <= month && month <=12)
{
if(month%2 != 0)
{
printf("31\n");
}
else
printf("30\n");
}
else
{
printf("请输入1-12的数字\n");
}
return 0;
}
二、switch语句(多分支的情况)
switch(表达式) //整型表达式
{
case 常量表达式: //1+b(error,因为b是变量)
语句; //可在不带花括号的情况下,使用使用多条语句,甚至也可不放语句
break;
case 常量表达式:
语句;
break;
case 常量表达式:
语句;
break;
default: //默认
语句;
break;
}
含义:
求解 "表达式"
根据 结果 ,匹配 下面case后面的值
匹配上后,
则执行对应case下的语句 ,
直到遇到了break 或者是switch 右} (花括号) //所以就可以实现一下效果,在3456情况下打印3
注意:
1.switch 后表达式 需要是一个整型表达式
2.case后面是,常量表达式,不能出现变量
注意:
1.case 其实是一个 标签 lable //类似书签
2.switch 只会匹配一次
3.default 写错,不会报语法问题,但是写错后,就起不到default的作用
4.default 书写的位置,没有明确规定,如果default写到前面,一定要把break写上
写出下面程序的输入结果:
int a = 5;
switch(a)
{
case 2: printf("2\n");
default: printf("不存在该选项\n");
case 4:
case 1: printf("1\n");
case 3: printf("3\n");break;
case 0: printf("0\n");
}
答:打印 不存在该选项
问:
如果default写错了,
假设把default换成dafualt,会是什么结果?
在default写错的情况下 int a = 2;
写出相应的结果,并思考原因。
答:打印 2
不存在该选项
练习:
练习1: 四则运算
计算器程序。
用户输入运算数和四则运算符,输出计算结果。
练习2:百分制度 --- 等级制
switch实现
学生成绩:
90-100 --- A
80-89 --- B
70-79 --- C
60-69 --- D
<=59 --- E
练习3:获取月份的天数
switch实现一下
1 #include<stdio.h>
2
3 int main()
4 {
5 --------------练习1--------------------
6 int a,b;
7 char ch;
8 scanf("%d %c %d",&a,&ch,&b);
9
10 switch(ch)
11 {
12 case '+':
13 printf("%d\n",a+b);
14 break;
15 case '-':
16 printf("%d\n",a-b);
17 break;
18 case '*':
19 printf("%d\n",a*b);
20 break;
21 case '/':
22 printf("%g\n",(float)a/b);
23 break;
24 default:
25 printf("输入错误,请重新输入:>\n");
26 break;
27
28 }
29
30 ---------------练习2------------------
31
32 int score,ret;
33 scanf("%d",&score);
34
35 ret = score/10;
36
37 switch(ret)
38 {
39 case 10:
40 case 9:
41 printf("A\n");
42 break;
43 case 8:
44 printf("B\n");
45 break;
46 case 7:
47 printf("C\n");
48 break;
49 case 6:
50 printf("D\n");
51 break;
52 case 5:
53 case 4:
54 case 3:
55 case 2:
56 case 1:
57 case 0:
58 printf("E\n");
59 break;
60 default:
61 printf("error\n");
62
63 }
64
65 ---------------练习3--------------------
66 int month,year,Y1,Y2,Y3;
67
68 scanf("%d%d",&year,&month);
69
70 switch(month)
71 {
72 case 1:
73 case 3:
74 case 5:
75 case 7:
76 case 8:
77 case 10:
78 case 12:
79 printf("31");
80 case 4:
81 case 6:
82 case 9:
83 case 11:
84 printf("30");
85 case 2:
86 Y1 = year%400;
87 Y2 = year%4;
88 Y3 = year%100;
89
90 if(Y1 == 0 ||(Y2 == 0 && Y3 != 0))
91 printf("29\n");
92 else
93 printf("28\n");
94 }
95
96 return 0;
97 }
四、三目运算符(条件运算)
表达式1 ? 表达式2 : 表达式3
问一问 表达式1 ? --是真 还是 假
真 ,执行 表达式2
假 ,执行 表达式3