c++switch打折问题

img

img


按照代码上的话50个就会打折不符合题目,我应该怎么操作区分开来,只能用switch

是不是不含50个
那么 (m - 1) / 50

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/249953
  • 你也可以参考下这篇文章:解决【C++】switch中变量赋值
  • 除此之外, 这篇博客: C++语言中关于switch的用法中的 关于switch的用法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在一些程序编写中绝对少不了判断语句。
    如下面这个用if的简单的判断结构:

    #include<iostream>
    using namespace std;
    
    int main() {
    
    	int a = 2, b = 3,sum;
    	sum = a + b;
    	if (sum=4)
    	{
    		cout << "等于4" << endl;
    	}
    	else if (sum=5)
    	{
    		cout << "等于5" << endl;
    	}
    	return 0;
    }
    

    但是这种if的判断语句存在着极大地弊病,就是在每次判断中都要计算一次表达式sum是否等于4或者5,而且表达式 a+b 的结果为一个值,而非一个范围,所以C++就有了switch来解决这种弊病。
    用switch改进后的语句如下面:

    #include<iostream>
    using namespace std;
    
    int main() {
    	int a = 2, b = 3,sum;
    	sum = a + b;
    	switch (sum)
    	{
    	case 4:
    		cout << "等于4" << endl; 
    		break;
    	case 5:
    		cout << "等于5" << endl;
    		break;
    	default:
    		break;
    	}
    	return 0;
    }
    

    在经过switch改进后,明显简洁很多,当然在这种及其简单的例子中也行很难体现其最大的优点,但是在日后的程序编写中switch对于程序的可读性和优化等是有一定的帮助的,所以了解和认识switch是一个程序员必备的。
    接下来是switch的格式:

    1. switch后面必须有()和{};
    2. 在()中是需要判断的语句和变量(例如上面是判断sum变量的值);
    3. 在{}中是switch核心程序块,用于判断处理;
    4. 在{}中就是使用case关键字来判断;
    5. case后面跟的必须是常量表达式(包括字符表达式)(格式如:case 1:语句;[break;]),表达式可以是C++任何的合法语句,但是其值只能是字符型常量或者整型常量,该常量表达式是用来判断()里面的表达式的值是否与该常量表达式的值相等;
    6. 每个分支case的常量表达式的值必须与某一值严格相等;
    7. case 常量表达式: 其冒号‘:’后面就是判断为True后所要执行的语句,而且最容易让新学者犯错的是,在执行语句后没有加 break 这样可能会导致的错误的结果,如果没有加break的话会继续执行下去,甚至会把其他case后面的语句也执行了,这个结果会在后面讲;
    8. 所有的case 后面可以加上“ default:语句块;break; ” 而且default可以加也可以不加;
    9. 注意 case 后面的 常量表达式的值都是不能相等的;(若判断的值范围较大,则显然是用if语句优于switch语句。)
    10. 在判断过程中发现每个分支case的常量表达式都不符合,则如果有default语句到时候就会执行default语句后面的的语句,如果default没有,则什么也不执行;
    11. 而且,若switch的某一分支的语句不止一句,则所要求的的多条语句也不用写成语句块的形式,只需在最后的语句后面加上break;即可表示在此case的执行语句结束;

    switch的格式示意(其中的[]括起来的表示可以加也可以不加):

    #include<iostream>
    using namespace std;
    
    int main() {
    
    	switch (表达式)
    	{
    	case 常量表达式1: [语句块1] [break; ]
    	case 常量表达式2: [语句块2] [break;]
    	case 常量表达式3: [语句块3] [break;]
    		.
    		.
    		.
    	case 常量表达式n: [语句块n] [break;]
    	[default:语句块n + 1;[ break;] ]
    	}
    	return 0;
    }
    

    在这里讲一下,如果在case中的语句最后不加break可能发生的不好结果:

    #include<iostream>
    using namespace std;
    
    int main() {
    	int a = 1;
    	switch (a)
    	{
    	case 1: cout << 1 << endl; 
    	case 2:  cout << 2 << endl; break;
    	case 3: cout << 3 << endl; 
    
    	}
    	return 0;
    }
    

    在其中的一个分支 case 1:和case 2:的最后没有加break。
    执行结果:
    执行结果该结果表明:在 case 1: 的执行语句后面没加 break; 的时候,程序不会跳出switch而继续判断下去,使得 case 2: 后面的执行语句也会被执行,知道碰到 break; 才停止,所以只输出了 1 和 2 ,而没有输出 3。
    在初学者刚学switch的时候有可能会有这种错误,所以在编写程序的时候一定要考虑break;的重要性。

    如果能善于运用bool(布尔)类型的True(1)和Flase(0)也可以用来判断一个范围的值,而不是一个严格的值。
    ///*********************************************************************///
    如我用switch语句实现学生成绩百分制转换成五级记分制:

    #include<iostream>
    using namespace std;
    
    int main() {
    	
    	int x, p;
    	cin >> x;
    	p = 1 * (x < 60) + 2 * (x >= 60 && x < 70) + 3 * (x >= 70 && x < 80) + 4 * (x >= 80 && x < 90) + 5 * (x >= 90);
    	switch (p)
    	{
    	case 1:cout << "不及格" << endl; break;
    	case 2:cout << "及格" << endl; break;
    	case 3:cout << "中等" << endl; break;
    	case 4:cout << "良好" << endl; break;
    	case 5:cout << "优秀" << endl; break;
    
    	default:
    		break;
    	}
    	
    	
    }
    

    关键的语句是“p = 1 * (x < 60) + 2 * (x >= 60 && x < 70) + 3 * (x >= 70 && x < 80) + 4 * (x >= 80 && x < 90) + 5 * (x >= 90);”,这是把范围转换为一个严格值的关键,在()里面表达式的值满足bool值为true时,也就是等于1了,而其bool值为false是,也就是等于0了,当然上面范围需是没有交集的,这样才能保证范围转换为一个严格的值时的准确,在准确转化完成后,其余步骤就和正常使用switch那样了。
    (如有异议欢迎在评论中提出。)


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^