有没有更简洁的方法来解决这个C#练习?

时间:2017-06-27 13:36:46

标签: c#

我是c#的初学者。所以我想解决这个问题:

  

你驾驶的速度有点太快,一名警察阻止你。编写代码来计算结果,编码为int值:0 =没有票,1 =小票,2 =大票。如果速度为60或更低,则结果为0.如果速度在61和80之间,则结果为1.如果速度为81或更高,则结果为2.除非是您的生日 - 在那一天,您的在所有情况下,速度可以高出5个。

我通过以下方式解决了这个问题:

class SpeedLimit
{
    public int CaughtSpeeding(int speed, bool isBirthday)
    {
        if (speed < 61 || (speed < 66 && isBirthday == true))
        {
            return 0;
        }

        else if (speed >= 61 && speed <= 80 && isBirthday == false)
        {
            return 1;
        }

        else if (speed >= 66 && speed <= 85 && isBirthday == true)
        {
            return 1;
        }
        else
            return 2;
    }
}

它有效,但我必须在生日时每次手动添加5个。我认为这不是本次练习的目的。那么还有其他方便的解决方法吗?

3 个答案:

答案 0 :(得分:3)

最快的胜利是以5倍的速度来处理你的生日:

public int CaughtSpeeding(int speed, bool isBirthday)
{
    if (isBirthday) speed -= 5;
    /*Birthday fully considered*/

答案 1 :(得分:0)

您可以预先计算使用isBirthday减去5的变量的速度。这样可以使代码更清晰。

class SpeedLimit
{
    public int CaughtSpeeding(int speed, bool isBirthday)
    {
        var measuredSpeed = isBirthday
                                ? speed - 5
                                : speed;

        if (measuredSpeed < 61)
        {
            return 0;
        }
        else if (measuredSpeed >= 61 &&
                 measuredSpeed <= 80)
        {
            return 1;
        }
        else
        {
            return 2;
        }
    }
}

答案 2 :(得分:0)

一点点数学也可以提供帮助。 6080之间的差异为20,将偏移量视为40,因为您说包容性我们考虑通过计算中的因子递减速度。因此票价将以这种方式计算。

ticket = Min(Max(speed - 1 - 40, 0) / 20, 2);

考虑生日时间

public static int CaughtSpeeding(int speed, bool isBirthday)
{
    if(isBirthday) speed -= 5;
    return (int)Math.Min(Math.Max(speed - 1 - 40, 0)/20, 2);
}