1

解決しました。ご意見をお寄せいただき、誠にありがとうございました。ここの素晴らしいコミュニティ。

プログラムの一部で顧客の駐車料金を計算する必要がある割り当てがあります。

料金は1時間と1/2時間の増分に基づいています。

時間と分の数を決定します。分1から30は、時給の1/2で課金されます。31から59までの分は1時間課金されます。

時間料金は1時間あたり$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までの分は1時間課金されます。

時間料金は1時間あたり$2.00です。駐車の最大時間制限はありません。

これは私にはあまり明確ではないので、13分を1/2時間料金の13/30として請求する必要があります。これは、約$ 0.43になりますか、それとも$ 1で、31分は$ 2.00ですか?その場合、61分は$3.00になります-これが私の解釈です。

  1. 合計分数を決定します。

    ユーザーがどのように入力するかを検討してください。分付きの1つのテキストボックス?時間/分の2つのテキストボックス?hh:mm形式の1つのテキストボックス?ただし、これが最終的な料金の基準となるため、合計分数をカウントする方法を見つけてください。

  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分では1時間はありませんが、60分では1時間あることが簡単にわかります。128分で2時間かかり、そのためにお客様に請求する必要があります。これは、結果値rv)が。になることを意味しますrv = (minutes / 60) * 2;

    次に、残りの料金を追加する必要があります(1時間ではありません)。ここでは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で割り、最も近い整数に切り上げます。Math.Ceiling()

これは実際には1ライナーです。

[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 に答える