全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(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;
}
相关推荐
txzrxz2 分钟前
拓补排序讲解
c++·算法·图论·排序
深圳市快瞳科技有限公司9 分钟前
宠物行为识别:将日常行为转化为可量化的健康指标
人工智能·算法·计算机视觉·宠物
稚南城才子,乌衣巷风流27 分钟前
长链剖分(Long Chain Decomposition)算法详解
算法·深度优先·图论
变量未定义~39 分钟前
环境治理、染色时间、小蓝组网
算法
Ulyanov1 小时前
雷达导引头仿真中的坐标系——从惯性系到量测角
开发语言·python·算法·系统仿真·雷达信号处理·雷达导引头
玖玥拾1 小时前
LeetCode 13 罗马数字转整数
笔记·算法·leetcode
m沐沐2 小时前
【计算机视觉】OpenCV 物体跟踪——原理、算法与CSRT跟踪器实战
人工智能·python·深度学习·opencv·算法·计算机视觉·人脸识别
起个破名想半天了2 小时前
算法与数据结构之Kruskal算法
数据结构
怪奇云呼军2 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
稚南城才子,乌衣巷风流2 小时前
树链剖分(树剖)算法详解:从原理到实现
算法·深度优先