【C语言习题演练】分支与循环——条件输出问题

大家好,很高兴和大家见面!!!在上一篇中咱们详细介绍了分支与循环的全部内容,详细大家对相关的知识点都有了相应的了解,接下来我会通过习题来帮助大家巩固相应的知识点。话不多说,咱们来开始今天的内容吧!

习题演练——分支与循环篇

1.请问最后输出的m和n分别是多少?

int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)
		{
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d,n = %d\n", m, n);
	return 0;
}

这一题考察的是对switch语句的理解,题目并不复杂,但是在做这一题之前我们先要明白switch语句的执行流程;

switch语句执行流程

这个流程图的意思是,在switch语句中,switch充当的像是一个筛选条件,而case相当于是一个入口,我们要先通过switch的判定来选择从哪个case入口进入语句;

如果我们从case1进入,则程序会从case1里的执行语句开始执行,也就是流程图中的执行语句1一直执行到遇到break

如果我从case2进入,则case1的执行语句被跳过,程序直接从case2里的执行语句开始执行,也就是流程图中的执行语句2一直执行到遇到break

如果我们从case3进入,则case1,case2里的执行语句被跳过直接从case3里的执行语句开始执行直到遇到break,在流程图中case3的执行语句就是break。

最后再跳出switch语句后开始执行语句外的执行语句,一直到结束。这就是switch语句的执行流程。

题目解析

下面我们顺着这个逻辑返回到题目中再来看这个代码,代码里总共有3个break,一个是在嵌套的switch语句里,一个是在case4的执行语句里,还有一个是在default执行语句里。

这也就意味着,第一个break结束的是嵌套的switch语句,只有第二个和第三个break才是结束的主体的switch语句。

下面我们来看看对象语句,分别是n=1,m=2,而n是主体和嵌套switch语句的判断对象;

接下来我们就可以关注程序应该从哪个入口开始进入语句,对象语句是n=1,所以我们这题的入口是从主体语句的case1开始执行,执行语句的顺序依次是:

m++(m=3) -> n++(n=2) -> 嵌套switch判断 -> case2 -> m++(m=4),n++(n=3),break -> 跳出嵌套switch语句,继续执行case4 -> m++(m=5),break -> 跳出主体switch语句 -> 打印m,n -> 结束

从这个执行顺序中我们得到了最终答案m=5,n=3,接下来我们通过计算机来验证我们的答案;

答案验证

不知道大家对这题还有没有疑问,欢迎留言提问,我会及时解答哦!接下来我们看下一题:

2.请问循环要循环几次

int main()
{
	int i = 0, k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)
	{
		k++;
	}
	return 0;
}

这一题考察的是对for循环语句的理解,我们先要回顾一下for循环语句的语句结构

for循环语句的语句结构

for(对象语句;判断语句;递进语句)
{
    循环执行语句;
}

 对照语句结构我们来将题目中的元素一一对应起来。题目中的各元素如下所示:

对象语句——i=0,k=0;

判断语句——k=0;

递进语句——k++;

循环执行语句——k++;

将这些元素找到后我们要开始思考题目问题了,这个循环会循环几次?

题目解析

我们要知道,如果要循环的话我们要满足判断条件为真,下面我们来看看题目的判断语句能否满足要求。

可以看到此时题目中的判断语句部分为k=0,大家要注意几点:

  1. '='为赋值操作符,作用是给操作对象进行赋值,'=='为关系操作符,作用是来判断两个操作对象是否相等;
  2. 计算机中认为0为假,非0为真;

首先它是一个赋值语句,并不是判断语句,此时for循环只会判断它的值为真还是为假,如果为真,循环会进入死循环;

其次,现在给k赋值的数为0,0在计算机中的判定结果为假;

最后,我们可以得到结论,此时的循环语句并不满足判断条件为真,所以循环并不会执行。

最终的答案就是循环执行0次。

答案验证

我们对程序进行调试,并打开监视窗口,此时变量i和变量k都创建好了,现在到了for循环的判断环节,我们继续往下走,看看是进入循环还是直接出循环;

这里我们可以看到,此时程序直接走到了第12行,跳过了循环,也就是说循环语句并未执行,循环次数为0;

 继续执行我们可以看到,此时屏幕上打印的k值也为0。

由运行结果我们得知,这一题的循环次数为0,循环并未执行。

朋友们你们做对了吗?接下来我们继续来看下一题:

3.输出1~100之间的奇数;

这个题目不难,我们先分析一下它的考察内容;

考察内容

1.如果我们要输出1~100之间的数字,我们需要先生成这些数字才行,最快捷的方式就是通过循环语句来完成。这是这题考察的第一个知识点——循环语句;

2.题目要求我们输出的是奇数,所以我们在输出是应该先辨别输出的数字是否为奇数,这里可以通过条件语句来完成。这是这题考察的第二个知识点——条件语句;

题目解析

第一步,我们需要生成1~100这些数字,并将其存储起来,所以可以编写一条循环语句:

	int i = 1;
	//while循环
	while (i <= 100)
	{
		i++;
	}
	//for循环
	for (i = 1; i <= 100; i++)
	{

	}
	//do……while循环
	do
	{
		i++;
	} while (i <= 100);

 三个循环语句,我们选其一就行,现在就能生成1~100之间的数字了;

第二步,判断奇偶,我们应该如何判断呢?这里我们需要考虑到奇数和偶数的区别,偶数都是2的倍数,但是奇数不是,根据这个条件,我们可以利用分支语句来编写代码:

if (i % 2 == 1)
{
	printf("奇数:%d\n", i);
}

 这样我们就完成了代码的编写,那如果我想将奇数和偶数区分出来呢?我们则可以编写代码:

if (i % 2 == 1)
{
	printf("奇数:%d\n", i);
}
else
{
	printf("偶数:%d\n", i);
}

 下面我们只需要将代码给组合起来就完成了这题的编写了:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int i = 1;
	//for循环
	for (i = 1; i <= 100; i++)
	{
		if (i % 2 == 1)//判断i/2的余数是否为1,建议写成(1 == i % 2);
		{
			printf("奇数:%d\n", i);//输出1~100之间的奇数;
		}
		/*else
		{
			printf("偶数:%d\n", i);//输出1~100之间的偶数;
		}*/
	}
	return 0;
}

这里因为题目要求的是输出奇数,所以我们把偶数给注释掉,接下来我们就可以运行代码来验证结果了;

答案验证

可以看到,这个代码能够很好的完成题目要求——输出1~100之间的奇数。

思维拓展

这一题先上面这样编码就已经没问题了,但是我想说这一题并不只有这一种编码方式,我们还可以通过其它的方式编码,比如通过循环直接进行打印:

int main()
{
	for (int i = 1; i <= 100; i += 2)
	{
		printf("%d  ", i);
	}
	return 0;
}

下面我们直接运行一下看看效果:

可以看到这样编码同样也能完成题目的要求。举这个例子就是希望大家在编码的时候不要把自己的思维给限制住了,可以将自己的思维打开,尝试着运用多种方式来解题,这样对我们的学习会有非常明显的帮助的。

结语

今天先给大家分享这三道题目,大家看完后可以好好消化一下,对于分支与循环的内容,我们还有一些习题来给大家练手,记得关注哦!

今天的内容到这里就全部介绍了,希望今天的内容能帮助大家更好的理解switch语句和for循环语句,感谢大家的翻阅,咱们下一篇再见!!! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值