• 分支和循环


    引言

    在 C语言 中,0 表示假,非0 表示真。 了解这一点很重要,因为很多变量出现在分支和循环的判断框中。常见的有 if 和 while.

    #include 
    
    int main() {
    	int a = -3;
    	if (a) 
    	{
    		printf("aaa\n");
    	}
    	else
    	{
    		printf("bbb\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出结果:

    1-1

    一、if 语句

    1. 场景1

    程序清单:if - else

    #include 
    
    int main() {
    	int a = -3;
    	if (a) {
    		printf("aaa\n");
    	}else{
    		printf("bbb\n");
    	}
    	return 0;
    }
    
    // 输出结果:aaa
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. 场景2

    程序清单:if - else if… - else

    #include 
    
    int main() {
    
    	int a = 99;
    	if (a >= 0 && a <= 9) 
    	{
    		printf("个\n");
    	}
    	else if(a >= 10 && a <= 99)
    	{
    		printf("十\n");
    	}
    	else if(a >= 100 && a <= 999)
    	{
    		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

    3. 场景3

    程序清单:if - return

    #include 
    
    int test() {
    	int a = 0;
    	if (a)
    	{
    		return 1;
    	}
    	return -1;
    }
    int main() {
    
    	int ret = test();
    	printf("%d\n", ret);
    }
    
    // 输出结果:-1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4. 场景4

    #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
    • 13
    • 14
    • 15

    上面的程序显然是代码编写的问题,才导致的歧义。实际上,在我们日常写代码的时候,一个 if 就对应着一个 else. 但在大学考试的时候,可能就会碰到这种无聊的题目,那么我们就应该明白:else 是和它离的最近的 if 匹配的。

    二、switch 语句

    程序清单:

    #include 
    
    int main() {
    
    	int day = 0;
    	scanf("%d", &day);
    
    	switch (day)
    	{
    		case 1:
    			printf("星期一\n");
    		case 2:
    			printf("星期二\n");
    		case 3:
    			printf("星期三\n");
    		case 4:
    			printf("星期四\n");
    		case 5:
    			printf("星期五\n");
    		case 6:
    			printf("星期六\n");
    		case 7:
    			printf("星期七\n");
    		default:
    			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

    输出结果:

    1-2

    程序清单:

    #include 
    
    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:
    			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
    • 34
    • 35
    • 36

    1-3

    总结语法:

    switch(整型表达式)
    {
    
    	case 整型常量表达式:
    	{
    		语句;
    	}
    	case 整型常量表达式:
    	{
    		语句;
    	}
    	case 整型常量表达式:
    	{
    		语句;
    	}
    	...
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注意事项:

    ① switch 括号内、case 后 必须是整型类型的数据,否则就会报错。

    ② default 表示不匹配所有的 case 标签,通常放在 switch 语句最后。default 可根据场景自己设定,可不加。

    ③ case 决定 switch 语句的入口,break 决定 switch 语句的出口。

    三、while 语句

    1. 场景1

    while 循环搭配 break 关键字 ( break 用于跳过整个循环 )

    #include 
    
    int main() {
    	int n = 0;
    	while (n < 10) {
    		n++;
    		if (n == 5) {
    			break;
    		}
    		printf("%d ", n);
    	}
    	return 0;
    }
    
    // 输出结果:1 2 3 4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 场景2

    while 循环搭配 continue 关键字 ( continue 用于跳过本次循环 )

    #include 
    
    int main() {
    	int n = 0;
    	while (n < 10) {
    		n++;
    		if (n == 5) {
    			continue;
    		}
    		printf("%d ", n);
    	}
    	return 0;
    }
    
    // 输出结果:1 2 3 4 6 7 8 9 10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3. 场景3

    getchar 为单个输入 ( getchar 返回类型是 int,每次读取一个字符,如果未读到字符,就返回 EOF,即 -1. )

    putchar 为单个输出

    #include 
    
    int main() {
    
    	int ch = 0;
    
    	while ( (ch = getchar()) != EOF ) {
    		putchar(ch);
    	}
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试结果:( Ctrl + Z 停止循环输入 )

    1-4

    scanf 循环输入 ( 返回值是 int,如果读到一个字段数据,就返回1;读到两个字段数据,就返回2;如果未读到字符,就返回 EOF,即 -1. )

    #include 
    
    int main() {
    
    	int ch = 0;
    
    	while (scanf("%d", &ch) != EOF) {
    		printf("%d\n", ch);
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试结果同上,不展示。

    4. while 循环清空缓冲区数据

    程序清单1:

    #include 
    
    int main() 
    {
    	char password[20] = { 0 };
    	printf("请输入密码:");
    	scanf("%s", password);
    
    	printf("请确认密码:");
    	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

    1-5

    程序清单2:

    #include 
    
    int main() 
    {
    	char password[20] = { 0 };
    	printf("请输入密码:");
    	scanf("%s", password);
    
    
    	int tmp = 0;
    	while ( (tmp = getchar()) != '\n') {
    		;
    	}
    
    	printf("请确认密码:");
    	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

    输出结果:

    1-6

    对比两个程序我们发现,第一个程序没有提示我们 " 确认密码 ",就直接输出了确认失败,这显然是因为 getchar 函数直接将我们的回车也读进去了。因为我们每次使用 scanf 函数的时候 ,最后都要点击键盘上的回车键,才能使 scanf 真正的输入。那么这是为什么呢?

    其实,在程序和键盘之间,还有一个东西:缓冲区。 scanf 每次都是从缓冲区读取数据的,并且 getchar 也是如此。所以只要 getchar 在 scanf 读取后,再次从缓冲区读数据,就可能会读到缓冲区的 " 残留数据 \n 字符 "。

    1-7

    解决方案:所以后来,我们在第二个程序中加上了如下代码,即可以让 getchar 把缓冲区的所有字符读取完之后,程序就可以读取到真正由键盘键入的数据了。

    int tmp = 0;
    while ( (tmp = getchar()) != '\n') {
    	;
    }
    
    • 1
    • 2
    • 3
    • 4

    四、for 循环

    for 循环和 while 循环大同小异,这里就一笔带过了。

    #include 
    
    int main() {
    
    	for (int i = 1; i <= 10; i++) {
    		if (i == 5) {
    			break;
    		}
    		printf("%d ", i);
    	}
    
    	return 0;
    }
    
    // 输出结果:1 2 3 4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意事项:

    ① 在下面的 for 循环中," int i = 1 " 称为【初始化】,只会执行一次;" i<=10 " 称为【判断】;" i++ " 称为【调整】。

    ② 本质上,for 循环就是上面所说的三个核心要素,然而它们都可以省略,但最好不要这么做,因为当 for 循环嵌套使用的时候,就会容易出错。

    for (int i = 1; i <= 10; i++) {
    
    }
    
    • 1
    • 2
    • 3

    五、do…while 循环

    do…while 循环的应用场景较少,它的循环至少执行一次。

    #include 
    
    int main() {
    
    	int i = 1;
    	do {
    		if (i == 5) {
    			break;
    		}
    
    		printf("%d ", i);
    		i++;
    	
    	} while (i <= 10);
    
    	return 0;
    }
    
    // 输出结果:1 2 3 4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    二分查找

    /*
    二分查找
    */
    
    int find(int arr[], int size, int k) {
    	int left = 0;
    	int right = size - 1;
    	while (left <= right) {
    		int mid = (left + right) / 2;
    		if (k == arr[mid]) {
    			return mid;
    		}
    		else if (k > arr[mid]) {
    			left = mid + 1;
    		}
    		else {
    			right = mid - 1;
    		}
    	}
    	return -1;
    }
    
    int main() {
    	int arr[] = { 0,5,7,8,13,21,24,55,77,85,93,94,95,97 };
    	int size = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
    	int k = 85;
    	int ret = find(arr, size, k);
    	if (ret == -1) {
    		printf("参数出错\n");
    	}else {
    		printf("数组下标:%d\n", ret);
    	}
    }
    
    // 输出结果:【数组下标:9】
    
    • 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

    注意事项:

    ① 二分查找只能针对于有序数组 (升序 / 倒序)

    ② 关于求平均值,也可以采取下面的方式。

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

    1-8

  • 相关阅读:
    求余数联系和赋值运算
    linux-文件查找、压缩和软件安装
    【蓝桥杯物联网赛项学习日志】Day1 点亮led
    200 套基于Java开发的Java毕业设计实战项目(含源码+说明文档)
    Spring基础:接口实现AOP
    Mysql——查询sql语句练习
    【无标题】右键菜单
    elasticsearch、Kibana 与logstash分布式使用方案(珍藏版)
    1 分钟 Serverless 搭建你的首个个人网站
    Python——基本数据类型的转换
  • 原文地址:https://blog.csdn.net/lfm1010123/article/details/127672112