大学C语言程序设计
chapter 2 分支结构
1. 三大结构的认识
编程语言的三大结构:
- 顺序结构:从上至下,从左至右的执行;
- 分支结构(选择结构):满足条件就执行:if, switch;
- 循环结构:满足条件就一直执行,直到不满足时退出:for, while。
学习分支结构前,我们需要了解一个概念:什么叫条件?
条件:在这里是一个关系表达式,或者是一个布尔类型的变量,其结果表示成立与否,那么它就只有两种结果:成立(true),不成立(false),而在计算机中成立用 '!0' 代替, 不成立用 '0' 代替。
当然布尔类型在C99并不存在,而在C++中是存在的,这里作为对条件这一概念的认识。
bool flag = true;// 1
bool flag = false;// 0
不过C99之前,人们也时常用 int 来表示布尔类型,毕竟它可以赋值为 1 and 0.
int flag=1;
int flag=0;
2. 关系表达式
等于 | 不等于 | 大于 | 小于 | 大于等于 | 小于等于 |
---|---|---|---|---|---|
== | != | > | < | >= | <= |
3. 逻辑表达式
符号 | 名字 | 使用格式 | 备注 | 样例 | 样例 |
---|---|---|---|---|---|
&& | 逻辑与 | a&&b | 同真为真 | 1&&1=1 | 1&&0=0 |
|| | 逻辑或 | a||b | 同假为假 | 1||0=1 | 0||0=0 |
! | 逻辑非 | !a | 非假即真,非真即假 | !0=1 | !1=0 |
& | 按位与 | a&b | 同真为真 | 1&0=0 | 1100 & 1001=1000 |
| | 按位或 | a|b | 同假为假 | 1|0=1 | 1100 | 1001=1101 |
~ | 按位取反 | ~a | 非假即真,非真即假 | ~1=0 | ~1010=0101 |
4. if语句
if(flag){} 、 if(flag)else{} 、if(flag){} else if(flag){} else{}、....
if...else...
bool flag = true;
布尔类型,只有两种格式:true, false
也可以记作1和0,0表示false, 非0表示true
bool flag = true;
if(flag){ //如果flag为真,就执行{}中的内容,否则不执行
//
}
bool flag=0;
if(flag){ //如果flag为真,就执行{}中的内容,否则不执行
//
}else{ //如果if不执行,就执行else{}中的内容
//
}
bool flag=0;
if(flag){//如果flag为真,就执行{}中的内容,否则不执行
//
}else if(flag){//如果前面没有if执行,并且满足现在if的条件,就执行else{}中的内容
//
}else if(flag){//如果前面没有if执行,并且满足现在if的条件,就执行else{}中的内容
//
}else{ //如果没有任何一个if执行,就执行else{}中的内容
//
}
5. if案例练习
【题目描述】输入一个整数,判断其是奇数还是偶数
输入样例:10
输出样例:10是偶数
#include<stdio.h>
int main(){
int n; scanf("%d", &n);
if(n%2==0){ //判断两个数相等用双等于; 奇偶数的判断还可以使用(n&1)
printf("%d是偶数", n);
}else{
printf("%d是奇数", n);
}
return 0;
}
【题目描述】输入年份year,输出该年份是否为闰年。
判断闰年的方法:年份能被4整除但不能被100整除或者年份能被400整除的称为闰年。
输入样例:2020
输出样例:2020是闰年
输入样例:2021
输出样例:2021不是闰年
#include<stdio.h>
int main(){
int year; scanf("%d", &year);
bool flag = (year%4==0 && year%100!=0)||(year%400==0);
if(flag){
printf("%d是闰年", year);
}else{
printf("%d不是闰年", year);
}
return 0;
}
6. 条件表达式
格式:<表达式1>?<表达式2>:<表达式3>
条件表达式要求有三个操作对象,"?"和":"一起出现在条件表达式中,称三目(元)运算符,它是C++中唯一的一个三目运算符。
条件表达式的运算规则:
(1)计算表达式1的值。
(2)若表达式1的值为真(或非0),则只计算表达式2,并将其结果作为整个表达式的值。
(3)反之,若表达式1 的值为假(或为0),则只计算表达式3,并将其结果作为整个表达式的值。
举例:求a,b的最大值
int maxn = a>b ? a:b;
举例:求a,b的最小值
int maxn = a<b ? a:b;
7. switch
本质上 switch 和 if 是相通的,满足条件就执行。
int main() {
int num; scanf("%d", &num);
switch(num) {
case -1: printf("-1\n"); break; //退出
case 1: printf("1\n"); break;
case 0: printf("0\n"); break;
default: //如果前面没有case执行,就执行
printf("ERROR\n"); break;
}
return 0;
}
【题目描述】根据输入的表示星期几的数字,对应输出它的英文名称。
1、星期一:Monday
2、星期二:Tuesday
3、星期三:Wednesday
4、星期四:Thursday
5、星期五:Friday
6、星期六:Saturday
7、星期日:Sunday
错误输入请输出:input error!
输入格式:输入的表示星期几的数字。
输出格式:对应输出它的英文名称。
输入样例:1
输出样例:Monday
#include<stdio.h>
int main(){
int n; scanf("%d", &n);
switch(n){
case 1: printf("Monday"); break;
case 2: printf("Tuesday"); break;
case 3: printf("Wednesday"); break;
case 4: printf("Thursday"); break;
case 5: printf("Friday"); break;
case 6: printf("Saturday"); break;
case 7: printf("Sunday"); break;
default: printf("input error!"); break;
}
return 0;
}
【题目描述】一个最简单的计算器,支持 +, -, *, / 四种运算。
仅需考虑输入输出为整数的情况,数据和运算结果不会超过int表示的范围。然而:
输入格式:输入三个参数,其中第 1、2 个参数为整数,第 3 个参数为操作符(+,-,*,/)。
输出格式:输出只有一行,一个整数,为 a 操作符 b 的运算结果。然而:
- 如果出现除数为0的情况,则输出:Divided by zero!
- 如果除数不为0,则保留2位小数。
- 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!
输入样例1:1 2 +
输出样例1:3
输入样例2:1 2 /
输出样例2:0.5
#include<stdio.h>
int main(){
int a,b; char c;
scanf("%d %d %c", &a, &b, &c);//由于使用到字符输入,所以加空格区分
switch(c){
case '+': printf("%d", a+b); break;
case '-': printf("%d", a-b); break;
case '*': printf("%d", a*b); break;
case '/': {
if(b==0) printf("Divided by zero!");
else printf("%.2lf", (double)a/b);
break;
} // {}是一个整体
default: printf("Invalid operator!"); break;
}
return 0;
}