1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài tập lập trình hướng đối tượng với visual C#

150 2,3K 14

Đ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 150
Dung lượng 3,46 MB

Nội dung

Form ₫ầu tiên của ứng dụng ₫ã hiển thị trong cửa sổ thiết kế, việc thiết kế form là quá trình lặp 4 thao tác tạo mới/xóa/hiệu chỉnh thuộc tính/tạo hàm xử lý sự kiện cho từng ₫ối tượng cầ

Trang 1

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 0.1 : Viết chương trình giải phương trình bậc 2

I Mục tiêu :

ƒ Giúp SV ôn lại qui trình viết 1 ứng dụng VC# ₫ơn giản, hệ thống lại các vấn ₫ề chính của phần mềm này, ₫ể các chương còn lại giải quyết chúng

II Nội dung :

ƒ Xây dựng chương trình nhỏ giải phương trình bậc 2 có dạng ax^2 + bx + c = 0 chạy ở chế ₫ộ textmode (console)

III Chuẩn ₫ầu ra :

ƒ Sinh viên nắm vững và viết thành thạo các ứng dụng nhỏ chạy ở chế ₫ộ textmode

IV Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon

"Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td GPTB2), click button

OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Ngay sau khi Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Hiệu chỉnh code của file Program.cs ₫ể có nội dung như sau :

//₫ịnh nghĩa hàm nhập 3 thông số a,b,c của phương trình bậc 2

static void NhapABC() {

//₫ịnh nghĩa hàm tính nghiệm của phương trình bậc 2

static void GiaiPT() {

//tính biệt số delta của phương trình

Trang 2

//₫ịnh nghĩa hàm xuất kết quả

static void XuatKetqua() {

if (delta < 0)

//báo vô nghiệm

Console.WriteLine("Phương trình vô nghiệm");

else //báo có 2 nghiệm

//₫ịnh nghĩa chương trình (hàm Main)

static void Main(string[] args) {

NhapABC(); //nhập a,b,c

GiaiPT(); //giải phương trình

XuatKetqua(); //xuất kết quả

//chờ người dùng ấn Enter ₫ể ₫óng cửa sổ Console lại

Console.Write("Ấn Enter ₫ể dừng chương trình : ");

5 Lặp lại bước 4 cho nhiều phương trình bậc 2 khác nhau Hãy thử nhập a = 0 xem chương trình phản ứng thế nào ? Nếu chương trình bị lỗi, hãy phân tích và xác ₫ịnh lỗi rồi tìm cách sửa lỗi ₫ể chương trình có thể xử lý ₫úng trường hợp người dùng nhập a = 0

Trang 3

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 0.2 : Viết chương trình thực hiện giải thuật lặp

I Mục tiêu :

ƒ Giúp SV ôn lại qui trình viết 1 ứng dụng VC# ₫ơn giản, hệ thống lại các vấn ₫ề chính của phần mềm này, ₫ể các chương còn lại giải quyết chúng

II Nội dung :

ƒ Xây dựng chương trình nhỏ chạy ở chế ₫ộ textmode (console), tính 3 hàm số theo công thức lặp sau ₫ây :

S1(x) = 1 + x + x2/2! + x3/3! + + xn/n!

S2(x) = 1 - x + x2/2! - x3/3! + + (-1)nxn/n!

S3(x) = 1 + sin(x) + sin(2x) + + sin(nx)

III Chuẩn ₫ầu ra :

ƒ Sinh viên nắm vững và viết thành thạo các ứng dụng nhỏ chạy ở chế ₫ộ textmode

trong ₫ó mỗi thành phần en phụ thuộc vào x và n, en thường nhỏ dần khi n tăng lên ₫ến khi ₫ủ nhỏ (nhỏ hơn sai số epsilon qui ₫ịnh) thì ta bỏ ₫i :

- ₫ối với S1(x) thì en = xn

/n!

- ₫ối với S2(x) thì en = (-1)nxn/n!

- ₫ối với S3(x) thì en = sin(nx)

Thuật giải lặp ₫ể tính công thức trên gồm các bước sau :

1 Lúc ₫ầu, thiết lập S = 1 và n = 1

2 Tính en, tích lũy en vào S

3 Kiểm tra en < epsilon Nếu thỏa thì dừng, nếu không thì tăng n 1 ₫ơn vị và thực hiện lại bước 2

Lập trình chẳng qua là dịch thuật giải ở dạng ngôn ngữ tự nhiên thành ngôn ngữ lập trình cho máy hiểu và thực thi tự ₫ộng dùm con người khi cần Sau ₫ây là qui trình ₫iển hình ₫ể viết chương trình nhỏ thực hiện 3 công thức lặp trên bằng VC# :

V Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon

"Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td TínhLap), click button

OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Ngay sau khi Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Hiệu chỉnh code của file Program.cs ₫ể có nội dung như sau :

Trang 4

classProgram

{

//₫ịnh nghĩa hằng gợi nhớ miêu tả sai số mong muốn

constdouble EPSILON = 0.0000001;

Trang 5

En = EnS2(x,n);

S = S + En;

n = n + 1;

} while (Math.Abs(En) >= EPSILON); //3 Lặp bước 2 nếu En >= epsilon

//gởi kết quả về lệnh gọi hàm này

} while (Math.Abs(En) >= EPSILON); //3 Lặp bước 2 nếu En >= epsilon

//gởi kết quả về lệnh gọi hàm này

return S;

}

//chương trình chính thử dùng các hàm ₫ược viết

staticvoid Main(string[] args)

{

double x;

String buf;

//yêu cầu người dùng nhập x

Console.Write("Nhập x : "); buf = Console.ReadLine();

5 Lặp lại bước 4 cho nhiều giá trị x khác nhau và kiếm tra xem chương trình chạy ₫úng không

Trang 6

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 0.3 : Viết chương trình xử lý ₫a thức

I Mục tiêu :

ƒ Giúp SV ôn lại qui trình viết 1 ứng dụng VC# ₫ơn giản, tập trung vào việc sử dụng các kiểu dữ liệu cơ bản ₫ịnh sẵn

II Nội dung :

ƒ Xây dựng chương trình nhỏ chạy ở chế ₫ộ textmode (console), thực hiện các yêu cầu sau :

1 miêu tả kiểu ₫ể lưu giữ từng toán hạng của ₫a thức gồm 2 thông tin : hệ số

và số mũ

2 sắp xếp danh sách các toán hạng của ₫a thức theo thứ tự giảm dần của số

mũ, phương pháp sắp xếp là Insertion Sort

3 chuẩn hóa ₫a thức : mỗi số mũ chỉ xuất hiện trong ₫a thức 1 lần

Thí dụ có ₫a thức gốc R(x)= x^3 + x^2 + x + 2x^2 + 2x + 2

sau khi chuẩn hóa thành R(x)= x^3 + 3x^2 + 3x + 2

4 Nhân 2 ₫a thức

III Chuẩn ₫ầu ra :

ƒ Sinh viên nắm vững và viết thành thạo các ứng dụng nhỏ chạy ở chế ₫ộ textmode và biết cách dùng các kiễu dữ liệu cơ bản ₫ịnh sẵn khi cần

IV Phân tích :

1 Ta dùng kiểu struct ₫ể miêu tả thông tin về mỗi số hạng của ₫a thức như sau :

struct Sohang {

public int somu; //số mũ

public float heso; //hệ số

};

2 Ý tưởng sắp xếp danh sách theo giải thuật "Insertion Sort" như sau :

Lặp xác ₫ịnh vị trí ₫úng cho từng số hạng i (từ 0 tới n) của ₫a thức :

- Lặp tìm số hạng có số mũ lớn nhất từ vị trí i tới n

- Hoán vị nó với số hạng i

Từ thuật giải ₫ược viết bằng ngôn ngữ tự nhiên ở trên, ta sẽ dịch nó thành hàm SortItems()

₫ược viết bằng VC# như trong mã nguồn dưới ₫ây

3 Chuẩn hóa ₫a thức : ₫ược thực hiện thông qua 2 bước chính :

- sắp xếp ₫a thức theo thứ tự số mũ giảm dần (gọi hàm SortItems() ở bước 2)

- duyệt tuần tự từ ₫ầu ₫ến cuối ₫a thức ₫ể cộng các số hạng liên tiếp có cùng số mũ lại thành 1 số hạng

Từ thuật giải ₫ược viết bằng ngôn ngữ tự nhiên ở trên, ta dịch nó thành hàm Chuanhoa()

₫ược viết bằng VC# như trong mã nguồn dưới ₫ây

4 Nhân ₫a thức : ₫ược thực hiện thông qua 2 bước chính :

- lặp nhân từng số hạng của ₫a thức 1 với tất cả các số hạng của ₫a thức 2 Kết quả

₫ược lưu vào ₫a thức kết quả

- Chuẩn hóa ₫a thức kết quả

Trang 7

Từ thuật giải ₫ược viết bằng ngôn ngữ tự nhiên ở trên, ta dịch nó thành hàm Nhan() ₫ược viết bằng VC# như trong mã nguồn dưới ₫ây

V Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon

"Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td Dathuc), click button

OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Ngay sau khi Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Hiệu chỉnh code của file Program.cs ₫ể có nội dung như sau :

//₫ịnh nghĩa kiểu miêu tả 1 số mũ

privatestructSohang {

publicfloat heso; //hệ số

publicint somu; //số mũ

public Sohang(float h, int s) { heso = h; somu = s; }

};

//hàm sắp xếp ₫a thức theo thứ tự số mũ giảm dần

staticvoid SortItems (Sohang[] dathuc, int soluong) {

//hàm chuẩn hóa ₫a thức, mỗi số mũ chỉ có 1 phần tử

staticint Chuanhoa (Sohang[] dathuc, int soluong) {

//₫ịnh nghĩa các biến cần dùng

int i,j;

Sohang[] temp = newSohang[soluong];

Trang 8

//hàm in ₫a thức ₫ể kiểm tra

staticvoid Indathuc(Sohang[] dathuc, int soluong) {

int i;

if (soluong == 0) return;

//in phần tử ₫ầu tiên của ₫a thức

Console.Write(dathuc[0].heso + "x^" + dathuc[0].somu + " ");

//lặp in từng phần tử còn lại của ₫a thức

for (i = 1; i < soluong; i++)

//cấp phát bộ nhớ chứa ₫a thức kết quả

dathuc3 = newSohang[soluong1*soluong2];

k = 0;

//lặp nhân từng số hạng của ₫a thức 1

for (i=0; i <soluong1; i++)

//với tất cả các số hạng của ₫a thức 2

for (j = 0; j <soluong2; j++) {

dathuc3[k].somu = dathuc1[i].somu+dathuc2[j].somu;

Trang 9

dathuc3[k].heso = dathuc1[i].heso*dathuc2[j].heso;

k++;

}

//chuẩn hóa ₫a thức kết quả

soluong3 = Chuanhoa (dathuc3,k);

}

//chương trình chính thử dùng các hàm chức năng

staticvoid Main(string[] args) {

Sohang[] dathuc1 = newSohang[] { newSohang(1,3), newSohang(1,2), new

Sohang(1,1),newSohang(-2,2),newSohang(2,1),newSohang(2,0)};

//2 thử chuẩn hóa ₫a thức và in ra ₫ể kiểm tra

Console.WriteLine("Đa thức gốc là : ");

Indathuc(dathuc2,6);

int somu = Chuanhoa(dathuc2,6);

Console.WriteLine("Đa thức ₫ược chuẩn hóa là : ");

Indathuc(dathuc2,somu);

//3 thử nhân 2 ₫a thức và in ra ₫ể kiểm tra

Sohang[] dathuc3 = newSohang[] { newSohang(1,3), newSohang(1,2), newSohang(1,1), newSohang(-2,2), newSohang(2,1),newSohang(2,0)};

Sohang[] dathuc4 = newSohang[] { newSohang(1,3), newSohang(1,2), newSohang(1,1), newSohang(-2,2), newSohang(2,1),newSohang(2,0)};

Sohang[] dathuc5 = newSohang[1];

int soluong=1;

Nhan(dathuc3, 6, dathuc4, 6, ref dathuc5, ref soluong);

Console.WriteLine("Đa thức kết quả là : ");

Indathuc(dathuc5, soluong);

//4 chờ người dùng ấn Enter ₫ể ₫óng cửa sổ Console lại

Console.Write("Ấn Enter ₫ể dừng chương trình : ");

Trang 10

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 1.1 : Viết chương trình sắp 8 con hậu

I Mục tiêu :

ƒ Giúp SV ôn lại qui trình viết 1 ứng dụng VC# ₫ơn giản, tập trung vào việc sử dụng các kiểu dữ liệu cơ bản ₫ịnh sẵn như struct và array

II Nội dung :

ƒ Xây dựng chương trình nhỏ chạy ở chế ₫ộ textmode (console), thực hiện các yêu cầu sau :

1 tìm tất cả phương án ₫ể sắp 8 con hậu vào bàn cờ 8x8 ô sao cho chúng không thể ăn ₫ược nhau (thỏa mãn ₫ồng thời các ₫iều kiện chúng không trên cùng hàng, cùng cột hay cùng ₫ường chéo)

2 in các phương án dạng ma trận 2 chiều ₫ể người dùng xem dễ dàng

III Chuẩn ₫ầu ra :

ƒ Sinh viên nắm vững và viết thành thạo các ứng dụng nhỏ chạy ở chế ₫ộ textmode và biết cách dùng các kiễu dữ liệu cơ bản ₫ịnh sẵn, nhất là kiểu struct và array, khi cần

IV Phân tích :

1 Ta dùng thuật giải backtracking ₫ể tìm các phương án sắp 8 con hậu như sau :

+ Lặp tìm vị trí con hậu ở từng cột, từ trái sang phải :

- Nếu sắp ₫ược cho cột c thì tăng c 1 ₫ơn vị ₫ể tiếp tục cột kế tiếp, nếu cột c ₫ã vượt qua MAX thì ₫ã tìm ₫ược 1 cách mới

- Nếu không sắp ₫ược cho cột c thì giảm c 1 ₫ơn vị ₫ể thử tiếp các khả năng còn lại của cột cũ này Nếu c <0 thì hết cách

2 Để lưu vết xử lý trên từng cột, ta dùng biến array hang[MAX], mỗi phần tử hang[c] chứa chỉ

số hàng ₫ã xử lý lần cuối trước ₫ây (-1 : chưa, MAX : hết)

Từ thuật giải ₫ược viết bằng ngôn ngữ tự nhiên ở trên, ta dịch nó thành chương trình ₫ược viết bằng VC# như trong mã nguồn dưới ₫ây

V Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon

"Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td Sap8Conhau), click button OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Ngay sau khi Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Hiệu chỉnh code của file Program.cs ₫ể có nội dung như sau :

Trang 11

//₫ịnh nghĩa các thuộc tính dữ liệu

constint MAX = 7; //chỉ số max của hàng và cột

staticint cachso = 0; //số cách sắp ₫ã tìm ₫ược

staticint[] hang = newint[MAX+1]; //danh sách chỉ số hàng ₫ã thử trong từng cột staticint c; //vị trị cột ₫ang sắp

//Điểm nhập của chương trình

staticvoid Main(string[] args)

{

// khởi ₫ộng trạng thái xuất phát

for (c = 0; c <= MAX; c++) hang[c] = -1;

Console.WriteLine("Số nghiệm là " + cachso);

//chờ người dùng ấn Enter ₫ể ₫óng cửa sổ Console lại

Console.Write("Ấn Enter ₫ể dừng chương trình : ");

Console.Read();

return;

}

//cố gắng tìm 1 phương án sắp 8 con hậu

staticbool Tim1cach()

//nếu cột c không phải là cột ₫ầu tiên thì :

//xét lại cột c từ hàng ₫ầu rồi lùi cột c

Trang 12

//hàm cố gắng tìm chỉ số hàng cho con hậu ở cột c

//trả về chỉ số hàng tìm ₫ược hay -1 ₫ể báo sai

staticint timhang(int c)

{

int h, hmin = hang[c] + 1;

for (h = hmin; h <= MAX; h++) // thử hàng h

if (testvitri(h, c)) return h;

return -1;

}

//hàm kiểm tra xem có thể ₫ặt con hậu ở vị trí h,c ?

//trả về TRUE nếu ₫ược, FALSE nếu không

staticbool testvitri(int h, int c) {

int c1,h1;

//cột c ₫ang kiểm tra nên chưa có con hậu nào

// xem có con hậu nào nằm ở hàng h ?

for (c1 = 0; c1 < c; c1++)

if (hang[c1] == h) returnfalse;

// xem có con hậu nào nằm trên ₫ường chéo trên trái - dưới phải c1 = c-1; h1 = h-1;

while (c1>= 0 && h1 <=MAX) {

if (hang[c1] == h1) returnfalse;

//hàm in kết quả 1 cách sắp 8 con hậu theo yêu cầu

staticvoid InKetqua() {

int h,c;

Console.WriteLine("Cách sắp thứ : " + (++cachso));

for (h= 0; h <=MAX; h++) {

// Hiển thị hàng lưới ngang của bàn cờ

for (c = 0; c <= MAX; c++) Console.Write("+ -");

Console.WriteLine("+");

Trang 13

// Hiển thị nội dung hàng thứ h của bàn cờ

for (c= 0; c<=MAX;c++)

if (hang[c] == h) Console.Write("| x ");

elseConsole.Write("| ");

Console.WriteLine("|");

}

// Hiển thị hàng lưới ngang cuối cùng của bàn cờ

for (c = 0; c <= MAX; c++) Console.Write("+ -");

Trang 14

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 1.1 : Viết chương trình tạo từ

I Mục tiêu :

ƒ Giúp SV ôn lại qui trình viết 1 ứng dụng VC# ₫ơn giản, tập trung vào việc sử dụng các kiểu dữ liệu cơ bản ₫ịnh sẵn như struct và array

II Nội dung :

ƒ Xây dựng chương trình nhỏ chạy ở chế ₫ộ textmode (console), thực hiện các yêu cầu sau :

1 chờ user nhập vào chuỗi có n ký tự khác nhau

2 tìm tất cả phương án ₫ể tạo từ dài n ký tự, mỗi ký tự là ký tự do user nhập, mỗi ký

tự ₫ược dùng 1 lần trong từ

3 in các từ tạo ₫ược ₫ể người dùng xem dễ dàng

III Chuẩn ₫ầu ra :

ƒ Sinh viên nắm vững và viết thành thạo các ứng dụng nhỏ chạy ở chế ₫ộ textmode và biết cách dùng các kiễu dữ liệu cơ bản ₫ịnh sẵn, nhất là kiểu struct và array, khi cần

IV Phân tích :

1 Ta dùng thuật giải backtracking ₫ể tìm các phương án tạo từ như sau :

+ Lặp tìm chỉ số gốc của ký tự ₫ược dùng cho từng vị trí (cột) trong từ, từ trái sang phải :

- Nếu sắp ₫ược cho cột c thì tăng c 1 ₫ơn vị ₫ể tiếp tục cột kế tiếp, nếu cột c ₫ã vượt qua MAX thì ₫ã tìm ₫ược 1 từ mới

- Nếu không sắp ₫ược cho cột c thì giảm c 1 ₫ơn vị ₫ể thử tiếp các khả năng còn lại của cột cũ này Nếu c <0 thì hết cách

2 Để lưu vết xử lý trên từng cột, ta dùng biến array chiso[MAX], mỗi phần tử chiso[c] chứa chỉ số ký tự gốc ₫ã xử lý lần cuối trước ₫ây (-1 : chưa, MAX : hết)

Từ thuật giải ₫ược viết bằng ngôn ngữ tự nhiên ở trên, ta dịch nó thành chương trình ₫ược viết bằng VC# như trong mã nguồn dưới ₫ây

V Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon

"Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td TaoTu), click button

OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Ngay sau khi Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Hiệu chỉnh code của file Program.cs ₫ể có nội dung như sau :

Trang 15

//₫ịnh nghĩa các thuộc tính dữ liệu

constint MAXLEN = 20; //số ký tự max cần dùng ₫ể tạo từ

staticString srcstr; //chuỗi các ký tự khác nhau ₫ể tạo từ

staticint sotu; //số từ ₫ã tìm ₫ược

staticint[] chiso = newint[MAXLEN + 1]; //danh sách chỉ số ký tự ₫ã thử trong từng cột staticint sokytu; //số ký tự gốc ₫ược dùng ₫ể tạo từ

staticint c; //vị trị cột ₫ang sắp

//Điểm nhập của chương trình

staticvoid Main(string[] args)

} while (sokytu >= MAXLEN);

// khởi ₫ộng trạng thái xuất phát

for (c = 0; c < sokytu; c++) chiso[c] = -1;

//bắt ₫ầu ₫ặt ký tự chỉ số 0 vào cột ₫ầu (cột 0) của từ cần xây dựng

Console.WriteLine("Số từ xây dựng ₫ược là " + sotu);

//chờ người dùng ấn Enter ₫ể ₫óng cửa sổ Console lại

Console.Write("Ấn Enter ₫ể dừng chương trình : ");

Console.Read();

return;

}

//cố gắng tìm 1 phương án sắp các ký tự thành 1 tự mới theo yêu cầu

staticbool Tim1cach() {

Trang 16

//hàm tìm chỉ số hàng cho con hậu ở cột c

staticint timkytu(int c)

{

int h, hmin = chiso[c] + 1;

for (h = hmin; h < sokytu; h++) // thử ký tự chỉ số h

//Kiểm tra từ, nếu có nghĩa thì trả về TRUE, nếu không trả về FALSE

staticbool conghia(String str)

{

// Bạn viết lại hàm này theo yêu cầu riêng

//ở ₫ây ta coi mọi từ ₫ều có nghĩa

returntrue;

}

//hàm in từ mới tìm theo yêu cầu

staticvoid InKetqua()

Trang 18

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 1.3 : Viết chương trình "Mã ₫i tuần tra"

I Mục tiêu :

ƒ Giúp SV ôn lại qui trình viết 1 ứng dụng VC# ₫ơn giản, tập trung vào việc sử dụng các kiểu dữ liệu cơ bản ₫ịnh sẵn như struct và array

II Nội dung :

ƒ Xây dựng chương trình nhỏ chạy ở chế ₫ộ textmode (console), thực hiện các yêu cầu sau :

1 chờ người dùng nhập kích thước bàn cờ, tọa ₫ộ hàng cột của con mã xuất phát

2 tìm tất cả phương án ₫ể giúp con mã ₫i tuần qua tất cả các ô cờ, mỗi ô chỉ

₫ược phép ₫i qua 1 lần

3 in các phương án dạng ma trận 2 chiều ₫ể người dùng xem dễ dàng

III Chuẩn ₫ầu ra :

ƒ Sinh viên nắm vững và viết thành thạo các ứng dụng nhỏ chạy ở chế ₫ộ textmode và biết cách dùng các kiễu dữ liệu cơ bản ₫ịnh sẵn, nhất là kiểu struct và array, khi cần

IV Phân tích :

1 Ta dùng thuật giải backtracking ₫ể tìm các phương án giúp con mã ₫i tuần qua tất cả các ô cờ :

+ Ở mỗi vị trí, con mã có tối ₫a 8 khả năng ₫i tiếp

+ Xuất phát từ vị trí ₫ầu, lặp tìm vị trí con mã kế tiếp (từ khả năng 1 tới 8) :

- Nếu tìm ₫ược thì tăng chỉ số nước ₫i 1 ₫ơn vị rồi tiếp tục cho ₫ến khi con mã ₫i hết các ô, lúc này ₫ã tìm ₫ược 1 cách mới

- Nếu không tìm ₫ược thì giảm chỉ số nước ₫i 1 ₫ơn vị, thử tiếp các khả năng còn lại của vị trí cũ này Nếu chỉ số nước ₫i <0 thì hết cách

2 Để lưu vết ₫i con mã, ta dùng biến array Nuocdi[MAX], mỗi phần tử Nuocdi[i] chứa tọa ₫ộ con mã tương ứng và chỉ số cách ₫ã xử lý lần cuối trước ₫ây (-1 : chưa, 8 : hết)

Từ thuật giải ₫ược viết bằng ngôn ngữ tự nhiên ở trên, ta dịch nó thành chương trình ₫ược viết bằng VC# như trong mã nguồn dưới ₫ây

V Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon

"Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td Madituan), click button

OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Ngay sau khi Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Hiệu chỉnh code của file Program.cs ₫ể có nội dung như sau :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

Trang 19

namespace Madituan

{

classProgram

{

// Kiểu chứa thông tin về 1 bước ₫i

privatestructItemRec {

publicint x, y;

publicint huong;

};

// Các biến dữ liệu chính

staticint Size;

staticint[,] Banco;

staticItemRec[] Nuocdi;

staticint SoNuocdi;

staticint SoNghiem;

SoNuocdi = SoNuocdi - 1;

//tiếp tục tìm cách ₫i khác

Nuocdi[SoNuocdi].huong = Nuocdi[SoNuocdi].huong + 1; }

//chờ người dùng ấn Enter ₫ể ₫óng cửa sổ Console lại

Console.Write("Ấn Enter ₫ể dừng chương trình : ");

Console.Read();

}

//hàm khởi ₫ộng các giá tr5i ₫ầu của chương trình

staticvoid Khoidong() {

Console.Write("Nhập số hàng (cột) của bàn cờ: ");

buf = Console.ReadLine(); Size = Int32.Parse(buf);

} while (Size <= 3 || Size > 9);

do //chờ nhập chỉ số hàng xuất phát

{

Console.Write("Nhập chỉ số hàng xuất phát của con mã : "); buf = Console.ReadLine(); row = Int32.Parse(buf);

Trang 20

} while (row < 0 || Size <= row);

do //chờ nhập chỉ số cột xuất phát

{

Console.Write("Nhập chỉ số cột xuất phát của con mã : "); buf = Console.ReadLine(); col = Int32.Parse(buf);

} while (col < 0 || Size <= col);

//phân phối vùng nhớ chứa array Banco và danh sach Nuocdi Banco = newint[Size, Size];

Nuocdi = newItemRec[Size * Size];

for (i = 0; i < Size * Size; i++)

Nuocdi[i] = newItemRec();

//khởi ₫ộng trạng thái ₫ầu cho các vị trí

for (i = 0; i < Size; i++)

//hàm tìm vị trí kế tiếp của con mã

// trả về TRUE nếu tìm ₫ược, FALSE nếu không tìm ₫ược

staticbool DiBuocNua() {

Trang 21

if (RetVal==false && SoNuocdi != 0) {

// nếu không tìm ₫ược vị trí kế thì lùi con mã 1 bước

Banco[Nuocdi[SoNuocdi].x,Nuocdi[SoNuocdi].y] = -1;

SoNuocdi = SoNuocdi - 1;

Nuocdi[SoNuocdi].huong = Nuocdi[SoNuocdi].huong + 1; }

} while (!RetVal && (SoNuocdi!= 0));

return RetVal;

}

// In kết quả con mã ₫i trên bàn cờ

staticvoid InKetqua()

// Hiển thị hàng lưới ngang bàn cờ

for (c = 0; c < Size; c++) Console.Write("+ ");

Console.WriteLine("+");

Trang 22

// Hiển thị nội dung hàng thứ h bàn cờ

for (c = 0; c < Size; c++)

Console.Write("| {0:D2} ", Banco[h, c]);

Console.WriteLine("|");

}

// Hiển thị hàng lưới ngang cuối cùng của bàn cờ

for (c = 0; c < Size; c++) Console.Write("+ ");

4 Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng Hãy nhập kích thước bàn

cờ và tọa ₫ộ miêu tả vị trí xuất phát của con mã rồi xem và kiểm tra kết quả hiển thị của chương trình

5 Lặp lại bước 4 nhiều lần với nhiều kích thước khác nhau và tọa ₫ộ xuất phát khác nhau

₫ể quan sát kết quả Lưu ý do thuật giải rất nhiều bước, còn máy thì tốc ₫ộ hạn chế nên nếu chọn kích thước từ 8 trở lên thì sẽ tốn rất nhiều ngày mới có thể có kết quả

Trang 23

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 2.1 : Xây dựng ứng dụng OOP ₫ơn giản

& tìm hiểu sự tương tác giữa các ₫ối tượng

I Mục tiêu :

ƒ Giúp SV làm quen với qui trình thiết kế trực quan 1 ứng dụng Dialog Based

ƒ Giúp SV làm quen với việc dùng lại linh kiện phần mềm

ƒ Giúp SV thấy cụ thể cấu trúc ứng dụng cấu thành từ các ₫ối tượng

ƒ Giúp SV thấy sự tương tác giữa các ₫ối tượng

II Nội dung :

ƒ Xây dựng ứng dụng Dialog Based cho phép người dùng chơi các file multimedia

ƒ Dịch và chạy chương trình

ƒ Debug chương trình ₫ể tìm lỗi nếu có

ƒ Tìm hiểu cấu trúc ứng dụng & sự tương tác cụ thể giữa các ₫ối tượng

III Chuẩn ₫ầu ra :

ƒ Thành thạo việc xây dựng 1 ứng dụng theo qui trình thiết kế trực quan

ƒ Thành thạo việc dùng lại linh kiện phần mềm có sẵn, thấy rõ cấu trúc phầm mềm

và sự tương tác giữa các ₫ối tượng trong phần mềm

ƒ Thành thạo việc viết code thay ₫ổi kích thước và vị trí các ₫ối tượng giao diện khi cửa sổ chứa chúng bị thay ₫ổi

IV Phân tích :

ƒ Sau khi phân tích chức năng của chương trình, ta thấy chương trình là 1 form giao diện trực quan, nó chứa 1 button Play ₫ể người dùng ra lệnh chơi file, nó cũng cần 1 ₫ối tượng cho phép người dùng duyệt trực quan cây thư mục ₫ể chọn file (giả sử ta biết ₫ó là ₫ối tượng FileOpenDialog) Cuối cùng chương trình cần 1

₫ối tượng có khả năng play file multimedia (giả sử ta biết ₫ó là ₫ối tượng Windows Media Player)

ƒ Theo kết quả phân tích trên, cấu trúc chương trình cần viết khá ₫ơn giản, nó chỉ chứa các ₫ối tượng ₫ã có sẵn, ta không cần phải bận tâm ₫ặc tả chi tiết các ₫ối tượng cần dùng mà chỉ cần dùng lại chúng, lắp ghép chúng lại ₫ể tạo thành chương trình Đây là trường hợp may mắn nhất, nhưng trong thực tế lập trình hướng ₫ối tượng, ta sẽ có ₫ược may mắn này thường xuyên

V Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Window, chọn icon "Windows Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (thí dụ MicroWMP), click button OK ₫ể tạo Project theo các thông số ₫ã khai báo

Trang 24

3 Form ₫ầu tiên của ứng dụng ₫ã hiển thị trong cửa sổ thiết kế, việc thiết kế form là quá trình lặp 4 thao tác tạo mới/xóa/hiệu chỉnh thuộc tính/tạo hàm xử lý sự kiện cho từng ₫ối tượng cần dùng trong form

4 Nếu cửa sổ ToolBox chưa hiển thị chi tiết, chọn menu View.Toolbox ₫ể hiển thị nó (thường nằm ở bên trái màn hình) Click chuột vào button (Auto Hide) nằm ở góc trên phải cửa sổ ToolBox ₫ể chuyển nó về chế ₫ộ hiển thị thường trực

5 Duyệt tìm phần tử Button (trong nhóm Common Controls), chọn nó, dời chuột về góc trên trái của form và vẽ nó với kích thước mong muốn Xem cửa sổ thuộc tính của Button vừa vẽ (thường ở góc dưới phải màn hình), duyệt tìm và hiệu chỉnh thuộc tính Text = "Play…", duyệt tìm và thay ₫ổi thuộc tính (Name) = btnPlay

6 Dời chuột vào trong cửa sổ Toolbox, duyệt tìm nhóm Components, ấn phải chuột vào mục Components (hay vào bất kỳ phần tử nào trong nhóm này) ₫ể hiển thị menu lệnh, chọn option "Choose Items" Khi cửa sổ "Choose Toolbox Items" hiển thị, click chuột vào button COM Components ₫ể hiển thị danh sách các linh kiện phần mềm theo chuẩn COM ₫ang ₫ược Windows quản lý, hãy duyệt tìm và ₫ánh dấu chọn vào phần tử “Windows Media Player”, rồi click button OK ₫ể "add" các control này vào nhóm Components của cửa sổ Toolbox của Project ứng dụng Bây giờ việc dùng control “Windows Media Player” giống y như các ₫iều khiển có sẵn khác

7 Duyệt tìm phần tử “Windows Media Player” (trong nhóm Components), chọn nó, dời chuột ngay dưới Button vừa vẽ, vẽ nó chiếm hết phần còn lại của form Xem cửa sổ thuộc tính của control vừa vẽ (thường ở góc dưới phải màn hình), duyệt tìm và hiệu chỉnh thuộc tính thuộc tính (Name) = wmpPlay

Sau khi thiết kế xong, Form có dạng sau :

8 Dời chuột về button btnPlay, ấn kép chuột vào nó ₫ể tạo hàm xử lý sự kiện Click chuột cho button, cửa sổ mã nguồn sẽ hiển thị ₫ể ta bắt ₫ầu viết code cho hàm Cách tổng quát ₫ể tạo hàm xử lý sự kiện là chọn ₫ối tượng btnPlay, cửa sổ thuộc tính của nó sẽ hiển thị, click icon ₫ể hiển thị danh sách các sự kiện của ₫ối tượng, duyệt tìm sự kiện quan tâm (Click), ấn kép chuột vào comboBox bên phải sự kiện

Trang 25

Click ₫ể máy tạo tự ₫ộng hàm xử lý cho sự kiện này Cửa sổ mã nguồn sẽ hiển thị khung sườn của hàm vừa ₫ược tạo với thân rỗng, viết thân cho hàm này như sau : privatevoid btnPlay_Click(object sender, EventArgs e) {

//tạo form duyệt chọn file cần chơi

OpenFileDialog dlg = newOpenFileDialog();

//hiển thị form duyệt chọn file cần chơi

DialogResult ret = dlg.ShowDialog();

//kiểm tra quyết ₫ịnh của người dùng, nếu người dùng chọn OK thì chơi

if (ret == DialogResult.OK)

wmpPLay.URL = dlg.FileName;

}

9 Chọn menu Debug.Start Debugging ₫ể dịch và chạy thử ứng dụng Khi Form chương trình hiển thị, hãy click chuột vào button Play, cửa sổ duyệt chọn file sẽ hiển thị, hãy duyệt và chọn 1 file multimedia nào ₫ó (ảnh tĩnh, film, âm thanh, file playlist,…), click button Open ₫ể chơi file này Hãy thử chọn nhiều file khác nhau xem chương trình chạy ổn ₫ịnh không

10 Dừng chương trình, dời chuột về cửa sổ “Solution Explorer”, duyệt tìm phần tử Form1, ấn phải chuột trên nó ₫ể hiển thị menu lệnh, chọn lệnh “View Code” ₫ể hiển thị lại mã nguồn của Form chương trình, khảo sát thân của hàm btnPlay và tìm hiểu

sự tương tác giữa ₫ối tượng Form1 với các ₫ối tượng OpenFileDialog và wmpPlay

11 Chạy lại ứng dụng, quan sát góc trên phải của Form chương trình, ta thấy 3 button chức năng thông thường là 1 thu nhỏ form về dạng icon, 2 phóng to/thu nhỏ kích thước form, 3 ₫óng form :

12 Thử click chuột vào button phóng to/thu nhỏ, form sẽ ₫ược phóng to ₫ể chiếm hết màn hình nhưng các ₫ối tượng giao diện ₫ược thiết kế bên trong nó (button, WMP) không hề thay ₫ổi kích thước theo Làm sao thay ₫ổi kích thước các ₫ối tượng trong form theo kích thước của form ?

13 Nếu muốn phóng to/thu nhỏ các ₫ối tượng bên trong theo kích thước cửa sổ, ta cần viết code thực hiện việc này 1 cách tường minh, ₫oạn code thay ₫ổi kích thước và vị trí các ₫ối tượng bên trong ₫ược ₫ể trong hàm xử lý sự kiện SizeChanged của ₫ối tượng Form

14 Dừng chương trình, dời chuột về cửa sổ “Solution Explorer”, duyệt tìm phần tử Form1, ấn kép chuột trên nó ₫ể hiển thị cửa sổ thiết kế Form, chọn Form ₫ể hiển thị cửa sổ thuộc tính của nó, click icon ₫ể hiển thị danh sách các sự kiện của Form, duyệt tìm sự kiện quan tâm (SizeChanged), ấn kép chuột vào comboBox bên phải sự kiện SizeChanged ₫ể máy tạo tự ₫ộng hàm xử lý cho sự kiện này Cửa sổ mã nguồn

Trang 26

sẽ hiển thị khung sườn của hàm vừa ₫ược tạo với thân rỗng, viết thân cho hàm này như sau :

privatevoid Form1_SizeChanged(object sender, EventArgs e) {

//xác ₫ịnh kích thước hiện hành của Form

int cx = this.Size.Width;

int cy = this.Size.Height;

//thay ₫ổi vị trí của ₫ối tượng WMP về vị trí mong muốn

wmpPlay.Location = newPoint (10, 40);

//thay ₫ổi kích thước của ₫ối tượng WMP theo kích thước Form

wmpPlay.Size = newSize (cx - 30, cy - 80);

Trang 27

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 2.2 : Xây dựng ứng dụng giải ô số Sudoku

I Mục tiêu :

ƒ Giúp SV làm quen với qui trình thiết kế trực quan 1 ứng dụng Dialog Based

ƒ Giúp SV làm quen với việc dùng lại linh kiện phần mềm

ƒ Giúp SV thấy cụ thể cấu trúc ứng dụng cấu thành từ các ₫ối tượng

ƒ Giúp SV thấy sự tương tác giữa các ₫ối tượng

II Nội dung :

ƒ Xây dựng chương trình nhỏ chạy ở chế ₫ộ ₫ồ họa cho phép user nhập các giá trị vào 1 số ô Sudoku rồi giải Cửa sổ ứng dụng có dạng sau :

III Chuẩn ₫ầu ra :

ƒ Thành thạo việc xây dựng 1 ứng dụng theo qui trình thiết kế trực quan

ƒ Thành thạo việc dùng lại linh kiện phần mềm có sẵn, thấy rõ cấu trúc phầm mềm

và sự tương tác giữa các ₫ối tượng trong phần mềm

ƒ Thành thạo việc viết code thay ₫ổi kích thước và vị trí các ₫ối tượng giao diện khi cửa sổ chứa chúng bị thay ₫ổi

IV Phân tích :

Trang 28

Chương trình chứa 1 ₫ối tượng Form, Form chứa các ₫ối tượng bên trong :

- 3 ₫ối tượng Button

- 1 ₫ối tượng Label

- 1 ₫ối tượng ma trận Sudoku

Ta có thể thiết kế trực quan Form với các ₫ối tượng co sẵn như Button, Label cho dễ Riêng ma trận Sudoku sẽ ₫ược lập trình ₫ộng theo trạng thái từng thời ₫iểm của nó

V Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Window, chọn icon "Windows Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (thí dụ Form_Sudoku), click button OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Form ₫ầu tiên của ứng dụng ₫ã hiển thị trong cửa sổ thiết kế, việc thiết kế form là quá trình lặp 4 thao tác tạo mới/xóa/hiệu chỉnh thuộc tính/tạo hàm xử lý sự kiện cho từng ₫ối tượng cần dùng trong form

4 Nếu cửa sổ ToolBox chưa hiển thị chi tiết, chọn menu View.Toolbox ₫ể hiển thị nó (thường nằm ở bên trái màn hình) Click chuột vào button (Auto Hide) nằm ở góc trên phải cửa sổ ToolBox ₫ể chuyển nó về chế ₫ộ hiển thị thường trực

5 Duyệt tìm phần tử Button (trong nhóm Common Controls), chọn nó, dời chuột về góc trên trái của form và vẽ nó với kích thước mong muốn Xem cửa sổ thuộc tính của Button vừa vẽ (thường ở góc dưới phải màn hình), duyệt tìm và hiệu chỉnh thuộc tính Text = "Giải", duyệt tìm và thay ₫ổi thuộc tính (Name) = btnGiai

6 Lặp lại bước 5 hai lần nữa ₫ể vẽ 2 button ("Giải tiếp", btnGiaitiep) và ("Xóa", btnXoa)

7 Duyệt tìm phần tử Label (trong nhóm Common Controls), chọn nó, dời chuột về vị trí ngay dưới các button và vẽ nó với kích thước mong muốn Hiệu chỉnh thuộc tính (Name) = lblMesg

8 Dời chuột về button btnGiai, ấn kép chuột vào nó ₫ể tạo hàm xử lý sự kiện Click chuột cho button, cửa sổ mã nguồn sẽ hiển thị ₫ể ta bắt ₫ầu viết code cho hàm Cách tổng quát ₫ể tạo hàm xử lý sự kiện là chọn ₫ối tượng btnGiai, cửa sổ thuộc tính của nó sẽ hiển thị, click icon ₫ể hiển thị danh sách các sự kiện của ₫ối tượng, duyệt tìm sự kiện quan tâm (Click), ấn kép chuột vào comboBox bên phải sự kiện Click ₫ể máy tạo tự ₫ộng hàm xử lý cho sự kiện này Cửa sổ mã nguồn sẽ hiển thị khung sườn của hàm vừa ₫ược tạo với thân rỗng, ta viết thân cho hàm này sau

9 Dời chuột về cửa sổ “Solution Explorer” (thường nằm ở phía trên phải màn hình), duyệt tìm phần tử Form1.cs, ấn phải chuột trên nó ₫ể hiển thị menu lệnh, chọn lệnh

“View Designer” ₫ể hiển thị lại cửa số thiết kế của Form Thực hiện lại bước 7 trên button btnGiaitiep ₫ểtạo hàm xử lý sự kiện Click chuột cho button này

10 Tiếp tục tạo hàm xử lý sự kiện Click chuột cho button btnXoa

Trang 29

11 Dời chuột về cửa sổ “Solution Explorer”, duyệt tìm phần tử Form1.cs, ấn phải chuột trên nó ₫ể hiển thị menu lệnh, chọn lệnh “View Designer” ₫ể hiển thị lại cửa số thiết

kế của Form Chọn Form này rồi lần lượt tạo hàm xử lý sự kiện KeyDown, MouseDown, Paint cho Form

12 Dời chuột về ₫ầu class Form1 rồi viết tiếp ₫oạn code sau phục vụ việc giải ô số Sudoku :

//============================================================== // phần code ₫ộc lập với giao diện

//============================================================== //₫ịnh nghĩa kiểu miêu tả thông tin về 1 ô số

structCell

{

publicbool fix; //fix = true : giá trị ô cố ₫ịnh

publicsbyte value;

};

//₫ịnh nghĩa các thuộc tính dữ liệu

constint LEN = 9;

Cell[,] matran = newCell[LEN, LEN];

int h, c; //tọa ₫ộ ô ₫ang xử lý

int cachso;

//hàm kiểm tra ô (h,c) có thể chứa giá trị val không ?

bool Testvitri(int h, int c, sbyte val)

{

int h1, c1;

int i, j;

matran[h, c].value = 0;

if (val > 9) returnfalse;

// xem có trùng với cell nào ở hàng h ?

for (c1 = 0; c1 < LEN; c1++)

if (matran[h, c1].value == val) returnfalse;

// xem có trùng với cell nào ở cot c ?

for (h1 = 0; h1 < LEN; h1++)

if (matran[h1, c].value == val) returnfalse;

// xem có trùng với cell trong vùng 3x3 ?

h1 = h / 3 * 3;

c1 = c / 3 * 3;

for (i = h1; i < h1 + 3; i++)

for (j = c1; j < c1 + 3; j++)

if (matran[i, j].value == val) returnfalse;

//chứa kết quả vào cell tương ứng

matran[h, c].value = val;

returntrue;

}

Trang 30

//hàm tìm trị phù hợp cho ô h,c ?

//trả về TRUE nếu ₫ược, FALSE nếu không

bool timtri(int h, int c)

{

sbyte val;

sbyte d;

if (matran[h,c].fix) returntrue;

val = matran[h, c].value; val++;

matran[h,c].value = 0;

for (d = val; d <= 9; d++) if (Testvitri(h, c, d)) returntrue;

returnfalse;

}

//hàm lùi về ô ngay trước ô h,c cần xừ lý tiếp

//trả về TRUE nếu lùi ₫ược, FALSE nếu không lùi ₫ược

bool Back(refint h, refint c)

//============================================================= //Định nghĩa các hằng cần dùng

int yStart = 70; //top của bảng Sukodu

int xStart = 10; //left của bảng Sukodu

int wSeparator = 4; //khoảng hở giữa các vùng

constint WCELL = 40; //₫ộ rộng từng ô

constint HCELL = 40; //₫ộ cao tửng ô

//tạo pen với màu Blue, nét vẽ 2 pixel

Pen pen = newPen(Color.FromArgb(255, 0, 255), 1);

//tạo brush với màu ₫ỏ, tô ₫ặc

Brush brush = newSolidBrush(Color.FromArgb(255, 0, 255));

Graphics g;

Trang 31

int xcur, ycur; //ô nhập liệu

//hàm hiển thị nội dung ô row,col

privatevoid OutXY(int row, int col)

{

//tạo ₫ối tượng font chữ cần dùng

Font myFont = newFont("Helvetica", 11);

//tạo biến miêu tả chế ₫ộ canh giữa khi xuất chuỗi

StringFormat format1 = newStringFormat(StringFormatFlags.NoClip);

format1.Alignment = StringAlignment.Center;

//tính tọa ₫ộ x,y trên form của ô row,col

int x, y;

x = xStart + col * WCELL + (col / 3 + 1) * wSeparator;

y = yStart + row * HCELL + (row / 3 + 1) * wSeparator;

//thiết lập màu nền và màu chữ cho ô

Color bColor, fColor;

if (matran[row,col].fix)

{

bColor = Color.FromArgb(0, 0, 255);

fColor = Color.FromArgb(255, 255, 255);

}

else

{

bColor = Color.FromArgb(230, 230, 230);

fColor = Color.FromArgb(0, 0, 0);

g.DrawString(matran[row,col].value.ToString(), myFont, new

SolidBrush(fColor), x + WCELL / 2, y + 8, format1);

if (matran[row,col].value == -1) //hiển thị ô không hợp lệ

//vẽ cursor nhập liệu ở ô hiện hành

pen.Color = Color.DarkBlue;

g.DrawRectangle(pen,x + 3, y + 3, WCELL - 6, HCELL - 6);

}

Trang 32

}

privatevoid Giai() {

//bắt ₫ầu tìm trị cho ô trên trái

Trang 33

Tim1cach();

}

}

//hàm reset ma trận Sudoku về trạng thái ban ₫ầu

privatevoid XoaSudoku()

matran[h, c] = newCell();

//hiệu chỉnh lại kích thước Form ₫ể chứa vừa ma trận TextBox

this.Size = newSize(9 * WCELL + xStart * 2 + 14 + 4 * wSeparator, 9 * HCELL + yStart + 10 + 40 + 4 * wSeparator);

//thiết lập ô chứa cursor nhập liệu

xcur = ycur = LEN / 2;

//cho phép Form xử lý sự kiện phím

this.KeyPreview = true;

XoaSudoku();

}

//hàm xử lý Click chuột trên button Giai

privatevoid btnGiai_Click(object sender, EventArgs e)

{

Giai();

Trang 34

}

//hàm xử lý Click trên button Giaitiep

privatevoid btnGiaitiep_Click(object sender, EventArgs e)

{

Giaitiep();

}

//hàm xử lý Click trên button Xoa

privatevoid btnXoa_Click(object sender, EventArgs e)

{

XoaSudoku();

}

//hàm xử lý Click chuột trên Form

privatevoid Form1_MouseDown(object sender, MouseEventArgs e)

{

//xác ₫ịnh tọa ₫ộ chuột

int x = e.X, y =e.Y;

//kiểm tra chuột có nằm trên ma trận Sudoku ?

if (xStart > x || x >xStart + LEN * WCELL + 4*wSeparator ||

yStart > y || y > yStart+ LEN * HCELL + 4*wSeparator) {

//nếu nằm ngoài ma trận thì không làm gì

return;

}

//xác ₫ịnh ô ₫ược focus

xcur = (x - xStart) /WCELL;

if (xcur == LEN) xcur ;

ycur = (y - yStart) /HCELL;

if (ycur == LEN) ycur ;

Trang 35

caseKeys.Escape:

this.Close(); break;

Trang 36

//thiết lập màu vẽ

for (row = 0; row < LEN; row++)

for (col = 0; col < LEN; col++) OutXY(row, col);

//thiết lập màu Magenta cho pen

pen.Color = Color.FromArgb(255, 0, 255);

//tạo brush với màu Magenta, tô ₫ặc

brush = newSolidBrush(Color.FromArgb(255, 0, 255));

//vẽ các ₫ường lưới dọc phân ô và phân vùng ma trận Sudoku

y1 = yStart;

y2= yStart+ LEN * HCELL + 4*wSeparator;

for (col=0;col<=LEN;col++) {

//xác ₫ịnh tọa ₫ộ x của ₫ường lưới

x1 = x2 = xStart + col*WCELL+ (col/3+1)*wSeparator;

if ((col-col/3*3)==0) //lưới phân vùng

g.FillRectangle(brush, x1 - wSeparator, y1, wSeparator, y2 - yStart);

else { //lưới phân ô

pen.Color = Color.FromArgb(0, 0, 255);

g.DrawLine(pen, x1, y1, x2, y2);

//xác ₫ịnh tọa ₫ộ y của ₫ường lưới

y1 = y2 = yStart + row * HCELL + (row / 3 + 1) * wSeparator;

if ((row - row / 3 * 3) == 0) //lưới phân vùng

g.FillRectangle(brush, x1, y1 - wSeparator, x2 - xStart, wSeparator);

else { //lưới phân ô

pen.Color = Color.FromArgb(0, 0, 255);

g.DrawLine(pen, x1, y1, x2, y2);

}

}

}

 

14 Chọn menu Debug.Start Debugging ₫ể dịch và chạy thử ứng dụng

15 Khi Form chương trình hiển thị, hãy click chuột vào từng ô cần nhập số rồi gỏ phím

số cần nhập Sau khi ₫ã nhập xong các ô số của bài toán, bạn click button Giai và xem ₫áp án có ₫úng với yêu cầu Nếu muốnn xem ₫áp án khác, bạn ấn button "Giải tiếp", máy sẽ cố gắng tìm phương án khác, nếu có nó hiển thị lên, nếu không nó báo hết cách

Trang 37

16 Muốn giải ô số Sudoku khác, bạn click button "Xóa" ₫ể máy khởi ₫ộng lại từ ₫ầu Hãy thực hiện lại bước 15

Trang 38

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 3.1 : Viết chương trình khảo sát việc ₫ịnh nghĩa & sử dụng ₫ối

tượng

I Mục tiêu :

ƒ Giúp SV làm quen với việc ₫ặc tả interface & class của ₫ối tượng

ƒ Giúp SV hiểu rõ chi tiết về các mức ₫ộ bao ₫óng thành phần trong ₫ối tượng

ƒ Giúp SV hiểu rõ cách thức sử dụng ₫ối tượng

II Nội dung :

ƒ Đặc tả 1 interface và 1 class hiện thực interface này

ƒ Xây dựng chương trình nhỏ demo các tình huống dùng ₫ối tượng khác nhau

III Chuẩn ₫ầu ra :

ƒ Sinh viên nắm vững và viết thành thạo các lệnh interface và class ₫ể ₫ịnh nghĩa 2 góc nhìn khác nhau của từng ₫ối tượng ₫ược dùng trong phần mềm

ƒ Sinh viên nắm vững các mức ₫ộ bao ₫óng thành phần trong ₫ối tượng, từ ₫ó chủ

₫ộng kiểm soát việc dùng ₫ối tượng trong các tình huống sử dụng khác nhau

IV Qui trình :

1 Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Windows, chọn icon

"Console Application" trong listbox "Templates" bên phải, thiết lập thư mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td DefAndUseObject), click button OK ₫ể tạo Project theo các thông số ₫ã khai báo

3 Ngay sau khi Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Hiệu chỉnh code của file Program.cs ₫ể có nội dung như sau :

namespace DefAndUseObject {

classProgram {

//₫ịnh nghĩa 1 hàm dịch vụ

staticvoid button2_Click(object sender, System.EventArgs e) {

Console.WriteLine("Ham xu lý Click cua class Program chay");

}

//₫iểm nhập của chương trình

staticvoid Main(string[] args) {

//1 tạo ₫ối tượng thuộc class MyClass

MyClass obj = newMyClass();

//2 thử truy xuất các thành phần private và protected

//quan sát phản ứng của chương trình dịch

//5 tạo sự kiện Click ₫ể xem hàm nào chạy

Object sender =newObject();

EventArgs e = newEventArgs();

obj.OnClick(sender,e);

Trang 39

//6 thiết lập lại hàm xử lý sự kiện Click

obj.Click -= newMyClass.EventHandler(obj.button1_Click);

obj.Click += newMyClass.EventHandler(button2_Click);

//7 tạo sự kiện Click ₫ể xem hàm nào chạy

obj.OnClick(sender, e);

//8 dùng ₫ối tượng như danh sách các số nguyên

int i;

//chứa 10 số nguyên từ 0-9 vào danh sách

for (i = 0; i < 10; i++) obj[i] = i;

//₫ọc lại các số nguyên trong danh sách và hiển thị

for (i= 0; i < 10; i++)

Console.WriteLine("phan tu " + i + " = " + obj[i]);

5 Cửa sổ soạn code cho interface IMyInterface ₫ược hiển thị, ta ₫ịnh nghĩa interface ₫ơn giản như sau :

protectedint[] arr = newint[100];

//2 ₫ịnh nghĩa các tác vụ quản lý ₫ối tượng

public MyClass() {

this.Click += newEventHandler(button1_Click);

}

~MyClass() {} //hàm destructor

//3 ₫ịnh nghĩa ₫ối tượng ₫ại diện hàm chức năng

publicdelegatevoidEventHandler(Object sender, EventArgs e);

//4 ₫ịnh nghĩa sự kiện Click ₫ược xử lý bởi delegate EventHandler

Trang 40

publiceventEventHandler Click;

//5 ₫ịnh nghĩa các tác vụ & toán tử chức năng

publicvoid button1_Click(object sender, System.EventArgs e) {

Console.WriteLine("Ham xu lý Click cua class MyClass chay");

}

publicvoid func2() {

Console.WriteLine("Ham MyClass.func2() ₫ang chạy");

}

//6 ₫ịnh nghĩa tác vụ kích hoạt sự kiện Click

publicvoid OnClick(Object sender, EventArgs e) {

if (Click != null) Click(sender, e);

}

//7 ₫ịnh nghĩa thuộc tính luận lý x

publicint x {

get { return m_x; } set { m_x = value; } }

//8 ₫ịnh nghĩa indexer

publicintthis[int index] {

get {

//kiểm tra giới hạn ₫ể quyết ₫ịnh

if (index < 0 || index >= 100) { return 0; }

else { return arr[index]; }

10 Hãy hiệu chỉnh lệnh ₫ịnh nghĩa biến MyClass obj=… ở ₫ầu hàm Main thành :

IMyInterfce obj = new MyClass();

rồi dịch và chạy lại ứng dụng Máy sẽ báo lỗi ở các hàng lệnh truy xuất ₫ối tượng obj, mày chỉ cho phép dùng ₫úng lệnh gởi thông ₫iệp obj.func2(); Lý giải : vì biến obj có kiểu là interface IMyInterface nên ta chỉ có thể truy xuất ₫úng 1 hàm func2 trong interface mà thôi, mọi chi tiết của ₫ối tượng ₫ược tham khảo ₫ều bị che dấu

Ngày đăng: 20/10/2014, 18:44

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w