• 【C语言】分支结构


    C语言是结构化的程序设计语言

    1. 顺序结构
    2. 选择结构 if switch
    3. 循环结构 while for do while

    在这里插入图片描述

    语句

    在这里插入图片描述

    控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,

    C语言有九种控制语句。

    分支语句(选择结构)

    if 语句

    语法结构:
    
    if(表达式)
    	语句;
    
    if(表达式)
    	语句1;
    else
    	语句2;
    
    if(表达式1)
    语句1;
    else if (表达式2)
    语句2;
    else
    语句3;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    #include
    int main()
    {
    	int age = 0;
    	scanf("%d",age);
    	if(age>=18)
    		printf("成年\n");
    	else
    		printf("快快长大\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    #include
    int main()
    {
    	int age = 0;
    	scanf("%d",age);
    	if(age<18)
    		printf("青少年\n");
    	else if(age>=18 && age<30)
    		printf("青年\n");
    	else if(age>=30 && age<50)
    		printf("中年\n");
    	else if(age>=50 && age<80)
    		printf("中老年\n");
    	else 
    		printf("老年\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    if默认下面一句,多句需加大括号。

    0表示假,非0表示真

    悬空else

    #include 
    int main()
    {
        int a = 0;
        int b = 2;
        if(a == 1)
            if(b == 2)
                printf("hehe\n");
        **else**
            printf("haha\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    else总是与最近的if匹配

    不要走直觉!

    代码风格很重要!

    不好的代码风格:

    //代码1
    //return  结束啦,返回了
    if (condition) {
        return x;
    }
    return y;
    
    //代码2
    int num = 1;
    if(num == 5)
    {
        printf("hehe\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    规范代码:

    if(condition)
    {
        return x;
    }
    else
    {
    	return y;
    }
    
    //
    int num = 1;
    if(5 == num)
    {
        printf("hehe\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    练习:

    //判断一个数是否是奇数
    
    int main()
    {
    	int n = 0;
    	scanf("%d",&n);
    	if(n%2==1)
    	{
    		printf("奇数\n");
    	}
    	else
    	{
    	printf("偶数\n");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    //输出1-100之间的奇数
    int main()
    {
    	int i = 0;
    	for(i = 1;i<=100;i++)
    	{
    		if(i%2 != 0)
    		{
    			printf("%d ",i);
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    switch语句

    适合多分支的情况

    switch(**整型**表达式)
    {
    	case **整型**常量表达式:
    	{
    		语句;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    int main()
    {
    	int day = 0;
    	scanf("%d",&day);
    	switch (day)
    	{
    		case 1:
    			printf("周一\n");
    			break;
    		case 2:
    			printf("周二\n");
    			break;
    		case 3:
    			printf("周三\n");
    			break;
    		case 4:
    				printf("周四\n");
    				break;
    		case 5:
    				printf("周五\n");
    				break;
    		case 6:
    				printf("周六\n");
    				break;
    		case 7:
    				printf("周天\n");
    				break;
    		default://所有的case都不匹配
    				printf("输入错误\n");
    				break;
    	}
    		return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    switch 、case决定入口,break决定出口

    先处理正常的,再处理异常的

    做题小心谨慎

    循环语句

    while

    for

    do while

    while

    while(表达式)
    {
    	//语句
    }
    
    • 1
    • 2
    • 3
    • 4
    //打印1-10的数字
    int main()
    {
    	int i = 1;
    	while(i<=10)
    	{
    		if(5==i)
    			break;//提前跳出
    
    		printf("%d",i);
    		i++;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    要敢于调试

    break是永久终止循环

    continue是跳过本次循环continue后面的语句 直接进入下一次判断

    #include 
    int main()
    {
     **int ch = 0;**
     while ((ch = getchar()) != EOF)
           putchar(ch);
        return 0;
    }
    
    //ctrl+z 会让getchar/scanf返回一个EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    从键盘输入流读取一个字符

    返回的是整型int

    打印一个字符

    在这里插入图片描述

    #include 
    int main()
    {
        
        char password[20] = { 0 };
        printf("请输入密码:\n");
        scanf("%s", password);//123456
    
        printf("请确认密码(Y/N):");
        int ch = getchar();
        if ('Y' == ch)
        {
            printf("确认成功\n");
        }
        else
            printf("确认失败\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    #include 
    int main()
    {
        
        char password[20] = { 0 };
        printf("请输入密码:\n");
        scanf("%s", password);//123456
    		getchar();//处理\n的问题
        printf("请确认密码(Y/N):");
        int ch = getchar();
        if ('Y' == ch)
        {
            printf("确认成功\n");
        }
        else
            printf("确认失败\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述
    在这里插入图片描述

    //处理方法2
    #include 
    int main()
    {
        
        char password[20] = { 0 };
        printf("请输入密码:\n");
        scanf("%s", password);//123456
    		int tmp = 0;
    //把\n放进tmp里,下面while条件为假,就结束了。
    		**while((tmp=getchar()) !='\n')
    		{
    				;
    		}
    
    //就相当于要吸收\n 防止\n之前的数据进入下面**
        printf("请确认密码(Y/N):");
        int ch = getchar();
        if ('Y' == ch)
        {
            printf("确认成功\n");
        }
        else
            printf("确认失败\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    理解缓冲区!!!

    //代码2
    #include 
    int main()
    {
        char ch = '\0';
     while ((ch = getchar()) != EOF)
     {
         if (ch <0|| ch >9)
            continue;
         putchar(ch);
     }
     return 0;
    }
    //跳过其他字符,只打印数字字符
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    for循环

    在这里插入图片描述

    //打印1-10
    int main()
    {
    	int i = 0;
    	for(i = 1;i<=10;i++)
    	{
    		printf("%d ",i);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    for循环对循环变量的控制

    1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
    2. 建议for语句的循环控制变量的取值采用**“前闭后开区间”**写法。
    //前闭后开的写法
    for(i=0; i<10; i++)
    {}
    
    • 1
    • 2
    • 3

    [0,10)

    可读性更高,右边可以展示循环次数

    在for循环看情况告知循环次数

    for循环变种

    #include 
    int main()
    {
     //代码1
     for(;;)
     {//判断省略 判断就恒为真
     printf("hehe\n");
     }
        //for循环中的**初始化部分,判断部分,调整部分**是可以省略的,但是不建议初学时省略,容易导致问
    题。
        
        //代码2
        int i = 0;
        int j = 0;
        //这里打印多少个hehe?
        for(i=0; i<10; i++)
       {
            for(j=0; j<10; j++)
           {
    				 printf("hehe\n");
           }
       }
        
        //代码3
        int i = 0;
        int j = 0;
        //如果省略掉初始化部分,这里打印多少个hehe?
    //只打印10个
        for(; i<10; i++)
       {
            for(; j<10; j++)//j不受控了
           {
     printf("hehe\n");
           }
       }
        
     //代码4-使用**多余一个变量**控制循环
    		int x, y;
        for (x = 0, y = 0; x<2 && y<5; ++x, y++)
       {
            printf("hehe\n");
       }
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    //请问循环要循环多少次?
    #include 
    int main()
    {
     int i = 0;
     int k = 0;
     for(i =0,k=0; ***k=0***; i++,k++)//循环压根就不进去
            k++;
     return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    do… while()循环

    do
    	循环语句;
    while(表达式);
    
    • 1
    • 2
    • 3
    int main()
    {
    	int i = 1;
    	do 
    	{
    		printf("%d ",i);
    		i++;
    	}while(i<=10);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    //break 后面不管有多少循环 都终止
    int main()
    {
    	int i = 1;
    	do 
    	{
    		if(i==5)
    		break;
    
    		printf("%d ",i);
    		i++;
    	}while(i<=10);
    
    }//1234
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    int main()
    {
    	int i = 1;
    	do 
    	{
    		if(i==5)
    			continue;
    		printf("%d ",i);
    		i++;
    	}while(i<=10);
    
    }//1234死循环
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    搞清楚到底跳哪,下一句要干什么。

    练习:

    1. 计算 n的阶乘。
    2. 计算 1!+2!+3!+……+10!
    3. 在一个有序数组中查找具体的某个数字n。
    4. 编写代码,演示多个字符从两端移动,向中间汇聚。
    5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
    //计算n的阶乘
    int main()
    {
    	int n = 0;
    	scanf("%d", &n);
    	int sum = 1;
    	for (int i = 1; i <= n; i++)
    	{
    		sum *= i;
    	}
    	printf("%d", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    **//计算阶乘和
    int main()
    {
    	int n = 0;
    	int i = 1;
    	int sum = 1;
    	int k = 0;
    	for (n = 1; n <= 3; n++)
    	{
    		for (i = 1; i <= n; i++)
    		{
    			sum *= i;
    			
    		}
    			k += sum;
    	}
    	printf("%d", k);
    }**
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    错误代码!

    //计算阶乘和
    int main()
    {
    	int n = 0;
    	int i = 1;
    	int sum = 1;
    	int k = 0;
    	for (n = 1; n <= 3; n++)
    	{
    		**sum = 1;**
    		for (i = 1; i <= n; i++)
    		{
    			sum *= i;	
    		}
    		k += sum;
    	}
    	printf("%d", k);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    没有sum归一,造成累计

    优化

    int main()
    {
    	int n = 0;
    	int i = 1;
    	int sum = 1;
    	int k = 0;
    	for (n = 1; n <= 3; n++)
    	{
    		sum *= n;//1!*2 == 2!
    		k += sum;
    	}
    	printf("%d", k);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    二分查找

    前提条件:数组有序

    val == 7

    查找7

    在这里插入图片描述

    //二分查找
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    	int val = 0;
    
    	int left = 0;//整个数组的大小    一个元素大小
    	int right = (sizeof(arr) / sizeof(arr[0]))-1;
    	while (left<=right)
    	{
    		int mid = (left + right) >> 1;
    
    		if (arr[mid] < val)
    		{
    			left = mid + 1;
    		}
    		else if (arr[mid] > val)
    		{
    			right = mid - 1;
    		}
    
    		else
    		{
    			printf("找到了\n");
    			break;
    		}
    	}
    	printf("没找到\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    mid这个求法有一定的问题,如果太大了 就不行了。

    int mid = left+(right-left) / 2;

    在这里插入图片描述

    此思想很重要

    编写代码,演示多个字符从两端移动,向中间汇聚。

    ##############
    w############h
    js##########Js
    最后完整显示
    
    • 1
    • 2
    • 3
    • 4

    用到strlen,引头文件string.h
    在这里插入图片描述
    在这里插入图片描述

    头文件:windows.h

    两个字符串的比较是不能用==

    strcmp

    int main()
    {
    	int i = 0;
    	char password[20] = { 0 };
    	for (i = 0; i < 3; i++)
    	{
    		printf("输入密码\n");
    		scanf("%s", password);
    		if (strcpy(password, "hehe") == 0)
    			break;
    	}
    	if (i == 3)
    	{
    		printf("exit\n");
    	}
    	else {
    		printf("log in\n");
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    猜数字:

    在这里插入图片描述

    rand函数调用前,要调srand

    在这里插入图片描述

    时间戳:

    C语言提供了一个函数time 可以返回一个时间戳

    在这里插入图片描述

    不需要存起来就直接传NULL

    #define _CRT_SECURE_NO_WARNINGS 1
    #include
    #include
    #include
    
    void menu()
    {
    	printf("#############\n");
    	printf("###1.play####\n");
    	printf("###0.exit####\n");
    	printf("#############\n");
    	printf("#############\n");
    	printf("#############\n");
    }
    
    void game()
    {
    	//1.生成一个随机数
    	int val = rand()%100+1;//控制在100之内
    	//2.猜数字
    	int k = 0;
    	
    	while (1)
    	{
    		printf("请输入数字\n");
    		scanf("%d", &k);
    		//输入数也要放进循环!
    		if (k > val)
    		{
    			printf("猜大了\n");
    		}
    		else if (k < val)
    		{
    			printf("猜小了\n");
    		}
    		else
    		{
    			printf("猜对了\n");
    			break;
    		}
    	}
    }
    
    int main()
    {
    	int input = 0;
    	srand((unsigned int)time(NULL));//时间在变化
    	do
    	{
    		menu();
    		printf("请选择\n");
    		scanf("%d", &input);
    		switch (input)
    		{
    			case 1:
    				game();
    				printf("猜数字\n");
    				break;
    			case 0:
    				printf("退出\n");
    				break;
    			default:
    				printf("选择错误,请重新选择\n");
    				break;
    		}
    	} while(input);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    int val = rand()%100+1;//控制在100之内

    **//输入数也要放进循环!**
    
    • 1

    srand放在主函数,程序进入调一次就行了。

    goto语句

    int main()
    {
    	again:
    	printf("haha\n");
    	goto again;
    	~~~~~~~~~~~~~~~~~~~~return 0;~~~~~~~~~~~~~~~~~~~~
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    一般不用 很乱

    goto语言真正适合的场景如下:

    for(...)
        for(...)
       {
            for(...)
           {
                if(disaster)
                    goto error;
           }
       }
        …
    error:
     if(disaster)
             // 处理错误情况
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    关机程序

    int main()
    {
        char input[10] = {0};
        system("shutdown -s -t 60");
        while(1)
       {
    
            printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
            scanf("%s", input);
            if(0 == strcmp(input, "我是猪"))
           {
                system("shutdown -a");
                break;
           }
    				
       }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    微分算子法求解常系数线性微分方程特解
    主成分分析用于ERP研究的实用教程-机遇和挑战(附代码)
    CF1168C And Reachability
    axure9设置组件自适应浏览器大小
    数据链路相关技术
    23_ue4进阶末日生存游戏开发[随机巡逻]
    Vulnhub-DC-3
    Atlassian发布最新补贴政策,Jira/Confluence迁移上云最低可至零成本
    Hadoop:认识MapReduce
    类和对象(7):初始化列表
  • 原文地址:https://blog.csdn.net/m0_60653728/article/details/127931028