解决。非常感谢所有投入的人。这里有很棒的社区。 p>
我有一项任务,其中部分计划需要为客户计算停车费。
费用基于小时和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;
}
}
答案 0 :(得分:4)
首先,我建议从逻辑 分离界面(按钮和文本框输入数据),计算费用。这可以通过创建新方法来完成,该方法需要参数(如每小时费用和总停车时间)并返回总费用(就像 rsbarro 建议的那样)。然后一些按钮点击事件只会检查输入的正确性,调用计数功能,并将它返回到某些文本框中,无论如何。
如果我理解正确的话,计算费用的实际功能应该不是很难写,如果你考虑如何手动为人停车,例如20分钟,30分钟,然后50,60,100 ,200,300等。
我将基于此写下其余内容:
确定小时数和分钟数。分钟1到30分钟 每小时收费1/2。从31到59分钟收费 整整一个小时。
每小时收费为每小时2.00美元。没有最长时间限制 公园。
因为这对我来说不是很清楚 - 我应该以13/30的1/2小时费率收取13分钟,这将是~0.43美元,或者是1美元,31分钟是2.00美元?然后61分钟将是3.00美元 - 这是我的解释。
确定总分钟数。
考虑用户如何提供输入。一个分钟的文本框?两个文本框,小时/分钟? hh:mm 格式的一个文本框?然而,它是,找到计算总分钟数的方法,因为这是你的最终费用。
<强>计数强>
由于每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
的是什么?
答案 1 :(得分:1)
我讨厌做人的作业,但这个很简单。你根本不需要if语句。不要认为它是每60分钟2美元。相反,它是每30分钟1美元。要获得30分钟增量的数量,只需将停车人的分钟数除以30,然后用Math.Ceiling()
向上舍入到最近的整数
它实际上是一个单行:
[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));
}
}
答案 2 :(得分: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();
}
}
编辑:此外,如果您的输入不同(假设您正在获得时间类,或者它可能是浮动形式,请先将其转换为分钟)