(八十六)switch语句

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
请按任意键继续. . .
时间: 2024-07-29 13:32:21

(八十六)switch语句的相关文章

第八十六期中亿佰联全国&quot;阳光借贷&quot;培训班圆满结训

第八十六期中亿佰联全国"阳光借贷"培训班于11月8日在湖南三和大酒店圆满结训.湖南三邦投资担保有限公司.中亿佰联鄱阳http://www.aliyun.com/zixun/aggregation/6492.html">投资管理有限公司.万年县中亿佰联投资管理有限公司.长沙稳众投资管理有限公司.九江金亿投资管理有限公司.郴州市鸿业投资管理有限公司.江西广泓融顺投资管理有限公司.津市中亿佰联投资管理有限公司.新余中亿佰联投资管理有限公司.湖南川佰投资管理有限公司.娄底立智资

entity-这段代码中二,四,八分频和十六分频有什么意思?

问题描述 这段代码中二,四,八分频和十六分频有什么意思? LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY LED IS PORT (clk,rst:IN std_logic; inp: in std_logic_vector(1 downto 0); output : OUT std_logic_vector(7 downto 0) ); END LED; ARCHITECTUR

c语言-C语言switch语句 错误 请指教

问题描述 C语言switch语句 错误 请指教 #include ""stdio.h""void main(){ int yearmonthday;//定义年月天数,闰年等于366天,平年等于365天 printf(""请输入月份.年份:""); scanf(""%d%d""&month&year); switch(month) { case 1:day=31;break

java switch-关于Switch语句,求大神解答!感谢!

问题描述 关于Switch语句,求大神解答!感谢! public class HelloWorld { public static void main(String[] args) { int num=1; switch(num){ case 1: System.out.println("1"); case 2: System.out.println("2"); break; case 3: System.out.println("3"); br

如何用switch语句替换if,else

问题描述 如何用switch语句替换if,elseif(){}if(){}else(){}和if(){}elseif(){}else{}的运行区别是什么,如果用switch语句来替换,体现其区别 解决方案 解决方案二:if(){}if(){}else(){} 这个其实是两段逻辑无论你的第一个if()是否成立,都要进行下一个if,else判断if(){}elseif(){}else{} 这个是一个单独的逻辑,可以直接用switch进行替换解决方案三:楼上正解解决方案四:第一种是两个if语句第二个i

图片-switch语句中各个case语句与default的次序不影响执行结果吗?

问题描述 switch语句中各个case语句与default的次序不影响执行结果吗? 解决方案 解决方案二: switch...case... 语句switch case 语句基础知识之switch case语句 解决方案三: http://zhidao.baidu.com/link?url=wmBFivbZ3tyO_HPJvx3coYKWoVtAhIXR8cfkaEU-Zea5u8nkB2Um5pwvPExjMCrihmtMY0N8dQ1si17IkSHW2K 解决方案四: 你的外层switc

php中switch语句用法详解_php技巧

本文介绍php中的switch语句的用法,它跟其他语句中的switch用法差不多的,但注意有有一个break语句. PHP中switch语句的标准语法: switch (expression) { case label1: code to be executed if expression = label1; break; case label2: code to be executed if expression = label2; break; default: code to be exe

我的MYSQL学习心得(十六) 优化

原文:我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(十) 自定义存储过程和函数 我的

热点推荐:PHP中十六个魔术方法详解

前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或emp