C++ Switch讲解与一本通平台讲解
C++ Switch 讲解~ Hi,大家好,我来讲解一下C++中的 Switch 以及信息学奥赛一本同上面的题目。
switch 是C++中的保留字,它的作用于if是差不多的。
下面是 switch 的结构
switch(表达式){
case 常量表达式:
语句...;
break;
case 常量表达式:
语句...;
break;
...
default:
语句...;
}
当 switch 小括号中的表达式与花括号中的常量表达式相同时,switch 就会执行冒号后面到break的语句。
如果一轮 case 都没有匹配项,就直接执行 default 的语句。
switch 不好用的地方在于,它只能判断 case 后面的常量表达式是否与表达式相同,只有相同才会执行后面的代码。这样,一旦要选择的量多了起来,switch 就略弱于 if 了。
Switch 的执行过程
这是 switch 的执行过程(有点丑)
default是可有可无的,执行完default也会跳出switch
首先 switch 会查找 case,如果 case 成立了,就执行其后方的代码,遇到 break 就跳出switch(没有就继续往下执行)。如果 case 中一个都没有成立,就会执行 default 后面的指令。当然 default 不一定要放在较后面,case 也不一定要放在 default 的前面。
在中间的 case 或 default 的末尾必须加上 break,否则,会影响到其他的代码。
Switch 的实例
下面是 switch 的一个实例
#include<iostream>
using namespace std;
int **in(){
int x;
cin >>x;
switch(x){
case 1:
cout << "One" << endl;
break;
case 2:
cout << "Two" << endl;
break;
default:
cout << "I don't konw!" << endl;
}
return 0;
}
这段代码的意思是输入一个 x,然后判断 x 是什么,如果是 1 则输出 One,如果是 2 则输出 Two,否则输出 I don't know。
注意 case 后方的常量表达式是不能重复的,default 也只能有一个或没有。
信息学奥赛一本通的题目
2057 - 2059,1049 - 1058
2057【例3.9 】星期几
这是一道用 switch 比较简单的题目,因为它的等式就7个,使用 switch 比较简洁明了。
下面是代码
#include<iostream>
using namespace std;
int **in(){
int x;
cin >> x;
switch(x){
case 1:
cout<<"Monday"<<endl;
break;
case 2:
cout<<"Tuesday"<<endl;
break;
case 3:
cout<<"Wednesday"<<endl;
break;
case 4:
cout<<"Thursday"<<endl;
break;
case 5:
cout<<"Friday"<<endl;
break;
case 6:
cout<<"Saturday"<<endl;
break;
case 7:
cout<<"Sunday"<<endl;
break;
default:
cout<<"input error!"<<endl;
}
return 0;
}
本题十分简单,只要懂了就可以完成。
2058【例3.10】简单计算器
这道题也十分简单,只需判断符号,在做相应的运算就行了。
下面是代码
#include<iostream>
using namespace std;
int **in(){
float x,y,sum;//两个数字和得数(样例输入的含有小数,所以要用float)
char s;//运算符
cin>>x>>y>>s;//按照题目要求输入
switch(s){//判断s
case '+'://加
sum=sum+(x+y);//累加,吧x+y的和加到sum里面
break;
case '-'://减
sum=sum+(x-y);
break;
case '*':
sum=sum+(x*y);
break;
case '/':
if(y==0){//判断除数是否为0
cout<<"Divided by zero!"<<endl;
return 0;//结束
}
sum=sum+(x/y);
break;
default:cout<<"Invalid operator!"<<endl;return 0;//没有此运算符
}
cout<<sum<<endl;//输出运算结果
return 0;
}
这个也不难,只要好好思考就可以找到思路。
2059【例3.11】买笔
这道题初学者看上去就觉得很难,做不出来,但思考一下。
首先,题目要求尽量多买亿一些笔,所以我们先用所有的钱买4元钱的笔,再看看买完之后还有多少钱。当买完之后还剩1元钱时,就可以用一支4元钱的笔换一支4+1=5元钱的笔。同理还剩下2元钱就用一支4元钱的笔换一只4+2元钱的笔。那如果多了三支笔呢?没有4+3=7元的笔啊?那就用两支4元钱的笔换一支5元钱的笔和一支6元钱的笔,这样就用完了剩下的3元钱
但是我居然输出搞反了啊!!!!(是z,y,x,我写成了x,y,z)
#include<iostream>
using namespace std;
int **in(){
int a,x=0,y=0,z=0;//a是总钱数,x是4元钱的笔,y是5元钱的笔,z是6元钱的笔
cin>>a;
x=a/4;//算出可以买多少4元钱的笔
switch(a%4){//查看剩余的钱
case 1://剩下1元钱
x--;
y++;
break;
case 2://剩下2元钱
x--;
z++;
break;
case 3://剩下3元钱
if(x<2) break;//特判
x-=2;
y++;
z++;
break;
}
cout<<z<<' '<<y<<' '<<x<<endl;
return 0;
}
无语
1049 晶晶赴约会
这道题十分简单,直接上代码。
#include<iostream>
using namespace std;
int **in()
{
int n;
cin>>n;
switch(n)
{
case 1:case 3:case 5://几个case连起来就可以表示:只要满足这几个条件的其中一个就可以进入
cout<<"NO"<<endl;
break;
default:cout<<"YES"<<endl;//否则就输出YES
}
return 0;
}
这题用if更简单:
#include<iostream>
using namespace std;
int **in(){
int n;
cin>>n;
if(n==1||n==3||n==5){
cout<<"NO"<<endl;
}
else
cout<<"YES"<<endl;
return 0;
}
1050 骑车与走路
这道题...好像不能用 switch 做...
#include<iostream>
using namespace std;
int **in()
{
int len;
cin>>len;
if(50+(double)len/3.0>(double)len/1.2)//如果走路的速度大于骑自行车
cout<<"Walk";
else if(50+(double)len/3.0==(double)len/1.2)//如果骑自行车的速度小于走路
cout<<"All";
else//如果都相等
cout<<"Bike";
return 0;
}
疑惑1051 分段函数
照打就行啦(好像还是用不了 switch...)
代码如下
#include<cstdio>//输出要用printf,printf要用cstdio,cstdio要用手打...
using namespace std;
int **in(){
double y,n;//float应该也行
scanf("%lf",&n);
if(n>=0&&n<5){
y=2.5-n;
}
else
if(n>=5&&n<10){
y=2-1.5*(n-3.0)*(n-3.0);
}
else
y=n/2.0-1.5;//照写就行
printf("%.3lf",y);//以3位小数输出
return 0;
}
1052 计算邮资
这题也是直接算(好像这个也是...)
代码如下
#include<iostream>
using namespace std;
int **in(){
int w,sum=8;//基本费
char x;//是否加急
cin>>w>>x;
if(w>1000){//大于1000克
w-=1000;
sum+=w/500*4;
if(w%500!=0){
sum+=4;
}
}//收费...
if(x=='y'){
sum+=5;
}//加急的特判
cout<<sum<<endl;
return 0;
}
1053 较大数输出
这个直接比三次就行(switch又被抛弃...)
代码如下
#include<iostream>
using namespace std;
int **in(){
int a,b,c,**xn;
cin>>a>>b>>c;
**xn=a;//假设较大的数是a
if(b>**xn) **xn=b;//如果b比较大的数大则将b赋值给**xn
if(c>**xn) **xn=c;//如果c比较大的数大则将c赋值给**xn
cout<<**xn<<endl;//输出较大的数
return 0;
}
1054 三角形判断
小学老师说过,三角形的任意两条边大于另一条边...(switch 又双被抛弃)
所以代码就是这样
#include<iostream>
using namespace std;
int **in(){
int a,b,c;
cin>>a>>b>>c;
if(a+b>c&&b+c>a&&a+c>b) cout<<"yes"<<endl;//满足条件就输出yes
else
cout<<"no"<<endl;//没满足就输出no
return 0;
}
1055 判断闰年
闰年如何判断?
它是4的倍数,且不是100的倍数。
它是400的倍数。
只要满足以上其中一个就可以被称为闰年(switch 又双叒被抛弃)
#include<cstdio>
using namespace std;
int **in(){
int n;
scanf("%d",&n);
if(n%4==0){
if(n%100==0){
if(n%400==0){
cout<<"Y"<<endl;
}
else
cout<<"N"<<endl;
}
else
cout<<"Y"<<endl;
}
else
cout<<"N"<<endl;//许多判断...
return 0;
}
1056 点和正方形的关系
直接判断,不用多说(switch 又双叒叕被抛弃)
#include <iostream>
using namespace std;
int **in(){
double x,y;
cin>>x>>y;
if((x>=-1&&x<=1)&&(y>=-1&&y<=1)) cout<<"yes"<<endl;//在正方形的坐标内就输出yes
else cout<<"no"<<endl;//否则输出no
return 0;
}
1057 简单计算器
啊这...
这不跟2058一样的吗???
1058 求一元二次方程
直接照着打就行
#include<iostream>
#include<cstdio>
#include<c**th>
using namespace std;
int **in(){
double a,b,c,x1,x2,sum;
cin>>a>>b>>c;
sum=b*b-4*a*c;
if(sum>-0.01&&sum<0.01){//实根相等
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
printf("x1=x2=%0.5f",x1);
}
else if(sum<0){//无实根
cout<<"No answer!";
}
else if(sum>0){//实根不相等
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
if(x1<x2){//谁小谁在前面
printf("x1=%0.5f;x2=%0.5f",x1,x2);
}
else{
printf("x1=%0.5f;x2=%0.5f",x2,x1);
}
}
return 0;
}
好了,题目都讲完了。
转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。
链接:C++ Switch讲解与一本通平台讲解http://www.gufeng7.com/niaolang/1843.html
联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com
上一篇: 你见过最烂的代码长什么样子?
下一篇: C++ If讲解与一本通平台讲解