---
# System prepended metadata

title: Untitled

---

GUIで以下のプログラムを作れ
なお、MoneyCaseクラスには仕様にないメソッドを適宜追加してもよい

easy

MoneyCaseクラスを作成せよ。ただし以下の要件を満たすものとする
・1万円、5千円、千円の紙幣および500円～1円までの硬貨が各何枚あるか管理する
・コンストラクタで初期の硬貨と紙幣の枚数を設定できる
・AddMoney(種類, 枚数)で特定の硬貨や紙幣の枚数を追加できる
・DecMoney(種類, 枚数)で特定の硬貨や紙幣の枚数を減らすことができる（ただし、マイナスになった場合は0にする）
・GetMoney(種類)で特定の硬貨の枚数を返す
・GetMoneyList()で硬貨と紙幣の枚数の一覧をリストまたは配列で返す
・CalcAmount()で現在の金額の総額を返す
normal

以下のフォームを作成せよ
・MoneyCaseクラスを利用し、現在の各紙幣・硬貨の枚数を画像をつかってわかりやすく表示（イメージ：■×3枚 〇×2枚）
・合計金額をラベルで表示
・各紙幣と硬貨の枚数表示の近くにそれぞれマイナスボタンとプラスボタンを用意し1枚ずつ増減させられるようにする

お金の画像
https://www.irasutoya.com/2019/04/blog-post_620.html
https://www.irasutoya.com/2013/04/blog-post_21.html
https://www.irasutoya.com/2013/04/blog-post_5033.html
https://www.irasutoya.com/2013/04/blog-post_3180.html
プラスマイナスボタンの画像
https://www.irasutoya.com/2014/10/blog-post_7.html
hard
MoneyCaseクラスに以下の機能を追加せよ
・OrganizeMoneyで財布の中身を最適化する（100円玉が5枚あったら500円玉にするなど）
・AddPrice(金額)で金額に応じて追加できる(5200円なら5千円札1枚と100円玉2枚を追加)

フォームにも以下の機能を追加せよ
・財布の中身を最適化できるボタンを用意する
・金額を指定して増減できるようにテキストボックスとボタンを用意する
expert
MoneyCaseクラスに以下の機能を追加せよ
・PaySimulate(金額)はおつりを最適化するために支払う金額を返すメソッド（財布の中身を減らしはしない）
・金額を渡されるとその金額を減らすことができるメソッド

フォームにも以下の機能を追加せよ
・金額を入力すると、最適な支払い金額とおつり額が表示される
・支払い確定ボタンを押すと上記金額が減らされ、おつりを受け取る


//ピッタリ支払い可能かどうか（完成）
        public bool PayJust(int pay_price)
        {
            string[] price = pay_price.ToString().Split();
            int len = price.Length;

            int one = 1;
            int five = 5;
            int rank_pay;
            int have = 0;

            //1の位から順にみてく
            for(int i = len-1; i >= 0; i--)
            {
                int pow = len - i - 1;              
                int mag = (int)Math.Pow(10, pow);//対象の位
 
                rank_pay = int.Parse(price[i]) * mag;//位ごと見ていく（1の位から）
                one *= mag;     //1,10,100...
                five *= mag;    //5,50,500...

                //対象以下の位の合計
                have += GetMoneyAmount(one) + GetMoneyAmount(five);//位ごとの手持ち合計
                if(rank_pay >= have)//手持ち対象の位の金額を払えるなら
                {
                    return false;
                }
                //払えるなら手持ちから仮払いして次の位へ  
                have -= rank_pay;
            }

            return true;

        }

        //支払いシミュレーション（未完成）
        public int PaySimurate(int pay_price)
        {
            if(CalcAmount() < pay_price)
            {
                return -1;
            }

            if (PayJust(pay_price))
            {
                return pay_price;
            }

            int pay = -1;
            for(int i = kind.Length-1; i > 0; i--)
            {
               
                if (PayJust(pay_price+i)){
                    pay = pay_price+i;
                }

                if(kind[i] > pay_price)
                {
                    pay = kind[i];
                    break;
                }

            }

            return pay;
        }        