switch的格式是:
switch(int类型变量名)
{
case 1:(←冒号) 代码1;(←分号)
case 2: 代码2;
cast 3:代码3;
default:代码4;
}
注意:(假设int类型变量名为a)
①case后面的数字,代表选择,在int类型变量名的值等于该数字时,执行相应case后面的代码,
并且!从这行开始一直执行到最后一个case的代码。除非使用break结束switch。如假设a为1,他会执行代码1,然后执行代码2,然后执行代码3,而非仅仅只执行代码1。
②假如int变量的值不等于case后面的数字,如果有default,则执行这一行后面的代码;如果没有,那么不会执行switch里面的代码,跳过switch,执行之后的代码。
③可以在switch外面套一层do while进行约束,while的条件是非case选择,例如case选择是1~4,while则是!=1&&!=2&&!=3&&!=4这样。或者假如变量a是int类型,
do
{switch{} cout<<"重新输入:";cin>>a;}
while(a<1||a>4);
④假如选择后面执行的东西比较多,使用自建函数比较好
⑤case 1也可以换为case 'a'等
⑥default 表示如果以前都不符合,则执行这一行代码。
上代码:
#include<iostream>
using namespace std;
void change();
void money();
void meinv();
void work();
void study();
int main()
{
int a;
change();
do
{
cin >> a;
switch (a)
{
case 1:money();break;
case 2:meinv();break;
case 3:work();break;
case 4:study();break;
default:cout << "你输入错啦,请重新输入:"; //default的意思是,假如输入的不是1、2、3、4,则执行这一段。
}
} while (a < 1 || a>4);
system("pause");
return 0;
}
void change()
{
cout << "从以下选择中,挑一个你喜欢的吧!" << endl;
cout << "1.一千万美金。\n2.一个绝世美女\\壮汉。\n3.一个待遇优渥的工作。\n4.一个可以任意学习的机会" << endl;
cout << "你的选择是:";
}
void money()
{
cout << "你获得了一千万美金,但是,你确定你会花么……" << endl;
}
void meinv()
{
cout << "我可没说美女会一辈子跟着你,说不定跑了呢?" << endl;
}
void work()
{
cout << "一般来说,待遇优渥的工作,对个人能力要求也是很高的。于是……" << endl;
}
void study()
{
cout << "学习总是好的,虽然会很累,很花时间,但是,有知识的人,都懂。" << endl;
}
输出:
从以下选择中,挑一个你喜欢的吧!
1.一千万美金。
2.一个绝世美女\壮汉。
3.一个待遇优渥的工作。
4.一个可以任意学习的机会
你的选择是:1
你获得了一千万美金,但是,你确定你会花么……
请按任意键继续. . .
总结:
①使用do while的好处是,必定执行一次switch,当我们需要用户必须经历这个选择的时候,使用这个比较好;
②使用int的优点在于,好设置,while的条件设置简单。
缺点在于:假如用户输入字符(比如字母a),那么会无限执行default后面的第一行代码,如:cout << "你输入错啦,请重新输入:";
③将int变量改为char类型,则需要相对修改代码。主要修改内容是,case后面的字符,从1改为'1'(表示是字符1),while括号内的判断语句。
如代码:
char a;
change();
do
{
cin >> a;
switch (a)
{
case '1':money();break;
case '2':meinv();break;
case '3':work();break;
case '4':study();break;
default:cout << "你输入错啦,请重新输入:"; //default的意思是,假如输入的不是1、2、3、4,则执行这一段。
}
} while (a !='1'&&a!='2'&&a!='3'&&a!='4');
输出:
从以下选择中,挑一个你喜欢的吧!
1.一千万美金。
2.一个绝世美女\壮汉。
3.一个待遇优渥的工作。
4.一个可以任意学习的机会
你的选择是:g
你输入错啦,请重新输入:f
你输入错啦,请重新输入:1
你获得了一千万美金,但是,你确定你会花么……
请按任意键继续. . .
这个时候,无论输入哪个字符,都不会有问题了。
但出现了新问题:
①假如用户连续输入多个字符,例如:1234这样,那么结果只会读取用户输入的第一个字符(即'1'),似乎只能在之前注明输入多个字符只会读取一个,以防止用户产生误解。
②假如连续输入几个字符,例如AAA(3个大写字母A),那么就会连续弹出三段"你输入错啦,请重新输入:"这样的文字。原因在于缓冲区的字符多次读取。
解决方法:加上代码:
cin.sync(); //用于清除输入缓冲区的各种字符
于是问题解决。
PS:switch用在动作选择感觉比较好。
即如代码:
void combat()
{
char act; //动作选择参数
bool m; //逃跑是否成功判断参数
change(); //假设这是一个展示玩家可以动作选择的函数
do
{
cin >> act;
switch (a)
{
case 'a':attack();break; //执行attack函数,假设这是攻击函数
case 'b':def();break; //执行防御函数,假设这是用来设置防御加值的
case 'c':m = escape();if (m = false)break;else return; //假设这个函数是用来逃跑的
case 'd':act=skill();if(act=='d')break; //假设这是一个使用技能的函数
default:cout << "你输入错啦,请重新输入:"; //default的意思是,假如输入的不是a、b、c、d,则执行这一段。
}
cin.sync(); //用于清除输入缓冲区的各种字符
} while (act != 'a'&&act != 'b'&&act != 'c'&&act != 'd');
}
a、b、c这三个函数相对简单。
a:执行对对方造成伤害,结束动作,轮到对方;
b:增加防御系数,结束动作后,轮到对方动作时减少对自己的伤害;
c:逃跑成功则离开combat()函数,逃跑失败则结束动作,轮到对方;
d:调用技能函数,比较复杂。
假如执行成功动作,成功执行一个动作(比如说类似攻击函数的函数),返回值为'd',然后if通过判断,执行break结束switch,又因为不在while范围内,结束while。
假如没有成功执行动作(比如没有技能可以用),例如返回一个值'f',因为,不在if范围,于是无法break,执行default代码,又因为在while范围判断内,因此重新执行选择。
switch多种选择执行同一行代码:
即比如无论我输入小写a还是大写A,都执行同一个函数,比如上面的attact()。
但问题是,while判断的条件又增多了。
这种方式,利用的是switch函数在非break情况下,会从符合要求的该行逐行往下执行的特点。
代码:
do
{
cin >> act;
switch (a)
{
case'A':
case 'a':attack();break; //执行attack函数,假设这是攻击函数
case'B':
case 'b':def();break; //执行防御函数,假设这是用来设置防御加值的
case'C':
case 'c':m = escape();if (m = false)break;else return; //假设这个函数是用来逃跑的
case'D':
case 'd':act=skill();if(act=='d')break; //假设这是一个使用技能的函数
default:cout << "你输入错啦,请重新输入:"; //default的意思是,假如输入的不是a、b、c、d,则执行这一段。
}
cin.sync(); //用于清除输入缓冲区的各种字符
} while (act != 'a'&&act != 'b'&&act != 'c'&&act != 'd'&&act != 'A'&&act != 'B'&&act != 'C'&&act != 'D');
效果是a和A,b和B等,是等价的。
switch的缺点:
①不适合执行范围。例如case后面要么是'a',要么是'1',但不能是>1等。
②只能执行整数(包括char类型,因为char类型能转为ASCII码,而ASCII码的每个符号的int值都是整数),不能执行浮点数。例如:case '1.1'是不行的,甚至int a改为double a,编译器都会提示出错。
使用枚举作为标签:
枚举在使用方法上类似int类型变量,也存在同样的缺点(即输入字母时会出现无限循环输出),以下代码改自int类型变量的代码:
enum{a=1,b,c,d}; //声明枚举,因为初始a=1,于是b=2,c=3,d=4
int m;
change(); //某个显示函数
do
{
cin >> m;
switch (m)
{
case a:money();break; //因为a=1,于是当输入1的时候,对应跳到这一行
case b:meinv();break; //因为b=2,于是当输入b的时候跳到这一行。
case c:work();break; //依次类推
case d:study();break;
default:cout << "你输入错啦,请重新输入:"; //default的意思是,假如输入的不是1、2、3、4,则执行这一段。
}
} while (m<a||m>d); //<a实际上就是<1,大于d实际上就是>4。于是这行的意思是<1或者>4则循环执行
除了有些时候可能更显眼一些,并没有发现有什么特别的优点。
由于cin不支持输入枚举名字,例如上面的a、b、c、d,因此还是需要int类型变量m。
在switch(m)的括号里面,也需要是int类型的变量m。
在case后面,可以用枚举相应的名字进行代替,例如a代替1等。
注意:枚举天生特点,后面的枚举变量名,在未声明的情况下,自动比前面的值大1。
使用while限制switch:
如果说,使用do while的目的是为了要求必须执行一次判断,然后要求不符合条件的输入,就需要重新输入。
那么使用while的特点就是,不符合条件的,直接不进行判断和出现相应的选择了。
例如,我们假设触发某个选择支,要求好感度达到50以上,于是代码:
if (好感度>50)
{
cout << "触发某个支线:" << endl;
然后一段话;cout << "输入你的选择:";m = 'm';
} //m给个不符合要求的值
while (好感度>50 && m != 'a' && m != 'b') //好感度满足,且输入的不符合要求则循环
{
cin >> m
switch (m)//假设m是事先声明的选择用变量
{
case 'a': 代码1;break;
case 'b':代码2;breakk;
default:cout << "请输入你的选择;"
}
}
假如好感度满足条件,才有机会触发这个支线。
假如好感度不满足条件,if和while的判断都不能通过,于是跳过,即无switch选择。
也可以用在,比如说,如果玩家愿意做出一个选择,并等待一定时间,那么就可以增长一个属性(变量),只要玩家不愿意退出,那么就可以无限进行,大概代码思路如下:
代码:
#include<iostream>
#include<ctime>
using namespace std;
int gold = 0; //全局变量gold
int vit = 0;
void abc();
void def(); //def函数省略不写,类同abc函数
int main()
{
cout << "你现在金钱为:" << gold << endl;
cout << "你现在vit为:" << gold << endl;
char a;
cin >> a; //玩家输入,决定进入
while (a == 'a' || a == 'b') //只要不自己退出,那么就无限执行
{
switch (a)
{
case 'a':abc();break; //abc是增长金钱(gold)的函数
case 'b':def();break; //def是增长vit的函数,省略
}
cout << "假如你需要继续进行,请输入a或者b,否则输入任意键结束循环:";
cin >> a;
}
}
void abc()
{
clock_t start = clock();
clock_t wait = 10*CLOCKS_PER_SEC;
while (clock() - start < wait);
gold = gold + 10;
cout << "你的金钱增长了10g" << endl;
cout << "你现在金钱为:" << gold << endl;
}
void def()
{
clock_t start = clock();
clock_t wait = 10 * CLOCKS_PER_SEC;
while (clock() - start < wait);
vit = vit + 10;
cout << "你的vit增长了10" << endl;
cout << "你现在vit为:" << gold << endl;
}
输出:
你现在金钱为:0
你现在vit为:0
a
你的金钱增长了10g
你现在金钱为:10
假如你需要继续进行,请输入a或者b,否则输入任意键结束循环:a
你的金钱增长了10g
你现在金钱为:20
假如你需要继续进行,请输入a或者b,否则输入任意键结束循环:b
你的vit增长了10
你现在vit为:20
假如你需要继续进行,请输入a或者b,否则输入任意键结束循环:b
你的vit增长了10
你现在vit为:20
假如你需要继续进行,请输入a或者b,否则输入任意键结束循环:r
请按任意键继续. . .