2015年4月16日 星期四

[2015][Quiz]MidExam-40173007H

程式有三個部分
Program為程式進入點
Jug為視窗主程式
JugPuzzle為類別 設定容量.裝倒水功能

Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _40173007H_MidTermQuiz
{
    static class Program
    {
        /// 
        /// 應用程式的主要進入點。
        /// 
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Jug());
        }
    }
}
Jug
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _40173007H_MidTermQuiz
{
    public partial class Jug : Form
    {
        JugPuzzle Ans = new JugPuzzle();
        public Jug()
        {
            InitializeComponent();
        }

        private void btnSolve_Click(object sender, EventArgs e)
        {
            Ans.message = txtMessage;
            Ans.numA = int.Parse(txtGlass1.Text);
            Ans.numB = int.Parse(txtGlass2.Text);
            Ans.numC = int.Parse(txtWaterNeeded.Text);

            Ans.SolveJugPuzzle();

        }

        private void btnClaer_Click(object sender, EventArgs e)
        {
            txtMessage.Clear();
        }
    }
}
JugPuzzle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _40173007H_MidTermQuiz
{
    class JugPuzzle
    {
        public TextBox message = new TextBox();
        public int numA;
        public int numB;
        public int numC;
        int tempA, tempB;

        public int gcd()
        {
            int tempA;
            int tempB;

            tempA = numA;
            tempB = numB;
            int mod = tempA % tempB;
            while (mod > 0)
            {
                tempA = tempB;
                tempB = mod;
                mod = tempA % tempB;  
            }
            return tempB;
        }

        public void SolveJugPuzzle()
        {
            int Glass1 = numA;
            int Glass2 = numB;
            int need = numC;
            int water1 = 0;
            int water2 = 0;

            message.AppendText("開始進行分水步驟! \n");
            

            if (need > Glass1+Glass2)
                message.AppendText("無解, 炸彈boom! \n");
            else if (need % gcd() != 0)
                message.AppendText("無解, 炸彈boom! \n");
            else if (need == Glass1)
            {
                water1 = Glass1;
                message.AppendText("將容器A裝滿 \n");
                message.AppendText("{A,B}={" + water1.ToString() + "," + water2.ToString() + "} \n");
                message.AppendText("*************************** \n");
                message.AppendText("*************************** \n");
                message.AppendText("將容器A放在磅秤上,即為所求 \n炸彈解除!");
            }
            else if (need == Glass1+Glass2)
            {
                water1 = Glass1;
                water2 = Glass2;
                message.AppendText("{A,B}={" + water1.ToString() + "," + water2.ToString() + "} \n");
                message.AppendText("*************************** \n");
                message.AppendText("*************************** \n");
                message.AppendText("將容器A與B一起放在磅秤上,即為所求 \n炸彈解除!");
            }
            else 
            {
                while (need != water1 || need != water2 || need!=water1+water2)
                {
                    if (water1==0)
                    {
                        water1 = Glass1;
                        message.AppendText("============================== \n");
                        message.AppendText("將容器A裝滿 \n");
                        message.AppendText("{A,B}={" + water1.ToString() + "," + water2.ToString() + "} \n");
                        
                        if (need == water1 + water2)
                        {
                            
                            message.AppendText("*************************** \n");
                            message.AppendText("*************************** \n");
                            message.AppendText("將容器A與B一起放在磅秤上,即為所求 \n炸彈解除!");
                            break;
                        }
                    }
                    else
                    {
                        if (water1 + water2 > Glass2)
                        {
                            water1 = water1 - (Glass2 - water2);
                            water2 = Glass2;
                            message.AppendText("============================== \n");
                            message.AppendText("將容器A的水倒進容器B, 直到B滿為止 \n");
                            message.AppendText("{A,B}={" + water1.ToString() + "," + water2.ToString() + "} \n");
                            
                            if (need == water1 + water2)
                            {
                                
                                message.AppendText("*************************** \n");
                                message.AppendText("*************************** \n");
                                message.AppendText("將容器A與B一起放在磅秤上,即為所求 \n炸彈解除!");
                                break;
                            }
                            else
                            {

                                water2 = 0; 
                                message.AppendText("============================== \n");
                                message.AppendText("將容器B的水倒光 \n");
                                message.AppendText("{A,B}={" + water1.ToString() + "," + water2.ToString() + "} \n");
                               
                            }
                        }
                        else
                        {
                            water2 = water1 + water2;
                            water1 = 0;
                            message.AppendText("============================== \n");
                            message.AppendText("將容器A的水倒進容器B, 直到B滿為止就倒空 \n");
                            message.AppendText("{A,B}={" + water1.ToString() + "," + water2.ToString() + "} \n");
                            

                            if (need == water1 + water2)
                            {
                                
                                message.AppendText("*************************** \n");
                                message.AppendText("*************************** \n");
                                message.AppendText("將容器A與B一起放在磅秤上,即為所求 \n炸彈解除!");
                                break;
                            }
                            
                        }

                    }
                    if (need == water1)
                    {
                        message.AppendText("*************************** \n");
                        message.AppendText("*************************** \n");
                        message.AppendText("將容器A放在磅秤上,即為所求 \n炸彈解除!");
                        break;
                    }
                    else if (need==water2)
                    {
                        message.AppendText("*************************** \n");
                        message.AppendText("*************************** \n");
                        message.AppendText("將容器B放在磅秤上,即為所求 \n炸彈解除!");
                        break;
                    }
                }
                
            }
        }



    }
}
期中考第2題的Form
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _40173007H_MidTermQuiz2
{
    public partial class Form1 : Form
    {
        MyDateTime MyDate = new MyDateTime();
        public Form1()
        {
            InitializeComponent();
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            MyDate.year = int.Parse(txtYear.Text);
            MyDate.month = int.Parse(comboMonth.Text);
            MyDate.day = int.Parse(comboDay.Text);

            if (rdbtnIsLeap.Checked)
            {

                if (MyDate.IsLeap())
                {
                    txtMessage.AppendText(MyDate.year+"年是閏年 \n");
                }
                else
                    txtMessage.AppendText(MyDate.year + "年是平年 \n");
            }

            else if (rdbtnDateLegal.Checked)
            { 
                if (MyDate.IsValid())
                    txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "合法 \n");
                else
                    txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "不合法 \n");
            }

            else if (rdbtnDateToWeek.Checked)
            {
                switch (MyDate.WeekDay())
                {
                    case 0:
                        txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期日 \n");
                        break;
                    case 1:
                        txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期一 \n");
                        break;
                    case 2:
                        txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期二 \n");
                        break;
                    case 3:
                        txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期三 \n");
                        break;
                    case 4:
                        txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期四 \n");
                        break;
                    case 5:
                        txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期五 \n");
                        break;
                    case 6:
                        txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期六 \n");
                        break;

                }
            }

            else if (rdbtnCalender.Checked)
            {
                txtMessage.AppendText("Sun\tMon\tTue\tWed\tThur\tFri\tSat\t\n");
                
                MyDate.day = 1;

                int First = MyDate.WeekDay();

                for (int i = 0; i < First; i++)
                {
                    txtMessage.AppendText("\t");
                }

                for (int j = 1; j <= MyDate.DaysOfMonth(); j++)
                {
                    txtMessage.AppendText(j+"\t");
                    if ((j+First)%7==0)
                        txtMessage.AppendText("\n");
                }



            }
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtMessage.Clear();
        }
    }
}
期中考第2題的class - MyDateTime
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _40173007H_MidTermQuiz2
{
    class MyDateTime
    {
        //field
        private int _year;
        private int _month;
        private int _day;

        public int year
        {
            get {return _year;}
            set { _year = value; }
        }

        public int month
        {
            get { return _month; }
            set { _month = value; }
        }

        public int day
        {
            get { return _day; }
            set { _day = value; }
        }



        public bool IsLeap()
        {
            if (_year % 4 == 0 && _year % 100 != 0)
                return true;
            else if (_year % 400 == 0)
                return true;
            else
                return false;
            
        }

        public int DaysOfMonth()
        {
            switch (_month)
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    return 31;
                    
                case 4:
                case 6:
                case 9:
                case 11:
                    return 30;
                    
                case 2:
                    {
                        if (IsLeap())
                            return 29;
                        else
                            return 28;
                    }
                default:
                    return 0;
            }
            
        }

        public bool IsValid()
        {
            if (_month > 12 || _month > 31)
                return false;

            else if (_day < 1 || _day > DaysOfMonth())
                return false;
            else
                return true;
        }

        public int WeekDay()
        {
            int Y;

            if (_month == 1 || _month == 2)
                Y = (_year - 1);
            else Y = _year;

            int y = Y % 100;
            int c = Y / 100;
            int m = (_month+9)%12+1;
            int d = _day;
            int W;

            W = (int)(d + Math.Floor(2.6 * (double)m - 0.2) + y + y / 4 + c / 4 - 2 * c)%7 ;

            if (W < 0)
                W += 7;
            
            return W;
        }

        
    }
}

3 則留言:

  1. 12行: 最好不要在非UI的類別宣告UI會使用到的東西
    16行: 盡量不要在同一行宣告兩個變數(即使那兩個變數被使用的性質很相近)
    gcd在這邊是一個方法,所以名稱最好用全大寫的GCD,配上一個動詞會更好,如: GetGCD

    回覆刪除
    回覆
    1. JugPuzzle的37,38行宣告的Glass1,Glass2最好字首也改成小寫喔

      刪除
  2. 第二題Form1.cs, 51行開始:
    txtMessage.AppendText(MyDate.year + "/" + MyDate.month + "/" + MyDate.day + "是星期日 \n");
    這些輸出字串的部分,可以在switch前就先設定前面不需要藉由switch判斷的字串。
    Ex:
    string message;
    message = MyDate.year.ToString() + "/" + MyDate.month.ToString() + "/" + MyDate.day.ToString();
    switch(MyDate.WeekDay())
    {
    case1:
    message += "是星期一"
    break;
    ...
    }

    回覆刪除