总述
这篇博客是我边学第四章边写而成,所以会在第四章学习结束时发出来,中间其实记录了很多次我的学习经历。
注:本博客所有知识点均出自C程序设计(第五版)
4.1 选择结构和条件判断
4.1中,学习了C语言有两种选择语句
- if语句:用来实现两个分支的选择结构
- switch语句:用来实现多分支的选择结构
了解这两个之后,我们可以用if语句对我们之前求方程解的程序进行优化,如下
#include<stdio.h> //编译预处理指令
#include<math.h> //调用数学函数库
int main() //定义主函数
{
//函数开始
double a,b,c,disc,x1,x2,p,q; //定义双精度浮点数a,b,c,disc,x1,x2,p,q
scanf("%lf%lf%lf",&a,&b,&c); //输入三个长单精度浮点数录入a,b,c的地址
disc=b*b-4*a*c; //disc的公式
if(disc<0) //如果disc<0
printf("此方程无实根\n"); //输出此方程无实根
else //否则disc>0
{
p=-b/(2*a); //p的公式
q=sqrt(disc)/(2*a); //q的公式,其中sqrt为math函数库中的开方,所以程序最开头要声明调用math函数库
x1=p+q;x2=p-q; //x1和x2的公式
printf("此方程的根为\nx1=%7.2f\nx2=%7.2f\n",x1,x2); //输出此方程的根为x1,x2,其中x1,x2为占七个字节保留两位小数的单精度浮点数
}
return 0; //函数值返回0
} //函数结束
这便是优化后的程序,也就是书上的例子。但是,我在看到这个程序的时候,就发现,当disc=0的时候,程序没有讨论这个情况,就导致当我输入1 2 1求解时,因为disc=0,所以输出结果就变成了
1 2 1
此方程的根为
x1= -1.00
x2= -1.00
Press any key to continue
可以看到,这时计算机仍然算出了正确的值,但是却有多余的x2=x1,所以我就想着,能不能把这个继续优化加上disc=0的情况,因为这时我也没有看后面非常了解if语句,也就照猫画虎进行了如下优化,可能会有些许复杂,但是能实现包含disc=0的情况,如下
#include<stdio.h> //编译预处理指令
#include<math.h> //调用数学函数库
int main() //定义主函数
{
//函数开始
double a,b,c,disc,x1,x2,p,q; //定义双精度浮点数a,b,c,disc,x1,x2,p,q
scanf("%lf%lf%lf",&a,&b,&c); //输入三个长单精度浮点数录入a,b,c的地址
disc=b*b-4*a*c; //disc的公式
if(disc<0) //如果disc<0
printf("此方程无实根\n"); //输出此方程无实根
if(disc==0) //如果disc=0
{
p=-b/(2.0*a); //p的公式
printf("此方程有且只有一个根\nx1=x2=%7.2f\n",p); //输出此方程有且只有一个根x1=x2为p的值,输出p为占七个字节保留两位小数的单精度浮点数
}
if(disc>0) //如果disc>0
{
p=-b/(2.0*a); //p的公式
q=sqrt(disc)/(2.0*a); //q的公式,其中sqrt为math函数库中的开方,所以程序最开头要声明调用math函数库
x1=p+q;x2=p-q; //x1和x2的公式
printf("此方程的根为\nx1=%7.2f\nx2=%7.2f\n",x1,x2); //输出此方程的根为x1,x2,其中x1,x2为占七个字节保留两位小数的单精度浮点数
}
return 0; //函数值返回0
} //函数结束
可以看到,我只是在之前的if else中又插入了一段if,还挺简单,但是,这个改进却让我搞了一个小时,一开始,我保留了原来的else,在后面加了个4.2要讲的if else,但我却发现,怎么都只能运行第一个if else,而且算出来的值还会影响不对,所以,我就推倒了重新用三个连续的if,这下行了,但是我又犯了一个极其愚蠢的问题,以至于我打完后一直看了10min中代码,结果最后还是百度了一下,才终于找到问题的所在,是把(**disc==0)打成了(disc=0)**导致中间一个if无法判断,后续都无法进行,而且程序也没报错,真的很致命也很蠢的问题,这里提醒一下 计算机中“ ==”是关系运算符,而“=”是赋值运算符,千万要记牢。
这样,改进了程序,输入1 2 1得输出就变成了如下
1 2 1
此方程有且只有一个根
x1=x2= -1.00
Press any key to continue
这样,就算完成啦!
4.2用if语句实现选择结构
这一节就是对if语句进行了系统的介绍
if语句的一般形式
-
if(表达式) 语句1 (没有else子句部分)
-
if(表达式) (有else子句部分)
语句1
else
语句2 -
if(表达式1)语句1 (在else部分又嵌套了多层的if语句)
else if(表达式2)语句2
else if(表达式3)语句3
··· ···
else if(表达式m)语句m
else 语句m+1
注意事项:else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
4.3关系运算符和关系表达式
关系运算符
在C语言中,比较符(或称比较运算符)称为关系运算符。
C语言中的关系运算符有六种:
1. <(小于)
2. <=(小于等于)
3. >(大于)
4. >=(大于等于)
5. ==(等于)
6. !=(不等于)
关于优先次序:
(1)前四种关系运算符优先级别相同,后两种相同,前四种优于后两种。
(2)关系运算符的优先级低于算术运算符。
(3)关系运算符的优先级高于赋值运算符。
关系表达式
用关系运算符将两个数值或数值表达式连接起来的式子,称为关系表达式。
这一节比较简单,就罗列了一些知识点,主要是对于优先级的记忆。
4.4逻辑运算符和逻辑表达式
逻辑运算符
C语言有三种逻辑运算符:
运算符 | 含义 | 举例 | 说明 |
---|---|---|---|
&& | 逻辑与(AND) | a&&b | 如果a和b都为真,则结果为真,否则为假 |
\\ | 逻辑或(OR) | a\\b | 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假 |
! | 逻辑非(NOT) | !a | 如果a为假,则!a为真,如果a为真,则!a为假 |
以上表格中 || 碍于博客格式打成了\\ 观看的时候自行替换一下,与的运算符应该是 ||。
逻辑运算符的优先次序:
(1)!(非)>&&(与)>||(或),即!为三者中最高。
(2)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。
逻辑表达式
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式。
C语言编译系统在表示逻辑运算结果时,用数值1代表“真”,用0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。
(这句话我最开始读的时候,其实觉得挺绕的,所以要结合书上的例子自行理解,我也看了差不多3,4遍大致了解了规则)
于是根据上面规则,得到一个逻辑运算的真值表C版
a | b | !a | !b | a&&b | a\\b |
---|---|---|---|---|---|
非0 | 非0 | 0 | 0 | 1 | 1 |
非0 | 0 | 0 | 1 | 0 | 1 |
0 | 非0 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 | 0 |
这一节看了还是挺久,就0非0和优先级没太搞清楚,而且这几节主要是概念知识的消化,也并没有程序,会相对枯燥,所以很多也不是很记得住,以后还要多回来翻翻书。
4.5条件运算符和条件表达式
条件表达式的一般形式是:表达式1?表达式2:表达式3
注:
1.条件运算符优先于算术运算符,因此赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。
以下为一个条件表达式的例子
#include<stdio.h> //编译预处理指令
int main() //定义主函数
{
//函数开始
char ch; //定义字符ch
scanf("%c",&ch); //输入字符赋到ch的地址
ch=(ch>='A'&&ch<='Z')?(ch+32):ch; //如果ch大于等于A小于等于Z,则将ch的值加32赋给ch,否则将ch赋给ch
printf("%c\n",ch); //输出字符为ch
return 0; //函数值返回0
} //函数结束
这一节主要是介绍了一个语句,没啥好说的,记住理解就完了。
4.6选择结构的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套(nest)。
if()
if() 语句1
else 语句2
else
if() 语句3
else 语句4
注:else总是与它上面的最近的未配对的if配对。
(可以加花括号来确定配对关系)
以下为嵌套实例
#include<stdio.h> //编译预处理指令
int main() //定义主函数
{
//函数开始
int x,y; //定义整数x,y
scanf("%d",&x); //输入整值赋到x的地址
if(x<0) //如果x<0
y=-1; //y=-1
else //if的嵌套
if(x==0) y=0; //如果x==0 则y=0
else y=1; //否则y=1
printf("y=%d\n",y); //输出y等于y的值
return 0; //函数值返回0
} //函数结束
注:为了使程序清晰,易读,写程序时对选择结构和循环结构应采用锯齿形的缩进形式。
这一节也是一个对嵌套的介绍,没多少难点,理解就好。
4.7用switch语句实现多分支选择结构
C语言提供switch语句直接处理多分支选择。
如以下程序
#include<stdio.h> //编译预处理指令
int main() //定义主函数
{
//函数开始
char grade; //定义字符grade
scanf("%c",&grade); //输入字符将其赋到grade的地址
printf("你的成绩:"); //输出你的成绩:
switch(grade) //switch得到grade的值和case比较
{
//内函数开始
case'A':printf("85~100\n");break