2017-02-09 13 views
-5

を得続ける私の問題ですが、私はこのコードを持っている:はので、ここで[OK]をDIVIDEBYZEROエラー

decRatio = _intNumofRooms /intTotal; 
if (decRatio > 1/6) { 
    MessageBox.Show("There can't be more than six people in the same room!", "Trump's Hotel", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    txtNumOfChildren.Focus(); 
    return false; 
} 
return true; 

は私だけ部屋あたり大人6名を受け入れることができホテルを持っています。大人は(合計)ですが、現在は何人の大人で部屋数を分けようとしていますが、その比率が1/6より大きければ、メッセージボックスに彼らが一人の部屋に6人以上の人がいることはできませんが、dividebyzeroexceptionエラーが発生します。このような比率を持つ別の方法や、どうすればこの問題を解決できますか?

+4

'inTotal'はゼロではありませんか? – Steve

+2

あなたのコードを質問自体に入れてください。画像への外部リンクとしてではありません。 – chwarr

+1

コードをテキストとしてコピー&ペーストします。イメージを使わないでください。 'intTotal'がどこから来たのかを表示します –

答えて

7

整数部はC#で整数を生成します。 1/6は2つの整数の除算であるため、ゼロが生成されます。あなたは画分を生成したい場合は、ダブルスで数学を行います

double ratio = (double)numberOfRooms/(double)total; 
if (ratio > 1.0/6.0) ... 

それはゼロ誤差により、あなたの除算を引き起こしている場合、私は知らないが、あなたが投稿したコードは明らかに間違っているので、それを固定することにより開始します。

また、C#では名前の種類に基づいて名前を付けないでください。それはintNumberOfRoomsではありません。それはnumberOfRoomsです。それはではなく、totalNumberOfGuestsです。

また、あなたの数学は単に間違っています。 6人と6人の部屋があるとします。それは1/6より大きい6/6の比率なので、ポリシー違反ですか?あなたはこれを完全に後方に持っています。

比率を完全に避ける方がよいでしょう。

if (totalNumberOfGuests > 6 * totalNumberOfRooms) ... 

代わりに乗算を行うことはできません。

次へ:ユーザーインターフェイスをビジネスポリシーコードと統合しました。制限を6から5に変更することを決めたとします。コード内のいくつの場所を変更する必要がありますか?数学だけでなくエラー文字列も変更する必要があります。このロジックを、ポリシーに違反しているかどうかを判断する機能にカプセル化します。ビジネスポリシーコードは、ユーザーインターフェイスコードから遠くににしてください。あなたの懸念をよりよく分離するためにコードを再編成する方法を理解できますか?

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/

を、あなたがコードについて具体的な質問がある場合戻ってくる:

最後に、あなたはここに投稿する前にもう一度、あなたはこれを読む必要があります。 "私が修正できないバグのあるプログラムを書いた"というのはという質問ではない。

+1

また、 'total'もその操作で使用される前にゼロであることがチェックされていれば、それを0に設定することをお勧めします。 – Adrian

+0

ありがとう、教授はそのような名前を望んでいて、私は個人的にそのように好きではありません... –