Tải bản đầy đủ (.doc) (35 trang)

Xây dựng chương trình mô phỏng thuật toán HEURISTIC giải bài toán xếp BALO

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 (1006.01 KB, 35 trang )

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CNTT VÀ TRUYỀN THÔNG


BÁO CÁO
THỰC TẬP CƠ SỞ
Đề tài:
XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG
THUẬT TOÁN HEURISTIC GIẢI BÀI TOÁN
XẾP BALO
Sinh viên thực hiện : ĐỖ THỊ MƠ
Lớp : CNTT-K9D
Giáo viên hướng dẫn : TRƯƠNG HÀ HẢI



Thái Nguyên, ngày tháng năm
Mục lục
Mở đầu 3
Chương 1 4
TÌM HIỂU NGÔN NGỮ VÀ THUẬT TOÁN 4
1.1. Tìm hiểu ngôn ngữ C Sharp 4
1.1.1. Tổng quan về C-Sharp 4
1.1.2. Những cơ sở của ngôn ngữ C# 6
1.1.4. WinForms 15
1.2.Thuật toán heuristic và bài toán xếp balo 23
1.2.1 Thuật toán Heuristic 23
1.2.2. Bài toán xếp balo 27
XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG 30
1.1. Giao diện chính của chương trình 30
2.2. Các chức năng của chương trình 30


a. Chức năng nhập dữ liệu từ bàn phím: 30
b. Chức năng nhập dữ liệu ngẫu nhiên 33
Kết luận 34
TÀI LIỆU THAM KHẢO: 35
Mở đầu
Thuật toán là một kiến thức, là bước mở đầu quan trọng để giải bất kỳ một bài
toán nào. Thuật toán hay nói một cách khác đó là phương pháp, là các bước giải
một bài toán.
Thuật toán là sương sống của mọi ngôn ngữa lập trình. Mỗi ngôn ngữ lập trình
với cách thể hiện câu lệnh khác nhau nhưng chúng đểu có chung một thuật toán để
giải quyết bài toán đó.
Qua đó muốn thể hiện được thuật toán đó thành một sản phẩm hoàn chỉnh ta
phải dùng ngôn ngữ, vì vậy ta có thể rèn luyện và sử dụng thành thạo ngôn ngữ lập
trình. Qua đó ta thấy được vai trò quan trọng của thuật toán và ngôn ngữ.
Trong bài thực tập này em đã lựa chọn thuật toán heuristic để giải bài toán xếp
balo và kết hợp sử dụng ngôn ngữ C-Sharp để mô phỏng thuật toán ấy vào bài toán
cụ thể. Nội dung xây dựng thuật toán được chia thành 2 chương:
Chương 1: Tìm hiểu ngôn ngữ và thuật toán
Chương 2: Xây dựng chương trình mô phỏng
Qua phần nội dung giúp em hiểu sâu hơn về khái niệm thuật toán, cách thức
hình thành ý tưởng để giải quyết các bài toán từ dễ đến khó để lập trình trên máy
tính. Thông qua nội dung bài thực tập giúp em hiểu thêm giải một bài toán hoàn
chỉnh trên máy tính điện tử như thế nào. Ý thức được tầm quan trọng của người lập
trình trong cuộc sống.
Chương 1
TÌM HIỂU NGÔN NGỮ VÀ THUẬT TOÁN
1.1. Tìm hiểu ngôn ngữ C Sharp
1.1.1. Tổng quan về C-Sharp
C# là một ngôn ngữ rất đơn giản, với khoảng 80 từ khóa và hơn mười
kiểu dữ liệu dựng sẵn, nhưng C# có tính diễn đạt cao. C# hỗ trợ lập trình có cấu

trúc, hướng đối tượng, hướng thành phần.
Trọng tâm của ngôn ngữ hướng đối tượng là lớp. Lớp định nghĩa
kiểu dữ liệu mới, cho phép mở rộng ngôn ngữ theo hướng cần giải quyết. C# có
những từ khóa dành cho việc khai báo lớp, phương thức, thuộc tính mới. C# hỗ trợ
đầy đủ khái niệm trụ cột trong lập trình hướng đối tượng: đóng gói, kế thừa, đa
hình.
Định nghĩa lớp trong C# không đòi hỏi tách rời tập tin tiêu đề với tập
tin cài đặt như C++.
Hơn thế, C# hỗ trợ kiểu sưu liệu mới, cho phép sưu liệu trực tiếp trong
tập tin mã nguồn. Đến khi biên dịch sẽ tạo tập tin sưu liệu theo định dạng XML.
C# hỗ trợ khái niệm giao diện, interfaces(tương tự Java). Một lớp chỉ
có thể kế thừa duy nhất một lớp cha nhưng có thể cài đặt nhiều giao diện.
C# có kiểu cấu trúc, struct (không giống C++). Cấu trúc là kiểu hạng
nhẹ và bị giới hạn. Cấu trúc không hể kế thừa lớp hay được kế thừa nhưng có thể
cài đặt giao diện.
C# cung cấp những đặc trưng lập trình hướng thành phần như
property, sự kiện và hướng dẫn hướng khai báo ( được gọi là attribute). Lập trình
hướng component được hỗ trợ bởi CLR thông qua siêu dữ liệu (metadata). Siêu dữ
liệu mô tả lớp bao gồm các phương thức và thuộc tính, các thông tin bảo mật…
C# cũng cho truy nhập trực tiếp bộ nhớ dùng con trỏ kiểu C++, nhưng
vùng mã đó được xem như là không an toàn. CLR sẽ không thực hiện thu dọn rác tự
động các đối tượng được tham chiếu bởi con trỏ cho đến khi lập trình viên tự giải
phóng.
Tại sao hiện nay c- sharp lại trở thành ngôn ngữ thông dụng. vì chúng
có những ưu điểm sau:
− C-sharp là ngôn ngữ đơn giản:
C# loại bỏ một vài sự phức tạp rối ren của những ngôn ngữ như java và
C++, bao gồm việc loại bỏ những macro, những template, đa kế thừa, và lớp cơ sở
ảo(virtual base class). Chúng là những nguyên nhân gây ra sự nhầm lẫn hay dẫn
đến những vẫn đề cho những người phát triển C++.

− C-Sharp là ngôn ngữ hiện đại:
Những đặc tính như là xử lý ngoại lệ và thu gom. Bộ nhớ tự động,
những dữ liệu mở rộng, và bảo mật mã nguồn là những đặc tính được mong đợi
trong một ngôn ngữ hiện đại. C# chứa tất cả những đặc tính trên.
− C-Sharp là ngôn ngữ hướng đối tượng
Những đặc điểm chính của ngôn ngữ hướng đối tượng(object-orented
language) là sự đóng gói(encapsulation), kế thừa(inheritance) và đa
hình(polymorphism). C# hỗ trợ tất cả những đặc tính trên.
− C-Sharp là ngôn ngữ mạnh mẽ và cũng mềm dẻo
Ngôn ngữ này không đặt rằng buộc lên những việc có thể làm. C# được
sử dụng cho nhiều các dự án khác nhau như là tạo ra ứng dụng xử lý văn bản, ứng
dựng đồ họa, bản tính, hay thậm chí những trình biên dịch cho các ngôn ngữ khác .
− C-Sharp là ngôn ngữ ít từ khóa
C# là ngôn ngữ sử dụng bị giới hạn những từ khóa. Phần lớn các từ khóa
được sử dụng để mô tả thông tin.
Bảng liệt kê các từ khóa của ngôn ngữ C#
Abstract Default Foreach Object Sizeof
Unsafe
As Delegate Goto Operator Stacklloc
Ushort
Base Do If Out Static
Using
Bool Double Implicit Override String
Vỉtual
Break Else In Params Struct
Volatile
Byte Enum Int Private Switch
Void
Case Event Interface Protected This
While

Catch Explicit Internal Public Throw
Một điều quan trọng khác với C++là mã nguồn không đòi hỏi phải có tập tin
header.
Tất cả mã ngồn được viết trong khai báo một lớp.
Các bước chuẩn bị cho chương trình
Khi tạo một chương trình trong C# hay bất cứ ngôn ngữ nào, chúng ta nên
theo nhưng bước tuần tự sau:
Bước 1: Xác định mục tiêu của chương trình.
Bước 2:Xác định nhưng phương pháp giải quyết vấn đề.
Bước 3:Tạo một chương trình để giải quyết vấn đề.
Bước 4: Thực thi chương trình để xem kết quả.
1.1.2. Những cơ sở của ngôn ngữ C#
1.1.2.1. Các kiểu
C# buộc phải khai báo kiểu của đối tượng được tạo. Khi kiểu được khai báo rõ
ràng, trình biên dịch sẽ giúp ngăn ngừa lỗi bằng cách kiểm tra dữ liệu được gán cho
đối tượng có hợp lệ không, đồng thời cấp phát đúng kích thước bộ nhớ cho đối
tượng.
C# phân thành hai loại : loại dữ liệu dựng sẵn và loại do người dùng định
nghĩa.
C# cũng được chia dữ liệu thành hai kiểu : giá trị và tham chiếu.Biến kiểu giá
trị được lưu trữ trong vùng nhớ stack, còn biến kiểu tham chiếu được lưu trữ trong
vùng nhớ heap.
C# cũng được hỗ trợ kiểu con trỏ của C++, nhưng ít khi được sử dụng.thông
thường con trỏ chỉ được sử dụng khi làm việc trực tiếp với Win API hay các đối
tượng COM.
a . Kiểu dữ liệu định sẵn
C# có nhiều kiểu dữ liệu dựng sẵn, mỗi kiểu ánh xạ đến một kiểu hỗ trợ
bởi CLS (Commom Language Specification),ánh xạ để đảm bảo rằng đối tượng
được tạo tỏng C# không khác gì đối tượng được tạo trong các ngôn ngữ .NET khac.
Mỗi kiểu có một kích thước cố định được liệt lê trong bảng sau:

Bảng 1-1 Các kiểu dựng sẵn
Kiểu Kích thước (byte) Kiểu .Net Mô tả giá trị
Byte 1 Byte Không dấu (0…255)
Char 1 Char Mã ký tự unicode
Bool 1 Boolean True or false
Sbyte 1 Sbyte Có dấu(-128…127)
Short 2 Int16 Có dấu(-32768-32767)
Ushort 2 Uint16 Không dấu(0….65535)
Int 4 Int32 Có dấu(-2147483647…. 2147483647)
Uint 4 Uint 32 Không dấu(0…4294967295)
Float 4 Single Số thực()
Double 8 Double Số thực()
Decimal 8 Dcimal Số có dấu chấm tĩnh với 28 ký số và
dấu chấm
Long 8 Int64 Số nguyên có dấu
(-922337203685477808
-922337203685477807)
Ulong 8 Uint64 Số nguyên không dấu
(0… 0xfffffffffff)
b. Biến và Hằng
Biến dùng để lưu trữ dữ liệu. Mỗi biến thuộc về một kiểu dữ liệu nào
đó. Biến có thể được gán giá trị và cũng có thể thay đổi giá trị khi thực hiện các
lệnh trong chương trình.
Để tạo một biến chúng ta phải khai báo kiểu của biến và gán cho biến
một tên duy nhất.
Biến có thể được khởi tạo giá trị ngay khi được khai báo, hay nó cũng có
thể được gán một giá trị mới vào bất cứ lúc nào trong chương trình.
Hằng là một biến nhưng giá trị của nó không thay đổi theo thời gian.
Khi cần thao tác trên một giá trị xác định ta dùng hằng. Khai báo hằng tương tự
khai báo biến và có thêm từ khóa Const ở trước. hằng một khi khởi động xong

không thể thay đổi được nữa
cú pháp :
<const> <type> <tên hằng> = <giá trị>; Ví dụ const int hang =100;
c. Kiểu liệt kê
Kiểu liệt kê đơn giản là tập hợp các tên hằng có giá trị không thay đổi
(thường được gọi là danh sách liệt kê).
Mỗi kiểu liệt kê có một kiểu dữ liệu cơ sở, kiểu dữ liệu có thể là bất cứ
kiểu dữ liệu nguyên nào như int, short, long tuy nhiên kiểu dữ lịêu của liệt kê
không chấp nhận kiểu ký tự. Để khai báo một kiểu liệt kê ta thực hiện theo cú pháp
sau:
[thuộc tính] [bổ sung] enum <tên liệt kê> [:kiểu cơ sở] {danh sách các thành
phần liệt kê};
d. Kiểu chuỗi ký tự
Kiểu dữ liệu chuỗi khá thân thiện với người lập trình trong bất cứ ngôn
ngữ lập trình nào, kiểu dữ liệu chuỗi lưu giữ một mảng những ký tự.
Để khai báo một chuỗi chúng ta sử dụng từ khoá string tương tự như cách
tạo một thể hiện của bất cứ đối tượng nào: String chuỗi;
e. Định danh
Định danh là tên mà người lập trình chỉ định cho các kiểu dữ liệu, các
phương thức, biến, hằng, hay đối tượng
Một định danh phải bắt đầu với một ký tự chữ cái hay dấu gạch dưới, các
ký tự còn lại phải là ký tự chữ cái, chữ số, dấu gạch dưới.
Các định danh không được trùng với các từ khoá mà C# và phân biệt hoa,
thường.
f. Biểu thức
Những câu lệnh mà thực hiện việc đánh giá một giá trị gọi là biểu thức.
Một phép gán một giá trị cho một biến cũng là một biểu thức
1.1.2.2 các câu lệnh
a. Rẽ nhánh không có điều kiện
Có 2 loại câu rẽ nhánh không điều kiện.

Một là phương thức: khi trình biên dịch thấy có lời gọi phương thức nó
sẽ tạm dừng phương thức hiện hành và nhảy đến phương thức được gọi cho đến hết
phương thức này sẽ trở về phương thức cũ.
Hai là tạo câu lệnh rẽ nhánh không điều kiện là dung từ khóa goto,
break, continue, throw.
b. Rẽ nhánh có điều kiện
Câu lệnh if else
Cú pháp:
If ( biểu thức logic)
Khối lệnh;
Hoặc:
If(biểu thức logic)
Khối lệnh 1;
Else
Khối lệnh 2;
Biểu thức logic là biểu thức cho giá trị true or false. Nếu biểu thức
logic cho giá trị đúng thì “khối lệnh” hay “khối lệnh 1” được thực thi ngược lại
“khối lệnh 2” được thực thi.
Biểu thức trong câu lệnh if phải là biểu thức logic, không thể là biểu
thức số.
Lệnh Swich
Cú pháp :
Switch (biểu thức lựa chọn)
{
Case biểu_thức _hằng:
Khối lệnh;
Lệnh nhảy;
[default:
Khối lệnh;
Lệnh nhảy;]

}
C# cung cấp các lệnh lặp gống như C++ như for, while, do-while và lệnh
lặp mới foreach. Nó cũng hỗ trợ các câu lệnh nhảy như: goto, break, continue và
return.
c. Lệnh nhảy goto
Lệnh GOTO: có thể dung để tạo lệnh nhảy nhưng nhiều nhà lập trình chuyên
nghiệp khuyên không nên dung câu lệnh này vì nó phá vỡ cấu trúc của chương
trình.
Cách dùng câu lệnh này như sau:
B1: tạo một nhãn
B2: goto đến nhãn đó.
d. Các câu lệnh lặp
Vòng lặp While:
Cú pháp :
while (biểu_thức_logic)
khối lệnh;
Khối lệnh sẽ được thực hiện đến khi nào biểu thưc còn đúng. Nếu ngay
từ đầ biểu thức sai, khối lệnh sẽ không được thức thi.
Vòng lặp Do-While
Cú pháp:
Do
Khối lệnh
While (biểu_thức_logic)
Khác với while khối lệnh này sẽ được thực hiện trước, sau đó biểu thức
được kiểm tra. Nếu biểu thức đúng khối lệnh được thực hiện.
Vòng lặp For
Cú pháp:
For([khởi tạo điều kiện đếm];[biểu thức];[gia tăng biến đếm])
Khối lệnh;
e. Các câu lệnh nhảy

Câu lệnh break, continue và return.
Khi đang thực hiện các lệnh trong vòng lặp, có yêu cầu như sau: không thực
hiện các lệnh còn lại nữa mà thoát khỏi vòng lặp, hay không thực hiện các công
việc còn lại của vòng lặp hiện tại mà nhảy qua vòng lặp tiếp theo. Để đáp ứng yêu
cầu trên C# cung cấp hai lệnh nhảy là break và continue để thoát khỏi vòng lặp.
+ Break khi được sử dụng sẽ đưa chương trình thoát khỏi vòng lặp và tiếp tục
thực hiện các lệnh tiếp ngay sau vòng lặp.
+ Continue ngừng thực hiện các công việc còn lại của vòng lặp hiện thời và
quay về đầu vòng lặp để thực hiện bước lặp tiếp theo
+ Return trả về giá trị gán và kết thúc vòng lặp.
1.1.2.3. Toán tử
Toán tử được kí hiệu bằng một biểu tượng dùng để thực hiện một hành động.
Các kiểu dữ liệu cơ bản của C# như kiểu nguyên hỗ trợ rất nhiều các toán tử như
toán tử gán, toán tử toán học, logic
a. Toán tử gán
Toán tử gán hay phép gán làm cho toán hạng bên trái thay đổi giá trị bằng
với giá trị của toán hạng bên phải. Toán tử gán là toán tử hai ngôi.
Đây là toán tử đơn giản nhất thông dụng nhất và cũng dễ sử dụng nhất.
b. Toán tử toán học
Ngôn ngữ C# cung cấp năm toán tử toán học, bao gồm bốn toán tử đầu
các phép toán cơ bản. Toán tử cuối cùng là toán tử chia nguyên lấy phần dư
• Các phép toán số học cơ bản (+,-,*,/)
Các phép toán này không thể thiếu trong bất cứ ngôn ngữ lập trình nào,
C# cũng không ngoại lệ, các phép toán số học đơn giản nhưng rất cần thiết bao
gồm: phép cộng(+),phép trừ (-), phép nhân (*), phép chia (/) nguyên và không
nguyên. Khi chia hai số nguyên, thì C# sẽ bỏ phần phân số, hay bỏ phần dư. Để tìm
phần dư của phép chia nguyên, chúng ta sử dụng toán tử chia lấy dư (%).
• Toán tử tăng và giảm
Khi sử dụng các biến số ta thường có thao tác là cộng một giá trị vào
biến, trừ đi một giá trị từ biến đó, hay thực hiện các tính toán thay đổi giá trị của

biến sau đó gán giá trị mới vừa tính toán cho chính biến đó.
1) += Cộng thêm giá trị toán hạng bên phải vào giá trị toán hạng bên trái
2) -= Toán hạng bên trái được trừ bớt đi một lượng bằng giá trị của toán
hạng bên phải
3) *= Toán hạng bên trái được nhân với một lượng bằng giá trị của toán
hạng bên phải.
4) /= Toán hạng bên trái được chia với một lượng bằng giá trị của toán
hạng bên phải.
5) %= Toán hạng bên trái được chia lấy dư với một lượng bằng giá trị của
toán hạng bên phải.
• Toán tử quan hệ
Những toán tử quan hệ được dùng để so sánh giữa hai giá trị, và sau đó trả
về kết quả là một giá trị logic kiểu bool (true hay false).
• Toán tử logic
Các toán tử là and(&&), or(||), not(!). Các toán tử này được dùng trong
các biểu thức điều kiện để kết hợp các toán tử quan hệ theo một ý nghĩa nhất định.
• Toán tử ba ngôi
Cú pháp: <biểu thức điều kiện>? < biểu thức 1>: < biểu thức 2>;
Ý nghĩa: nếu biểu thức điều kiện đúng thì thực hiện biểu thức 1. Nếu sai thực
hiện biểu thức 2.
1.1.2.4. Lớp và phương thức
Các đặc điểm của lập trình hướng đối tượng
C# là ngôn ngữ lập trình hướng đối tượng. Ra đời sau ngôn ngữ lập
trình hướng đối tượng C++ và Java nên nó kết tinh những ưu điểm của hai ngôn
ngữ trên.
Một ngôn ngữ lập trình hướng đối tượng có 4 đặc điểm chính:
* Trừu tượng hóa dữ liệu (Data Abstraction): trong lập trình hướng đối
tượng, một chương trình được quan niệm là các đối tượng, mỗi đối tượng có các
trạng thái(state) và các hành vi (method, action, behavior). Các đối tượng này có thể
thực hiện các hành vi trên dữ liệu của đối tượng (state). Quá trình chọn lọc chỉ giữ

lại các đặc điểm, các thuộc tính thông dụng của đối tượng liên quan đến bài toán
cần giải quyết gọi là trừu tượng hóa dữ liệu. Ví dụ nếu cần xây dựng một chương
trình quản lý khách hàng cho một đại lý bán ôtô, trong chương trình sẽ có một đối
tượng khách hàng. Đối tượng khách hàng có rất nhiều đặc điểm như: Tên, địa chỉ,
số điện thoại, vân tay, màu tóc…trong bài toán này ta chỉ giữ lại các đặc điểm tên,
địa chỉ, số điện thoại của khách hàng. Nhưng nếu giải quyết bài toán quản lý các
công dân của một quốc gia, đối tượng công dân lúc này ngoài các thuộc tính ngày
tên, ngày sinh thì chúng ta phải lưu giữ cả vân tay, màu tóc
* Bao gói dữ liệu (Data Encapsulation): Một chương trình là một tập các đối
tượng, mỗi đối tượng có dữ liệu và hành vi. Ngôn ngữ lập trình có khả năng che dấu
đi dữ liệu bên trong của đối tượng. Trong ngôn ngữ lập trình chúng ta sẽ bắt gặp nó
thể hiện ở dưới những từ khóa chỉ bổ từ truy xuất như: public, private, protected.
* Kế thừa (Inheritance): Kế thừa là một đặc điểm quan trọng trong lập trình
hướng đối tượng. Đó là khả năng sử dụng lại các đối tượng đã có để mở bổ sung mở
rộng.
* Đa hình (Polymorphism): Đó là khả năng ghi đè phương thức của lớp cơ
sở và cung cấp một phát triển khác ở trong lớp dẫn xuất. Sức mạnh của đa hình thể
hiện ở chỗ, kiểu của đối tượng chưa xác định ở thời điểm biên dịch chương trình.
Điều này cho phép thông tin kiểu đối tượng lúc thực thi được sử dụng để xác định
phương thức thực sự được gọi.
a. Khái niệm lớp và cách khai báo lớp
Lớp (Class) giống như khái niệm thực thể trong cơ sở dữ liệu, nó vẽ ra mô
hình,chỉ ra các thành phần mà một đối tượng thuộc lớp đó sẽ có.Ví dụ lớp Student
gồm có các trường ID(mã sv), Name(tên sv), Address(địa chỉ), các phương
thức Studing(học), TakeExam(thi), Relax(thư giãn). Lớp Car gồm các trường
Make(hãng), Model, và các phương thức Driving(lái), Accelerating(tăng tốc),
phanh(Braking).
- Cú pháp để khai báo một lớp
class
{ //class member

}
- Trong một lớp thì gồm các thành phần: hằng số, các trường, các phương thức
khởi tạo(constructor), các property, các indexer, các phương thức(method).
b. Khái niệm đối tượng
Nếu như lớp chỉ là mô hình chỉ ra một đối tượng thuộc lớp đó gồm nhưng cái
gì thì đối tượng là một thể hiện của lớp.Ví dụ trên chúng ta có lớp Car, nó chỉ ra
rằng một đối tượng thuộc lớp phải có nhãn hiệu (Make), Model. Ví dụ nhãn hiệu
(Make) là Toyota, Model là Innova. Chúng ta có thể tạo ra nhiều đối tượng thuộc
một lớp, làm thế nào để tạo ra một đối tượng của lớp?
Cú pháp tạo đối tượng của lớp:
<Tên lớp> <Tên đối tương> = new <Tên phương thức khởi tạo>([danh sách
đối số]);
Câu lệnh trên thực hiện 2 việc:
• Cấp phát vùng nhớ cho đối tượng.
• Khởi tạo giá trị cho các trường của đối tượng(khởi tạo đối tượng).
- Hàm khởi tạo (Constructor) làm một phương thức đặc biệt dùng để tạo ra đối
tượng của một lớp.
- Đặc điểm của hàm khởi tạo:
• Trùng với tên của lớp
• Không trả về kiểu dữ liệu
• Có đối số hoặc không có đối số
• Nếu không viết phương thức khởi tạo, trình biên dịch cung cấp một
phương thức khởi tạo mặc định để khởi tạo đối tượng.
c. khái niệm Phương thức
Là các hàm bên trong một lớp, mỗi phương thức cài đặt một hành động của
đối tượng.
Các phương thức được gọi thông qua các đối tượng hoặc thông qua tên lớp
nếu là phương thức tĩnh
Cú pháp để khai báo một phương thức
<access modifief> <return type> <MethodName>([danh sách đối số])

{ }
Gọi phương thức:
* <Tênđốitượng><tênphươngthức([ danh sách các đối số])>
* <Tênlớp> <Tênphươngthức([danh sách các đối số])> (áp dụng cho phương
thức tĩnh)
Một phương thức mà có từ khóa static đặt trước gọi là phương thức tĩnh,
phương thức tĩnh là phương thức của lớp, do đó nó được gọi trực tiếp thông qua tên
lớp. Còn phương thức không có từ khóa static đặt trước nó, phương thức thuộc về
đối tượng do đó chỉ có thể gọi phương thức thông qua đối tượng.
Phương thức có thể trả về giá trị hoặc không trả về giá trị (kiểu void). Nếu
phương thức trả về giá trị trong thân phương thức phải có câu lệnh return. Cú pháp:
return(biểu thức);
1.1.4. WinForms
1.1.4.1. Giới thiệu về WinForms
a. Khái niệm WinForms
Windows Forms hay viết tắt là WinForms là thuật ngữ chỉ việc phát triển các
ứng dụng giao diện người dùng bằng cách sử dụng các thành phần xây dựng sẵn
(buil in component) còn được gọi là các điều khiển. Hay nói cách khác Windows
Forms là một API (Application Programming Interface) cho phép tạo GUI
(Graphical User Interface) cho các ứng dụng chạy trên desktop.
Các điều khiển này dùng để hiển thị thông tin cho người dùng cũng như cho
người dùng nhập thông tin vào Windows Forms ra đời đáp ứng nhu cầu tạo ứng
dụng nhanh (Rapid Application Development).
b. Lớp form
Form là thành phần cơ sở để tạo nên một ứng dụng WinForm. Một form
dùng để chứa và quản lý các điều khiển. Mỗi ứng dụng WinForm chứa ít nhất một
form.
Trong ứng dụng, muốn tạo một form có 2 lựa chọn.
Cách 1: Tạo đối tượng của lớp Form class, lớp này nằm trong namespace
System.Windows.Form.

Cách 2: Form thường được tạo ra từ giao diện đồ họa trực quan: chuột phải
lên project->Add->Windows Form
Hình 1-1-4 Cách tạo giao diện form
Mỗi Form khi tạo ra từ g iao diện trực quan trong Visual Studio gồm 3 file
* File *.Designer.cs chứa các khai báo về điều khiển, khởi tạo các điều
khiển, khởi tạo các delegate.
* File *.cs: chứa mã nguồn xử lý sự kiện của các điều khiển trên form
* File *.resx: là tài liệu XML mô tả các tài nguyên sử dụng trên form.
Bảng dưới đây liệt kê ra các phương thức, thuộc tính và sự kiện chính của
lớp Form
Thuộc tính Mô tả
Windowstate Thiết lập kích thước của form khi mở normal:khích thước đúng
bằng kích thước thiết kế. Maximized kích thước form bằng kích
thước màn hình
Text Thiết lập dòng tiêu đề trên form
Name Tên của form, nên băt đầu bằng frm
Location Lấy tọa độ góc bên trái của form
Modal Nhận giá trị true/false. Nếu nhân true form trở thành kiều
modal,có nghĩa là phải tắt form này mới thao tác được form khác.
c. Thao tác xử lý các linh kiện trên form
Trên mỗi form có nhiều điều khiển, khi người dùng tương tác với ứng dụng
sẽ phải thao tác với các điều khiển trên form.Ví dụ người dùng click lên một điều
khiển Button, nhập dữ liệu vào một TextBox…đó là các sự kiện. Một điều khiển
hỗ trợ một tập các sự kiện khác nhau. Thông thường chúng ta phải viết phương
thức, sau đó khai báo delegate, cho delegate tham chiếu đến phương thức, đăng ký
sự kiện với delegate. Visual Studio đã giúp giảm bớt công sức lập trình bằng cách
cho người dùng chọn sự kiện sau đó chỉ tập trung vào viết mã lệnh để xử lý sự
kiện đó mà không phải quan tâm đến vấn đề khai báo delegate, đăng ký sự kiện
với delegate.
Lập trình trên WinForm là lập trình hướng sự kiện. Để xử lý sự kiện cho một

điều khiển trên WinForm, đầu tiên chọn điều khiển, sau đó chọn bảng properties,
sau đó chọn event và click đúp lên sự kiện cần viết
Muốn bắt sự kiện Click Button thì chỉ việc đơn giản click đúp lên Button đó.
Còn sự kiện Form Load thì click đúp lên form
d. Điều khiển là gì
Điều khiển (Control) là một đối tượng trực quan, được đưa vào form để tạo
giao diện đồ họa cho một ứng dụng. Mục đích của điều khiển là để biểu diễn thông
tin hoặc lấy thông tin từ người dùng. Ví dụ điều khiển PictureBox cho phép hiển
thị một bức ảnh, điều khiển TextBox cho phép người dùng nhập thông tin vào.
Microsoft Visual Studio 2005 cung cấp các loại điều khiển khách nhau.
Có thể phân loại thành các nhóm như sau:
Trong phần lớn các trường hợp, muốn đưa một điều khiển lên form, chỉ việc
kéo thả điều khiển đó từ thanh công cụ ToolBox vào form, sau đó thiết lập các
thuộc tính cho điều khiển trong cửa sổ properties.
Tuy nhiên có những trường hợp chúng ta không thể thiết kế các điều khiển
bằng cách kéo thả. Ví dụ trong trường hợp bạn thiết kế form cho người chơi cờ
caro, trên form gồm có nhiều điều khiển button. Nếu chúng ta thiết kế theo kiểu
kéo thả khi đó chúng ta phải viết mã lệnh bắt sự kiện click cho tất cả các button có
trên form, điều đó sẽ không khả thi khi số lượng button trên form lớn. Trong
trường hợp đó chúng ta phải dùng mã lệnh để tạo các điều khiển và thêm các điều
khiển vào form.
Lớp Control
Control là lớp cơ sở của tất cả các điều khiển của WinForm. Lớp này nằm
trong namespace System.Windows.Forms và định nghĩa rất nhiều các thuộc tính,
phương thức và sự kiện.
Các thuộc tính, phương thức của một form có thể truy cập thông qua từ khóa
this. Từ khóa this được sử dụng để biểu diễn form hiện tại đang được active.
e. Qui tắc đặt tên các điều khiển
Để mã chương trình được thống nhất, sáng sủa và dễ dàng trong việc viết
mã, các điều khiển thường được đặt tên với các tiền tố được qui định sẵn. Bảng

dưới đây liệt kê ra qui tắc đặt tên của các điều khiển
Điều khiển Tiền tố
Toosbutton control Btn
Label Lbl
TextBox Txt
CheckBox Chk
checkedListBox Chl
DateTimePicker Dtp
ListBox Lst
MonthCalendar Cal
PictureBox Pic
RadioButton Rad
RichTextBox Rtb
TreeView Tvw
ListView Lw
Form Frm
MaskedTextBox Msktxt
DataGridView dgvw
DataView Dvw
Dialog Dlg
ProgressBar Pb
WebBrowser wbw
1.1.4.2. Các điều khiển cơ bản
a. Điều khiển Lable
Dùng để hiển thị một dòng văn bản trên form.Thuộc tính text để gán và lấy
giá trị text của label Phương show/hidden để hiện và ẩn một label
b. Điều khiển TextBox
Điều khiển TextBox dùng để hiển thị hoặc nhập dữ liệu từ người dùng
Tên thuộc tính Giải thích
Mulitiline Thiết lập textbox gồm 1 hay nhiều dòng

passwordChar Kí tự thay thế khi nhập password
ReadOnly Cho phép nhập dữ liệu vào textbox hay chỉ đọc
Sự kiện Giải thích
TextChanged Xảy ra khi dữ liệu trong textbox bị tthay đổi
Text Dùng để gán hoạc lấy giá trị tự ô TextBox
c. Điều khiển Button
Là loại điều khiển để cho người dùng tương tác với ứng dụng, khi người
dùng click lên điều khiển Button để thực hiện một hành động nào đó (ví dụ thêm
một bản ghi vào trong bảng).
- Button Control hỗ trợ sự kiện click.
- Thuộc tính Enable để bật và tắt (Enable/Disable một Button Control).
d. Điều khiển RadioButton
- Loại điều khiển cho phép chọn duy nhất một trong rất nhiều lựa chọn.
- Thuộc tính checked để kiểm tra xem radiobutton được chọn hay không.
e. Điều khiển Panel
- Dùng để nhóm các controls có liên quan với nhau, tạo thành một khối
logic.
- Thuộc tính Borderstyle thiết lập đường viền cho Panel (bình thường sẽ ko
nhìn thấy panel)
1.2.Thuật toán heuristic và bài toán xếp balo
1.2.1 Thuật toán Heuristic
1.2.1.1.Mở rộng khái niệm thuật toán: giải thuật
Trong quá trình nghiên cứu giải quyết các vấn đề - bài toán, người ta đã đưa
ra những nhận xét như sau:
• Có nhiều bài toán cho đến nay vẫn chưa tìm ra một cách giải theo kểu
thuật toán và cũng không biết là có tồn tại thuật toán hay không.
• Có nhiều bài toán đã có thuật toán nhưng không chấp nhận được vì
thời gian giải theo thuật toán đó quá lớn hoặc các điều kiện cho thuật
toán khó đáp ứng
• Có những bài toán được giải theo nhưng cách giải vi phạm thuật toán

nhưng vẫn chấp nhận được.
Từ những nhận định trên , người ta thấy rằng cần phải có những đổi mới cho
khái niệm thuật toán. Người ta đã mở rộng hai tiêu chuẩn của thuật toán: tính xác
định và tính đúng đắn. việc mở rộng tính xác định đối với thuật toán đã được thể
hiện qua các giải thuật đệ quy và ngẫu nhiên. Tính đúng của thuật toán bây giờ
không còn bắt buộc đối với một số cách giải bài toán,nhất là cách giải gần đúng.
Trong thực tiễn có nhiều trường hợp người ta phải chấp nhận các cách giải thường
có kết quả tốt (nhưng không phải lúc nào cũng tốt nhất) nhưng ít phức tạp và hiệu
qủa. Chẳng hạn nếu có một bài toán bằng thuật toán tối ưu đòi hỏi máy tính phải
thực hiện nhiều lắm thì chúng ta có thể sẵn sàng chấp nhận một giải pháp gần tối ưu
mà chỉ cần máy tính chạy trong vày ngày hoặc vài giờ.
Các cách giải pháp chấp nhận được nhưng không hoàn toán đáp ứng đầy
đủ các tiêu chuẩn các tiêu chuẩn của thuật toán thường được gọi là giải thuật. khái
niệm mở rộng này của thuật toán đã mở rộng cửa cho chúng ta trong việc tìm kiếm
phương pháp để giải quyết các bài toán được đặt ra.
Một trong những giải thuật được đề cập đến và sử dụng trong khoa học trí tuệ
nhân tạo là các cách giải theo kiểu heuristic.
1.2.1.2. Giải thuật heuristic
Thuật giải Heuristic là một sự mở rộng khái niệm thuật toán. Nó thể hiện cách
giải bài toán với các đặc tính sau :
• Thường tìm được lời giải tốt (nhưng không chắc là lời giải tốt nhất)
• Giải bài toán theo thuật giải Heuristic thường dễ dàng và nhanh chóng đưa
ra kết quả hơn so với giải thuật tối ưu, vì vậy chi phí thấp hơn.
• Thuật giải Heuristic thường thể hiện khá tự nhiên, gần gũi với cách suy
nghĩ và hành động của con người.
• Có nhiều phương pháp để xây dựng một thuật giải Heuristic, trong đó
người ta thường dựa vào một số nguyên lý cơ sở như sau:
a. Nguyên lý vét cạn thông minh :
Trong một bài toán tìm kiếm nào đó, khi không gian tìm kiếm lớn, ta thường
tìm cách giới hạn lại không gian tìm kiếm hoặc thực hiện một kiểu dò tìm đặc biệt

dựa vào đặc thù của bài toán để nhanh chóng tìm ra mục tiêu.
b. Nguyên lý tham lam (Greedy):
Lấy tiêu chuẩn tối ưu (trên phạm vi toàn cục) của bài toán để làm tiêu chuẩn
chọn lựa hành động cho phạm vi cục bộ của từng bước (hay từng giai đoạn) trong
quá trình tìm kiếm lời giải.
c. Nguyên lý thứ tự :
Thực hiện hành động dựa trên một cấu trúc thứ tự hợp lý của không gian khảo
sát nhằm nhanh chóng đạt được một lời giải tốt.
d. Hàm Heuristic:
Trong việc xây dựng các thuật giải Heuristic, người ta thường dùng các hàm
Heuristic. Ðó là các hàm đánh giá thô, giá trị của hàm phụ thuộc vào trạng thái hiện
tại của bài toán tại mỗi bước giải. Nhờ giá trị này, ta có thể chọn được cách hành
động tương đối hợp lý trong từng bước của thuật giải.
1.2.1.3. Bài toán tổ hợp tối ưu
Bài toán có dạng tổng quát như sau:
− xác định trên một tập hữu hạn các phần tử D. Hàm f(x) được gọi là hàm mục
tiêu.
− Mỗi phần tử XD có dạng X=(x
1,
x
2
x
n
) được gọi là một phương án.
Cần tìm một phương phương án X D sao cho hàm f(x) đạt Min(max). X như
thế gọi là phương án tối ưu.
Có thể tìm phương án tối ưu bằng phương pháp “vét cạn”nghĩa là xét tất cả
các phương án trong tập D (hữu hạn) để xác định phương án tốt nhất. Mặc dù D là
hữu hạn nhưng để tìm một phương án tối ưu cho một bài toán kích thước n bằng
phương pháp “vét cạn” ta có thể sẽ tốn thời giam hàm mũ. Với nhiều bài toán tối

ưu hóa, quả là quá thừa khi dùng quy hoạch động để xác định phương án tối ưu,
thay vì ta có thể dùng các thuật toán đơn giản và hiệu quả cao.
Phương pháp heuristic sẽ giải bài toán tối ưu tổ hợp mà thời gian có thể chấp
nhận được, tuy nhiên có thể chỉ đạt được phương án tốt chứ không phải là tối ưu. Vì
với cách này thì có thể ở bước cuối cùng ta không còn gì để chọn mà phải chấp
nhận một giá trị cuối cùng còn lại.
1.2.1.4. Nội dung
Khác với quy hoạch động, thường giải quyết các bài toán con từ dưới lên trên,
chiến lược tham lam giống với phương pháp chia để trị ,thường là tiến triển theo
cách từ trên xuống(TopDown), phương pháp X được xây dựng bằng cách lựa chọn
từng thành phần x
i
của X cho đến khi hoàn chỉnh (đủ n thành phần). Với mỗi x
i
ta
sẽ chọn một x
i
tối ưu. Với cách này thì có thể xảy ra ở bước cuối cùng khi ta không
còn gì để chọn mà phải chấp nhận một giá trị cuối còn lại tối ưu hoặc không tối ưu.
Lược đồ của phương pháp heuristic:
Void heuristic(A,X);
{xây dựng phương án X từ các cặp đối tượng A}
{
X=Ф;
while A<> Ф do
{
X=Select (A);{hàm lựa chọn X tốt nhất trong A}
A=A-{x};
if X {x} chấp nhận được
{

×