1. Trang chủ
  2. » Tất cả

Microsoft Word - Bai 6.1.docx

11 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 102,42 KB

Nội dung

Microsoft Word Bai 6 1 docx Trang 1 MÔN CÁC MẪU THIẾT KẾ HỚNG ỐI TỢNG Bài thực hành số 6 1 Xây dựng và kiểm thử hệ thống qun lý biểu thức I Mục tiêu  Giúp SV làm quen với cách thức qun lý biểu t[.]

Trang MÔN : CÁC MẪU THIẾT KẾ HỚNG ỐI TỢNG Bài thực hành số 6.1 : Xây dựng kiểm thử hệ thống qun lý biểu thức I Mục tiêu :  Giúp SV làm quen với cách thức qun lý biểu thức i số Giúp SV biết cách sử dụng mẫu thiết kế Singleton, Apdater, Composite, Abstract Factory yêu cầu cụ thể II Nội dung : Xây dựng module qun lý biểu thức i số nh sau : biểu thức ợc xây dựng phép tốn hai ngơi +, -, *, / Các biểu thức c bn thực hay biến thực biểu thức có dịch vụ thiết yếu : - tối gin - tính trị III Chuẩn ầu :  Nắm vững tính chất, cơng dụng mẫu thiết kế Singleton, Adapter, Composite, Abstract Factory ể dùng li mẫu vị trí chng trình cần xây dựng IV Qui trình xây dựng chng trình Chy VS Net, chọn menu File.New.Project ể hiển thị cửa sổ New Project Mở rộng mục Visual C# TreeView "Project Types", chọn mục Window, chọn icon "Windows Form Application" listbox "Templates" bên phi, thiết lập th mục chứa Project listbox "Location", nhập tên Project vào textbox "Name:" (td BaiTH7), click button OK ể to Project theo thông số ã khai báo Form ầu tiên ứng dụng ã hiển thị cửa sổ thiết kế, việc thiết kế form trình lặp thao tác to mới/xóa/hiệu chỉnh thuộc tính/to hàm xử lý kiện cho ối tợng cần dùng form Ta s thiết kế form ứng dụng sau Bây ta xây dựng hệ thống chứa thành phần miêu t biểu thức to biểu thức Dời chuột gốc Project cửa sổ "Solution Explorer", ấn phi chuột phần tử gốc này, chọn option Add.New Folder, ặt tên cho folder Expression ể việc lấy số ngẫu nhiên nhiều phần tử phần mềm ợc quán, ta s to ối tợng chuyên phục vụ to số ngẫu nhiên ể bo m phần tử to số ngẫu nhiên nhất, ta dùng mẫu thiết kế Singleton Hãy thực ối tợng có dịch vụ sau : - to số nguyên ngẫu nhiên - to số nguyên ngẫu nhiên nằm khong từ tới n - to số thực ngẫu nhiên nằm khong từ tới Trang Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class MyRandom.cs, chọn button Add ể máy to class Viết code cho class nh sau : class MyRandom { //hàm khởi to private ể cấm bên to ối tợng MyRandom private MyRandom() { } //thông tin dùng chung class private static MyRandom myrnd = new MyRandom(); public static MyRandom getInstance() { return myrnd; } //thông tin ối tợng private Random rnd = new Random(); public int RndInt() { return rnd.Next(); } public int RndInt(int n) { return rnd.Next(n); } public double RndDouble() { return rnd.NextDouble(); } } Lu ý ta ã dùng mẫu Adapter ể xây dựng class MyRandom dựa class Random NET Class MyRandom giống y nh class MyRandom ã ợc viết th viện GenLib thực hành 5.1 ể qun lý biểu thức, ta dùng mẫu thiết kế Composite ể ịnh nghĩa thành phần cấu thành biểu thức theo lợc ồ class nh sau : Trớc hết, ịnh nghĩa interface chung cho biểu thức : hằng, biến, biểu thức ngơi có dịch vụ sau : - tham kho biểu thức bên trái - tham kho biểu thức bên phi - tính trị biểu thức - tối gin biểu thức Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ “Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface IExpression.cs, chọn button Add ể máy to interface Viết code cho interface nh sau : interface IExpression { //hàm tính trị biểu thức double eval(IVarList e); //hàm tối gin biểu thức IExpression simplify(); //ịnh nghĩa thuộc tính Left (chỉ ọc) IExpression Left {get;} //ịnh nghĩa thuộc tính Right (chỉ ọc) IExpression Right { get; } } Trang Hiện thực class abstract chứa thông tin chung mà ối tợng biểu thức khác (hằng, biến, biểu thức ngơi) s dùng : - thuộc tính Left (vì biến khơng cần) - thuộc tính Right (vì biến khơng cần) Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class AbstractExpr.cs, chọn button Add ể máy to class Viết code cho class nh sau : abstract class AbstractExpr : IExpression { //hàm tính trị biểu thức public abstract double eval(IVarList e); //hàm tối gin biểu thức public abstract IExpression simplify(); //hiện thực thuộc tính Left (chỉ ọc) public virtual IExpression Left { get { return null; } } //hiện thực thuộc tính Right (chỉ ọc) public virtual IExpression Right { get { return null; } } } Hiện thực class miêu t số : Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class Constant.cs, chọn button Add ể máy to class Viết code cho class nh sau : class Constant : AbstractExpr { //giá trị private double value; //hàm khởi to có giá trị d xác ịnh public Constant(double d) { value = d; } //hàm tính tốn public override double eval(IVarList e) { return value; } //hiện thực thuộc tính Value (chỉ ọc) public double Value { get { return value; } } Trang //hàm gii mã chuỗi vn bn public override String ToString() { return String.Format("{0:f5}", value); } //hàm tối gin public override IExpression simplify() { //không thể tối gin hn return this; } }  10 Hiện thực class miêu t biến, ta dùng cách ặc tên biến theo dng Xi, với i số biến từ trở lên : Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class Variable.cs, chọn button Add ể máy to class Viết code cho class nh sau : class Variable : AbstractExpr { //chỉ số biến mơi trờng tính tốn private int rang; //hàm khởi to biến có số i public Variable(int i) { rang = i; } //hàm tính trị biến public override double eval(IVarList e) { return e[rang]; } //hàm gii mã biến thành dng chuỗi public override String ToString() { return "X" + rang; } //hàm tối gin biến public override IExpression simplify() { //không thể tối gin hn return this; } }  11 Hiện thực kiểu enum miêu t mã phép toán ợc dùng ể xây dựng biểu thức Trong thực hành ta hn chế dùng tốn tử ngơi cộng, trừ, nhân ể xây dựng biểu thức Ta không dùng phép chia ể hn chế lỗi chia q trình tính biểu thức : Trang Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class Operator.cs, chọn button Add ể máy to class Viết code cho class nh sau : enum Operator { //kiểu liệt kê mã phép tốn ngơi ợc dùng PLUS, MINUS, MULT, DIV } Lu ý phi ổi từ khóa từ class thành enum 12 Hiện thực class miêu t biểu thức dùng tốn tử ngơi : Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class BinOpExpr.cs, chọn button Add ể máy to class Viết code cho class nh sau : class BinOpExpr : AbstractExpr { // toán hng trái private IExpression left; // toán hng phi private IExpression right; //mã tốn tử ngơi private Operator op; //hàm khởi to biểu thức dùng toán tử ngơi op dùng tốn hng l r public BinOpExpr(Operator op, IExpression l, IExpression r) { this.op = op; left = l; right = r; } //hàm tính trị biểu thức public override double eval(IVarList e) { switch (op) { case Operator.PLUS: return left.eval(e) + right.eval(e); case Operator.MINUS: return left.eval(e) - right.eval(e); case Operator.MULT: return left.eval(e) * right.eval(e); case Operator.DIV: return left.eval(e) / right.eval(e); } return 0; } Trang //hiện thực thuộc tính Left (chỉ ọc) public override IExpression Left { get { return left; } } //hiện thực thuộc tính Right (chỉ ọc) public override IExpression Right { get { return right; } } //hàm gii mã biểu thức thành chuỗi vn bn public override String ToString() { StringBuilder ret = new StringBuilder("(" + left); switch (op) { case Operator.PLUS: ret.Append(" + "); break; case Operator.MINUS: ret.Append(" - "); break; case Operator.MULT: ret.Append(" * "); break; default: ret.Append(" / "); break; } ret.Append(right + ")"); return ret.ToString(); } //hàm tối gin biểu thức public override IExpression simplify() { //tối gin biểu thức bên trái IExpression ls = left.simplify(); //tối gin biểu thức bên phi IExpression rs = right.simplify(); IExpressionFactory ef = new ExpressionFactory(); if ((rs as Constant) == null || (ls as Constant) == null) return ef.createBinaryOp(op, ls, rs); //tính biểu thức double ketqua; double l = ls.eval(null); double r = rs.eval(null); switch (op) { case Operator.PLUS: Trang ketqua = l + r; break; case Operator.MINUS: ketqua = l - r; break; case Operator.MULT: ketqua = l * r; break; default: ketqua = l / r; break; } return ef.createConstant(ketqua); } }  13 Ta cần ối tợng chuyên qun lý giá trị biến ể phục vụ tính tốn biểu thức theo biến Trớc hết ta ịnh nghĩa interface tối thiểu cho ối tợng qun lý giá trị biến Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ “Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface IVarList.cs, chọn button Add ể máy to interface Viết code cho interface nh sau : interface IVarList { //ịnh nghĩa indexer double this [int i] {get; set; } } 14 Hiện thực ối tợng qun lý trị biến nh sau : Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class VarList.cs, chọn button Add ể máy to class Viết code cho class nh sau : class VarList : IVarList { //danh sách trị biến private double[] variables; //hàm khởi to mơi trờng tính tốn có size biến public VarList (int size) { variables = new double[size]; } //ịnh nghĩa indexer qun lý biến public double this [int i] { get { return variables[i]; } set { variables[i] = value; } Trang } //hàm gii mã biểu thức thành chuỗi vn bn public override String ToString() { String buf="["; for (int i = 0; i < variables.Length; i++) if (i == 0) buf += String.Format("{0:f5}", this[i]); else buf += ", " + String.Format("{0:f5}", this[i]); buf += "]"; return buf; } } 15 Ta dùng mẫu Abstract Factory ể cung cấp dịch vụ to ối tợng mà chng trình ứng dụng dùng ối tợng Factory có kh nng nh sau : - to ợc ối tợng số - to ợc ối tợng biến - to ợc ối tợng biểu thức nhị phân - to ợc ối tợng biểu thức ngẫu nhiên - to ợc ối tợng biểu thức ngẫu nhiên có tối a maxprof cấp lồng - to ợc ối tợng qun lý trị biến ợc dùng ể tính biểu thức Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ “Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface IExpressionFactory.cs, chọn button Add ể máy to interface Viết code cho interface nh sau : interface IExpressionFactory { //hàm to có giá trị xác ịnh IExpression createConstant(double constant); //hàm to biến có số xác ịnh IExpression createVariable(int id); //hàm to biểu thức dùng tốn tử ngơi IExpression createBinaryOp(Operator op, IExpression left, IExpression right); //hàm to biểu thức ngẫu nhiên IExpression createRandomExpression(); //hàm to biểu thức ngẫu nhiên có tối a maxProf cấp IExpression createRandomExpression(int maxProf); //hàm to ối tợng tính tốn ngẫu nhiên IVarList createRandomVarList(); }   Dời chuột th mục Expression cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class Trang ExpressionFactory.cs, chọn button Add ể máy to class Viết code cho class nh sau : class ExpressionFactory : IExpressionFactory { //số biến ợc dùng biểu thức private static int MAXVARIABLE = 2; //ối tợng to số ngẫu nhiên dng Singleton private MyRandom rnd = MyRandom.getInstance(); //hàm to biểu thức dùng tốn tử ngơi public IExpression createBinaryOp(Operator op, IExpression left, IExpression right) { return new BinOpExpr(op, left, right); } //hàm to có giá trị xác ịnh public IExpression createConstant(double constant) { return new Constant(constant); } //hàm to biến có số xác ịnh public IExpression createVariable(int id) { if (id >= MAXVARIABLE) MAXVARIABLE = id + 1; return new Variable(id); } //hàm to biểu thức ngẫu nhiên (có tối a cấp lồng nhau) public IExpression createRandomExpression() { return createRandomExpression(3); } //hàm to biểu thức ngẫu nhiên có tối a maxProf cấp lồng public IExpression createRandomExpression(int maxProf) { int cat=0; if (maxProf == 0) cat = rnd.RndInt(2); else cat = rnd.RndInt(4); switch (cat) { case 0: //biểu thức return createConstant(rnd.RndDouble()); case 1: // biểu thức biến return createVariable(rnd.RndInt(MAXVARIABLE)); } // biểu thức //to biểu thức bên trái IExpression left = createRandomExpression(maxProf - 1); Trang 10 //to biểu thức bên phi IExpression right = createRandomExpression(maxProf - 1); //to biểu thức return createBinaryOp((Operator)(rnd.RndInt(3)), left, right); } //hàm to ối tợng tính tốn ngẫu nhiên public IVarList createRandomVarList() { IVarList e = new VarList(MAXVARIABLE); for (int i = 0; i < MAXVARIABLE; i++) { e[i] = rnd.RndDouble(); } return e; } } 16 Duyệt tìm phần tử Form1 cửa sổ "Solution Explorer", ấn phi chuột vào mục này, chọn option "View Designer" ể hiển thị cửa sổ thiết kế Form1 17 Nếu cửa sổ ToolBox cha hiển thị chi tiết, chọn menu View.Toolbox ể hiển thị (thờng nằm bên trái hình) Click chuột vào button (Auto Hide) nằm góc phi cửa sổ ToolBox ể chuyển chế ộ hiển thị thờng trực 18 Duyệt tìm phần tử Button cửa sổ ToolBox, chọn v góc trái Form Vào cửa sổ thuộc tính Button hiệu chỉnh li thuộc tính Text = "Start", thuộc tính (Name) = btnStart To hàm xử lý kiện Click Button viết on code kiểm thử hệ thống qun lý biểu thức nh sau : private void btnStart_Click(object sender, EventArgs e){ //to ối tợng qun lý file ể ghi liệu StreamWriter oFile = new StreamWriter("data.txt", true, Encoding.Unicode); //to ối tợng Factory qun lý việc to biểu thức IExpressionFactory ef = new ExpressionFactory(); //to biểu thức ngẫu nhiên có tối a cấp lồng IExpression e1 = ef.createRandomExpression(6); //to danh sách giá trị biến ợc dùng tính tốn biểu thức IVarList env = ef.createRandomVarList(); oFile.WriteLine("Dùng danh sách giá trị biến : "+ env.ToString()); oFile.WriteLine("ể tính biểu thức:"); oFile.WriteLine(e1.ToString()); oFile.WriteLine(String.Format("Kết qu : {0:f5}", e1.eval(env))); oFile.WriteLine("Biểu thức có dng tối gin sau :"); e1 = e1.simplify(); oFile.WriteLine(e1.ToString()); oFile.WriteLine(String.Format("Kết qu tính : {0:f5}", e1.eval(env))); oFile.WriteLine("==============================================="); oFile.Close(); } Trang 11 Lu ý thêm lệnh using namespace ợc dùng ứng dụng nh sau : using System.IO; using BaiTH7.Expression; 19 Dịch chy chng trình Nếu có lỗi sửa, hết lỗi chng trình s chy Mỗi lần ngời dùng click chuột vào button, chng trình s to biểu thức ngẫu nhiên, tính xuất kết qu Sau ó, chng trình tối gin biểu thức, tính trị xuất kết qu ể so sánh Thử click chuột vào button nhiều lần (30 lần) dừng chng trình 20 Dùng trình WordPad mở file data.txt th mục chứa file kh thi chng trình, quan sát xem biểu thức ợc to xử lý bở chng trình xem có sai sót khơng ?     ... Factory có kh nng nh sau : - to ợc ối tợng số - to ợc ối tợng biến - to ợc ối tợng biểu thức nhị phân - to ợc ối tợng biểu thức ngẫu nhiên - to ợc ối tợng biểu thức... biểu thức : hằng, biến, biểu thức ngơi có dịch vụ sau : - tham kho biểu thức bên trái - tham kho biểu thức bên phi - tính trị biểu thức - tối gin biểu thức Dời chuột th mục Expression cửa... tin chung mà ối tợng biểu thức khác (hằng, biến, biểu thức ngôi) s dùng : - thuộc tính Left (vì biến khơng cần) - thuộc tính Right (vì biến khơng cần) Dời chuột th mục Expression cửa sổ “Solution

Ngày đăng: 04/01/2023, 10:23