学习笔记6 —— C语言流程控制


C语言中按照程序的执行程序的不同,分为 顺序结构、分支结构、和循环结构。下面就用一个简单的案例来展示C语言的3种流程结构。

一、顺序结构

顺序结构是最简单的一种流程结构,它采用自上而下的方式逐条执行各语句。

/*
 *  @file           division.c
 *  @brief          求两个整数相除(要求结果保留两位有效小数)
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */

#include<stdio.h>

int main()
{
	int a;
	int b;
	float quotient;
	printf("Please enter two integer:\n");
	scanf("%d%d", &a, &b);
	quotient = (float)a / b;
	printf("a / b = %.2f\n",quotient);
	return 0;
}

在这里插入图片描述

程序在计算结果的时候,用到了类型转换运算符它把int类型变量a的类型转换为float类型,这么做的目的是为了运算结果能得到一个拥有小数点的小数值。由于变量a被转换为float类型,所以变量b也会自动地转换为float类型,自然就会得到一个float类型的运算结果。并把这个结果赋值给了变量quotient。最后通过printf函数以保留两位有效小数的方式将信息打印在控制窗口上

这个程序的执行流程为:
1.将标准库头文件“stdio.h”包含进来。
2.执行主函数。
3.定义两个int类型变量a和b。
4.定义float类型变量quotient。
5.使用printf函数打印一条提示信息。
6.使用scanf函数获取用户的输入,并保存到变量a和b中。
7.对a和b使用除法运算符进行运算,并将结果赋值给quotient。
8.使用printf函数打印最终结果
9.退出主函数,程序执行完毕
可以看出,整个程序是按照自上而下逐句执行的。

二、分支结构

C语言的分支结构可以控制程序的部分流程是否执行,或是从多条执行路径中选择一条来执行

1.if语句

格式:

if(表达式)
	语句

小括号内的表达式为判断条件,当表达式的值为真时,执行语句;当表达式的值为假时,不执行语句
代码:

/*
 *  @file           if_division.c
 *  @brief          通过if语句来对除数为0的情况进行检查,只有除数不为0时,才会进行除法运算
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */

#include<stdio.h>

int main()
{
	int a;
	int b;
	float quotient;
	printf("Please enter two integer:\n");
	scanf("%d%d", &a, &b);
	if (b)
	{
		quotient = (float)a / b;
		printf("a / b = %.2f\n", quotient);
	}
	return 0;
}

除数为零
在这里插入图片描述
除数不为零
在这里插入图片描述

可以通过if语句来对除数为0的情况进行检查,只有除数不为0时,才会进行除法运算。
if(b)与if(b!=0)它同样是判断变量b的值是否不等于0,而使用if(b)的方式会让代码显得更加简练。它们的 作用实际是一样的。

2.if…else语句

格式:

if(表达式)
	语句1
else
	语句2

if…else语句和if语句相比,多了else部分,形成了二选一的流程 执行情形。
代码:

/*
 *  @file           if_division_1.c
 *  @brief          通过if语句来对除数为0的情况进行检查,只有除数不为0时,才会进行除法运算,除数为0时,打
 *                  印一条信息明确告知用户
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */

#include<stdio.h>

int main()
{
	int a;
	int b;
	float quotient;
	
	printf("Please enter two integer:\n");
	scanf("%d%d",&a,&b);
	
	if (b)
	{
		quotient = (float)a / b;
		printf("a / b = %.2f\n",quotient);
	}
	else
	{
		printf("Data is error!\n");
	}
	
	return 0;
}

当除数不为0时,程序打印输出正常的结果,除数为0时,打印一条信息明确告知用户。
在这里插入图片描述

3.if…else语句嵌套

要求用户输入一个0到100的整数,以表示学生的考试分数,程序能根据这个分数评定出相应的等级,共有A,B,C,D四个等级,其中90分及以上为优秀(用A表示),80到89分为良好(用B表示),60到79分为及格(用C表示),60分以下为不及格(用D表示)。

/*
 *  @file           if_division_2.c
 *  @brief          通过对if...else语句的嵌套使用,就可以让程序实现除多选一的流程执行情形。
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */

#include<stdio.h>

int main()
{
	int score;
	printf("Please enter a score between 0 and 100:\n");
	scanf("%d", &score);
	
	if ((score >= 0) && (score <= 100))
	{
		if (score >= 90)
		{
			printf("A\n");
		}
		else
		{
			if(score >= 80)
		    {
				printf("B\n");
		    }
			else
			{
				if(score >= 60)
				{
					printf("C\n");
				}
				else
				{
					printf("D\n");
				}
			}
		}
	}
	else
	{
		printf("Data is error!\n");
	}
	
	return 0;
}

在这里插入图片描述

4.if…else if…else语句

/*
 *  @file           if_division_3.c
 *  @brief          它的执行流程和利用if...else语句嵌套的执行流程一样,完全可以认为if...else if...else语句
 * 					就是对if...else语句嵌套的一种变形写法。
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */

#include<stdio.h>

int main()
{
	int score;
	
	printf("Please enter a score between 0 and 100:\n");
	scanf("%d", &score);
	
	if ((score >= 0) && (score <= 100))
	{
		if (score >= 90)
		{
			printf("A\n");
		}
		else if (score >= 80)
		{
			printf("B\n");
		}
		else if (score >= 60)
		{
			printf("C\n");
		}
		else
		{
			printf("D\n");
		}
	}
	else
	{
		printf("Data is error!\n");
	}
	
	return 0;
}

5.switch…case语句

/*
 *  @file           if_division_4.c
 *  @brief          通过它同样能实现多选一的效果,而且使代码的逻辑更加清晰。
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */
#include<stdio.h>

int main()
{
	int score;
	
	printf("Please enter a score between 0 and 100:\n");
	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:
			case 6:
				printf("C\n");
				break;
			default:
				printf("D\n");
				break;
		}
	}
	else
	{
		printf("Data is error!\n");
	}
	
	return 0;
}

break语句可以终止switch...case语句语句的执行,如果在某处漏掉了必要的break,则switch...case语句不会被终止,程序会继续执行后面的语句,直到遇见break语句或者代表整个switch...case语句结束的右大括号。
整型表达式为score/10,就是把原来0到100的分数,换算到0到10的范围
default标签可以放置在任何位置,甚至可以出现在所有case标签之前,所以default标签下的break语句不要随意省略。

三、循环结构

C语言中的循环结构就是让语句能够重复、多次地被执行的一种流程结构。

1.while语句

格式:

while(表达式)
	语句
/*
 *  @file           while_aver.c
 *  @brief          计算n个学生的平均分
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */
 
#include<stdio.h>

int main()
{
	int i;
	int n;
	int score;
	int sum = 0;
	float aver; 
	
	printf("Please enter the number of students:\n");
	scanf("%d", &n);
	printf("Please enter the scores of %d students:\n",n);
	i = n;
	
	while (i--)
	{
		scanf("%d", &score);
		sum += score;
	}
	
	aver = (float)sum / n;
	printf("Total:%d , Average:%.2f\n", sum, aver);
	
	return 0;
}

在这里插入图片描述

while语句之前,通过i=n,把变量n的值赋给了变量i,因为我们要保存好学生数量,后面计算平均分时还需要用到它。即while语句中我们操作和修改的只是变量i,不会对变量n有影响。
sum变量定义时必须对它进行初始化的操作,即让变量sum的初始值为0,若不这样做的话,初始时sum变量的值未知,即使将学生的成绩都累加进去,最终计算出的总分也不会正确。

2.do…while语句

do...while语句和while语句差不多,do...while是先执行循环体,然后才去检查表达式的值
格式:

do
	语句
while(表达式);
/*
 *  @file           do_while_aver.c
 *  @brief          do...while计算n个学生的平均分
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */

#include<stdio.h>

int main()
{
	int i;
	int n;
	int score;
	int sum = 0;
	float aver; 
	
	printf("Please enter the number of students:\n");
	scanf("%d", &n);
	printf("Please enter the scores of %d students:\n",n);
	i = n;
	
	do
	{
		scanf("%d", &score);
		sum += score;
	}while(--i);
	
	aver = (float)sum / n;
	printf("Total:%d , Average:%.2f\n", sum, aver);
	
	return 0;
}

3.for语句

格式:

for(表达式1;表达式2;表达式3);
	语句

表达式1 通常在此对循环变量进行初始化或赋值(初始化时执行一次)
表达式2 表达式的值为真时执行循环体,为假时结束for语句(循环体执行前)
表达式3 通常在此对循环变量进行修改、更新操作(循环体执行后)

如果表达式2被省略,则表示条件永远为真,这样它就变成了一个无限执行的循环,导致for语句无法结束,我们通常将这种无限执行的循环称之为死循环。

/*
 *  @file           do_while_aver.c
 *  @brief          for循环计算n个学生的平均分
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */
 
#include<stdio.h>

int main()
{
	int i;
	int n;
	int score;
	int sum = 0;
	float aver; 
	
	printf("Please enter the number of students:\n");
	scanf("%d", &n);
	printf("Please enter the scores of %d students:\n",n);
	
	for (i = 0; i < n; ++i)
	{
		scanf("%d",&score);
		sum += score;
	}
	
	aver = (float)sum / n;
	printf("Total:%d , Average:%.2f\n", sum, aver);
	return 0;
}

4.循环的嵌套使用

/*
 *  @file           for_even.c
 *  @brief          打印偶数
 *  @version 1.1    无
 *  @author         北豼
 *  @date           2022年1月28日
 */

#include<stdio.h>

int main()
{
        int n;
        int i;

        printf("Please enter a data!\n");
        scanf("%d", &n);

        for (i=1; i <= n; ++i)
        {
                if (i % 2)
                {
                        continue;
                }
                printf("%d ", i);
        }

        return 0;
}

在这里插入图片描述

四、流程控制语句

1.continue语句

特点:

1.只能用在循环结构的语句中
2.通常和if语句搭配使用
3.一旦被执行,则会跳过其后的语句,直接进入下一次迭代
4.只会对包含它的循环起作用

格式:

continue;
for (int i = 1; i <= 10; ++i)
{
	if (i & 2)
	{
		continue;
	}
	printf("%d", i);
}

打印结果:

2 4 6 8 10

当变量i的值为奇数时,该表达式的值为真,这会导致continue语句被执行。一旦continue语句被执行,那么其后的printf函数调用语句就不再被执行

2.break语句

对付死循环的利器。
要注意的点:

1.只能用在switch...case语句或循环结构的语句中
2.通常搭配if语句使用
3.一旦被执行,则会强制中断流程,结束语句的执行

for (int i = 1; i <= 10; ++i)
{
	if (i > 5)
	{
		break;
	}
	printf("%d", i);
}

结果:

1 2 3 4 5

3.return语句

return语句能够起到强制中止函数的功能,也就是在函数中如果有return语句被执行,即使后面还有其它语句,整个函数的执行流程也将结束

#include<stdio.h>

int main()
{
	printf("AA\n");
	return 0;
	printf("BB\n");
}

结果:

AA

return语句必须在函数内使用,不论是在顺序结构、分支结构、还是循环结构,都会造成函数的执行流程被强制结束,如果被关闭的是主函数,则会导致整个程序的结束

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是北豼不太皮吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值