C语言基础4——控制语句1(分支)

控制语句1

分支语句

1 if语句

1.1 基本结构

if(表达式)

{

语句块1;

}

else

{

语句块2;

}

        执行逻辑: 如果表达式结果为真,则执行语句块1,否则执行语句块2。

【例】

if(下雨)
{带伞;}
else

{不带伞;}

#include <stdio.h>

int main(int argc, char const *argv[])
{
   int rain=0;
   scanf("%d", &rain);
    if(rain)
    {
        printf("带伞!\n");
    }
    else 
    {
        printf("不带伞!\n");
    }

    return 0;
}

练习1:输入a和b两个整数,用if语句实现两数相减(大的减小的)(答案见最后)

1.2分层结构

if ( 表达式 1 )

{

语句块1;

}

else if(表达式2)

{

语句块2;

}

else

{

语句块3;

}

        执行逻辑:如果判断if中的表达式结果为真则执行语句块1, 如果不满足则进入下面else if中表达式继续判断,如果条件为真则执行语句块2,如果以上条件都不满足则执行else下面的语句块3。

【例】

#include<stdio.h>

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    if (a > b)
        printf("a>b\n");
    else if (a < b)
        printf("a<b\n");
    else
        printf("a==b\n");
    
    return 0;
}

1.3嵌套结构

if ( 表达式 1 )

{

if(表达式2)

{

语句块1;

}

else

{

语句块2;

}

}

else

{

语句块3;

}

【例】

if(下雨)
{
带伞;
if(小雨)
{骑车;}
else
{坐车;}
}
else
{不带伞;}

【例】用嵌套结构实现学生等级练习

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int score;
    printf("请输入学生成绩:");
    scanf("%d", &score);
    if (score >= 0 && score <= 100) //0-100
    {
        if (score >= 90) //90-100
            printf("A\n");
        else if (score >= 80) //80-89
            printf("B\n");
        else if (score >= 70) //70-79
            printf("C\n");
        else if (score >= 60) //60-69
            printf("D\n");
        else
            printf("sorry, you lost!\n"); //0-59
    }
    else
        printf("输入错误!\n");
    return 0;
}

练习2:输入一个数,如果大于0打印大于0并且再进行判断是否大于10,如果大于等于10打印大于等于10,小于10打印小于。否则如果小于0打印不想要这个数。(答案见最后)

练习3:实现大小写转换(用getchar、putchar实现)(答案见最后)
输入大写字母输出小写字母,
输入小写字母输出大写字母,
输入的不是字母,提示输入错误。

练习4:下列程序段运行后,x 的值是( ) (答案见最后)

a = 1 ; b = 2 ; x = 0 ;

if( ! ( -- a ) )

        x -- ;

if( ! b )

        x = 7 ;

else

        ++ x 

练习5:下面的一段程序的输出结果为( 答案见最后) 

#include <stdio.h>

int   main()

{

        if -)

                printf" 1 " ) ;

        else

                printf" 2 " ) ;

        if(0)

                printf" 3 " ) ;

        else

                printf" 4 " ) ;

        return 0;

}

小总结

  1. 首先判断if后面的表达式是否成立,如果成立执行if后面的语句块,否则执行else后面的语句块。
  2. if后面可以没有else, 但是else前面必须有。
  3. if和else后面如果只有一行语句可以省略花括号{}。

2 switch case语句

基本结构

switch ( 变量或者表达式 )

{

        case 常量1: 语句块1; break;

        case 常量2: 语句块2; break;

        case 常量3: 语句块3; break;

        ...

        case 常量n: 语句块n; break;

        default: 语句块n+1;

}

执行顺序

当变量或表达式的值与其中一个case语句后的常量相符合时,就执行此case后面的语句块,并依次下去执行后面所有case中的语句块,直到遇见break语句则退出switch语句为止。如果变量或表达式与所有case语句的常量都不相符,就执行default语句中的语句块。

注意:

  1. 表达式不能是浮点或字符串
  2. case后面的break可以省略,但是省略时会顺序执行,直到遇到break结束。

【示例】从终端输入一个学生的成绩,判断学生成绩,打印成绩级别用switch写
【90 - 100】 A
【80 - 89】   B
【70 - 79】   C
【60 - 69】   D
【< 60 】      sorry you lost

(注意,若case后面的条件想要包含所有的成绩,如果将100、99等一分作为一个case后的常量,将要写很多很多case语句,因此可以用整除方法将每10分划为一个段,之后进行分支判断。)

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int score;
    scanf("%d", &score);

    if (score >= 0 && score <= 100)        //判断成绩是否是一个正确分数,如果成绩在范围之外就不用进行等级判断了
    {
        switch (score / 10)
        {
        case 10:
        case 9:
            printf("A\n");
            break;
        case 8:
            printf("B\n");
            break;
        case 7:
            printf("C\n");
            break;
        case 6:
            printf("D\n");
            break;
        default:
            printf("sorry, you lost!\n");
            break;
        }
    }
    else
        printf("输入错误!\n");

    return 0;
}

练习6:从终端输入一个日期
 scanf ("%d %d %d ", &year , &mon , &day ),判断这是这一年的第几天(答案见后面)
(提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)

小总结

  1. 执行顺序:先判断switch()中的条件是否满足以下的case,如果满足则执行满足的case中的语句块,如果都不满足则执行default中的默认语句块。
  2. 如果case的语句块和下面case中的语句块相同,则可以省略。形式如下:

case 常量1:

case 常量2:语句块1;break;

遵守switch语句规则

switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:

(1)只能针对基本数据类型中的整型类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句。

(2)case标签必须是常量表达式,如42或者'4'。

(3)case标签必须是唯一性的表达式;也就是说,不允许两个case具有相同的值。

------------------------------------------------------这是一条分割线------------------------------------------------------

天才预设的上一篇跳转路径:C语言基础3——输入输出-CSDN博客

天才预设的下一篇跳转路径:C语言基础5——控制语句2(循环)-CSDN博客

练习答案

练习1:

输入a和b两个整数,用if语句实现两数相减(大的减小的)

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a, b;
    scanf("%d %d", &a, &b);
    if (a > b)
        printf("%d\n", a - b);
    else
        printf("%d\n", b - a);

    return 0;
}

注意要判断两个数的大小

练习2:

输入一个数,如果大于0打印大于0并且再进行判断是否大于10,如果大于等于10打印大于等于10,小于10打印小于。否则如果小于0打印不想要这个数。(答案见最后)

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a;
	scanf("%d",&a);
	if (a > 0)
	{
		printf("大于0");
		if (a >= 10)
		{
			putchar(10);
			printf("大于等于10");
		}	
		else
			printf("小于10\n");
	}
	else
		printf("不想要这个数\n");
	return 0;
}

练习3:

实现大小写转换(用getchar、putchar实现)(答案见最后)
输入大写字母输出小写字母,
输入小写字母输出大写字母,
输入的不是字母,提示输入错误。

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char c = getchar();
	if (c >= 'a' && c <= 'z')
	{
		putchar(c - ' ');
		putchar(10);
	}
	else if (c >= 'A' && c <= 'Z')
	{
		putchar(c + ' ');
		putchar(10);
	}
	else 
		printf("不是字母\n");
	return 0;
}

判断语句中也可写A或a的ASCII码值,对用的A的ASCII值为65,a的ASCII值为97

练习4:

下列程序段运行后,x 的值是( ) (答案见最后)

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a = 1 , b = 2 , x = 0 ;
    if( ! ( -- a ) )
        x -- ;
    if( ! b )
        x = 7 ;
    else
        ++ x ;
    printf("%d",x);
}

第一个if语句里面的判断条件--a,首先a要自减,此时a等于0.!0则真,进入第一个if判断语句,x自减,x等于-1。第二个if判断,!2则假,于是进入else语句,对x进行自增,x最终结果为0.(CSDN的编译器对此题运行可能有些错误)

练习5:

下面的一段程序的输出结果为( ) 

#include <stdio.h>
int   main()
{
    if ( -1 )
        printf( " 1 " ) ;
    else
        printf( " 2 " ) ;
    if(0)
        printf( " 3 " ) ;
    else
        printf( " 4 " ) ;

        return 0;
}

在if判断中,非0则真,不要看到-1就显示为假,对应的条件也为真,此时打印1。对应的下一个if、else同理,为0则假,打印4。

练习6:

从终端输入一个日期
 scanf ("%d %d %d ", &year , &mon , &day ),判断这是这一年的第几天(答案见后面)
(提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)

#include <stdio.h>

int main(int argc, const char *argv[])
{
    int y,m,d;
	scanf("%d %d %d",&y,&m,&d);
	if ((m < 0 && m > 12)||(d < 1 && d > 31))
		printf("输入错误\n");
	int day = 0;
	switch(m)
	{
	case 1:
		day = d;
		break;
	case 2 :
		day = d + 31;
		break;
	case 3 :
		day = d + 31 + 28;
		break;
	case 4 :
		day = d + 31 + 28 + 31;
		break;
	case 5 :
		day = d + 31 + 28 + 31 + 30;
		break;
	case 6 :
		day = d + 31 + 28 + 31 + 30 + 31;
		break;
	case 7 :
		day = d + 31 + 28 + 31 + 30 + 31 + 30;
		break;
	case 8 :
		day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31;
		break;
	case 9 :
		day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
		break;
	case 10 :
		day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
		break;
	case 11 :
		day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
		break;
	case 12 :
		day = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
		break;
	}
	if ((y % 400 == 0 || y % 4 == 0 && y % 100 != 0)&&(m > 2))
	{
		day = day + 1;
		printf("%d\n",day);
	}
	else 
		printf("%d\n",day);
	return 0;
}

以上代码属于一种比较容易想到的逻辑,分别对月份进行分支判断,进入到该分支之后对前面的月份进行求和,得到该月对应的已有的天数,最后判断平闰年,来判断2月份是否多一天。且每一个case后面都需要跟一个break来终止分支。

以下是另一种思路:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int year, mon, day, days = 0, flag;
    scanf("%d %d %d", &year, &mon, &day);
    if (year % 100 == 0) //整百年
    {
        if (year % 400 == 0) //闰年
            flag = 1;
        else //平年
            flag = 0;
    }
    else //非整百年
    {
        if (year % 4 == 0) //闰年
            flag = 1;
        else //平年
            flag = 0;
    }

    switch (mon)
    {
    case 12:
        days += 30;
    case 11:
        days += 31;
    case 10:
        days += 30;
    case 9:
        days += 31;
    case 8:
        days += 31;
    case 7:
        days += 30;
    case 6:
        days += 31;
    case 5:
        days += 30;
    case 4:
        days += 31;
    case 3:
        days += 28 + flag;
    case 2:
        days += 31;
    case 1:
        days += day;
        break;
    default:
        printf("err!\n");
        break;
    }

    printf("%04d-%02d-%02d: 是这一年的第%d天\n", year, mon, day, days);

    return 0;
}

这串代码是利用一个flag标志来记录平闰年,最终通过flag的值来决定是否要加上2月份的一天。在switch语句中,可以看到除了case1语句后面存在break,其余case后都没有,这是因为switch语句的case后面只有遇到break才会终止运行,否则会越过后面的case分支判断直接执行后面的内容。

走一个例子:当输入的月份为5的时候,分支判断会执行case5后面的内容,后面的语句无break终止程序,于是会执行case4、3、2、1后面的所有语句,也就对应的这几个月的天数也会被累加,直到遇到1后面的break才会停止。

本节内容不多,主要是跟的一些练习,希望读者可以将这些练习题以及对应的注意的点融会贯通~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值