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 请按任意键继续. . .