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;
}
}
}
12行: 最好不要在非UI的類別宣告UI會使用到的東西
回覆刪除16行: 盡量不要在同一行宣告兩個變數(即使那兩個變數被使用的性質很相近)
gcd在這邊是一個方法,所以名稱最好用全大寫的GCD,配上一個動詞會更好,如: GetGCD
JugPuzzle的37,38行宣告的Glass1,Glass2最好字首也改成小寫喔
刪除第二題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;
...
}