全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
使用if-else if结构来处理多个分支时的条件判断,在程序设计中会随着分支数量的增加而引入更多的嵌套层次。这不仅会导致程序规模迅速扩大且变得相对复杂,并且理解起来也会变得更加困难。此外,在C++编程中还提供了switch语句作为一种替代方案,并且这种switch语句通常被认为更为直观和易于理解和使用。
switch语句的格式:
switch 语言是一种用于实现多分支选择的重要结构。当 switch 语言执行时,它会首先评估给定的表达式结果,然后依次与 case 子句中的各个常量进行比较。如果发现匹配结果,则会触发相应的 case 代码块运行,并在完成该代码块后添加 break 关键字以确保后续代码不会立即终止;如果未添加 break 关键字,程序将不会立即退出 switch 结构,而是会继续执行后续的 case 子 clause 和 default 处理逻辑,直到遇到 break 关键字或 switch 结构结束为止。其基本语法格式如下所示:
switch(表达式){
case 常量表达式1:
语句1;
……
break;
case 常量表达式2:
语句2;
……
break;
……
case 常量表达式n:
语句n;
……
break;
default:
语句n+1;
……
}
具体来说
此外
实战训练1—将某一门课程的成绩转换为等级输出
问题描述:
当学生的成绩达到或超过90分时(≥)),系统将返回'优秀';当分数在81至89.9分之间(≥)时(注意:这里原本应为'≥'但根据示例可能需要调整),系统将返回'良好';若分数介于71至79.9分之间(≥),则显示'中等';而当分数位于61至69.9分范围内(≥)时,则判定为'及格';若分数低于61分,则返回结果为'不及格'
输入格式:
一行一个整数score,0<=score<=100
输出格式:
输出成绩对应的等级。
输入输出样例:
| 输入样例1 | 输出样例1 |
|---|---|
| 95 | 优秀 |
| 输入样例2 | 输出样例2 |
| 89 | 良好 |
| 输入样例3 | 输出样例3 |
| 73 | 中等 |
| 输入样例4 | 输出样例4 |
| 60 | 及格 |
| 输入样例5 | 输出样例5 |
| 56 | 不及格 |
问题分析:
在之前的讨论中,在处理分数时我们采用多分支结构if-else if来进行判断。然而如果改用switch语句进行处理那么case块会有从100到0的所有整数值共计101个case块需要逐一处理。经过分析发现,在95至99分区间内这些数值都有一个共同点即它们的十位数字均为相同的数值同样地在85至89分区间内这些数值也会有相同的特性以此类推我们可以得出结论:只要成绩的十位数字相同则其对应的等级也就完全一致。(特别地当score达到满分时其除以十的结果会超出正常范围但按照现有规则仍然将其归类为优秀等级)具体的实现步骤如下:
#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中):
#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表示年份...已知如何判断是否为闰年,则在处理二月时需特别注意:例如,在闰年中二月有29个日历日,在非闰年的二月中则只有28个日历日。具体来说:一月.三月.五月.七月.八月.十月.十二月等奇数月均为大月(共有31个日历日);而四月.六月.九月.十一月等则属于小月(共有30个日历日)。特别地,在处理二月时需判断当前year是否为闰年:如果是,则将变量days赋值为29;否则将days赋值为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天。采用同样的赋值方式处理这些情况。类似地针对其他情况。
#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;
}
