Tải bản đầy đủ (.pdf) (150 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.46 MB, 150 trang )

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 :
using System;
namespace GPTB2 {
class Program {
//₫ịnh nghĩa các biế
n cần dùng
static double a, b, c;
static double delta;
static double x1, x2;
//₫ị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() {


String buf;
Console.Write("Nhập a : "); buf= Console.ReadLine();
a = Double.Parse(buf);
Console.Write("Nhập b : "); buf = Console.ReadLine();
b = Double.Parse(buf);
Console.Write("Nhập c : "); buf = Console.ReadLine();
c = Double.Parse(buf);
}
//₫ị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
delta = b * b - 4 * a * c;
if (delta >= 0) //nếu có nghiệm thực
{
x1 = (-b + Math.Sqrt(delta)) / 2 / a;
x2 = (-b - Math.Sqrt(delta)) / 2 / a;
}
}

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
{
Console.WriteLine("Phương trình có 2 nghiệm thực : ");
Console.WriteLine("X1 = " + x1);
Console.WriteLine("X2 = " + x2);

}
}

//₫ị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 : ");
Console.Read();
}
}
//kết thúc class
} //kết thúc namespace
4. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng. Hãy thử nhập 1 bộ ba
(a,b,c) của phương trình bậc 2 nào ₫ó ₫ể chương trình giải và xem kết quả có ₫úng
không.
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 1
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 + x
2
/2! + x
3
/3! + + x
n
/n!
S2(x) = 1 - x + x
2
/2! - x
3
/3! + + (-1)
n
x
n
/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.
IV. Phân tích :
Điểm chung của 3 hàm S1, S2, S3 là dùng cùng công thức lặp có dạng sau :
S(x) = 1 +


=1n
n
e
trong ₫ó mỗi thành phần e

n
phụ thuộc vào x và n, e
n
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ì e
n
= x
n
/n!
- ₫ối với S2(x) thì e
n
= (-1)
n
x
n
/n!
- ₫ối với S3(x) thì e
n
= 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 e
n
, tích lũy e
n
vào S.
3. Kiểm tra e
n
< 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 :
using System;
using System.Collections.Generic;
using System.Text;
namespace TinhLap
{
Trang 2
class Program
{
//₫ịnh nghĩa hằng gợi nhớ miêu tả sai số mong muốn
const double EPSILON = 0.0000001;

//₫ịnh nghĩa hàm tính n!
static long giaithua(int n)
{
if (n <= 1) return 1;
return n*giaithua(n-1);
}


//₫ịnh nghĩa hàm tính thành phần x^n/n!
static double EnS1(double x, int n)
{
return (Math.Pow(x,n))/giaithua(n);
}

//₫ịnh nghĩa hàm tính công thức S1(x)
static double S1(double x)
{
//1. Lúc ₫ầu, thiết lập S = 1 và n = 1
double S = 1;
int n = 1;
double En;
do {
//2. Tính En, tích lũy En vào S
En = EnS1(x,n);
S = S + En;
n++;
} 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;
}

//₫ịnh nghĩa hàm tính thành phần (-1)^nx^n/n!
static double EnS2(double x, int n)
{
return Math.Pow(-1,n)*Math.Pow(x,n)/giaithua(n);
}

//₫ịnh nghĩa hàm tính công thức S2(x)

static double S2(double x)
{
//1. Lúc ₫ầu, thiết lập S = 1 và n = 1

double S = 1;
int n = 1;
double En;
do {
//2. Tính En, tích lũy En vào S
Trang 3
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
return S;
}

//₫ịnh nghĩa hàm tính công thức S3(x)
static double S3(double x)
{
//1. Lúc ₫ầu, thiết lập S = 1 và n = 1
double S = 1;
int n = 1;
double En;
do {
//2. Tính En, tích lũy En vào S
En = Math.Sin(n*x);
S = S + En;
n++;

} 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
static void 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();
x = Double.Parse(buf);
//gọi thử hàm S1(x)
Console.WriteLine("S1(" + x + ")= "+ S1(x));
//gọi thử hàm S2(x)
Console.WriteLine("S2(" + x + ")= " + S2(x));
//gọi thử hàm S3(x)
Console.WriteLine("S3(" + x + ")= " + S3(x));
}
}
}
4. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứ
ng dụng. Hãy thử nhập 1 giá trị x
nào ₫ó (nằm trong miền hội tự của hàm) ₫ể chương trình tính 3 hàm S1(x), S2(x), S3(x)
hiển thị kết quả.
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 1
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 2
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 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Dathuc {
class Program {
//₫ịnh nghĩa kiểu miêu tả 1 số mũ
private struct Sohang {
public float heso; //hệ số
public int 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
static void SortItems (Sohang[] dathuc, int soluong) {
//₫ịnh nghĩa các biến cần dùng
int i,j, max;
Sohang temp;
//Lặp xác ₫ịnh vị trí ₫úng cho từ số mũ
for (i = 0; i < soluong-1; i++) {
//Tìm phần tử có số mũ lớn nhất từ vị trí i
max = i;
for (j = i + 1; j < soluong; j++)
if (dathuc[max].somu < dathuc[j].somu)
max = j;
//hoán vị phần tử có số mũ lớn nhất về vị trí i
temp = dathuc[i];
dathuc[i] = dathuc[max];
dathuc[max] = temp;
}
}


//hàm chuẩn hóa ₫a thức, mỗi số mũ chỉ có 1 phần tử
static int Chuanhoa (Sohang[] dathuc, int soluong) {
//₫ịnh nghĩa các biến cần dùng
int i,j;
Sohang[] temp = new Sohang[soluong];
Trang 3
//sắp xếp thự tự các phần tử trong ₫a thức
SortItems(dathuc,soluong);
//Lặp việc gộp các phần tử có số mũ giống nhau
j = 0; temp[0] = dathuc[0];
i = 1;
while (i < soluong)
if (temp[j].somu == dathuc[i].somu) {
temp[j].heso += dathuc[i].heso;
i++;
} else {
j++;
temp[j] = dathuc[i];
i++;
}
//copy kết quả về dathuc gốc
for (i =0; i <= j ; i++)
dathuc[i] = temp[i];
//return số phần tử trong ₫a thức chuẩn hóa
return j+1;
}

//hàm in ₫a thức ₫ể kiểm tra
static
void 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++)
if (dathuc[i].heso <0)
Console.Write(dathuc[i].heso+ "x^"+ dathuc[i].somu + " ");
else
Console.Write("+ " + dathuc[i].heso + "x^"+ dathuc[i].somu + " ");
//in ký tự xuống dòng
Console.WriteLine();
}

//hàm nhân 2 ₫a thức
static void Nhan (Sohang
[] dathuc1, int soluong1, Sohang[] dathuc2, int soluong2, ref
Sohang[] dathuc3, ref int soluong3) {
//₫ịnh nghĩa các biến cần dùng
int i,j,k;
//cấp phát bộ nhớ chứa ₫a thức kết quả
dathuc3 = new Sohang[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 4
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
static void Main(string[] args) {
Sohang[] dathuc1 = new Sohang[] { new Sohang(1,3), new Sohang(1,2), new
Sohang(1,1),new Sohang(-2,2),new Sohang(2,1),new Sohang(2,0)};
//1. thử sắp xếp và in ra ₫ể kiểm tra
Console.WriteLine("Đa thức gốc là : ");
Indathuc(dathuc1,6);
SortItems(dathuc1,6);
Console.WriteLine("Đa thức ₫ược sort là : ");
Indathuc(dathuc1,6);

Sohang[] dathuc2 = new Sohang[] { new Sohang(1,3), new Sohang(1,2), new Sohang(1,1),
new Sohang(-2,2), new Sohang(2,1),new Sohang(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 = new Sohang[] { new Sohang
(1,3), new Sohang(1,2), new Sohang(1,1),
new Sohang(-2,2), new Sohang(2,1),new Sohang(2,0)};

Sohang[] dathuc4 = new Sohang[] { new Sohang(1,3), new Sohang(1,2), new Sohang(1,1),
new Sohang(-2,2), new Sohang(2,1),new Sohang(2,0)};
Sohang[] dathuc5 = new Sohang[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 : ");
Console.Read();
}//hết hàm Main
}//hết class Program
}//hết namespace

4. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng. Hãy kiểm tra kết quả hiển
thị của chương trình.
5. Thử hiệu chỉnh lại nội dung các ₫a thức trong mã nguồn rồi chạy lại phần mềm ₫ể kiểm
tra kết quả.
6. Hãy suy nghĩ và hiệu chỉnh lại phần mềm ₫ể có thể nhập ₫a thức từ người dùng.
Trang 1
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 :
using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sap8Conhau
{
class Program
{
Trang 2
//₫ịnh nghĩa các thuộc tính dữ liệu
const int MAX = 7; //chỉ số max của hàng và cột
static int cachso = 0; //số cách sắp ₫ã tìm ₫ược
static int[] hang = new int[MAX+1]; //danh sách chỉ số hàng ₫ã thử trong từng cột
static int c; //vị trị cột ₫ang sắp

//Điểm nhập của chương trình
static void Main(
string[] args)
{
// khởi ₫ộng trạng thái xuất phát
for (c = 0; c <= MAX; c++) hang[c] = -1;
cachso = 0;
//bắt ₫ầu ₫ặt con hậu ở cột 0 vào hàng 0
hang[0] = 0;
//bắt ₫ầu tìm hàng cho con hậu ở cột thứ 2 (chỉ số là 1)
c = 1;
while (Tim1cach())
{
// tìm ₫ược cách sắp 8 con hậu
InKetqua();

//lùi lại cột trước ₫ể tiếp tục tìm cách sắp khác
c ;
}
// hết cách > dừng chương trình
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
static bool Tim1cach()
{
int h;
while (c <= MAX)
{
// tìm chỉ số hàng cho con hậu ở cột c
h = timhang(c);
if (h >= 0)
{ //nếu tìm ₫ược
//lưu hàng vào danh sách kết quả rồ
i tăng chỉ số cột ₫ể tiếp tục
hang[c++] = h;
continue;
}
//trường hợp không tìm ₫ược hàng cho con hậu ở cột c
if (c > 0)
{

//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 3
hang[c ] = -1;
continue;
}
//hết cách
return false;
}
return true;
}//hết hàm Tim1cach

//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
static int 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
static bool 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) return false;
// 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 >=0) {
if (hang[c1] == h1) return false;
h1 ; c1 ;
}
// xem có con hậu nào nằm trên ₫ường chéo trên phải - dưới trái
c1 = c-1; h1 = h+1;
while (c1>= 0 && h1 <=MAX) {
if (hang[c1] == h1) return
false;
h1++; c1 ;
}
return true;
}

//hàm in kết quả 1 cách sắp 8 con hậu theo yêu cầu
static void 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 4
// 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 ");
else Console.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("+ ");
Console.WriteLine("+");
}

}//hết class Program
}//hết namespace


4. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng. Hãy kiểm tra kết quả hiển
thị của chương trình.
Trang 1
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 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TaoTu
{

class Program
{
Trang 2
//₫ịnh nghĩa các thuộc tính dữ liệu
const int MAXLEN = 20; //số ký tự max cần dùng ₫ể tạo từ
static String srcstr; //chuỗi các ký tự khác nhau ₫ể tạo từ
static int sotu; //số từ ₫ã tìm ₫ược
static int[] chiso = new int[MAXLEN + 1]; //danh sách chỉ số ký tự ₫ã thử trong từng cột
static int sokytu; //số ký tự gốc ₫ược dùng
₫ể tạo từ
static int c; //vị trị cột ₫ang sắp

//Điểm nhập của chương trình
static void Main(string[] args)
{
//nhập chuỗi ký tự dùng ₫ể tạo từ
do
{
Console.Write("Hãy nhập chuỗi các ký tự cần dùng : ");
srcstr = Console.ReadLine();
//xác ₫ịnh số ký tự ₫ược dùng
sokytu = srcstr.Length;
} 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
chiso[0] = 0;
//bắt ₫ầu tìm ký tự cho cột thứ 2 (chỉ số là 1) của từ cần xây dựng

c = 1;
while (Tim1cach())
{
// tìm ₫ược 1 từ mới
InKetqua();
//lùi lại cột trước ₫ể tiếp tục tìm cách sắp khác
c ;
}
// hết cách > dừng chương trình

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
static bool Tim1cach() {
int h;
while (c < sokytu)
{
// tìm chỉ số ký tự cho ký tự cột c
h = timkytu(c);
if
(h >= 0)
{ //tìm ₫ược ==>lưu chỉ số vào danh sách kết quả rồi tăng chỉ số cột ₫ể tiếp tục
Trang 3
chiso[c++] = h;
continue;

}
//trường hợp không tìm ₫ược ký tự ở cột c
if (c > 0)
{
//cột c chưa phải là cột ₫ầu tiên =>xét lại cột c từ ký tự ₫ầu rồi lùi cột c
chiso[c ] = -1;
continue;
}
//hết cách
return false;
}
return true;
}//hết hàm Tim1cach

//hàm tìm chỉ số hàng cho con hậu ở cột c
static int timkytu(int c)
{
int h, hmin = chiso[c] + 1;

for (h = hmin; h < sokytu; h++) // thử ký tự chỉ số h
if (duocphep(h, c)) return h;
return -1;
}

// Kiểm tra xem có thể xếp ký tự thứ h vào vị trí thứ c trong từ cần xây dựng
static bool duocphep(int h, int c)
{
int k;
for (k = 0; k < c; k++)
if (chiso[k] == h) return false;

return true;
}

//Kiểm tra từ, nếu có nghĩa thì trả về TRUE, nếu không trả về FALSE
static bool 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
return true;
}

//hàm in từ mới tìm theo yêu cầu
static void InKetqua()
{
String desstr;
int k;
//Xây dựng từ mới tìm ₫ược
desstr = "";
for (k = 0; k < sokytu; k++)
Trang 4
desstr += srcstr[chiso[k]];
if (conghia(desstr)) //kiểm tra từ có nghĩa trước khi in
{
Console.WriteLine("Từ thứ " + (++sotu) + " : " + desstr);
}
}

}//hết class Program
}//hết namespace



4. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng, nhập 1 chuỗi ký tự gốc 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 cho nhiều chuỗi ký tự có ₫ộ dài khác nhau.
Trang 1
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 2
namespace Madituan
{
class Program
{
// Kiểu chứa thông tin về 1 bước ₫i
private struct ItemRec {

public int x, y;
public int huong;
};
// Các biến dữ liệu chính
static int Size;
static int[,] Banco;
static ItemRec[] Nuocdi;
static int SoNuocdi;
static int SoNghiem;

// Chương trình chính
static void Main(string[] args)
{
Khoidong();
while (DiBuocNua())
if (SoNuocdi == Size * Size-1)
{
//tìm ₫ược 1 cách mới, in cách
₫i mới tìm ₫ược
InKetqua();
Banco[Nuocdi[SoNuocdi].x, Nuocdi[SoNuocdi].y] = -1;
//lùi con mã 1 bước
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
static void Khoidong() {
int i,j;
int row, col;
String buf;
do //chờ nhập kích thước bàn cờ

{
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 3
} 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 = new int[Size, Size];
Nuocdi = new ItemRec[Size * Size];
for (i = 0; i < Size * Size; i++)
Nuocdi[i] = new ItemRec();
//khởi ₫ộng trạng thái ₫ầu cho các vị trí
for (i = 0; i < Size; i++)

for (j = 0; j < Size; j++)
Banco[i, j] = -1; // con mã chưa ₫i qua ô [i,j]

SoNghiem = 0;
// Thiết lập nước ₫i ₫ầu tiên của con mã
Nuocdi[0].x = col;
Nuocdi[0].y = row;
Nuocdi[0].huong = 0;
SoNuocdi =0;
//chọn khả năng ₫i tiếp của vị trí ₫ầu tiên của con mã
Banco[Nuocdi[SoNuocdi].x, Nuocdi[SoNuocdi].y] = 0;
}

//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
static bool DiBuocNua() {
int x=0, y=0;
bool RetVal;
RetVal = false;
do { // lặp tìm vị trí kế
while (RetVal==false && Nuocdi[SoNuocdi].huong < 8) {
switch (Nuocdi[SoNuocdi].huong) { //thử
hướng ₫i hiện tại
case 0 :
x = Nuocdi[SoNuocdi].x + 2;
y = Nuocdi[SoNuocdi].y - 1;
break;
case 1 :
x = Nuocdi[SoNuocdi].x + 1;
y = Nuocdi[SoNuocdi].y - 2;

break;
case 2 :
x = Nuocdi[SoNuocdi].x - 1;
y = Nuocdi[SoNuocdi].y - 2;
break;
case 3 :
x = Nuocdi[SoNuocdi].x - 2;
y = Nuocdi[SoNuocdi].y - 1;
Trang 4
break;
case 4 :
x = Nuocdi[SoNuocdi].x - 2;
y = Nuocdi[SoNuocdi].y + 1;
break;
case 5 :
x = Nuocdi[SoNuocdi].x - 1;
y = Nuocdi[SoNuocdi].y + 2;
break;
case 6 :
x = Nuocdi[SoNuocdi].x + 1;
y = Nuocdi[SoNuocdi].y + 2;
break;
case 7 :
x = Nuocdi[SoNuocdi].x + 2;
y = Nuocdi[SoNuocdi].y + 1;
break;
}
if (0<=x && x<Size && 0<=y && y<Size && Banco[x,y]==-1) {
// nếu ₫ược thì ghi nhận
SoNuocdi = SoNuocdi + 1;

Banco[x,y] = SoNuocdi;
Nuocdi[SoNuocdi].x = x;
Nuocdi[SoNuocdi].y = y;
Nuocdi[SoNuocdi].huong = 0;
RetVal =true;
} else // nếu không tìm ₫ược vị trí kế tiếp
Nuocdi[SoNuocdi].huong = Nuocdi[SoNuocdi].huong + 1;
}
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ờ
static void InKetqua()
{
int h, c;
SoNghiem = SoNghiem + 1;
Console.WriteLine("Cách ₫i thứ : " + SoNghiem);
for (h = 0; h < Size; h++)
{
// Hiển thị hàng lưới ngang bàn cờ
for (c = 0; c < Size; c++) Console.Write("+ ");
Console.WriteLine("+");

Trang 5
// 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("+ ");
Console.WriteLine("+");
}
}//hết class Program
}//hết namespace


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 1
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 2
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 3
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 :
private void btnPlay_Click(object sender, EventArgs e) {
//tạo form duyệt chọn file cần chơi
OpenFileDialog dlg = new OpenFileDialog();
//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

×