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

Tìm hiểu file trên windows ứng dụng thuật toán đối sánh mẫu

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 (755.74 KB, 45 trang )

Trờng đại học vinh

Khoa công nghệ thông tin
===== =====

tìm kiếm file trên windows ứng dụng
thuật toán đối sánh mẫu

Đồ án Tốt nghiệp đại học
Ngành kỹ s công nghệ thông tin

Cán bộ hớng dẫn: Ths. Trần Văn Cảnh
Sinh viên thực hiện: Hoàng Đức Toàn
Lớp 45K - Công nghệ thông tin

VINH - 2009

Mục lục

Trang

Lời cảm ơn

1

Lời nói đầu

2

Chơng 1: Giới thiệu .


3

1


1.1. Bài toán tìm kiếm file trên windows

3

1.2. Một số công cụ tìm kiếm ...

5

1.3. Đánh giá các công cụ tìm kiếm .

7

1.4. Lý do chọn đề tài

11

Chơng 2: Các thuật toán sử dụng trong chơng trình

12

2.1. Thuật toán tính độ lớn dãy con chung dài nhất giữa hai xâu


12


2.2. Thuật toán tìm chuỗi con chung dài nhất giữa hai xâu

13

2.3. Thuật toán đánh giá độ tơng tự tựa ngữ nghĩa giữa hai xâu .

16

Chơng 3: Cài đặt ..

19

3.1. Lựa chọn ngôn ngữ .

19

3.2. Cài đặt chơng
trình .......................................................................

23

3.2.1. Cài đặt các lớp và lập trình thuật
toán .....................................

23

3.2.2. Thiết kế và xây dựng các form của chơng trình

31


3.3. Chạy thử và kiểm tra ..

32

3.4. Các giao diện trong chơng trình ...

39

Chơng 4: Nhân xét và đánh giá sản phẩm
.

44

4.1. Một số kết quả đạt đợc ................................................................

44

4.2. Hớng phát triển

44

Kết
luận ...................................................................................................

45

Tài liệu tham
khảo ..................................................................................

46


Lời cảm ơn

2


Đầu tiên em xin chân thành cảm ơn các Thầy Cô Khoa Công Nghệ
Thông Tin đã hớng dẫn và giảng dạy rất nhiệt tình trong suốt năm năm học ở
Trờng Đại Học Vinh. Những kiến thức mà chúng em học đợc trên giảng đờng
sẽ là hành trang quý báu trên bớc đờng đời sau này.
Để tìm hiểu, xây dựng và hoàn thành đợc đồ án này em xin cảm ơn tới
thầy giáo Thạc sỹ Trần Văn Cảnh - Giảng viên khoa CNTT Trờng Đại Học
Vinh đã tận tình hớng dẫn và giúp đỡ em trong quá trình thực hiện.
Em cũng xin bày tỏ lòng biết ơn tới gia đình và bạn bè đã tạo điều kiện,
giúp đỡ cho em trong suốt thời gian học tập, nghiên cứu để có đợc những
thành quả nh ngày hôm nay. Với kiến thức còn phần nào hạn chế của mình, hi
vọng sẽ nhận đợc những ý kiến đóng góp quý báu từ thầy cô, gia đình và bạn
bè để em ngày một tiến bộ hơn.
Vinh, 05/2009
Sinh viên thực hiện
Hoàng Đức Toàn

3


LờI NóI ĐầU
Công nghệ thông tin đang phát triển không ngừng, chúng ta đang sống
trong một thế giới mà ở đó máy vi tính, mạng internet và các thiết bị kỹ thuật
số luôn hiện hữu ở tất cả mọi góc độ, lĩnh vực của cuộc sống hiện đại. Một nhu
cầu thực tế trong xu thế hội nhập ngày nay đang đòi hỏi là trao đổi thông tin,

kết nối thông tin, tìm kiếm các thông tin một cách nhanh nhất, chính xác nhất
và đáng tin cậy nhât. Và dĩ nhiên các phần mềm đợc lập ra nhằm thực hiện
công việc đó. Đối với các phần mềm trớc đây thờng thiên hớng cho việc lập
trình ứng dụng cho một số ngời, thì ngày nay xu thế phát triển của nghành
công nghệ phần mềm là phải làm sao tạo ra đợc các sản phẩm có thể ứng dụng
cho nhiều ngời để tìm kiếm thông tin một cách chính xác và nhanh nhất.
Nắm bắt đợc xu thế đó, hàng loạt các ngôn ngữ lập trình ra đời và ngày
càng hoàn thiện. Trong đó phải kể đến hai ngôn ngữ lập trình .NET và JAVA
đang là sự lựa chọn hàng đầu của các lập trình viên. Đây là hai công cụ để lập
trình nó phụ thuộc vào kiến thức và sở thích của từng ngời mà ứng dụng. Điều
quan trọng ở đây em tìm hiểu nghiên cứu C# (Thuộc Visual Studio .NET
2005) để có thể triển khai các ứng dụng trên Windows. Những phần mềm đợc
viết dựa trên nền tảng C# sẽ có đợc khả năng thao tác, tích hợp về ứng dụng
tốt.
Đối với một ngôn ngữ lập trình thì khả năng áp dụng tạo ra những phần
mềm có tính ứng dụng cao là rất lớn, song với khuôn khổ và mục đích nghiên
cứu công nghệ, trong đồ án này em chỉ triển khai xây dựng ứng dụng Tìm
kiếm file trên windows ứng dụng thuật toán đối sánh mẫu để thể hiện
khả năng hớng đối tợng, lập trình trực quan của C#. Khi đã hiểu rõ bản chất và
tính u việt của C# thì khả năng phát triển các ứng dụng của nó trong các bài
toán lớn sẽ đạt đợc những thành công.

Chơng 1. Giới thiệu
1.1. Bài toán tìm kiếm file trên windows
Dữ liệu trong máy tính đợc lu trữ dới rất nhiều dạng khác nhau, nhng sử
dụng chuỗi vẫn là một trong những cách rất phổ biến. Trên chuỗi các đơn vị dữ
liệu không có ý nghĩa quan trọng bằng cách sắp xếp của chúng. Nhiều lúc ngời
sử dụng không để ý tới việc lu trữ các file dữ liệu thế nào mà hay lu trữ một

4



cách theo cảm tính. Ta có thể thấy các dạng khác nhau của chuỗi nh ở các file
dữ liệu, hay chính văn bản chúng ta đang đọc.
Một phép toán cơ bản trên chuỗi là đối sánh mẫu (pattern matching), bài
toán yêu cầu ta tìm ra một hoặc nhiều vị trí xuất hiện của mẫu trên một văn
bản.. Trong đó mẫu và văn bản là các chuỗi có độ dài N và M (M # N), tập các
ký tự đợc dùng gọi là bảng chữ cái khác, có số lợng là d.
Đối sánh mẫu là bài toán tìm sự xuất hiện của một mẫu với một số đặc
tính nào đó trong chuỗi các ký hiệu cho trớc. Khái niệm chuỗi ở đây khá
rộng, có thể là chuỗi văn bản gồm một dãy các chữ, số và kí tự đặc biệt, có thể
là chuỗi nhị phân,... Dạng đơn giản nhất của bài toán đối sánh mẫu là tìm sự
xuất hiện một xâu cho trớc trong một chuỗi (còn gọi là xâu đích). Tìm độ lớn
dãy con chung dài nhất giữa hai xâu ký tự, tìm chuỗi con chung dài nhất giữa
hai xâu ký tự, đánh giá độ tơng tự tựa ngữ nghĩa giữa hai câu văn.
Các phơng pháp đối sánh




Dựa trên đặc tính mẫu: Tìm kiếm đơn mẫu, tìm kiếm đa mẫu
Dựa trên kết quả trả về: Tìm kiếm chính xác, tìm kiếm xấp xỉ

Độ tơng tự giữa hai xâu văn bản
Một cách tơng đối có thể hiểu độ tơng tự là mức độ giống nhau giữa hai
xâu kí tự. (Xét theo quan điểm thống kê mức độ giống nhau giữa hai xâu sẽ
phản ánh mức độ tơng tự về ngữ nghĩa).
Một phơng thức trong phép đối sánh mẫu là tìm kiếm xấp xỉ (approximate
search) hay tìm kiếm mờ (fuzzy search). So mẫu xấp xỉ cho phép tìm kiếm
những thông tin gần giống. Hớng tiếp cận này trong bài toán tìm kiếm mang

lại kết quả mềm dẻo hơn, do đó đáp ứng đợc yêu cầu thực tế tốt hơn. Vấn đề
tìm kiếm xấp xỉ đặt ra trong nhiều ứng dụng khoa học kĩ thuật khác: nhận
dạng chữ viết, nhận dạng ảnh, đồ thị, so sánh xấp xỉ trong các xâu có độ dài
không cố định,....và đặc biệt phổ biến trong các hệ thống trích rút văn bản. Tìm
kiếm xấp xỉ là tìm sự xuất hiện của mẫu trong văn bản, trong đó cả văn bản và
mẫu đều có thể có lỗi. Đây là các lỗi có thể nhận ra bằng mắt thờng,
không xét về khía cạnh ngữ nghĩa (OCRoptical character recognition errors),
do một số kí tự nhất định bị chèn thêm hoặc bị xóa hoặc bị thay thế, chẳng hạn
Việt Nam và Việt Nan hay Việtt Nan,... Những lỗi này do nhiều nguyên
nhân khác nhau, có thể kể ra nh:

5


- Câu truy vấn sai chính tả, xâu tìm kiếm không đúng cú pháp so với văn
bản
- Lỗi in ấn, lỗi chính tả, sử dụng dấu chấm câu sai,...
- Do sự biến đổi hình thái từ trong một số ngôn ngữ
- Dữ liệu đa vào cơ sở dữ liệu không chính xác, thờng xảy ra với tên ngời,
địa chỉ,...
- Thông tin ngời tìm đa vào không chính xác, chỉ đại loại
Có nhiều mô hình lỗi đợc đa ra, nhng phổ biến nhất và là cơ sở cho rất
nhiều mô hình lỗi khác là chuỗi con (hay xâu con) chung dài nhất, dãy con
chung dài nhất. Độ đo lỗi này phản ánh độ tơng tự giữa hai xâu, làm cơ sở
để cài đặt tính năng tìm kiếm xấp xỉ trong cơ sở dữ liệu và trong các hệ thống
tìm kiếm file trong Windows. Vì vậy bài toán đợc giải quyết ở đây là: Cho xâu
nguồn (hay xâu mẫu) P độ dài m (P1P2.Pm) và xâu đích S độ dài n (S1S2
Sn) trên cùng bảng chữ A. Tính độ lớn dãy con chung dài nhất, tìm chuỗi con
chung dài nhất giữa hai xâu P và S, xác định độ tơng tự giữa hai xâu P và S.
Độ tựa ngữ nghĩa ở đây đợc hiểu là giá trị thực nằm trong khoảng [0,1]

thoả mãn:
- Độ tựa ngữ nghĩa càng lớn nếu số chuỗi con của P xuất hiện trong S
càng nhiều
- Độ tựa ngữ nghĩa bằng 1 nếu xâu P xuất hiện trong S
- Độ tựa ngữ nghĩa bằng 0 nếu không có một phần nào đó của P xuất hiện
trong S.
Lu ý rằng, trờng hợp S là một dòng dữ liệu văn bản (trong các máy tìm
kiếm file của hệ thống, tìm kiếm web,...), xâu mẫu P thờng ngắn còn xâu đích
S dài hơn rất nhiều so với P nên để phản ánh ngữ nghĩa đợc tốt cần phải tách
đoạn dòng dữ liệu S và so sánh từng đoạn với P (chẳng hạn, việc ngắt câu có
thể xem là một cách tách đoạn). Khi đó độ tơng tự sẽ đợc tổng hợp từ các kết
quả so sánh P và các khúc của S.
Để giải bài toán xác định độ tơng tự giữa hai xâu, ở đây sẽ sử dụng hai độ
đo. Một là độ tơng tự dựa vào độ dài chuỗi con chung dài nhất. Mặc dù đây là
mô hình lỗi kinh điển song với cách tiếp cận otomat mờ sẽ đem lại một thuật
toán nhanh, đặc biệt hiệu quả khi cần so mẫu P với rất nhiều xâu S. Hai là độ
gần tựa ngữ nghĩa dựa trên sự thống kê mật độ xuất hiện các chuỗi con của P
trong S. Độ đo này sẽ phản ánh đợc độ tơng tự về ngữ nghĩa giữa hai xâu.
1.2. Một số công cụ tìm kiếm

6


Hiện nay trên mạng Internet có rất nhiều công cụ tìm kiếm hữu ích cho
ngời sử dụng. Bao gồm các công cụ tìm kiếm đa chức năng và các công cụ tìm
kiếm theo từng lĩnh vực riêng biệt. Các công cụ đó cho phép ngời dùng có thể
tìm kiếm một cụm từ, đề tài, bài viết, các file, các trang web, hay dữ liệu. Cụ
thể: Google.com, Socbay.com, Xalo.com, Yahoo.com, Nhacso.net,

Hình 1.1. Tìm kiếm socbay.com


Ngoài ra còn có những chức năng tìm kiếm nh: chức năng tìm kiếm
Search trong Windows, chức năng tìm kiếm Find trong Microsoft Word,

Hình 1.2. Tìm kiếm của office

7


Hình 1.3. Tìm kiếm search của Windows

1.3. Đánh giá các công cụ tìm kiếm
Công cụ tìm kiếm Search của hệ điều hành windows XP cho phép tìm
kiếm các từ khoá trong một file, một th mục hay trong tất cả các ổ đĩa của máy
tính.
Một số kiểu lu trữ tên tập tin trong Windows ngời sử dụng hay dùng:
daihocvinh; dai hoc vinh; dhvinh;
Với cách đặt tên nh vậy thì rất khó để có thể tìm kiếm đợc kết quả cho
phần mềm Tìm Kiếm Search của hệ điều hành windows XP.
Đặc biệt với file: dai hoc vinh.txt mà ngời quản lý lại nghĩ rằng file là :
daihocvinh thì với phần mềm search của windows không thể nào tìm thấy

8


H×nh 1.4. T×m víi windows

Tån t¹i mét sè vÊn ®Ò n÷a vÒ c¸c c«ng cô t×m kiÕm hiÖn nay: vÝ dô vÒ
c«ng cô t×m kiÕm cña trang web ‘’.


9


Hình 1.5. Tìm kiếm trên nhacso.net

Khi thực hiện tìm kiếm trên trang web này do ngữ nghĩa câu văn của tiếng
Việt khác so với tiếng Anh nên kết quả tìm kiếm là khác nhau cho những cách
trình bày khác nhau.
Công cụ tìm kiếm Find của phần mềm Microsoft Word: công cụ này chỉ
cho phép tìm kiếm cụm từ nội bên trong một văn bản
Công cụ tìm kiếm Google hỗ trợ tìm kiếm theo chỉ mục. Nhng khi ta tìm
kiếm với một từ khoá thì nó liệt kê ra tất cả các trang có nội dung không đúng
nghĩa với ý nghĩa từ khoá cần tìm

10


Hình 1.6. Công cụ tìm kiếm Google

1.4. Lý do chọn đề tài
Vấn đề đặt ra là cần có một công cụ hữu ích cho việc tìm kiếm các file lu
trữ bằng tiếng Việt một cách nhanh nhất và hiệu quả hơn.
Nắm bắt đợc các yêu cầu đó thì phần mềm Tìm kiếm file trên
Windows ứng dụng thuật toán đối sánh mẫu đợc xây dựng.

11


Phần mềm này xây dựng cho phép tìm kiếm theo độ xấp xỉ khác nhau do
đó kết quả tìm đợc khác nhau. Ngoài ra nó có thể cho phép tìm kiếm chính xác

các từ khoá khi ngời sử dụng nhập vào.
Các chức năng chính của chơng trình
- Chức năng tìm kiếm chính xác
- Chức năng tìm kiếm xấp xỉ
- Chức năng lu kết quả
- Chức năng sắp xếp kết quả TK
- Chức năng thực thi chơng trình ngay trên kết quả tìm kiếm

Chơng 2. Các thuật toán trong chơng trình
2.1. Thuật toán tính độ lớn dãy con chung dài nhất
Bài toán :
Cho xâu mẫu P độ dài m, P=P 1P2Pm và xâu S độ dài n, S=S1S2Sn trên
cùng một bảng chữ A. Tính độ lớn dãy con dài nhất của P và S. Độ lớn nhất
dãy con chung của P, S ký hiệu là Ld (P,S)
Có thể hiểu đơn giản là bài toán tìm số lợng lớn nhất các kí tự chung giữa
2 xâu mà đảm bảo thứ tự xuất hiện.
Thuật toán
Procedure Ld(string s, string p)
Var i, j, ketqua, m, n : integer;
Begin
Ketqua := 0;
m = length(p);

12


n = length(s);
For i := 1 to n do
If s[i] không thuộc Ap then bỏ qua
Else

if tồn tại 1<= j <= m thoả mãn s[i] = p[j]
and M[j] = M[j+1] = = M[m] = 0 then
M[j] = 1;
Else if tồn tại j < k # m thỏa mãn M[k] = 1
Begin
M[j] = 1;
M[k] = 0;
End;
for i := 1 to n do
if M[i] = 1 then ketqua := ketqua + 1;
End;
Hình 2.1. Thuật toán tính độ lớn dãy con chung dài nhất

Ví dụ: Với 2 xâu daihocvinh và dai hoc vinh
Chơng trình sẽ thực hiện thuật toán một để tìm độ lớn xâu con chung dài
nhất, kết quả sẽ là:

Hình 2.2. Mô phỏng thuật toán tìm độ lớn xâu con chung dài nhất

2.2. Thuật toán tìm kiếm dãy con chung dài nhất giữa hai xâu ký tự
Bài toán:

13


Cho xâu mẫu P độ dài m: P = P 1...Pm; và xâu S độ dài n: S = S 1...Sn trên
cùng bảng chữ A. Tìm khúc con chung lớn nhất của P và S. Khúc con chung
dài nhất của P, S đợc kí hiệu là Lk(S, P).
Ví dụ: với P = khoa tin truong dai hoc VINH
S = Đai hoc Vinh

Nếu bỏ qua các kí tự viết hoa, nói cách khác là không phân biệt chữ hoa
chữ thờng thì Lk(P, S) = dai hoc vinh.

Thuật toán
Procedure Lk(string s, string p)
Begin
(f, d) : = 0; f_max : = 0; LenMax : = 0; LF_P : = 0;
For j : = 1 to n do
Begin
(f,d) : = TFuzz((f, d), Sj)
If f > f_max then f_max : = f
Else
If LenMax < f_max then
Begin
LenMax : = f_max;
LF_P : = d;
LF_S : = j - 1;
End;
f_max : = f;
End;
End;
End.
Hình 2.3. Thuật toán tìm xâu con chung dài nhất

14


Ví dụ: Với 2 xâu daihocvinh và dai hoc vinh
Chơng trình sẽ thực hiện thuật toán hai để tìm xâu con chung dài nhất, kết
quả sẽ là:


Hình 2.4. Mô phỏng thuật toán tìm kiếm xâu con chung dài nhất

15


2.3. Thuật toán đánh giá độ tơng tự ngữ nghĩa giữa hai câu văn
Xét ví dụ sau:
Câu 1: Ngày hôm nay cơn bão số 5 đã mạnh lên cấp 8.
Câu 2: Cơn bão số 5 đổ bộ vào Quảng Trị, dự báo cơn bão sẽ tiếp tục
mạnh lên.
Câu 3: Sức gió của cơn bão số 5 đã mạnh tới cấp 8
Câu 4: Cơn bão số 5 đổ bộ vào Quảng Trị, sức gió đã mạnh lên cấp 8.
Một cách tơng đối có thể thấy theo khía cạnh tựa ngữ nghĩa câu 3 gần
nghĩa với câu 1 hơn câu 2 và câu 4 gần tựa ngữ nghĩa với câu 1 hơn câu 2,
câu 3
Có thể xây dựng một hàm f(c1, c2) để đánh giá mức độ tựa ngữ nghĩa
giữa hai câu trong tiếng Việt. Nh trong ví dụ trên thì
f(c1,c2) < f(c1,c3) < f(c1,c4)
Thử nghiệm:
L1
1 + L1(L1-1)
f(c1, c2) = x
Lc(1,2)
DLC + 1 + L1(l1-1)
Trong đó L1: số từ câu 1.
Lc(1, 2): độ dài dãy từ chung giữa 2 câu.
DLC : là tổng độ lệch giữa các từ chung của 2 câu.

16



Thuật toán
Procedure TuaNguNghia(câu1 string, câu 2 string, a real)
Var i, j : integer;
m, n, TDL, SoTuChung: integer;
LuuDoLech: array[0..100 ] of integer;
f: Real;
Begin
a := 0;
f := 0;
m := sotu(cau1);//m là số từ câu 1.
n := sotu(cau2);//n là số từ câu 2.
TDL := 0;
SoTuChung := 0;
For i:=1 to m do
For j:=1 to n do
If (M1[i] = M2[j]) va (M[i] cha bị đánh dấu) then
Begin
LuuDoLech[i] := d(i, j);
Đánh dấu M1[i] và M2[j];
End;
For i:=1 to n do
If LuuDoLech[i] <> 0 then
Begin
TDL := TDL + LuuDoLech[i];
SoTuChung = SoTuChung + 1;
End;

f := -a * TDL / (P * (P + 1)) + SoTuChung / n;

End.
Hình 2.5. Thuật toán tính độ tơng tự

17


áp dụng thuật toán ta thu đợc:
f(câu1, câu2) = 0,44039
f(câu1, câu3) = 0,55765
f(câu1, câu4) = 0,62343
Theo ví dụ trên thì mức độ gần (theo ngữ nghĩa trong thực tế) giữa (câu
2, câu 1) nhỏ hơn (câu 3, câu 1) khi áp dụng thuật toán trên đợc:
f(câu 1, câu 2) = 0,44039 < 0,55765 = f(câu 1, câu 3). Tơng tự mức độ
gần giữa (câu 3 , câu 1) cũng nhỏ hơn (câu 4, câu 1) cũng có mức độ gần nhỏ
hơn (câu 4, câu 1) khi áp dụng ta cũng thu đợc f(câu 1, câu 3) = 0,55765 <
0,62343 = f(câu 1, câu 4).
Ví dụ: Với 2 xâu daihocvinh và dai hoc vinh
Chơng trình sẽ thực hiện thuật toán ba để để tính độ tơng tự giữa hai xâu,
kết quả sẽ là:

Hình 2.6. Mô phỏng thuật toán độ xấp xỉ cuả hai xâu

Chơng 3. Cài đặt
3.1. Lựa chọn ngôn ngữ

18


Hiện nay có rất nhiều ngôn ngữ lập trình có thể giúp ngời phát triển phần
mềm tạo ra các ứng dụng của mình một cách tốt nhất. Đặc biệt là các ngôn

ngữ lập trình bậc cao nó hỗ trợ các công cụ, chức năng và giao diện tốt dễ sử
dụng. Ngôn ngữ lập trình C# cũng là một trong những nhân tố đó. Sở dĩ em
chọn C# để thiết kế chơng trình này vì C# là ngôn ngữ có những u điểm đó là
ngôn ngữ đơn giản, hiện đại, hớng đối tợng, hớng modul. Bên cạnh đó nó còn
là ngôn ngữ mạnh mẽ và mềm dẻo, có ít từ khoá và dễ sử dụng. ở đây ngôn
ngữ C# sử dụng để khai thác các đối tợng cụ thể, có thể định nghĩa cho từng
lớp riêng biệt. Trong chơng trình này thì C# đợc dùng để định nghĩa các lớp
riêng biệt nh lớp Tìm Kiếm, Độ xấp xỉ,.....
Các thành phần trong C# đều là đối tợng.
Tất cả các phơng thức và sự kiện trong C# đợc chứa trong khai báo: cấu
trúc (struct) hoặc lớp (class).
Ngôn ngữ C# sử dụng khoảng 80 từ khoá và một số kiểu dữ liệu đợc dựng
sẵn.
Dựa trên nền tảng của C, C++ và Java.
Có những đặc tính : Thu gom bộ nhớ tự động, các kiểu dữ liệu mở rộng,
bảo mật mã nguồn
Tóm lại những nét u điểm của C# có thể đợc tổng hợp nh sau :
- C# là ngôn ngữ đơn giản
C# loại bỏ một vài sự phức tạp 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.
Chúng là nguyên nhân gây nên sự nhầm lẫn hay dẫn đến những vấn đề cho ngời phát triển C++. Nếu chúng ta là ngời học ngôn ngữ này đầu tiên thì chắc chắn
là sẽ không trải qua những thời gian để học nó, nhng khi đó ta sẽ không biết đợc hiệu quả của ngôn ngữ C# khi loại bỏ những vấn đề trên.
Ngôn ngữ C# đơn giản vì nó dựa trên nền tảng C và C ++. Nếu chúng ta
thân thiện với C và C++ hoặc thậm chí là Java, chúng ta sẽ thấy C# khá giống
về diện mạo, cú pháp, biểu thức, toán tử, nhng nó đã đợc cải tiến làm cho ngôn
ngữ đơn giản hơn. Một vài trong các sự cải tiến là loại bỏ các d thừa, hay là
thêm vào những cú pháp thay đổi. Ví dụ nh, trong C++ có ba toán tử làm việc
với các thành viên là ::, . , và ->. Để biết khi nào dùng ba toán tử này cũng
phức tạp và dễ nhầm lẫn. Trong C#, chúng đợc thay thế với một toán tử duy
nhất gọi là . (dot). Đối với ngời mới học thì điều này và những việc cải tiến

khác làm bớt nhầm lẫn và đơn giản hơn.

19


- C# là ngôn ngữ hiện đại
Những đặc tính nh là xử lý ngoại lệ, thu gom bộ nhớ tự động, những kiểu
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# 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 là sự đóng gói, sự kế
thừa, và đa hình. C# hỗ trợ tất cả những đặc tính trên.
- C# là ngôn ngữ mạnh mẽ và cũng mềm dẻo
Nh đã đề cập trớc, với ngôn ngữ C# chúng ta chỉ bị giới hạn bởi bản thân
hay là trí tởng tợng của chúng ta. Ngôn ngữ này không đặt những 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 đồ hoạ, 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# là ngôn ngữ ít từ khoá
C# là ngôn ngữ sử dụng chỉ khoảng 80 từ khoá và hơn mời kiểu dữ liệu đợc xây dựng sẵn. Phần lớn các từ khoá đợc sử dụng để mô tả thông tin. Chúng
ta có thể nghĩ rằng một ngôn ngữ có nhiều từ khoá thì sẽ mạnh hơn. Điều này
không phải sự thật, ít nhất là trong trờng hợp ngôn ngữ C#, chúng ta có thể tìm
thấy rằng ngôn ngữ này có thể đợc sử dụng để làm bất cứ nhiệm vụ nào.
- C# là ngôn ngữ hớng module
Mã nguồn C# có thể đợc viết trong những phần đợc gọi là lớp, những lớp
này chứa các phơng thức thành viên của nó. Những lớp và những phơng thức
có thể đợc sử dụng lại trong ứng dụng hay các chơng trình khác. Bằng cách
truyền các mẫu thông tin đến lớp hay phơng thức chúng ta có thể tạo ra những
mã nguồn dùng lại có hiệu quả.
C# là một trong rất nhiều ngôn ngữ lập trình đợc hỗ trợ bởi .NET

Framework (nh C++, Java,VB). Có thể hiểu đơn giản đây là một trung tâm
biên dịch trong đó tất cả các ngôn ngữ đợc hỗ trợ bởi .NET Framework sẽ đợc
chuyển đổi ra MSIL (một dạng mã trung gian) rồi từ đấy mới đợc biên dịch tức
thời (Just in time Compiler JIT Compiler) thành các file thực thi nh exe.
Một thành tố quan trong nữa trong kiến trúc .NET Framework chính là CLR
(.NET Common Language Runtime), khối chức năng cung cấp tất cả các dịch
vụ mà chơng trình cần giao tiếp với phần cứng, với hệ điều hành.
Có thể sử dụng Visual Studio 2003, 2005 hoặc 2008 phiên bản Express
Editions do Microsoft cung cấp hoàn toàn miễn phí.

20


Hình 3.1. Môi trờng lập trình C#

3.2. Cài đặt chơng trình
3.2.1. Cài đặt các lớp và lập trình thuật toán
- Lớp tìm kiếm

21


class LopTK
{
public string p, s; //p là xâu mẫu, s xâu đích
public int dp, ds, da; //dp,ds lần lượt là độ dài xâu p,s
public int[] A = new int[10000];
public int[] TTLeft, TTright;
public int[] Danhdau;
public int[] Q;

public int Contro;
bool OK;
public int luuthaydoi;
public LopTK(string pa, string sa)
{
p = ' ' + pa.ToLower();
dp = p.Length;
s = ' ' + sa.ToLower();
ds = s.Length;
da = 0;
TTLeft = new int[dp];
TTright = new int[dp];
Q = new int[dp];
Danhdau = new int[dp];
for (int i = 1; i < dp; ++i)
Danhdau[i] = 0;
Contro = 0;
OK = false;
luuthaydoi = 1;
}
public void xay_dung_A()
{
for (int i = 1; i < dp; ++i)
{
int j = Convert.ToInt32(p[i]);
if (A[j] == 0)
{
da = da + 1;
A[j] = i;
TTLeft[i] = i;


22


int dem = i;
for (int k = i; k < dp; ++k)
if (p[k] == p[i])
{
TTright[dem] = k;
TTLeft[k] = dem;
dem = k;
}
TTright[dem] = dem;
}
}
}
public void davao(char a)
{
int i = A[Convert.ToInt32(a)];
luuthaydoi = 0;
if (Contro == 0)
{
Contro = 1;
Q[Contro] = i;
Danhdau[i] = 1;
}
else
{
while (TTright[i] >= i)
{

OK = false;
for (int j = 1; j <= Contro; ++j)
if (Q[j] > i)
if (i >= luuthaydoi)
if (Danhdau[i] == 0)
{
luuthaydoi = Q[j];
Danhdau[Q[j]] = 0;
Q[j] = i;
Danhdau[i] = 1;
OK = true;
break;
}

23


if (OK == false & i > Q[Contro])
if (Danhdau[i] == 0)
{
Contro = Contro + 1;
Q[Contro] = i;
Danhdau[i] = 1;
break;
}
if (i == TTright[i]) break;
i = TTright[i];
}
}
}

public void main()
{
xay_dung_A();
for (int j = 1; j < ds; ++j)
if (A[Convert.ToInt32(s[j])] > 0)
{
davao(s[j]);
}
}
}

H×nh 3.2. Code líp t×m kiÕm

- ThuËt to¸n t×m ®é lín x©u con chung dµi nhÊt
private void btnTT1_Click(object sender, EventArgs e)
{
//Thuat toan tim cac xau con chung o day
string xau1 = "";

24


string xau2 = "";
int i = 0;
int j = 0;
xau1 = txtXau1.Text + " ";
xau2 = txtXau2.Text + " ";
//MessageBox.Show(xau1);
//MessageBox.Show(xau2);
//this.Close();

int n = 0;
int m = 0;
n = txtXau1.Text.Length + 1;
m = txtXau2.Text.Length + 1;
int max = 0;
string kq = "";
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
if ((xau1[i] == xau2[j]))
{
int l = i;
int k = j;
string tg = "";
int dem = 0;
while ((xau1[l] == xau2[k]) && ((l + 1) < n) &&
((k + 1) < m))
{
//if (txtXau1.Text[l + 1] == txtXau2.Text[k +
1])
{
tg += xau1[l];
dem++;
}
l++;
k++;
}
if (max < dem)
{


25


×