c++语言switch 语句怎么讲解

c++语言switch 语句怎么讲解,第1张

我们已经了解,if……else……可以用来描述一个“二岔路口”,我们只能选择其中一条路来继续走。然而,有时候我们会遇到一些“多岔路口”的情况,用if……else……语句来描述这种多岔路口会显得非常麻烦,而且容易把思路搅浑。比如程序4.2.2就是一个用if……else……语句描述的四岔路口(四种 *** 作符),整个程序占据了将近一页。

如果我们把这些多岔路看作电路,那么用if……else……这种“普通双向开关”来选择某一条支路就需要设计一套很复杂的选路器。所以最简便的选路方法当然是做一个像下图那样的开关。(图4.4.1)

在C++中,也有这样的开关,那就是switch语句。它能够很简捷地描述出多岔路口的情况。具体的语法格式为:

switch(表达式)

{

case 常量表达式1:

{

语句块1;

break;

}

……

case 常量表达式n:

{

语句块n;

break;

}

default:

{

语句块n+1;

}

}

在switch语句中,我们要记住四个关键词,分别是switch、case、default和break。switch是语句的特征标志(图中标作sw);case表示当switch后的表达式满足某个case后的常量时,运行该case以后的语句块。要注意,任意两个case后的常量不能相等,否则switch将不知道选择哪条路走。default表示当表达式没有匹配的case时,默认(default)地运行它之后的语句块(图4.4.1中未标出);break表示分岔路已经到头,退出switch语句。

下面,我们就来用switch语句来改写程序4.2.2。箭头表明遇到break以后的运行情况。

#include "iostream.h"

int main()

{

float a,b

char oper

cout <<"请输入一个表达式(eg.1+2):" <<endl

cin >>a >>oper >>b

switch (oper)

{

case '+':

{

cout <<a <<oper <<b <<'=' <<a+b <<endl

break

}

case '-':

{

cout <<a <<oper <<b <<'=' <<a-b <<endl

break

}

case '*':

{

cout <<a <<oper <<b <<'=' <<a*b <<endl

break

}

case '/':

{

if (b!=0) cout <<a <<oper <<b <<'=' <<a/b <<endl

else cout <<"出错啦!"<<endl

break

}

default:

cout <<"出错啦!"<<endl

}

return 0

}

上述程序的运行结果和程序4.2.2的运行结果一样。我们发现使用了switch语句以后,代码的平均缩进程度有所减少,阅读代码的时候更简洁易懂。所以,使用swith语句来描述这种多分支情况是很合适的。

试试看:

1、如果去除了case对应的break,则运行出来会是什么结果?

结论:如果去除了break,则不会退出switch而运行到别的支路里去。

2、如果程序4.2.2的default没有处在switch的结尾部分,那么运行出来会是什么结果?

结论:switch语句中最后一个分支的break可以省略,其它的break均不可以。

3、case后的常量能否是一个浮点型常量或双精度型常量?

switch的一些使用技巧

返回去看一下程序4.1.2,我们不难发现这个程序也是一个多分支结构。可是switch语句只能判断表达式是否等于某个值,而不能判断它是否处于某个范围。而要我们把处于某个范围中的每个值都作为一句case以后的常量,显然也太麻烦了。那么我们还能不能使用swith语句来描述这种范围型的多分支结构呢?

通过分析,我们发现了主要起区分作用的并不是个位上的数,而是十位上的数。如果我们能把十位上的数取出来,那么最多也就只有十个分支了,不是吗?下面我们就来看一下用switch语句改编的程序4.1.2。

#include "iostream.h"

int main()

{

int mark

cout <<"请输入成绩(0~100): "

cin >>mark

switch(mark/20)

{

case 5:

{

if (mark>100)//100到119的情况都是mark/20==5,所以要用if语句再次过滤

{

cout <<"ERROR!" <<endl

break

}

}

case 4:

{

cout <<"Good!" <<endl

break

}

case 3:

{

cout <<"Soso" <<endl

break

}

case 2://根据前面试一试的结论,如果case没有对应的break,会运行到下一个case中

case 1:

case 0:

{

if (mark>=0)//同样要用if过滤负数

{

cout <<"Please work harder!" <<endl

break

}

}

default://其它情况都是出错

cout <<"ERROR!" <<endl

}

return 0

}

这个程序要比原来的程序4.1.2冗长一些。但是这里提到这个程序的目的是要教会大家一种使用switch的方法,即“以点盖面”。

算法时间:数据的转换

在程序设计中,我们经常会遇到这样的问题:我们希望处理的数据和电脑能够处理的数据可能有所不符。不符合的情况一般有两种,一种是范围不符合,另一种是类型不符合。对于范围不符合,我们一般考虑的是使用代数式对数据进行处理。比如C++中的随机函数能够产生一个0~32768之间的一个整数,如果我们希望得到一个0~10之间的随机数,那么就用它对10取余数,那么结果一定就在这个范围内。对于类型不符合,我们只好尽量用已有的数据类型来描述这种难以表达的类型。就如同电脑中用0和1表示真和假一样。

注意:

break 只能跳出一层 switch 或者循环,如果是 if else break 是不管的。它只管 switch 或者循环。

答案:C B B C A D B A D B

1.获得用户输入的一个整数N,计算并输出N的32次方。

2.获得用户输入的一段文字,将这段文字进行垂直输出。

3.获得用户输入的一个合法算式,例如1.2+3.4,输出运算结果。

4.获得用户输入的一个小数,提取并输出其整数部分。

5.获得用户输入的一个整数N,计算并输出1到N相加的和。

答案:C A A A B A C D A C

1.获得用户输入的一个整数,输出该整数百位及以上的数字。

2.获得用户输入的一个字符串,将字符串按照空格分割,然后逐行打印出来。

3.程序读入一个表示星期几的数字(1-7),输出对应的星期字符串名称。例如,输入3,返回“星期三”。

4.设n是一任意自然数,如果n的各位数字反向排列所得自然数与n相等,则n被称为回文数。从键盘输入一个5位数字,请编写程序判断这个数字是不是回文数。

5.输入一个十进制整数,分别输出其二进制、八进制、十六进制字符串。

答案:B A D C D D C A C D

1.输入一个年份,输出是否是闰年。#闰年条件:能被4整除但不能被100整除,或者能被400整除的年份,都是闰年。

2.最大公约数计算。获得两个整数,求出这两个整数的最大公约数和最小公倍数。最大公约数的计算一般使用辗转相除法,最小公倍数则使用两个数的乘积除以最大公约数。

3.统计不同字符个数。用户从键盘键入一行字符,编写一个程序,统计并输出其中英文字符、数字、空格和其他字符的个数。

4.改编题目1中的程序,当用户输入出错时给出“输入内容必须是整数!”的提示,并让用户重新输入。

5.羊车门问题。有三扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门。在开启它之前,主持人会开启另外一扇门,露出门后的山羊。此时,允许参赛者更换自己的选择。请问,参赛者更换选择后能否增加猜中汽车的机会?——这是一个经典问题。请使用random库对这个随机事件进行预测,分别输出参赛者改变选择和坚持选择获胜的概率。

答案:B B B B A D D A D D

Tips:

2.字典类型的key只能是不可变数据类型;

3.Python中以下情况判断为False:

(1)None–>None值

(2)False–>False值

(3)0 --->数值零不管它是int,float还是complex类型

(4)‘’,(),[] --->任何一个空的序列

(5){} --->空的集合。

9.列表类型的pop(i)方法,如果不指定参数 i,则默认取出并删除列表中最后一个元素

1.英文字符频率统计。编写一个程序,对给定字符串中出现的a~z字母频率进行分析,忽略大小写,采用降序方式输出。

2.中文字符频率统计。编写一个程序,对给定字符串中出现的全部字符(含中文字符)频率进行分析,采用降序方式输出。

3.随机密码生成。编写程序,在26个字母大小写和9个数字组成的列表中随机生成10个8位密码。

4.重复元素判定。编写一个函数,接受列表作为参数,如果一个元素在列表中出现了不止一次,则返回True,但不要改变原来列表的值。同时编写调用这个函数和输出测试结果的程序。

5.重复元素判定续。利用集合的无重复性改编上一个程序,获得一个更快更简洁的版本。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7933285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存