4.1 选择结构和判断条件

选择结构的关键:条件判断。

C语言选择语句:

  1. if语句 实现两个分支
  2. switch语句,实现多分支的选择结构
//使用if实现双分支选择结构
# include <stdio.h>
# include <math.h>
//求方程实根 
int main()
{
    double a,b,c,disc,x1,x2,p,q;//disc是判别式 b^2-4*a*c
    printf("请分别输入a,b,c的值\n");
    scanf("%lf%lf%lf",&a,&b,&c);
    printf("%f\t%f\t%f\t",a,b,c);
    disc=pow(b,2)-4*a*c;
    //disc大于0时才有实根
    if(disc<0){
        printf("这个方程没有实根\n");
    } else{
        q=sqrt(disc)/(2.0*a);
        p=-b/(2.0*a);
        x1=p+q;
        x2=p-q;
        printf("x1=%.2f\t,x2=%.2f",x1,x2);
    } 
    return 0;
}

4.2 用if语句实现选择结构

4.2.1 用if语句处理选择结构举例

//用if语句处理选择结构举例 
# include <stdio.h>
# include <math.h>
//是两个值进行互换
//关键是借助中间变量进行交换 
int main()
{
    double a,b,temp;
    printf("请分别输入a,b的值\n");
    scanf("%lf%lf",&a,&b);
    //a大于b时进行交换 
    if(a<b){
    } else{
        temp=a;
        a=b;
        b=temp;
    } 
    printf("%f\t%f",a,b);
    return 0;
}

4.2.2 if语句的一般形式

一般形式

​ if(表达式)语句1

​ [else 语句2] //这个部分可以有,也可以没有

常用三种形式

  1. if (表达式) 语句1 没有else部分

  2. if(表达式)

    ​ 语句1

    else

    ​ 语句2

  3. if(表达式1) 语句1 多层if语句

    else if(表达式2)

    else if(表达式3)

    ….

    else

注意:

  1. 整个if语句可以卸载多行上。也可以卸载一行上
  2. if(表达式){ 语句1 语句2 } 语句1 语句2属于内嵌语句,是if语句中的一部分。
  3. if语句无论写在几行上,都是一个整体,属于同一个语句。
  4. 内嵌语句可以是简单语句,也可以是多种语句
  5. 表达式的值只能是逻辑值

4.3 关系运算符和关系表达式

4.3.1 关系运算符及其优先次序

关系运算符.png

运算符的优先级

运算符优先级.png

4.3.2 关系表达式

在C的逻辑运算中,以“1”代表真,以“0”代表“假”。

例:a=3,b=2,c=1

特殊情况:

d=a>b 因为a>b为真,因此关系表达式a>b的值为1,所以赋值d后的值为1。

4.4 逻辑运算符和逻辑表达式

4.4.1 逻辑运算符及其优先次序

逻辑表达式:用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式

&&:逻辑与:只要有量为假 表达式的值就为假

||:逻辑或:只要有量为真 表达式的值就为真

!:逻辑非

逻辑运算符.png

运算符的优先级:

  1. !>&&>|| 从高到低排列

  2. 逻辑运算符中的“&&”和“||” 低于关系运算符,“!”高于算术运算符

    运算符的优先级.png

    4.4.2 逻辑表达式

逻辑表达式:用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式

逻辑表达式的值应该是一个逻辑量“真”或者“假”

判断结果时:以数值 1 代表真,以数值 0 代表假

判断一个量时:以 0 代表假,以数值 非0 代表真

如:设a的值等于4,则!a的值为0。因为a的值为非0,被认作是真,对它进行非运算,得“假”。“假”以0为代表。

注意:

  • 逻辑运算符两边的运算对象不但可以是0和1,或者是0和非0,也可以是字符型、浮点型、枚举型、或指针型的纯量型数据。
  • 当a=1,b=2,c=3,d=4,m和n的原值为1是,由于“a>b”的值为0,因此m=0,此时已经能判断整个表达式的值不可能为真。不必再进行”n=c>d”的运算,因此n的值不是0,而仍保持原值1。

4.4.3 逻辑型变量

C99所增加的一种数据类型。语法:_Bool a;

在头文件stdbool.h中,将bool定义为_Bool的同义词,同时定义两个符号常量true和false true代表1 false代表0

例如:

# include <stdio.h>
# include <stdbool.h> 
int main()
{
    _Bool a = false;
    printf("--------------%d-----------------\n",a);
    bool b = true; 
    printf("--------------%d-----------------\n",b);
    return 0;
} 

运行结果:
--------------0-----------------
--------------1-----------------

--------------------------------
Process exited after 0.02229 seconds with return value 0
请按任意键继续. . .

注意:

在使用bool之前,应该确定该编译系统是否能使用。

4.5 条件运算符的条件表达式

条件运算符: 逻辑表达式 ? 值为1时 执行 : 值为0时执行;

条件运算符是C语言中的唯一的三目运算符

4.6 选择结构的嵌套

在if语句中又包含一个或多个if语句称为if语句的嵌套

表现形式:

if()
    if()  语句1
    else  语句2
else
    if()   语句3
    else   语句4

else 会就近匹配 if

if-else就近匹配.png

4.7 用switch语句实现多分支选择结构

语法:

switch(表达式)
{
case 常量1:语句1;break;
case 常量2:语句2;break;
.......
default:  语句n;
}

说明:

  1. 表达式的值类型应为整数类型(包括字符型)。
  2. 花括号内是一个复合语句,case 用来标记一个位置
  3. 可以没有default标号,没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。
  4. 标号的出现次序不影响执行结果
  5. case常量必须互不相同,
  6. case标号只起标记作用,根据switch表达式的值找到匹配的入口标号。
  7. case子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行此case标号后的所有语句。
  8. 多个case标号可以共用一组执行语句。

4.8 选择结构程序综合举例

例:判断一年是否是闰年

# include <stdio.h>
# include <math.h>
# include <stdbool.h>
/*
判断一年是否是闰年 
*/
int main()
{
    int year;
    _Bool leap;
    printf("请输入要判断的年份\n");
    scanf("%d",&year);
    if(year%4==0&&year%100!=0||year%400==0)
        leap=1;
    else
        leap=0;
    //将leap作为判断输入年份是否是闰年
    //leap=1 为闰年
    //leap=0 不是闰年 
    if(leap)
        printf("%d是闰年",year);
    else
        printf("%d不是闰年",year);
    return 0;

}

例:求方程的根

# include <stdio.h>
# include <math.h>
# include <stdbool.h>
/*
    求ax^2+bx+c=0的根 
*/
int main()
{
    double a,b,c,desc,p,q,x1,x2; //desc=b^2-4ac;
    printf("请分别输入a,b,c的值\n");
    scanf("%lf%lf%lf",&a,&b,&c);
    if(!a)    //a=0时,二次方程不存在 
        printf("这不是二次方程");
    else
    {
        desc=pow(b,2)-4*a*c;
        if(desc==0)
        {
            printf("这个方程有两个相同的实根");
            x1=-b/(2.0*a);
            printf("x1=%d,x2=%d",x1,x1);
        } else if(desc<0)
        {
            printf("这个方程没有实根");
        } else
        {
            p=sqrt(desc)/(2.0*a);
            q=-b/(2.0*a);
            x1=p+q;
            x2=q-p;
            printf("x1=%d\tx2=%d",x1,x2); 
        } 
    } 
    return 0;

}

# include <stdio.h>
# include <math.h>
# include <stdbool.h>
/*
    计算运输费用 
*/
int main()
{
    int c,s;//c表示250的倍数,s表示里程
    printf("请输入相应的里程数:\n");
    float d,p,f,w;//d 表示折扣 便宜d%,p表示价格,f表示总价,w表示重量 
    scanf("%d",&s);
    printf("请输入相应的单价和重量:\n");
    scanf("%f%f",&p,&w); 
    /*
    计算里程倍数 
    */
    if (s>3000) 
        c=12;
    else
        c=s/250;
    //统计折扣 
    if(c>=12){
        d=15;
    } else if (8<=c&&c<=11){
        d=10;
    } else if (c>=4&&c<=7){
        d=8;
    } else if(c>=2&&c>=3){
        d=5;
    } else if(c>0&&c<=1){
        d=2;
    } else{
        printf("没有优惠\n");
        d=0; 
    }
    printf("优惠%f\n",d/100);
    //计算运费
    f=p*w*s*(1-d/100);
    printf("运输费用是%f\n",f); 
    return 0;

}