全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)

if语句处理多个分支时需要用if-else if结构,分支越多,嵌套的if语句层就越多,程序不但庞大、复杂,理解起来也比较困难。在C++编程中,针对有些问题除了使用if-else if结构之外,还有switch语句也可以实现,并且switch语句更加简洁易懂。

switch语句的格式:

switch语句是适用于实现多分支选择的语句。swith语句在执行时,先计算表达式的值,然后按顺序与case子句中所列出的各个常量进行比较,若表达式的值与常量中的值相等,则由此进入相应的case语句执行程序,并在执行完相应的语句加上break语句,如果不加break程序不会立即跳出switch语句,而是继续依次执行后面的case语句和default中的代码,直到遇到break语句或switch语句结束。具体格式如下:

cpp 复制代码
switch(表达式){
  case 常量表达式1:
    语句1;
    ......
    break;
  case 常量表达式2:
    语句2;
    ......
    break;
   ......
   case 常量表达式n:
     语句n;
     ......
     break;
   default:
     语句n+1;
     ......
}

**注意:**case语句后的各常量表达式的值不能相同,否则会出现相互矛盾的现象造成逻辑混乱;每个语句标号由保留字case和后面的常量表达式及冒号组成,每个常量表达式通常为常量,如常数或字符;每个case和default的出现次序不影响执行结果;该语句中可以使用一次或多次case标号,但只能使用一次default标号,或者省略整个default部分;多个case标号也允许使用在同一个语句序列的前面,break表示语句到此结束,跳出整个switch;default:可选的default块,当表达式的值与所有case都不匹配时,执行default块的代码。

实战训练1---将某一门课程的成绩转换为等级输出

问题描述:

一个学生的成绩如果大于等于90,程序会输出"优秀",如果成绩大于等于80小于90,程序输出"良好",如果大于等于70小于80,程序输出"中等",如果大于等于60小于70,程序输出"及格",如果小于60,程序输出"不及格"。

输入格式:

一行一个整数score,0<=score<=100

输出格式:

输出成绩对应的等级。

输入输出样例:

|-------|-------|
| 输入样例1 | 输出样例1 |
| 95 | 优秀 |
| 输入样例2 | 输出样例2 |
| 89 | 良好 |
| 输入样例3 | 输出样例3 |
| 73 | 中等 |
| 输入样例4 | 输出样例4 |
| 60 | 及格 |
| 输入样例5 | 输出样例5 |
| 56 | 不及格 |

问题分析:

在前面的内容中,使用多分支结构if-else if来处理的,根据score的取值,如果使用switch直接来处理,那么case里面的常量会有100、99、98......、0,共101个case,通过分析90到99十位上的数为9,80到89十位上的数为8......,所以根据成绩十位数一样的等级也是一样的(其中100除以10之后为10,所以9和10 都为优秀),这样就可以先对score除以10之后再使用switch去处理,具体程序如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
   	int score;//定义成绩变量score 
	cin>>score;//输入成绩变量score 
	int sw=score/10; //成绩除以10 
	switch(sw){
		//90以上(包括90)都是优秀 ,所以变量的值为9和10都输出优秀,因此10和9可以使用同一语句块 
		case 10:
		case 9:
			cout<<"优秀"<<endl;
			break;
		case 8://大于等于80 ---良好 
			cout<<"良好"<<endl;
			break;
		case 7://大于等于70 ---中等 
			cout<<"中等"<<endl;
			break;
		case 6://大于等于60 -及格 
			cout<<"及格"<<endl;
			break;
		//小于60都是不及格,所以共用同一语句块 
		case 5:
		case 4:
		case 3:
		case 2:
		case 1:
		case 0:
			cout<<"不及格"<<endl; 
			break;
		default:
			break; 
	}
	return 0;
}

对于上述代码可以进行相应的改进(把不及格都放到default中):

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
   	int score;//定义成绩变量score 
	cin>>score;//输入成绩变量score 
	int sw=score/10; //成绩除以10 
	switch(sw){
		//90以上(包括90)都是优秀 ,所以变量的值为9和10都输出优秀,因此10和9可以使用同一语句块 
		case 10:
		case 9:
			cout<<"优秀"<<endl;
			break;
		case 8://大于等于80 ---良好 
			cout<<"良好"<<endl;
			break;
		case 7://大于等于70 ---中等 
			cout<<"中等"<<endl;
			break;
		case 6://大于等于60 -及格 
			cout<<"及格"<<endl;
			break;
		default://和前面内容都不匹配,说明小于等于60,所以可以将5到0进行合并写到default中 
			cout<<"不及格"<<endl; 
			break;
	}
	return 0;
}

实战训练2---计算月份天数

问题描述:

输入年份与月份,让计算机输出该月份的天数。题目涉及年、月、天这几个量,分别用year、month、days来表示;前面内容介绍过闰年,对于闰年来讲,2月份是29天,平年是28天;月份1、3、5、7、8、10、12月份是31天,剩余的月份4、6、9、11是30天,最后对于2月份,首先需要判断是否为闰年,闰年为days赋值为29,否则赋值为28。

输入描述:

两个整数 year和month

输出描述:

一个整数(天数)days

输入输出样例:

|--------|-------|
| 输入样例1 | 输出样例1 |
| 2000 2 | 29 |
| 输入样例2 | 输出样例2 |
| 2006 3 | 31 |

问题分析:

根据题意,首先输入year和month这两个变量,根据month的取值,取月份1、3、5、7、8、10、12时,都为31天,使用相同的赋值语句,同理对于

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
   	int year,month,days;//定义年份、月份和天数变量 
	cin>>year>>month;//输入年份和月份 
	switch(month){
		//月份1 3 5 7 8 10 12,天数为31天,共用同一代码块 
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days = 31;
			break;
		//月份4 6 9 11,天数为30天,共用同一代码块
		case 4:
		case 6:
		case 9:
		case 11:
			days = 30;
			break;
		case 2:
			if(((year%4==0 )&& (year%100 !=0)) || (year%400==0)) {//判断是否为闰年,该条件 
				days = 29;
			}else{
				days = 28;
			}
	}
	cout<<days<<endl;
	return 0;
}
相关推荐
Noah_aa9 分钟前
代码随想录算法训练营第五十六天 | 图 | 拓扑排序(BFS)
数据结构
KpLn_HJL1 小时前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
程序员老冯头2 小时前
第十五章 C++ 数组
开发语言·c++·算法
AC使者7 小时前
5820 丰富的周日生活
数据结构·算法
cwj&xyp7 小时前
Python(二)str、list、tuple、dict、set
前端·python·算法
无 证明7 小时前
new 分配空间;引用
数据结构·c++
xiaoshiguang311 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡11 小时前
【C语言】判断回文
c语言·学习·算法
别NULL11 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇11 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯