前面我们讲过循环语句的for、while、do-while的使用,即组成C语言中的循环结构,而除了循环其实还有顺序和选择,顺序结构就是顺着程序中的代码一行一行执行下去,而选择为分支结构,有if语句和switch语句,今天先讲if语句和部分与if语句需要一起“搭配食用”的语法点。话不多说开始上车。
我们之后将会采用例题+语法点的方法来继续学习。
if语句
用法
if(表达式)//括号里是判断的条件表达式,若条件为真那么继续执行下面的语句,反之则不执行,数字符号中非0都是真,0是假
{语句;
}
//比如if(12%2==0)很显然条件为真,故会执行下面的语句
if(表达式)
{语句;
}
else
{语句;//当表达式不成立时执行else里面的语句,这里理解为“否则”
}
if(表达式)
{语句;
}
else if(表达式)//可以在else后面加if
{语句;
}
else......
注:当只有一条语句时就不用{},会显得更整洁。
【例1】判断某个数是奇偶数
思路:if+%+while
很显然我们需要用到除以2这个方法来帮助我们判断奇偶数,需要if并且算术操作符%;我们可以测试多组输入输出,因此用到while。
程序和运行
#include<stdio.h>
int main()
{int n;while(scanf("%d",&n)!=EOF){if(n%2==0){printf("是偶数\n");}else{printf("是奇数\n");}}return 0;
}
//省去了{}和加上了占位符让运行结果可读性提高
#include<stdio.h>
int main()
{int n;while(scanf("%d",&n)!=EOF){if(n%2==0)printf("%d是偶数\n",n);elseprintf("%d是奇数\n",n);}return 0;
}
判断正负数和奇偶数本质上是一样的,只是判断的条件变了;其次要判断的数值类型发生变化记得进行数据类型的变化!比如要进行小数之间的判断,这时候浮点数就要上场了。
【例2】输出一个区间里的偶数或奇数
思路:if+%+for
很显然我们需要用到除以2这个方法来帮助我们判断奇偶数,因此要if帮助我们实现;再者每一个区间里的数都需要进行这个操作,因此要用循环结构,暂且选择for。
程序和运行
//先输出偶数
#include<stdio.h>
int main()
{int n;printf("请输入区间最大值:");scanf_s("%d", &n);for (int i = 0; i <= n; i++){if (i % 2 == 0)printf("%d\n", i);}return 0;
}
//奇数只是将条件if改成if(i%2!=0),!=是不等于的意思
【例3】判断三个数中的最大值
这道题有很多思路,我们挑两个来讲。
思路一:逐个比较+&&+if
&&是逻辑与操作符,当&&前后的条件都为真时才为真,其余情况都为假。
程序和运行
为了加强其他数据类型的学习和记忆我们引入double类型。
#include <stdio.h>
int main()
{double n1, n2, n3;printf("请输入三个数,以空格分隔: ");scanf("%lf %lf %lf", &n1, &n2, &n3);if( n1>=n2 && n1>=n3 )printf("%.2f 是最大数。", n1);//保留小数点后两位。if( n2>=n1 && n2>=n3 )printf("%.2f 是最大数。", n2);if( n3>=n1 && n3>=n2 )printf("%.2f 是最大数。", n3);return 0;
}
思路二:两个两个比较+函数封装+if
函数封装记得返回类型,若不需要特别指明返回类型则写void。
程序和运行
#include<stdio.h>
//求两个数中的最大值
double max(double n1,double n2)
{if(n1>=n2)return n1;//记住return只能返回一个值elsereturn n2;
}
int main()
{double n1, n2, n3;printf("请输入三个数,以空格分隔: ");scanf("%lf %lf %lf", &n1, &n2, &n3);double max_n=max( max(n1,n2),n3);//进行max(n1,n2)再然后是max( max(n1,n2),n3);printf("%.2lf\n",max_n);return 0;
}
【例4】求解一元二次方程ax2+bx+c=0 的根
思路:math.h(sqrt)+if
math.c是类似于stdio.h的另一个头文件,可以使用包含求二次方根(sqrt)在内的数学运算函数。
首先我们需要随意输入三个系数,(已经确保a!=0)此时先进行第一个条件判断:方程是否有解;当有实数解时就可以根据求根公式求解相对应的根。
程序和运行
#include <stdio.h>
#include <math.h>//包含头文件int main()
{float a, b, c;printf("输入方程的三个系数:");scanf_s("%f %f %f", &a, &b, &c);//已经满足a!=0if (b * b - 4 * a * c >= 0){float d, x1, x2;d = sqrt(b * b - 4 * a * c);//求二次方根的函数sqrtx1 = (-b + d) / (2 * a);x2 = (-b - d) / (2 * a);printf("x1=%3.2f,x2=%3.2f\n", x1, x2);//%3.2f表示包括小数点在内的位数至少占3个位置}elseprintf("该一元二次方程无实数解");return 0;
}
【例5】判断闰年
思路:闰年判断方法+嵌套if
首先最重要的是知道什么是闰年,用数学的方法怎么判断?仅仅是除以4余数为0便是闰年吗?显然判断条件是不只有这一个也就是当判断是多重时,需要用到嵌套if,就是if-else语句里面还有if-else,实际上还可以用上面的逻辑运算符与&&,它本质上也是进行多个条件的判断。
闰年判断方法:
- 不能被4整除就一定不是闰年
- 能被4整除且不能被100整除的是闰年,能被4整除且能被100整除且能被400整除的是闰年
程序和运行
#include <stdio.h>int main()
{int year;printf("输入年份: ");scanf_s("%d",&year);if(year%4 == 0){if( year%100 == 0){// 这里如果被 400 整除是闰年if ( year%400 == 0)printf("%d 是闰年", year);elseprintf("%d 不是闰年", year);}elseprintf("%d 是闰年", year );}elseprintf("%d 不是闰年", year);return 0;
}