C#での計算プログラムの作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
GaZ

C#での計算プログラムの作成について

#1

投稿記事 by GaZ » 9年前

お世話になります。
初めてのプログラミングに取り組んでおり、少しずつ仕様が実装できることがとても楽しい状況にいます。

保管費用の計算の自動化を目標にしています。
保管費用は期毎に加算され、期は1日-10日,11日-20日,21日-月末日の月に3期。
例えば、7月9日に入庫し7月12日出庫した場合だと9-10,11-12の二期となり、期毎の費用×2となります。

思いつけた方法で取り組んでみましたが正しい結果を得れているのかわかりません。
得れていても沢山のミスや無駄を含んでいるような気がしてなりません。

良い方法をご教受ください。

コード:

 
                int KeepDay = 0;
                string dum1 = DateTime.Today.ToString();
                string today = dum1;    //本日の日付
                DateTime dt_today = DateTime.Parse(today);
                string inDay = _Log_day_y + "/" + _Log_day_m + "/" + _Log_day_d ;	//入庫日
                DateTime dt_inday = DateTime.Parse(inDay);
                TimeSpan ts0 = dt_today - dt_inday;
                KeepDay = ts0.Days;
                string Log_keepDay = "保管日数:" + KeepDay + "日";

                int Keep_y = dt_today.Year - dt_inday.Year;
                int Keep_m = dt_today.Month - dt_inday.Month;
                Keep_m = Keep_y * 12 + Keep_m;
                
                int Keep_tod = dt_today.Day;
                int Keep_ind = dt_inday.Day;
                
                int tod_count = 0;
                int ind_count = 0;

                if (Keep_tod - 10 <= 0)
                {
                    tod_count = 2;
                }
                else
                {
                    if (Keep_tod - 20 <= 0)
                    {
                        tod_count = 3;
                    }
                    else
                    {
                        tod_count = 4;
                    }
                }

                if (Keep_ind - 10 <= 0)
                {
                    ind_count = 2;
                }
                else
                {
                    if (Keep_ind - 20 <= 0)
                    {
                        ind_count = 3;
                    }
                    else
                    {
                        ind_count = 4;
                    }
                }

                int Keep_d = 0;
                if (tod_count >= ind_count)
                {
                    Keep_d = tod_count - ind_count + 1;
                }
                else
                {
                    Keep_d = ind_count - tod_count;
                }
                Keep_d = Keep_m * 3 + Keep_d;

                //int InExp = 28;     //入庫費用
                //int OutExp = 28;    //出庫費用
                int KeepExp = 11;   //保管費用

                KeepExp = Keep_d * KeepExp;
                var Log_keepExp = "保管経費:" + KeepExp + "円";

 


上記コードで試行した場合
1:入庫→2014/06/11 出庫→2014/07/11 結果→44円(4期)
2:入庫→2012/07/11 出庫→2014/07/11 結果→803円(73期)
3:入庫→2010/07/11 出庫→2014/07/11 結果→1595円(145期)




[2] 環境  
 [2.1] OS : Windows7
 [2.2] コンパイラ名 : Visual Studio Express 2013

[3] その他
 ・どの程度C言語を理解しているか
  全くできていません。
 ・ライブラリを使っている場合は何を使っているか
  使用していません。

以上
宜しくお願いいたします。

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: C#での計算プログラムの作成について

#2

投稿記事 by ookami » 9年前

ソースを目視で確認しただけですいませんが、期の引き算のelse内の、
Keep_d = ind_count - tod_count;

Keep_d = ind_count - tod_count - 1;
ではないでしょうか。

「正しい結果を得れているのか」を確認するには、この場合は境界値試験などをするとよいと思います。
(参考)試験の種類
https://ittechinf.wiki.zoho.com/%E3%82% ... A1%9E.html

「無駄を含んでいるような気がして」とのことですが、気になったところでは以下のようなところがあります。

(修正前)
string dum1 = DateTime.Today.ToString();
string today = dum1;
DateTime dt_today = DateTime.Parse(today);
 ↓
(修正後) dum1とtodayを他で使っていないので
DateTime dt_today = DateTime.Today;


(修正前)
int KeepDay = 0;
KeepDay = ts0.Days;
string Log_keepDay = "保管日数:" + KeepDay + "日";
 ↓
(修正後) KeepDayを他で使っていないので
string Log_keepDay = "保管日数:" + ts0.Days + "日";


Keep_todとKeep_indそれぞれについて 10以下なら「2」、20以下なら「3」、それ以外なら「4」、と、期を判定している部分。ただ、これは分かりにくくなります。自分なら元のコードの方を好むかもしれない..
 ↓
tod_count = (Keep_tod-1)/10 + 2;
ind_count = (Keep_ind-1)/10 + 2;
※ intの割り算では自動的に小数切り捨てになります。

(また、最終的には差を見ているので +2 しなくてもよい)
 ↓
tod_count = (Keep_tod-1)/10;
ind_count = (Keep_ind-1)/10;

とりあえずこんなところでしょうか。

③については、3項演算子を使って、
tod_count = (Keep_tod - 10 <= 0) ? 2 :
        (Keep_tod - 20 <= 0) ? 3 :
        4;
という書き方もありますが、3項演算子は嫌う人もいます。私は好きですが...

あと、異常系(例えば「_Log_day_yなどに数値以外が入力された場合」や「未来日を入力した場合」など)については、後々でよいと思いますが、何かしらの対処があるとよいと思います。

GaZ

Re: C#での計算プログラムの作成について

#3

投稿記事 by GaZ » 9年前

ご指摘いただきました箇所等見直しし完成することができました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る