1

解决了。非常感谢所有提供意见的人。这里很棒的社区。

我有一项任务,其中一部分程序需要计算客户的停车费。

费用以小时和 1/2 小时为增量。

确定小时数和分钟数。第 1 至 30 分钟按小时费率的 1/2 收费。从 31 到 59 的分钟按一小时计费。

每小时收费 2.00 美元。停车没有最长时间限制。

我被困在如何正确编码这个问题上。我想它使用 if 语句,这不是问题。但是由于没有最大时间限制,我不知道如何正确编码,或者至少如何开始它。

到目前为止,这是我整个项目的代码,我只是不知道如何开始处理程序的这一部分。

    public Waterpark()
    {
        InitializeComponent();
    }

    private void individualButton_Click(object sender, EventArgs e)
    {
        if (groupNameTextBox.Text.Trim() != string.Empty)
        {
            try
            {
                groupAmount = int.Parse(groupNameTextBox.Text);
                try
                {
                    parkingMinutes = int.Parse(parkedTextBox.Text);
                    IndividualTotals();
                }
                catch
                {
                    MessageBox.Show("Must be an integer.", "INPUT ERROR");
                    parkedTextBox.Focus();
                    parkedTextBox.SelectAll();
                }
            }
            catch
            {
                MessageBox.Show("Must be an integer.", "INPUT ERROR");
                peopleTextBox.Focus();
                peopleTextBox.SelectAll();
            }
        }
        else
        {
          MessageBox.Show("Must be a valid group name.", "INPUT ERROR");
          groupNameTextBox.Focus();
          groupNameTextBox.SelectAll();
        }    
    }


    private void eventOneCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        eventInt += 1;
        eventInt -= 1;
    }

    private void eventTwoCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        eventInt += 1;
        eventInt -= 1;
    }

    private void eventThreeCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        eventInt += 1;
        eventInt -= 1;
    }

    private void eventFourCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        eventInt += 1;
        eventInt -= 1;
    }

    private void eventFiveCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        eventInt += 1;
        eventInt -= 1;
    }

    private void IndividualTotals()
    {
        extraInt = eventInt - 1;

        switch(extraInt)
        {
        case 1:
            extraFee = 3.00;
            break;
        case 2:
            extraFee = 5.00;
            break;
        case 3:
            extraFee = 6.00;
            break;
        case 4:
            extraFee = 7.00;
            break;
        default:
            extraFee = 00.00;
            break;

        int hoursParked = minutesParked / 60;
        int minutesRemainder = hoursParked % 60;
        double hoursCost = hoursParked * 2;

        if (minutesRemainder <= 30)
        {
            minutesCost = 1;
        }

        else
        {
            minutesCost = 2;
        }
        parkingFee = hoursCost + minutesCost;

        }
    }
4

3 回答 3

4

首先,我建议界面(用于输入数据的按钮和文本框)与计算费用的逻辑分开。这将通过创建新方法来完成,该方法接受参数(如小时费和总停车时间)并返回总成本(就像rsbarro建议的那样)。然后一些按钮点击事件只会检查输入的正确性,调用计数函数,并将它返回的内容放到某个文本框中,无论如何。

如果我理解正确的话,计算费用的实际功能应该不会很难写,如果你考虑如何手动为人停车,例如 20 分钟、30 分钟,然后是 50、60、100、200, 300等。

我将基于此编写其余部分:

确定小时数和分钟数。第 1 至 30 分钟按小时费率的 1/2 收费。从 31 到 59 的分钟按一小时计费。

每小时收费 2.00 美元。停车没有最长时间限制。

因为这对我来说不是很清楚 - 我应该按 1/2 小时的 13/30 收费 13 分钟,这将是 ~0.43 美元,还是 1 美元,31 分钟是 2.00 美元?那么 61 分钟将是 3.00 美元——这是我的解释。

  1. 确定总分钟数。

    考虑用户如何提供输入。一个带有分钟的文本框?两个带有小时/分钟的文本框?一个hh:mm格式的文本框?但是,找到计算总分钟数的方法,因为这是您最终费用的基础。

  2. 数数

    由于每 60 分钟将收取 2.00 美元,我们可以通过将分钟数除以 60(或 61,取决于解释)并取商(其整数部分)来轻松找到小时数。意思是:

    25 div 60 = 0
    35 div 60 = 0
    60 div 60 = 1
    95 div 60 = 1
    128 div 60 = 2
    

    在这里我们很容易看到,在 25 和 35 分钟内没有完整的小时,而在 60 分钟内则有一个小时。在 128 分钟内有两个完整小时,我们应该向我们的客户收取费用。这意味着某些结果值( rv) 将是rv = (minutes / 60) * 2;

    现在我们必须为剩余的时间(不是整小时)添加费用。这里我们有两种选择:如果余数少于 30,我们只收取 1.00 美元。如果超过 30,我们向可怜的家伙收取 2.00 美元。modulo使用除法得到余数:

    25 mod 60 = 25
    35 mod 60 = 35
    60 mod 60 = 0
    95 mod 60 = 35
    128 mod 60 = 8
    

    所以,让我们采取remainder = minutes % 60;. 并检查选项(因为这是你的任务,我会用伪代码编写):

    remainder <- minutes mod 60;
    if remainder =< 30:
       add $1.00 to the fee
    else: # (if remainder is more than 30, namely 31..59)
       add $2.00 to the fee
    

之后,只需按您的功能返回总费用(全时费用+剩余费用)并呈现给用户。

同样出于好奇:eventInt您的代码中到底是什么?

于 2012-10-14T18:36:12.613 回答
1

我讨厌做别人的功课,但这一个真的很简单。您根本不需要 if 语句。不要认为它是每 60 分钟 2 美元。相反,它是每 30 分钟 1 美元。要获得 30 分钟增量的数量,只需将人停放的分钟数除以 30,然后四舍五入到最接近的 intMath.Ceiling()

它实际上是一个 1-liner:

[TestClass]
public class Parking
{
    private int GetParkingCharge(int minutesParked)
    {
        return (int)Math.Ceiling(minutesParked/30f);
    }

    [TestMethod]
    public void TestParking()
    {
        Assert.AreEqual(0, GetParkingCharge(0));
        Assert.AreEqual(1, GetParkingCharge(25));
        Assert.AreEqual(2, GetParkingCharge(45));
        Assert.AreEqual(2, GetParkingCharge(60));
        Assert.AreEqual(3, GetParkingCharge(61));
        Assert.AreEqual(3, GetParkingCharge(90));
        Assert.AreEqual(4, GetParkingCharge(91));
    }
}
于 2012-10-14T19:43:23.280 回答
0

这似乎是一个足够的算法:

public static float Charge(int lengthInMinutes)
    {
        float charge = 0.0f;
        while (lengthInMinutes >= 60)
        {
            charge += 2;
            lengthInMinutes -= 60;
        }

        // use this code instead of the 'if else' blog below to charge for ever minute after that for half the rate
        //float chargePerMinute = (float)((2.0f / 2) / 60);
        //charge += (float)lengthInMinutes * chargePerMinute;

        // at this point, we'll only have less than 60 minutes
        if (lengthInMinutes > 30)
        {
            charge += 2;
        }
        else if (lengthInMinutes > 0)
        {
            charge += 1;
        }
        if (charge > float.MaxValue)
            return float.MaxValue;
        return charge;
    }

测试的主要功能:

class Program
{
    static void Main(string[] args)
    {
        float charge = ParkingCharges.Charge(100);
        Console.WriteLine(charge.ToString("000.00"));
        Console.ReadKey();
    }
}

编辑:另外,如果您的输入不同(假设您正在获得一个时间类,或者它可能是浮点形式,只需先将其转换为分钟)

于 2012-10-14T18:46:45.760 回答