引言
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言你还没卷起来?】系列之第五篇,介绍C语言的选择结构,结合专题优质题目,带领读者从0开始,深度掌握知识点。
1️⃣ 概念介绍
C语言的选择结构是一种编程结构,用于根据条件的真假来选择性地执行代码块。
我们也称选择结构为条件控制语句选择结构
条件控制语句选择结构分为if-else结构与switch-case结构
简单形式如下:
if(表达式) { 语句 }
其中表达式不限于逻辑表达式或关系表达式,可以是各种表达式,如算术表达式等。当表达式的值为非零时,结果为“真”;当表达式的值为零时,结果为“假”。
if-else结构
基本形式是:
if(表达式) 语句1 else 语句2
当表达式的结果为真(非零)时,执行语句1,执行完后跳到下一语句。当表达式的结果为假(零)时,执行语句2,执行完后顺序执行下一语句。
else-if结构
形式如下:
if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 …… …… else if(表达式n) 语句n else 语句n+1
switch语句一般格式
switch(表达式) { case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; … case 常量表达式n: 语句n; break; default: 语句n+1; break; }
注意事项
case后面常量表达式的值必须互不相等,否则会出现互相矛盾的现象。其类型应该与switch后面表达式的类型相容。
例如不能出现两个case 1
case和常量表达式之间要有空格
case1是错的,case 1是对的
case和default出现可以在任何位置,其先后次序不影响执行结果,但习惯上将default放在switch-case结构的底部。
case提供了执行某一语句序列的入口,起着标号的作用;多个case可以执行同一语句序列。
每个case语句的结尾不要忘了加break,否则将导致多个分支重叠。
不要忘记最后的default分支。即使程序真的不需要default处理,也应该保留语句: default : break;
2️⃣代码过渡
在正式开始选择结构的代码实现之前,我们需要掌握解决问题的数学等思想应该如何向代码思想过渡。
举个例子:
求一个数x的绝对值
数学思想:若x小于0,则其绝对值为-x,否则为x
判断一个整数x是否为5的倍数
数学思想:若x%5等于0,则x是5的倍数,否则不是
将百分制的成绩转换成等级制,100~90->A
数学思想:若成绩≥90,并且成绩≤100,则为A
我们使用C语言解决上面的问题需要使用以下语言元素:
若…则…否则 对应 选择结构
小于等于 对应 关系运算符
并且 对应 逻辑运算符
以下为常见的关系运算符:
当逻辑表达式成立时,为“真”,用1表示,否则为“假",用0表示。
举个例子:
设a为4,b为6,c为4
设a为4,b为6,c为5
注意事项
数学中的 a≤x≤b, 不能改写成C的 a<=x<=b,而应该是a<=x&&x<=b
采用“不完全计算”方法(有结论即停算) 例如a>0 || b!=5已经确定a>0,此时表达式的结果一定为真,不需要再判断b!=5的正确性了
其操作数均视为逻辑量,非0即真 例如(x=-1) && (y=2 )相当于1&&1
3️⃣知识点讲解
这一节我们将细致讲讲形式与执行过程、双分支if语句形式与执行过程、switch语句形式与执行过程
使用单分支的if 语句求表达式值,若为真则执行其内嵌的1条语句(若多条须用大括号引起,成为1条复合语句),否则执行if语句后的语句。
单分支的if 语句形式:
if( 表达式 ) 语句
举个简单的例子:
要求输出2整数的较大值,我们可以先设两个变量x,y,把x的值赋值给max,如果y>max,就再把y的值赋值给max,如果y<=max,那么max仍然是最大的,最后只需要输出max的值即可。
if( y>max ) max=y; printf("%d\n", max);
双分支的if 语句形式:
if ( 表达式 ) 语句1 else 语句2
表达式若为真,则执行if分支内嵌的语句1;否则执行else分支内嵌的语句2。
还是拿上面一题举例子,如果x>y,就把x赋值给max,否则把y赋值给max,使用以下代码:
if( x>y ) max=x; else //相当于if(x <= y) max=y;
注意: else 后无表达式 如else (x<=y)是错的
下面介绍if语句的常用代码块:
第一种
if( a>b) t=a; a=b; b=t;
这个代码块用于交换两个数的值,我们细致分析下
比如说a为5,b为4,如果a大于b,我们就把a的值赋值给t,这个时候t的值变为5,然后把b的值赋给a,这个时候a的值变为4,再把t的值赋给b,这个时候b的值变为5,结果为:a==4
,b==5
第二种
if( score<60 ) puts("E"); else if( score<70 ) puts("D"); else puts("A");
当score小于60的时候输出E,当score大于等于60小于70的时候输出D,当score大于等于70的时候输出A
这样做的一个好处是我们不需要这样写:
if( score<60 ) puts("E"); if( score>=60 && score<70 ) puts("D"); if(score>=70) puts("A");
一个简单的else就能帮助我们节省很多步骤
第三种,复杂的if语句
闰年的条件是(1)能被4整除,但不能被100整除;(2)能被400整除。
对应的语句为:(1)year%4==0 && year%100!=0
(2)year%400==0
整合起来就是:
if( (year%4==0 && year%100!=0) || year%400 ) printf("%d 是闰年。\n", year ); else printf("%d 不是闰年。\n", year );
第四种,好用的条件表达式
max=(a>b) ? a: b; printf("%d", max);
形式:表达式1 ?表达式2 :表达式3
特点:是C中唯一的3目运算符
求解:求式1,若为真则值为表达式2的值;否则值为表达式3的值
适用:常用于表示简单的双分支选择结构
举个例子:
如果a=5,b=3,那么max(a>b)?a:b的值就是5,因为5大于3,所以条件为真,返回a的值。
如果a=2,b=4,那么max(a>b)?a:b的值就是4,因为2不大于4,所以条件为假,返回b的值。
接着我们讲一讲switch语句形式与执行过程
switch语句是一种用于根据表达式值选择执行不同代码块的选择结构。 它的形式如下:
switch (表达式) { case 值1: // 如果表达式的值等于值1,则执行这里的代码 break; case 值2: // 如果表达式的值等于值2,则执行这里的代码 break; case 值3: // 如果表达式的值等于值3,则执行这里的代码 break; // 可以有更多的case语句 default: // 如果表达式的值没有与上面的任何值匹配,则执行这里的代码 }
switch语句的执行过程如下:
1.将表达式的值与每个case后面的值进行比较,从上到下逐个检查。
2.如果找到匹配的值,则从该位置开始执行与该case语句相关联的代码块,并且在执行完毕之后跳出switch语句。
3.如果没有找到匹配的值,即表达式的值与所有case后面的值均不匹配,则执行default标签下的代码块(如果有)。
4.如果没有default标签或者default标签后面的代码块执行完毕,程序将继续执行紧随switch语句的代码。
举个简单的例子:
int num = 2; switch (num) { case 1: printf("数字是1\n"); break; case 2: printf("数字是2\n"); break; default: printf("数字不是1、2、3\n"); } return 0; }
由于num为2,对应case2,所以程序输出数字是2
需要注意的是:
- 在每个case后面的值必须是常量表达式,且不允许重复
- 每个case语句块末尾都要使用break语句,用于跳出switch语句,否则会继续执行下一个case的代码块,这可能造成错误。
- 可以有多个case语句块与同一代码块相关联,它们会顺序执行,直到遇到break语句或者switch语句结束。
4️⃣编程实例
综上所述,选择结构是编程中常用的一种控制结构,用于根据条件的真假选择不同的执行路径。
接着我们通过编程实例,进行实战讲解。
题目要求:求一元二次方程的2实数根或2虚根(不考虑a=0的情况)。
例如:输入 a b c: 1 -2 1 ;输出 x1=1.000, x2=1.000
输入 a b c: 3 4 5 ;输出 x1=-0.667+1.106 i, x2=-0.667-1.106 i
1.解题思路
计算判别式 d,即 b*b - 4*a*c
使用 if 条件语句进行判断:
- 若 d 大于零,则表示方程有两个不同实数根,使用 sqrt 函数计算 d 的平方根,并分别计算出两个实根 x1 和 x2,然后使用 printf 函数输出结果。
- 若 d 小于或等于零,则表示方程没有实数根,使用 sqrt 函数计算 -d 的平方根并取虚部,然后计算出实部 x1,最后使用 printf 函数输出结果。
2.代码实现
// 计算判别式 d = b^2 - 4ac d = (b * b - 4 * a *c); // 判断二次方程的根的情况 if (d > 0) { // 若 d 大于 0,则有两个不同的实数根 d = sqrt(d); x1 = (-b + d) / (2 * a); x2 = (-b - d) / (2 * a); printf("x1 = %.3f, x2 = %.3f\n", x1, x2); } else { // 若 d 小于等于 0,则有虚根 d = sqrt(-d); x1 = -b / (2 * a); // 实部 x2 = d / (2 * a); // 虚部 printf("x1 = %.3f + %.3fi, x2 = %.3f - %.3fi\n", x1, x2, x1, x2); }
3.添加预处理命令等,将代码格式化
#include <math.h> #include <stdio.h> int main() { double a, b, c, d, x1, x2; // 提示用户输入 a、b、c 的值 printf("Enter a b c: "); scanf("%lf %lf %lf", &a, &b, &c); // 计算判别式 d = b^2 - 4ac d = (b * b - 4 * a *c); // 判断二次方程的根的情况 if (d > 0) { // 若 d 大于 0,则有两个不同的实数根 d = sqrt(d); x1 = (-b + d) / (2 * a); x2 = (-b - d) / (2 * a); printf("x1 = %.3f, x2 = %.3f\n", x1, x2); } else { // 若 d 小于等于 0,则有虚根 d = sqrt(-d); x1 = -b / (2 * a); // 实部 x2 = d / (2 * a); // 虚部 printf("x1 = %.3f + %.3fi, x2 = %.3f - %.3fi\n", x1, x2, x1, x2); } return 0; }
编译运行结果:
通过使用 if 条件语句,程序能够根据不同的情况执行相应的代码,实现了根据判别式的值来判断二次方程的根的类型。
至此,选择结构的编程实例已讲解完成,读者需要躬身实践来掌握C语言选择结构相关知识点。
5️⃣总结
此文为 【C语言必知必会】系列第五篇 ,带领读者掌握C语言的选择结构,带领读者从0开始,深度掌握知识点。
专栏将提供优质C语言编程题,带领读者全方位掌握C语言,读者可订阅专栏持续跟进。