if语句
程序执行的流程:
if语句的通用形式:
if(表达式){
语句1;
语句2;
...
}
程序运行到if语句时,首先会进行判断,即对 ()
中的表达式求值。为真(表达式值为非0),则执行{}
中的语句(或紧跟if的一条简单语句);否则,直接跳过if语句。
- 即使if语句是后面紧跟
{}
的复合语句,整个if语句仍然被视为一条语句。
if else语句
单独的if语句的作用是让程序选择是否执行一条语句,而if else语句则可以让程序在两条语句之间做选择。
程序执行的流程:
if else语句的通用形式:
if(条件判断){
语句1;
...
}
else{
语句2;
...
}
与if语句类似,程序运行到if else语句时,会先对()
中的表达式求值。表达式值为真,则执行if之后{}
中的语句(或紧跟if的一条简单语句);否则,执行else之后{}
中的语句(或紧跟else的一条简单语句)。
-
if else语句的特点是必然会执行其中一部分的语句。
-
条件运算符
?:
是表达if else语句的一种更简洁的方式。-
上文的通用形式,用条件运算符可以写为如下形式:
(条件判断)?(语句1):(语句2);
-
条件运算符的运用可以让代码更加简洁。需要注意的是,使用条件运算符时,条件判断的表达式、语句1和语句2最好都是简单语句,否则容易会得不偿失。
-
多重选择
生活中,有时会遇到两种以上的选项供我们选择。在C语言中,我们也能实现多重选择的结构。
else if
else if从本质上看,是if else语句的变式。可以使用多个if else语句达成多重选择的目的,但是使用else if可以让代码更简洁,同时提高程序的可读性。
程序执行流程:
用if else语句实现上图结构:
if(条件判断)
语句1;
else{
if(条件判断)
语句2;
else{
if(条件判断)
语句3;
else
...
}
}
引入else if后:
if(条件判断)
语句1;
else if(条件判断)
语句2
else if(条件判断)
语句3;
else if(条件判断)
...
switch语句
面对多重选择结构时,我们还可以使用switch语句。
switch语句的通用形式:
switch(整型表达式){
case 常量1:
语句1;
case 常量2:
语句2;
...
default:
语句3;
}
程序运行到switch语句时,会根据()
中的表达式扫描标签,当有匹配值出现时,程序则会直接跳转到那一行,然后依次执行后面的所有语句;如果没有匹配的标签,则会跳转到default
标签处,执行后面的语句;当既没有匹配的标签也没有default
标签时,则直接执行switch语句之后的语句。
case 常量1
这样可以使程序进行跳转的句段被称为标签。()
中的表达式,最终应该是一个整数值(包括char类型)。- 变量不能作为
case
处的标签, - 如果没有break语句,程序会从匹配的标签开始,一直执行到switch语句结束,而不是像if else语句那样只执行关键字后面
{}
中的内容。所以在运用switch语句时,需要学会搭配break语句一起使用。- 执行break语句之后,会让程序跳出当前的switch语句。
default
标签可以放在任意位置,出于程序可读性的考虑,一般将它作为最后一个标签。
goto语句
使用沟通语句也可以实现分支结构,但是程序的可读性较差,在c语言中基本不使用。
goto语句由两部分组成:goto关键字和标签:
goto tag;
tag:
...
当程序运行到关键字goto处,会直接跳转到标签,然后执行标签后面的语句。
- 标签可以像变量那样命名,程序跳转时将跳转到对应的标签处。
- C语言中,一般只有需要快速跳出多重循环时会使用goto语句。
经典程序
奇数、偶数判断
int main(){
int n;
scanf("%d",&n);
if(n%2==0)
printf("%d是偶数",n);
else
printf("%d是奇数",n);
return 0;
}
质数判断
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
- 方法1
int main(){
int num;
scanf("%d",&num);
int i;
bool flag=true;
//遍历所有小于num的数字
for (i = 2; i < num; i++) {
if (num % i == 0) {
flag = false;
break;
}
}
if (flag||num==2)
printf("%d是一个质数\n", num);
else
printf("%d不是一个质数\n", num);
}
- 方法2
int main(){
int num;
scanf("%d",&num);
int i;
bool flag = true;
//遍历到num/2
for (i = 2; i < (num/2); i++) {
if (num % i == 0) {
flag = false;
break;
}
}
if (flag||num==2)
printf("%d是一个质数\n", num);
else
printf("%d不是一个质数\n", num);
}
- 方法3
int main(){
int num;
scanf("%d",&num);
int i;
bool flag = true;
//遍历到num开平方
//需要引入<math.h>
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
flag = false;
break;
}
}
if (flag || num == 2)
printf("%d是一个质数\n", num);
else
printf("%d不是一个质数\n", num);
}
闰年判断
公历年份是4的倍数,且不是100的倍数的,或者公历年份是是400的倍数是闰年。
int main() {
int year;
scanf("%d", &year);
int flag = 0;
if (year % 4 == 0 && year % 100 != 0)
flag = 1;
else if (year % 400 == 0)
flag = 1;
if (flag == 1)
printf("是闰年");
else
printf("不是闰年");
return 0;
}
最大公约数(辗转相除法)
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
- 迭代写法
int gcd(int x, int y) {
int remainder, dividend, divisior;//remainder为余数 dividend为被除数 divisior为除数
int count=0;
//初始化被除数,除数及余数
//max(x,y)函数返回较大数
//mini(x,y)函数返回较小数
remainder = max(x, y) % mini(x, y);
dividend = max(x, y);
divisior = mini(x,y);
while (remainder != 0) {
dividend = divisior;
divisior = remainder;
remainder=dividend%divisior;
}
return divisior;
}
- 递归写法
int gcd(int x,int y){
//使用递归时必须确保x>y
//明确递归结束的条件
if(y==0)
return x;
return gcd(y,x%y);
}