选择结构程序设计(3/3)

CSDN 

switch语句

1.switch语句的基本形式

switch语句是多支选择语句。


switch (表达式)
{
        case 情况1:
	         语句块1;
		case 情况2:
		     语句块2:
         ...
		case 情况n:
			 语句块n;
		default:
			默认语句块;
}

2.switch语句流程图

switch语句的执行流程图如下图所示。

将表达式的结果与case后的常量表达式一一对比,其后的各个语句块是相应的操作。其中default关键字的作用是没有符合条件的情况,将会执行default后的默认情况语句块。

switch语句检验的条件必须是 一个整型表达式,其中可以包含运算符和函数调用。而case语句检验的条件必须是整型常量,即含有常量表达式或者常量运算。

下面我们通过示例代码来分析下switch语句的使用方法: 

#include<stdio.h>
int main()
{
	int date;
	printf("今天星期几?\n");
	scanf("%d", &date);

	switch (date)
	{
	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("Error\n");
		break;
	}
	return 0;
}

注意: 任意两个case语句都不能使用相同的常量值;每个switch结构只能有一个default语句,而且default语句可以省略。

 3.break语句在switch语句中的作用

switch语句中,每个case情况内都使用了break语句。如果不使用break语句会出现什么情况呢?

#include<stdio.h>
int main()
{
	int date;
	printf("今天星期几?\n");
	scanf("%d", &date);

	switch (date)
	{
	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("Error\n");
		//break;
	}
	return 0;
}

我们可以看到如果将break全部注释掉,程序后面的内容将都会执行。 

4.多路开关模式的switch语句

将多个case语句后的语句块及break去掉后,就构成了多路开关模式的switch语句。

例如:

switch (表达式)
{
case 1:
	语句1
    break;
case 2:
case 3:
	语句2
	break;
default:
	默认语句
	break;
}

可以看到,case2后面没有使用break语句,那么符合case2检验与符合case3检验时的输出效果一样。也就是说,多路开关模式可以使得多种检验条件执行一种操作。 

举个栗子:

判断一年四季的情况

利用switch语句判断输入的月份属于哪个季节。

#include<stdio.h>
int main()
{
 	int month;                          				/*定义变量月份*/
 	printf("请输入月份:\n");
 	scanf("%d",&month);                 			/*输入月份*/
     switch(month)                    				/*根据月份分季节*/
     {
     		/*多路开关模式*/
       	case 3:
       	case 4:    
       	case 5:
           	printf("%d月是春季\n",month);		/*3,4,5月是春季*/
           	break;
        	/*多路开关模式*/
       	case 6:
       	case 7:    
       	case 8:
           	printf("%d月是夏季\n",month);		/*6,7,8月是夏季*/
           	break;
       	/*多路开关模式*/
       	case 9:
       	case 10:    
       	case 11:
           	printf("%d月是秋季\n",month);		/*9,10,11月是秋季*/
           	break;
       	/*多路开关模式*/
       	case 12:
       	case 1:    
       	case 2:
           	printf("%d月是冬季\n",month);		/*12,1,2月是冬季*/
           	break;
       	default:
           	printf("error!!!\n");        			/*无此月份*/
       }
       return 0;                        				/*程序结束*/
}

本利中使用的就是多路开关模式,使得检测month的值为3、4、5这三种情况时,都会输出相同的级结果。同时,利用default语句对于不符合月份分数字输入,提示错误。 

 

以上便是关于switch语句的全部内容,如果有讲解不清楚的地方,欢迎大家指出。

感谢您的观看,这里是磊磊吖的学习笔记,记得订阅和关注,让我们一起学习。

<think>好的,我现在需要帮用户解决如何用流程图表示C语言中的switch语句的问题。首先,我得回忆一下switch语句的基本结构和工作原理。switch语句根据表达式的值选择不同的分支执行,每个case对应一个常量表达式,可能还有default分支。用户提供的引用资料提到,switch必须使用整数类型,并且break语句的作用是退出switch结构,否则会继续执行下一个case,这也被称为“case穿透”。 接下来,我需要将这些知识转化为流程图的步骤。流程图通常包括开始和结束的椭圆,判断用菱形,处理步骤用矩形,箭头表示流程方向。根据引用中的示例代码,switch语句的结构大致是:先计算表达式,然后与各个case常量比较,匹配则执行对应的语句块,遇到break则跳出switch,否则继续执行下一个case,直到遇到break或结束。如果没有匹配的case,则执行default分支。 现在需要考虑流程图的各个节点。开始节点之后,应该是计算表达式的值,然后进入第一个case的判断。每个case判断可以用菱形框表示,如果匹配则执行对应的语句块,否则继续下一个case的判断。需要注意的是,如果case中没有break,流程会继续向下执行,直到遇到break或结束。因此,在流程图中,每个case执行完后需要判断是否有break,如果有则直接跳出到结束,否则继续下一个case。不过,这样可能会让流程图变得复杂,可能需要简化处理,将每个case视为独立的分支,执行完语句块后直接跳出,除非没有break。 但根据引用[3]提到,如果没有break,会顺序执行下一个case,所以流程图中需要体现这一点。可能需要在每个case的语句块后添加一个判断是否有break的步骤。如果有break,则直接结束;如果没有,则继续下一个case的语句。不过,这样处理可能会让流程图变得繁琐,尤其是当多个case连续没有break时。或许可以采用另一种方式,将case的顺序连接起来,执行完一个case的语句后,如果没有break,自动进入下一个case的语句块,直到遇到break或结束。 不过,通常流程图的绘制可能不会详细到每个break的判断,而是更结构化的表示。例如,先判断表达式,然后根据不同的case值分支到对应的处理块,每个处理块结束后通过break跳出到结束,而default分支则处理未匹配的情况。这可能更符合常见的流程图法,但需要用户注意case穿透的情况。 另外,引用[4]中的示例代码结构可以作为参考,其中每个case后面跟着break,而default在最后。流程图应该反映这种结构。可能的步骤是: 1. 开始 2. 计算表达式值 3. 判断是否等于case 1,是则执行语句块1,然后跳到结束 4. 否则判断是否等于case 2,依此类推 5. 如果都不匹配,执行default语句块 6. 结束 但这种方式可能无法准确表示case穿透的情况。例如,当某个case没有break时,流程应该继续执行下一个case的语句块。因此,正确的流程图应该在每个case执行后判断是否有break,如果有则结束,否则继续下一个case的判断。但这样会导致流程图中有很多重复的判断节点,可能比较复杂。 另一个方法是,将switch语句视为多层条件判断,每个case是一个条件分支,但允许执行完一个case后继续执行后续的case,除非遇到break。这可能更接近实际的执行流程,但流程图会变得较为复杂。 综合考虑,用户可能希望一个简洁的流程图,重点突出switch的结构,而case穿透的情况可以通过文字说明。因此,流程图的步骤可能如下: 开始 → 计算表达式 → 判断case 1 → 是则执行语句块1 → 是否有break → 是则结束,否则继续下一个case → 否则判断case 2 → ... → 如果都不匹配,执行default语句块 → 结束。 不过,这样的流程图可能不够清晰,尤其是处理break的部分。可能需要简化,将每个case视为独立分支,执行完后直接结束,除非没有break的情况下继续下一个case。或者,将case穿透的情况用单独的箭头表示。 最终,我认为比较清晰的流程图步骤是: 1. 开始 2. 计算表达式结果 3. 判断是否匹配case 1: - 是:执行语句块1 → 检查是否有break → 有则跳到结束,无则继续下一个case(如case2) - 否:继续判断case 2 4. 类似处理后续case 5. 如果所有case都不匹配,执行default语句块 6. 结束 这样的流程图虽然详细,但能够准确反映switch的执行逻辑,包括break的作用和case穿透的情况。但绘制时可能需要使用多个菱形判断框和连接线,较为复杂。对于用户来说,可能需要一个简化的版本,重点展示主要结构,而通过文字补充说明case穿透的情况。 因此,在回答中,应该分步骤说明流程图的绘制方法,并指出需要注意break和case穿透的情况,同时结合引用中的资料,强调break的重要性。此外,可以给出一个简化的流程图示例,并建议使用工具绘制时如何处理各个分支。</think>### 如何用流程图表示C语言的switch语句 #### 流程图绘制步骤 1. **开始符号**:用椭圆形表示流程图的开始。 2. **输入表达式**:用矩形框表示计算switch的表达式值,例如:`表达式 = x`。 3. **判断分支**:用菱形框依次判断表达式是否匹配各`case`的常量值: - 若匹配某个`case`,执行对应的语句块。 - 若无匹配,进入`default`分支。 4. **处理break语句**: - 若语句块中包含`break`,用箭头指向“结束”符号。 - 若无`break`,用箭头指向下一个`case`的判断(体现“case穿透”)[^3]。 5. **结束符号**:用椭圆形表示流程结束。 #### 示例流程图结构 ``` 开始 ↓ [计算表达式值] ↓ 是否匹配case1? → 是 → [执行语句块1] → 有break? → 是 → 结束 ↓ 否 ↓ 否 是否匹配case2? → 是 → [执行语句块2] → 有break? → 是 → 结束 ↓ 否 ↓ 否 ... ↓ 所有case不匹配 [执行default语句块] ↓ 结束 ``` #### 关键注意事项 1. **整数类型限制**:表达式和`case`值必须为整型(如`int`、`char`)[^1]。 2. **break的作用**:若省略`break`,流程会继续执行后续`case`的语句,直到遇到`break`或结束。 3. **default分支**:通常放在最后,但实际位置不影响逻辑判断。 #### 工具建议 使用**Draw.io**或**Visio**绘制时: - 为每个`case`分配独立分支。 - 用红色箭头标注“case穿透”路径。 - 在`default`分支添加注释说明未匹配时的行为。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值