You are on page 1of 81

B¸o c¸o thùc tËp tèt nghiÖp

LỜI GIỚI THIỆU


Với sự phát triển nhảy vọt của khoa học công nghệ nói chung của ngành tin học
nói riêng. Với những tính năng ưu việt, sự tiện dụng và được ứng dụng rộng rãi, tin học
ngày nay là một phần không thể thiếu được của nhiều ngành trong công cuộc xây dựng
và phát triển xã hội. Hơn thế nữa nó còn đi sâu đời sống của con người.
Tin học đã thâm nhập khá mạnh mẽ vào Việt Nam. Nhiều lĩnh vực hoạt động từ lĩnh
vực quản lý hành chính, quản lý kinh tế, tự động hóa công nghiệp ... đến các lĩnh vực giáo
dục và đào tạo đều có thay đổi đáng kể nhờ ứng dụng tin học. Máy tính là công cụ cần thiết
đối với con người trong thời đại ngày nay. Hoạt động của một máy tính là xử lý các thông tin
đưa vào theo một chương trình đã được lập sẵn nhằm đưa ra kết quả phục vụ yêu cầu nào đó
của người sử dụng. Việc xây dựng các chương trình cho máy tính là hết sức cần thiết bởi vì
các chương trình là linh hồn của máy tính. Trong xây dựng chương trình để có một chương
trình có hiệu quả cần phải có chuyên gia phân tích bài toán đưa ra sơ đồ thuật toán và từ đó
các lập trình viên tiến hành sinh mã nguồn cho chương trình. Vấn đề đặt ra liệu có thể xây
dựng một phần mềm hỗ trợ người lập trình xây dựng sơ đồ thuật toán hay không? Với mong
muốn đó... em lựa chọn đề tài: “Xây dựng công cụ tạo sơ đồ khối”
Trong quá trình tìm hiểu và hoàn thiện luận văn tốt nghiệp, em xin chân thành cảm
ơn các thầy cô giáo trong khoa Công nghệ thông tin - Trường đại học Bách khoa Hà Nội đã
giúp đỡ và trang bị kiến thức cho em trong suốt thời gian học ở trường. Đặc biệt, em xin
chân thành cảm ơn sự chỉ dẫn tận tình hướng dẫn của thầy giáo Phạm Đức Khánh trong thời
gian em làm luận án tốt nghiệp. Và cuối cùng em xin chân thành cảm ơn gia đình, bạn bè và
những người xung quanh đã động viên, tạo điều kiện và giúp đỡ em. Do thời gian eo hẹp và
khả năng có hạn nên luận văn không tránh khỏi những thiếu sót. Kính mong nhận được ý
kiến đóng góp, phê bình của quý thầy cô và các bạn để luận văn được hoàn thiện hơn.
Em xin ch©n thành cảm ơn !

Hải Phòng, ngày 30 tháng 06 năm 2006


NGƯỜI THỰC HIỆN

Trương Viết Thiện

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 1


B¸o c¸o thùc tËp tèt nghiÖp

Chương I: MỤC ĐÍCH YÊU CẦU CỦA BÀI TOÁN


1. Mục đích:
Trong xây dựng để có một ngôi nhà chắc chắn cần phải có bản thiết
kế chính xác, rõ ràng. Điều này có thể thực hiện thông qua bộ công cụ hỗ trợ
vẽ thiết kế AutoCad. Trong lập trình để có một chương trình đúng với yêu cầu
cần phải có một sơ đồ thuật toán chính xác, rõ ràng. Và mục đích của đề tài
này là xây dựng phần mềm hỗ trợ người lập trình xây dựng sơ đồ thuật toán.
Kết quả của đề tài này là một sản phẩm phần mềm trong đó có đầy đủ
các đối tượng hỗ trợ vẽ sơ đồ khối và có các tính năng cho phép người sử
dụng tạo lập sơ đồ khối một cách thuận tiện, đơn giản, chính xác và rõ ràng.
2. Yêu cầu:
- Để xây dựng được sơ đồ thuật toán chính xác, rõ ràng trước hết phải
tìm hiểu lý thuyết:
+ Thế nào là thuật toán?
+ Có những cách biểu diễn thuật toán nào?
+ Ưu nhược điểm của các cách biểu diễn
- Sau khi tìm hiểu lý thuyết cần phải xác định rõ phương pháp biểu
diễn bài toán bằng sơ đồ khối có ưu điểm gì hơn so với các phương pháp
khác. Từ đó chi tiết hóa các khối gồm những thành phần gì? Cách liên kết các
khối như thế nào? Tình tự thực hiện của sơ đồ ra sao….
- Từ những lý thuyết tìm hiểu ở trên xác định phương pháp xây dựng
công cụ hỗ trợ người lập trình tạo sơ đồ khối.
- Có thể có nhiều ngôn ngữ lập trình có thể giải quyết được bài toán
này chẳng hạn như: Turbo Pascal, Turbo C, Visual Basic, … Mỗi ngôn ngữ
đều có ưu nhược điểm vì vậy cần tìm hiểu kỹ để tìm ra ngôn ngữ thích hợp
thể hiện bài toán.
- Sau khi tìm hiểu ngôn ngữ và xác định phương pháp xây dựng tiến
hành xây dựng sản phẩm. Tiến hành kiểm thử chương trình, bắt lỗi và sửa lỗi
để có một chương trình hoàn thiện

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 2


B¸o c¸o thùc tËp tèt nghiÖp

Chương II: CƠ SỞ LÝ THUYẾT


1. Thuật toán:
1.1. Định nghĩa về giải thuật
1.2. Giải thuật theo cách hiểu thông thường
- Ðể tin học hoá một bài toán trong thực tế ta phải bắt đầu từ việc xác định
bài toán. Nhiều thời gian và công sức bỏ ra để xác định vấn đề cần giải
quyết, tức là phải trả lời rõ ràng câu hỏi “phải làm gì?” sau đó là “làm như
thế nào?“. Thông thường, khi khởi đầu, hầu hết các bài toán là không đơn
giản, không rõ ràng.
- Theo nghĩa rộng, khái niệm giải thuật được sử dụng ở mọi nơi, không riêng
gì trong lĩnh vực tin học.
- Giải thuật là một loạt các thao tác có thứ tự nhằm giải quyết một bài toán
nào đó.
- Ví dụ: “Thuật toán tìm giá trị lớn nhất trong dãy số”
 Bước 0: Nhập dãy số a
 Bước 1: Gán chỉ số i=1
 Bước 2: Gán giá trị max=a[1]
 Bước 3: Tăng i = i+1
 Bước 4: So sánh max với a[i], nếu max<a[i] thì gán max = a[i]
 Bước 5: Nếu i<n thì quay lại B3
 Bước 6: In ra màn hình giá trị lớn nhất: Max
1.3. Các thao tác trong thuật giải
- Thao tác tuần tự: Một công việc đã được xác định rõ ràng, thực hiện xong
thì chuyển sang công việc khác.
- Thao tác kiểm tra điều kiện: Kiểm tra điều kiện đưa ra có thoả mãn hay
không để quyết định thao tác tiếp theo.
- Thao tác lặp: Quay trở lại bước nào đó trong dãy thao tác.
- Một thao tác có thể được lặp đi lặp lại nhiều lần tới khi một điều kiện nào
đó được thoả mãn
- Ví dụ:
Giải thuật nấu cơm (đề phòng trường hợp có thêm khách)
 Bước 0: Ước lượng số gạo cần thiết
 Bước 1: Vo gạo
 Bước 2: Cho gạo và nước thích hợp vào nồi cơm điện(NCĐ)
 Bước 3: Cắm điện, chuyển chế độ “cook”
 Bước 4: Chờ đến khi NCĐ chuyển sang chế độ “warm”
 Bước 5: Chờ thêm 10 phút nữa
 Bước 6: Cơm chín. Nếu không có thêm khách thì sang bước 8
 Bước 7: Quay lại bước 0
 Bước 8: Kết thúc.
Nhận xét:
Bước 6 là thao tác kiểm tra điều kiện và bước 7 là thao tác lặp.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 3


B¸o c¸o thùc tËp tèt nghiÖp

1.4. Định nghĩa


Giải thuật là một dãy các câu lệnh chặt chẽ và rõ ràng xác định một trình tự
thao tác trên một đối tượng nào đó sao cho sau một số bước hữu hạn thực hiện, ta
thu được kết quả mong muốn.
 Câu lệnh: đơn vị thao tác, tính toán, xử lý
 Trình tự rõ ràng: thực hiện xong bước này mới chuyển sang bước khác,
không nhập nhằng.
 Đối tượng: các dữ kiện của bài toán, dữ liệu trung gian, kết quả,…
 Kết quả: Thông tin, lời giải cho bài toán,…
Như vậy:
Giải thuật là bất cứ thủ tục tính toán nào nhận các dữ liệu vào sau một số hữu
hạn các bước xử lý trả thông tin ra.
- Ví dụ: “Bài toán sắp xếp dãy số”
 Input: Dãy số
 Output: Dãy số đã sắp xếp

INPUT OUTPUT
ALGORITHM

1.5. Từ giải thuật đến chương trình


- Giải thuật chỉ là phương pháp để giải quyết bài toán
- Sử dụng giải thuật để giải quyết bài toán cần:
 Có máy tính
 Lập trình: Cài đặt giải thuật lên máy tính theo một ngôn ngữ lập trình nào
đó chẳng hạn như: Turbo Pascal, Turbo C, Visual Basic,…
- Biểu diễn đối tượng xử lý bởi dữ liệu trong chương trình (có nhiều kiểu dữ
liệu với cấu trúc khác nhau như: Integer, Char,….)
- Như vậy một chương trình được tạo nệ từ: Thuật giải và cấu trúc dữ liệu
2. Các phương pháp biểu diễn:

2.1.Các phương pháp biểu diễn giải thuật


2.1.1.Phương pháp biểu diễn từng bước
- Các thao tác của giải thuật được liệt kê từng bước
- Tại mỗi bước, sử dụng ngôn ngữ tự nhiên để diễn tả công việc phải làm.
- Bước đứng trước (có số thứ tự nhỏ hơn) được thực hiện trước.
- Ưu nhược điểm
 Dễ hiểu, dễ làm
 Phụ thuộc vào “cách hành văn” của người diễn đạt
 Với những giải thuật phức tạp, cách diễn đạt này trở nên rườm rà
 …
- Ví dụ:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 4


B¸o c¸o thùc tËp tèt nghiÖp

Giải thuật “Tìm vị trí xuất hiện đầu tiên của một số nguyên trong dãy số nguyên đã cho”:
 Bước 1: Nhập dãy số nguyên
 Bước 2: Nhập số nguyên a
 Bước 3: Gán cho phần tử so sánh (s) giá trị của số đầu tiên trong dãy
 Bước 4: So sánh a với s
 Nếu a=s thì ghi nhận vị trí của phần tử s (p)
 Nếu a≠s và s chưa phải phần tử cuối cùng trong dãy thì gán s bằng phần tử
tiếp theo và lặp lại bước 4
 Nếu a≠s và s là phần tử cuối cùng của dãy thì gán p = 0
 Bước 5: Nếu p ≠ 0 thì đưa ra vị trí cần tìm là p, ngược lại thông báo không
tìm thấy. Kết thúc
2.1.1 Diễn đạt giải thuật bằng sơ đồ khối
- Sử dụng các hình khối để minh hoạ cho các lệnh hay thao tác.
- Sử dụng mũi tên để diễn đạt thứ tự thực hiện
- Đây là cách diễn đạt khoa học, có tính nhất quán cao
- Các hình khối cơ bản
 Khối bắt đầu
 Khối kết thúc
 Khối thao tác cụ thể
 Khối kiểm tra điều kiện
 Khối vào/ra dữ liệu
 Khối gọi chương trình con

Các ký pháp trong phương pháp biểu diễn này:

Khối bắt đầu và kết thúc


Begin End A
Gọi chương trình con A

Thực hiện công việc A

Kiểm tra điều Điều


kiện: TùyĐúngthuộc điều
kiện(Đúng hay Sai)
kiệnmà rẽ nhánh thích hợp

Vào/ra dữ liệu
Sai

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 5


B¸o c¸o thùc tËp tèt nghiÖp

Từ các khối ở trên có một số cấu trúc như sau:

§ iÒu KiÖn Xö lý

If…then… Néi dung while…


§ iÒu KiÖn
Cấu trúc
lÆ p lặp
do…

Cấu trúc rẽ nhánh


Néi dung
Xö lý nÕu
§ iÒu KiÖn § óng lÆ p
®óng

If…then… Sai repeat…


else… Xö lý nÕu
until…
sai § iÒu KiÖn

Một số ví dụ:
Ví dụ 1: Tính chu vi, diện tích hình chữ nhật

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 6


B¸o c¸o thùc tËp tèt nghiÖp

Begin

Phương pháp liệt kê


§ äc c¹ nh a,b
B1. Nhập hai cạnh a,b
B2. Tính chu vi
C :=2*(a+b)
C = 2*(a+b) Sơ đồ khối
B3. Tính diện tích
S = a*b S :=a*b
B4. In chu vi C
B5. In diện tích S
B6. Kết thúc In ra C,S

End

Ví dụ 2: Vẽ lưu đồ thuật giải tính tổng n số tự nhiên đầu tiên

Cách 1 Cách 2

Begin

§ äc sè N

S:=0
Begin

i :=0
§ äc sè N

S :=S +i

S :=N(N+1)/2
i : =i+1

i >N
Sai In ra S
§ óng

In ra S

End
End

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 7


B¸o c¸o thùc tËp tèt nghiÖp

Ví dụ 3: Tính chu vi, diện tích tam giác

Phương pháp liệt kê


B1. Nhập cạnh a,b,c Begin

B2. Kiểm tra xem a,b,c có phải


§ äc a,b,c
ba cạnh tam giác không
Nếu (a+b>c) và (b+c>a) và (a+c>b)
thì sang bước 3 (a+b>c) and (b+c>a)
and (a+c>b)
Sai In “Kh«ng
t¹ o thµnh
Nếu không thì thông báo “không tạo TG”

thành tam giác” và kết thúc Lưu


§ óng
đồ thuật toán
C :=(a+b+c)
B3. Tính chu vi C = (a+b+c) p :=C/2

B4. Tính nửa chu vi p = C/2 S := p * ( p − a ) * ( p − b) * ( p − c)


B5. Tính diện tích tam giác theo
công thức Hê-rông In ra C,S

S=
B6. In kết quả C,S
End

Như vậy: Một bài toán có thể có nhiều thuật toán với các cách biểu diễn khác
nhau. Vấn đề là ta phải tìm ra thuật toán tốt để giải bài toán.
2.1.2 Diễn đạt thuật giải bằng giả ngôn ngữ
- Giả ngôn ngữ
 Dựa trên ngôn ngữ lập trình bậc cao
 Gần với ngôn ngữ tự nhiên của con người
 Ví dụ:
Ngôn ngữ giả Pascal (tựa Pascal) có các ký pháp khá giống với ngôn ngữ lập
trình Pascal, được rút gọn sao cho dễ diễn đạt
- Giả ngôn ngữ được đưa ra với mục đích diễn đạt các giải thuật sao cho gần
với ngôn ngữ lập trình và ngôn ngữ tự nhiên.
- Sử dụng giả ngôn ngữ khiến việc chuyển từ giải thuật sang chương trình dễ
dàng hơn.
- Ví dụ: Giải thuật tính tổng n số tự nhiên đầu tiên
Nhập N
i:=0
S:=0
REPEAT
S:=S+i
i:=i+1
UNTIL (i>N)
In S

2.2.Thiết kế và phân tích giải thuật

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 8


B¸o c¸o thùc tËp tèt nghiÖp

- Quá trình viết chương trình giải bài toán:


 Phân tích yêu cầu bài toán
 Thiết kế giải thuật
 Viết chương trình
 Chạy thử, đánh giá
- Thiết kế giải thuật là từ yêu cầu của một bài toán, diễn đạt một giải thuật
giải quyết bài toán đó.
 Mô-đun hoá việc giải quyết bài toán.
 Tinh chỉnh từng bước.
- Phân tích giải thuật
 Xem xét các tiêu chuẩn của giải thuật có được thoả mãn không, nếu có thì
đến mức độ nào.
2.2.1. Thiết kế từ trên xuống BÀI TOÁN
GIẢI PHƯƠNG TRÌNH BẬC II
Các bài toán lớn đòi hỏi giải thuật có quy mô
lớn
- Mô-đun hoá A B C

Bài toán = nhiều mô-đun


Mô-đun lớn = nhiều mô-đun con A1 C1 C2
A2
Việc giải quyết một mô-đun ở mức thấp nhất
là “đủ đơn giản”
- Thiết kế từ trên xuống (top-down design): A2.1 A2.2 A2.3
Bài toán được xem xét từ tổng quát đến chi
tiết
NHẬP HỆ SỐ XỬ LÝ HIỂN THỊ KẾT QUẢ
Ví dụ: Bài toán giải phương trình bậc 2

TRƯỜNG HỢP SUY TRƯỜNG HỢP KHÔNG


BIẾN SUY BIẾN

TÍNH TÍNH NGHIỆM THEO


DELTA DELTA

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 9


B¸o c¸o thùc tËp tèt nghiÖp

2.2.2. Phương pháp tinh chỉnh từng bước


- Phương pháp tinh chỉnh từng bước (stepwise refinement)
 Ban đầu, sử dụng ngôn ngữ tự nhiên để diễn tả những công việc chính của
giải thuật.
 Các bước sau, các công việc được chi tiết hoá dần dần, ngôn ngữ tự nhiên
được thay thế dần dần bằng giả ngôn ngữ.
 Cuối cùng, giả ngôn ngữ được chuyển sang ngôn ngữ lập trình Ng«n ng÷ (tõ th« s¬ ®Õn chi tiÕt)
Tinh chØ
tù nhiªn
- Đặc điểm
 Thể hiện rõ ý tưởng thiết kế từ trên xuống
Gi¶ ng«n
nh tõng b­ í c

 Gắn liền việc thiết kế giải thuật với việc lập trình ng÷

Ng«n ng÷
- Ví dụ: Sắp xếp dãy số theo thứ tự tăng dần lËp tr×
nh
 Phác thảo “thô” với những “ý tưởng cơ bản”
 “Từ dãy các số chưa được sắp xếp, tìm số nhỏ nhất và đưa lên đầu”
 Lặp lại quy trình trên tới khi dãy chưa được sắp xếp trở thành rỗng.
 Ban đầu, dãy chưa sắp xếp là dãy đã cho, dãy đã sắp xếp là rỗng.
 Lưu trữ dãy bằng “mảng” (danh sách các số), đưa số nhỏ nhất (aj) lên đầu
danh sách là đổi chỗ nó với số đầu tiên.
 Đổi chỗ

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 10


B¸o c¸o thùc tËp tèt nghiÖp

 Số trung gian := aj
 aj := số đầu tiên
 Số đầu tiên : = số trung gian
 …, cuối cùng ta được chương trình với ngôn ngữ cụ thể
2.2.3. Phương pháp phân tích giải thuật
- Tính đúng đắn
 Chạy thử nghiệm, đối chiếu kết quả à phát hiện được tính sai.
 Dùng công cụ toán học để chứng minh à tính đúng đắn.
- Tính đơn giản
 Giải thuật có dễ hiểu, dễ lập trình không?
- Tính hiệu quả
 Đơn giản chưa chắc đã hiệu quả.
 Đối với nhiều bài toán, tính hiệu quả là quan trọng, các giải thuật đơn giản
lại gây tốn tài nguyên, chạy chậm.
 Thời gian tính toán à Độ phức tạp tính toán
 Những giải thuật hiệu quả phải có độ phức tạp (thời gian) tính toán chấp
nhận được.
- Tính dừng
 Chứng minh, suy luận
 Chạy thử

Chương III: TÌM HIỂU NGÔN NGỮ THỰC HIỆN

I. Tổng quan về ngôn ngữ lập trình Visual Basic


Visual Basic, con đường nhanh nhất và đơn giản nhất để tạo những ứng
dụng cho Microsoft Windows. Bất kể bạn là một nhà chuyên nghiệp hay là
một người mới lập trình Windows, Visual Basic cung cấp cho bạn một tập hợp
các công cụ hoàn chỉnh để nhanh chóng phát triển các ứng dụng.
Vậy Visual Basic là gì ? Thành phần “Visual” nói đến các phương thức
dùng để tạo giao diện đồ họa người sử dụng (GUI). Thay vì viết những dòng
mã để mô tả sự xuất hiện và vị trí của những thành phần giao diện, ta chỉ cần

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 11


B¸o c¸o thùc tËp tèt nghiÖp

thêm vào những đối tượng đã được định nghĩa trước ở vị trí nào đó trên màn
hình.
Thành phần “Basic” nói đến ngôn ngữ “BASIC” (Beginners All-Purpose
Symbolic Instruction Code) một ngôn ngữ được dùng bởi nhiều nhà lập trình
hơn bất cứ một ngôn ngữ nào khác trong lịch sử máy tính. Visual Basic được
phát triển dần dần dựa trên ngôn ngữ BASIC, và bây giờ chứa đựng hàng trăm
điều lệnh, hàm, và từ khóa... có quan hệ trực tiếp với giao diện đồ họa của
Windows.
Ngôn ngữ lập trình Visual Basic không chỉ là Visual Basic. Hệ thống lập
trình Visual Basic, những ứng dụng bao gồm Microsoft Excel, Microsoft
Access, và nhiều ứng dụng Windows khác đều dùng cùng một ngôn ngữ.
Mặc dù mục đích của chúng ta là tạo ra những ứng dụng nhỏ cho bản
thân hay một nhóm, một hệ thống các công ty lớn, hoặc thậm chí phân phối
những ứng dụng ra toàn cầu qua Internet. Visual Basic là cung cụ mà bạn cần.
• Những chức năng truy xuất dữ liệu cho phép ta tạo ra những cơ sở dữ liệu,
những ứng dụng front-end, và những thành phần phạm vi server-side cho
hầu hết các dạng thức cơ sở dữ liệu phổ biến, bao gồm Microsoft SQL
Server và những cơ sở dữ liệu mức enterprise khác.

• Những kỹ thuật ActiveX cho phép ta dùng những chức năng được cung cấp
từ những ứng dụng khác, như là chương trình xử lý văn bản Microsoft
Word, bảng tính Microsoft Excel và những ứng dụng Windows khác.
• Khả năng Internet làm cho nó dễ dàng cung cấp cho việc thêm vào những
tài liệu và ứng dụng qua Internet hoặc intranet từ bên trong ứng dụng của
bạn, hoặc tạo những ứng dụng Internet server.
• Ưng dụng của bạn kết thúc là một file .exe thật sự. Nó dùng một máy ảo
Visual Basic để bạn tự do phân phối ứng dụng.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 12


B¸o c¸o thùc tËp tèt nghiÖp

II. Cấu trúc của một ứng dụng Visual Basic


Một ứng dụng thật ra là một tập hợp các chỉ dẫn trực tiếp đến máy tính
để thi hành một hay nhiều tác vụ. Cấu trúc của một ứng dụng là phương pháp
trong đó các chỉ dẫn được tổ chức, đó là nơi chỉ dẫn được lưu giữ và thi hành
những chỉ dẫn trong một trình tự nhất định.
Vì một ứng dụng Visual Basic, trên cơ bản là những đối tượng, cấu trúc
mã đóng để tượng trưng cho những mô hình vật lý trên màn hình. Bằng việc
định nghĩa, những đối tượng chứa mã và dữ liệu. Form, cái mà chúng ta nhìn
thấy trên màn hình là tượng trưng cho những thuộc tính, quy định cách xuất
hiện và cách cư xử. Cho mỗi form trong một ứng dụng, có một quan hệ
module form (với tên file mở rộng là .frm) dùng để chứa đựng mã của nó.
Mỗi module chứa những thủ tục sự kiện – những đoạn mã, nơi đặt những
chỉ dẫn, cái sẽ được thi hành trong việc đáp ứng những sự kiện chỉ định. Form
có thể chứa những điều khiển. Tương ứng với mỗi điều khiển trên form, có
một tập hợp những thủ tục sự kiện trong module form đó.
Mã không chỉ quan hệ với một form chỉ định hay điều khiển có thể được
đặt trong một loại module khác, một module chuẩn (.BAS). Một thủ tục được
dùng để đáp ứng những sự kiện trong những đối tượng khác nhau phải được
đặt trong cùng một chuẩn, thay vì tạo những bản sao mã trong những thủ tục
sự kiện cho mỗi đối tượng. Một lớp module (.cls) được dùng để tạo những đối
tượng, cái mà có thể được gọi từ những thủ tục bên trong ứng dụng của bạn.
Trong khi một module chuẩn chỉ chứa mã, một lớp module chứa đựng cả mã
và dữ liệu. Ta có thể nghĩ nó như một điều khiển.

III. Chúng ta có thể làm gì với Visual Basic


 Tạo giao diện người sử dụng
Giao diện người sử dụng có lẽ là thành phần quan trọng nhất của một
ứng dụng. Đối với người sử dụng, giao diện chính là ứng dụng ; họ không cần

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 13


B¸o c¸o thùc tËp tèt nghiÖp

chú ý đến thành phần mã thực thi bên dưới. ứng dụng của chúng ta có thể phổ
biến được hay không phụ thuộc vào giao diện.
 Sử dụng những điều khiển chuẩn của Visual Basic
Ta dùng những điều khiển để lấy thông tin mà người sử dụng nhập vào,
và để hiển thị kết xuất. Những điều khiển mà ta có thể dùng trong ứng
dụng bao gồm hộp văn bản, nút lệnh, và hộp danh sách,.... Những điều khiển
khác cho ta truy xuất những ứng dụng khác, xử lý dữ liệu của nó như là một
thành phần mã trong ứng dụng của bạn.
 Lập trình với những đối tượng.
Những đối tượng là thành phần chủ yếu để lập tình Visual Basic. Những
đối tượng có thể là form, những điều khiển hay cơ sở dữ liệu.
 Lập trình với phần hợp thành
Chúng ta đôi khi cần sử dụng khả năng tính toán của Microsoft Excel
trong ứng dụng Visual Basic, hay định dạng một tài liệu sử dụng thanh công
cụ định dạng của Microsoft Word, hoặc lưu trữ và xử lý dữ liệu dùng
Microsoft Jet... Tất cả những điều này có thể thực hiện được bằng cách xây
dựng những ứng dụng của chúng ta sử dụng những thành phần ActiveX. Thêm
vào đó, Visual Basic có thể giúp chúng ta tạo ra những điều khiển ActiveX
riêng.
 Đáp ứng những sự kiện chuột và bàn phím
Những ứng dụng Visual Basic có thể đáp ứng một lượng lớn sự kiện
chuột và bàn phím. Ví dụ form, hộp ảnh, và những điều khiển ảnh có thể phát
hiện vị trí con trỏ chuột, có thể quyết định phím trái hay phím phải được nhấn,
và có thể đáp ứng những tổ hợp của phím chuột với phím Shift, Ctrl, hay Alt.
Sử dụng những điều khiển phím, ta có thể lập trình những điều khiển và form
để đáp ứng các hành động phím hoặc phiên dịch và xử lý mã Ascii của ký tự.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 14


B¸o c¸o thùc tËp tèt nghiÖp

Thêm vào đó, những ứng dụng Visual Basic có thể hỗ trợ sự kiện rê và
thả cũng như tính năng rê và thả OLE.
 Làm việc với văn bản và đồ họa.
Visual Basic cung cấp khả năng đồ họa và văn bản phức tạp trong ứng
dụng. Những thuộc tính văn bản có thể giúp ta nhấn mạnh các khái niệm quan
trọng và các chi tiết cần quan tâm. Thêm vào đó, Visual Basic cung cấp khả
năng đồ họa cho phép ta linh động trong thiết kế, bao hàm các hình ảnh động
bằng cách hiển thị một loạt các hình ảnh liên tiếp nhau.
 Gỡ rối mã và quản lý lỗi
Đôi khi có những lỗi xảy ra bên trong mã của ứng dụng. Những lỗi
nghiêm trọng có thể là nguyên nhân một ứng dụng không đáp ứng lệnh, thông
thường yêu cầu người sử dụng khởi động lại ứng dụng, và không lưu lại
những gì ta đã làm. Quá trình tìm ra và sửa lỗi gọi là gỡ rối. Visual Basic cung
cấp nhiều công cụ giúp chúng ta phân tích ứng dụng làm việc như thế nào.
Những công cụ gỡ rối đặt biệt hữu ích trong việc tìm ra nguồn gốc lỗi, nhưng
chúng ta cũng có thể dùng những công cụ này để kiểm tra chương trình hoặc
tìm hiểu những ứng dụng khác nhau làm việc như thế nào.
 Xử lý ổ đĩa, thư mục và file
Khi lập trình trong Windows, nó rất quan trọng để có khả năng thêm, di
chuyển, tạo mới hoặc xóa những thư mục và file, lấy thông tin về và xử lý ổ
đĩa. Visual Basic cho phép chúng ta xử lý ổ đĩa, thư mục và file bằng hai
phương pháp : qua những phương thức cũ như là điều lệnh Open, Write#, và
qua một tập hợp các công cụ mới như FSO (File System Object)

 Thiết kế cho việc thi hành và tính tương thích


Visual Basic chia xẻ hầu hết những tính năng ngôn ngữ trong Visual
Basic cho những ứng dụng, bao gồm trong Microsoft Office và nhiều ứng

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 15


B¸o c¸o thùc tËp tèt nghiÖp

dụng khác. Visual Basic, VBScript, một ngôn ngữ script Internet, đều là tập
hợp con của ngôn ngữ Visual Basic.
 Phân phối những ứng dụng
Sau khi tạo một ứng dụng Visual Basic, ta có thể tự do phân phối bất kỳ
ứng dụng nào đã tạo bằng Visual Basic đến bất cứ ai dùng Microsoft
Windows. Ta có thể phân phối ứng dụng trên đĩa, trên CD, qua mạng, trên
intranet hoặc Internet.

IV. Tóm tắt ngôn ngữ


1. Biến
Biến được dùng để lưu tạm thời các giá trị tính toán trong quá trình xử lý
chương trình.
 Cách khai báo biến
Visual Basic dùng cách khai báo biến trong chương trình như sau :
Dim <Tên biến> As <Kiểu biến>
Ta cũng có thể không cần khai báo kiểu biến (tức bỏ mệnh đề As <Kiểu
biến> phía sau), trong trường hợp này, biến có thể được dùng để lưu giữ một
giá trị bất kỳ.
 Quy tắc đặt tên biến
 Tên biến có chiều dài tối đa 255 ký tự.
 Phải bắt đầu bằng một chữ cái.
 Không đặt các khoảng trống và các ký hiệu (+ - * /...) trong tên biến.
 Không được trùng với từ khóa của ngôn ngữ.
 Tránh đặt tên trùng nhau.
 Phạm vi sử dụng biến
Phạm vi sử dụng biến tùy thuộc cách ta khai báo và chỗ ta đặt dòng lệnh
khai báo biến.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 16


B¸o c¸o thùc tËp tèt nghiÖp

 Nếu ta khai báo trong phần General, biến có thể được dùng ở bất kỳ đoạn
lệnh nào trong from và cũng chỉ mất đi khi from được giải phóng khỏi bộ
nhớ.
 Nếu ta khai báo biến trong phần viết lệnh cho một sự kiện của một đối
tượng (tức khai báo giữa hai dòng Sub và End Sub của mã lệnh đó) thì biến
chỉ tồn tại và dùng được trong phạm vi hai dòng Sub và End Sub đó mà
thôi. Biến như vậy gọi là biến riêng hay biến nội bộ.
 Nếu ta dùng từ khóa Public thay cho Dim để khai báo biến , biến sẽ tồn tại
trong suốt thời gian thực hiện chương trình và có thể dùng được trong bất cứ
đoạn lệnh nào của chương trình. Biến như vậy gọi là biến chung hay biến
toàn cục.
2. Các kiểu dữ liệu trong Visual Basic

Tên Độ rộng Khoảng giá trị


kiểu
Byte 1 byte 0 đến 255
Integer 2 byte -32768 đến 32767
Long 4 byte -2.147.483.648 đến 2.147.483.647
-3,402823E38 đến –1,401298E-45 (giá trị âm)
Single 4 byte 1,401298E-45 đến 3,402823E38 (giá trị
dương)
-1,79769E308 đến –4,94065E-324 (giá trị âm)
Double 8 byte 4,94065E-324 đến 1,79769E308 (giá trị
dương)
-922337203685477,5808 đến
Currency 8 byte
922337203685477,5807
Boolean 2 byte True tới False
1 tháng 1 năm 100 đến 31 tháng 12 năm 9999 ;
Date 2 byte
Thời gian từ 0:00:00 đến 23:59:59:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 17


B¸o c¸o thùc tËp tèt nghiÖp

1 byte cho mỗi


String có thể lên đến 231 ký tự
ký tự
16 byte +1 byte Null, Error, bất kỳ kiểu số nào có giá trị trong
Variant
cho mỗi ký tự khoảng Double hay bất kỳ nội dung text nào

Ký hiệu Exx phía sau số có nghĩa là nhân với 10xx.


• Kiểu số nguyên dương (không chấp nhận số âm) gồm kiểu Byte.
• Kiểu số nguyên (chấp nhận cả số âm nhưng không chấp nhận phần lẻ thập
phân) gồm các kiểu :Integer, Long.
• Kiểu số thực gồm Single, Double, Currency.
• Kiểu Boolean gọi là kiểu luận lý, nó chỉ chấp nhận hai giá trị True là đúng
và False là sai.
• Kiểu String dùng để chứa các giá trị chuỗi. Một chuỗi ký tự có thể có nhiều
ký tự. Khi viết một giá trị chuỗi, ta phải bao hai đầu nó bằng dấu nháy kép.
• Kiểu ngày tháng (Date) để chứa giá trị thời gian. Khi viết một giá trị kiểu
Date, ta có thể viết theo bất cứ kiểu ghi giờ nào bao hai đầu bằng dấu #.
3. Các toán tử và hàm trong Visual Basic
3.1. Các toán tử tính toán

Toán tử ý nghĩa
+ Cộng hai số hạng hoặc hai chuỗi
- Trừ hai số hạng
* Nhân hai số hạng
/ Chia, trả về kiểu số thực
\ Chia lấy nguyên
Mod Chia lấy dư
^ Lấy lũy thừa

3.2. Các toán tử so sánh

Toán tử ý nghĩa

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 18


B¸o c¸o thùc tËp tèt nghiÖp

> So sánh xem số thứ nhất có lớn hơn số thứ hai không
< So sánh xem số thứ nhất có nhỏ hơn số thứ hai không
= So sánh xem số thứ nhất có bằng số thứ hai không
<> So sánh xem số thứ nhất có khác hơn số thứ hai không
>= So sánh xem số thứ nhất có lớn hơn hay bằng số thứ hai không
<= So sánh xem số thứ nhất có nhỏ hơn hay bằng số thứ hai không

3.3. Các toán tử luận lý

Toán tử ý nghĩa
Trả về True nếu cả hai số hạng đều là True, trả về False nếu
And
một trong hai số hạng là False
Trả về True nếu một trong hai số hạng là True, trả về False nếu
Or
cả hai số hạng là False
Not Trả về True nếu số hạng là False, False nếu số hạng là True

* Một số hàm cơ bản của Visual Basic.

Hàm ý nghĩa
Abs(số) Trả về giá trị tuyệt đối của con số truyền vào.
Sin(số) Trả về sin của một số
Cos(số) Trả về cos của một góc, góc truyền vào tính bằng radian.
Tan(số) Trả về tang của một góc, góc truyền vào tính bằng radian.
Atn(số) Trả về arctang của một con số.
Int(số) Trả về phần nguyên của một con số
Fix(số) Làm tròn số
Sgn(số) Trả về con số nguyên cho biết dấu của con số truyền vào.
Sqr(số) Trả vè căn bậc hai của số.
Val(chuỗi) Trả về một con số tương ứng với chuỗi truyền vào.
Str (số) Trả về một chuỗi ký tự biểu diễn con số truyền vào

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 19


B¸o c¸o thùc tËp tèt nghiÖp

4. Cấu trúc tuyển và cấu trúc lặp


4.1. Cấu trúc tuyển
 Cấu trúc tuyển If
Cú pháp 1 :
If <biểu thức luận lý> Then
...<các câu lệnh>
...
End If
Cú pháp 2 :
If <biểu thức luận lý> Then
...<các câu lệnh>
...
Else
...<các câu lệnh>
...
End If
 Cấu trúc tuyển Select Case
Cú pháp :
Select Case <biến hay biểu thức>
Case <các giá trị>
<các câu lệnh>
...
Case <các giá trị>
...
[ Case Else
<các câu lệnh> ]
...
End Select

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 20


B¸o c¸o thùc tËp tèt nghiÖp

4.2. Các cấu trúc lặp


 Cấu trúc Do...Loop
Cú pháp 1 :
Do While <biểu thức điều kiện>
<các câu lệnh>
...
[ Exit do ]
Loop
Cú pháp 2 :
Do
<các câu lệnh>
...
[ Exit do ]
Loop Until <điều kiện>
Cú pháp này khác cú pháp 1 ở chỗ : trong cú pháp 1 điều kiện được xét
trước khi thực hiện các câu lệnh, cú pháp 2 điều kiện được xét sau khi thực
hiện các câu lệnh.
 Cấu trúc For...Next
Cú pháp :
For biến = giá trị đầu To giá trị cuối [Step khoảng tăng]
<các câu lệnh>
...
[Exit for]
Next biến
5. Thủ tục
 Cách định nghĩa thủ tục
Một thủ tục trước khi muốn sử dụng nó phải định nghĩa nó. Dùng từ
khóa Sub để khai báo thủ tục như thế này.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 21


B¸o c¸o thùc tËp tèt nghiÖp

Private/public Sub <Tên thủ tục>


<Các mã lệnh mà thủ tục này thực hiện>
...
[Exit Sub]
End Sub
 Nếu ta khai báo bằng từ khóa Public, thủ tục có thể được gọi để sử dụng
trong bất kỳ form nào trong chương trình.
 Nếu ta khai báo bằng từ khóa Private, thủ tục chỉ có thể dùng được trong
form có chứa nó mà thôi
 Thủ tục có truyền tham số
Khi một thủ tục được gọi mà có truyền thêm một số giá trị vào, các
giá trị này được gọi là các tham số của thủ tục đó. Để làm điều này, khi
khai báo thủ tục ta cần ghi thêm nó sẽ nhận bao nhiêu tham số bằng cú
pháp như sau :
Private/Public Sub <Tên thủ tục> (<Tham số> As <Kiểu>,...)
<Các mã lệnh mà thủ tục này thực hiện>
...
[Exit Sub]
End Sub

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 22


B¸o c¸o thùc tËp tèt nghiÖp

Chương IV: MÔ HÌNH, PHƯƠNG HƯỚNG GIẢI QUYẾT

1. Mô hình
Để xây dựng công cụ hỗ trợ lập trình dựa cơ sở thuật toán bước khởi đầu ta phải
mô hình hóa bài toán. Như đã biết có nhiều phương pháp để mô tả một giải thuật:
- Phương pháp biểu diễn từng bước
- Phương pháp vẽ sơ đồ khối
- Phương pháp giả ngôn ngữ
Trong các phương pháp trên thì phương pháp biểu diễn giải thuật bằng sơ đồ
thuật toán là hữu hiệu nhất, nó như một bản thiết kế. Thông qua đó bất kỳ một lập
trình viên nào cũng có thể thao tác để biến nó thành chương trình cụ thể. Phương
pháp biểu diễn thuật toán bằng sơ đồ thuật toán được mô tả như sau:
- Sử dụng các hình khối để minh hoạ cho các lệnh hay thao tác.
- Sử dụng mũi tên để diễn đạt thứ tự thực hiện
- Đây là cách diễn đạt khoa học, có tính nhất quán cao
- Các hình khối cơ bản:
*) Khối bắt đầu
*) Khối kết thúc
Begin End
*) Khối thao tác cụ thể
*) Khối kiểm tra điều kiện
*) Khối vào/ra dữ liệu Đúng
Điều
*) Khối gọi chương trình con A kiện

- Các cấu trúc thường gặp: Sai

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 23


A
B¸o c¸o thùc tËp tèt nghiÖp

Ví dụ 1: Sơ đồ khối tính chu vi, diện tích hình chữ nhật (Hình trái)
Ví dụ 2: Sơ đồ khối tính tổng từ 1..N (Hình phải)

Begin
Begin

§ äc c¹ nh a,b § äc sè N

C :=2*(a+b) S:=0

S :=a*b
i :=0

In ra C,S

S :=S +i
End

i : =i+1

i >N
Sai
§ óng

In ra S

End

Từ sự mô tả trên để xây dựng được công cụ hỗ trợ lập trình dựa cơ sở thuật toán
và đưa ra mô hình bài toán như sau:
- Xây dựng bộ công cụ hỗ trợ vẽ sơ đồ thuật toán
- Xây dựng phần mềm sinh mã chương trình nguồn pascal từ sơ đồ thuật toán

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 24


B¸o c¸o thùc tËp tèt nghiÖp

2. Phương pháp giải quyết


Trong sơ đồ khối, mỗi khối có một chức năng riêng. Mỗi khối phải thể hiện được
là khối gì, thực hiện công việc gì…Ngoài ra còn có các đường để nối các khối. Thuật
toán sẽ thực hiện theo chỉ dẫn của các đường từ đó ta phải tiến hành xây dựng các
khối,các đường sao cho nó đảm bảo được tính chất này. Mỗi khối, mỗi đường ta sẽ
gán cho nó các thuộc tính tương ứng, các thuộc tính này quyết định chức năng của
khối, của đường.
2.1 Khối BEGIN (START)
Ký pháp:
START

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (Start)
- Line in: Mã của các mũi tên đi vào
- Line out: Mã của mũi tên đi ra
- Outext: Để hiển thị thông tin trên khối
2.2 Khối END (END)
Ký pháp:
END

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (end)
- Line in: Mã của các mũi tên đi vào
- Line out: Mã của mũi tên đi ra
- Outext: Để hiển thị thông tin trên khối
2.3 Khối thao tác cụ thể (Process)
Ký pháp:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 25


B¸o c¸o thùc tËp tèt nghiÖp

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (process)
- Line in: Mã của các mũi tên đi vào
- Line out: Mã của mũi tên đi ra
- Outext: Để hiển thị thông tin trên khối

2.4 Khối kiểm tra điều kiện (Decision)


Ký pháp:
Đúng
Điều
kiện

Sai
Các thuộc tính:
- Id: Mã đối tượng
- Type: Kiểu đối tượng (Decision)
- Line in: Mã của các mũi tên đi vào
- Line out: Mã của mũi tên đi ra
- Outext: Để hiển thị thông tin trên khối
2.5 Khối nhập dữ liệu vào (Input)
Ký pháp:

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (Input)
- Line in: Mã của các mũi tên đi vào
- Line out: Mã của mũi tên đi ra
- Outext: Để hiển thị thông tin trên khối
2.6 Khối xuất dữ liệu ra (Output)
Ký pháp:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 26


B¸o c¸o thùc tËp tèt nghiÖp

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (Output)
- Line in: Mã của các mũi tên đi vào
- Line out: Mã của mũi tên đi ra
- Outext: Để hiển thị thông tin trên khối

2.7 Khối gọi chương trình con (Function)


Ký pháp:
A

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (Function)
- Line in: Mã của các mũi tên đi vào
- Line out: Mã của mũi tên đi ra
- Outext: Để hiển thị thông tin trên khối
2.8 Đường nối (Line)
Ký pháp:

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (Line)
- Con_From: Kết nối từ đối tượng nào
- Con_To: Kết nối tới đối tượng nào
2.9 Điểm nối (Connect)
Ký pháp:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 27


B¸o c¸o thùc tËp tèt nghiÖp

Các thuộc tính:


- Id: Mã đối tượng
- Type: Kiểu đối tượng (Conn)
- Line in: Mã của mũi tên đi vào
- Line out: Mã của mũi tên đi ra

3. Thiết kế dữ liệu trong ngôn ngữ Visual Basic


3.1 Các lớp:
- Lớp ClsNode: Đóng gói các dữ liệu và thủ tục thao tác các Node trong một
lưu đồ thuật toán.
Thuộc tính:
Tên Kiểu Mô tả
NodeType eNodeType Loại Node: Begin, End, IF,Process,Input,...
ParentNode ClsNode Node trước
NextNode1 ClsNode Node kế tiếp 1
NextNode2 ClsNode Node kế tiếp 2
X Long Toạ độ X
Y Long Toạ độ Y
PIn ePosition Kiều đường vào
POut1 ePosition Kiểu đường ra của đường 1
POut2 ePosition Kiểu đường ra của đường 2
CommandL ist ClsCommandL ist Danh sách các lệnh nếu loại Node là Process
VarInList ClsVarList Danh sách các biến nhập nếu Node là Input
VarOutList ClsVarList Danh sách các biến xuất nếu Node là Output
IFEXPR String Biểu thức IF nếu Node là IF

- Lớp ClsNodeList: Collection các đối tượng của lớp ClsNode.


- Lớp ClsCommand: Đóng gói các dữ liệu và thủ tục để trừu tượng đối tượng
lệnh gán.
Thuộc tính:
Tên Kiểu Mô tả
VarName String Tên biến
Value String Giá trị được gán

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 28


B¸o c¸o thùc tËp tèt nghiÖp

- Lớp ClsCommandList: Collection các đối tượng của lớp ClsCommand.


- Lớp ClsVar: Đóng gói các dữ liệu và thủ tục để trừu tượng đối tượng biến.
Thuộc tính:
Tên Kiểu Mô tả
VarName String Tên biến
D ataType eDataType Kiểu dữ liệu của biến
Value String Giá trị hiện thời của biến
VarType eVarType Kiểu biến 0:biến đơn;1:Mảng
- Lớp ClsVarList: Collection các đối tượng của lớp ClsVar.
- Lớp ClsProgram: Đóng gói các dữ liệu và thủ tục để trừu tượng đối tượng
chư ơng trình.
Thuộc tính:
Tên Kiểu Mô tả
VarList ClsVarList Danh sách biến của chương trình
NodeList ClsNodeList Danh sách các Node của chương trình
ProgramName String Tên chương trình
FileName String Tên File chứa lưu đò của chương trình
Comment String Chú thích

3.2 Kết quả đạt được


Giao diện chính của chương trình:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 29


B¸o c¸o thùc tËp tèt nghiÖp

Tại cửa sổ chính của chương trình này có hệ thống menu trong đó có các mục
như sau:
+ Menu Tập tin gồm: Tạo mới sơ đồ khối, ghi lại, thoát khỏi chương trình
+ Menu Hiển thị: Bật tắt việc hiển thị các thanh công cụ và thanh trạng
thái.
+ Menu Cây chương trình: Cung cấp các mục chọn chức năng để thao tác
với cây chương trình bên tay trái như Mở nút, thêm biến,...
+ Menu Lưu đồ: Cung cấp các chức năng thao tác với lưu đồ như soạn
thảo nội dung nút, Xoá nút, thay đổi vị trí điểm vào, điểm ra, Chạy thử, tạo
mã Pascal.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 30


B¸o c¸o thùc tËp tèt nghiÖp

Chương V: Cài đặt và sử dụng chương trình

1. Cài đặt chương trình:


Double click vào File setup. exe có trong bộ cài kèm theo CD luận án. Làm theo các
chỉ dẫn trên màn hình.
1.1. Chạy chương trình:
Double click vào file Algorithm Chart. exe, màn hình chương trình sẽ hiện lên như sau:

1.2. Biến
Để thiết lập danh sách các biến sẽ sử dụng trong chương trình: Click phải vào nút Biến trên
Cây thành phần, chọn [Thêm biến]. Hộp thoại thêm biến sẽ hiện lên như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 31


B¸o c¸o thùc tËp tèt nghiÖp

Gõ tên biến vào ô [Tên biến], chọn kiểu dữ liệu cho biến trong Combo [Kiểu]. Nếu biến là
mảng, tick vào ô kiểm [Mảng]. Click [Thêm]. Trên cây thành phần sẽ có thêm nút tương
ứng với biến đã thêm như sau:

1.3. Soạn thảo lưu đồ thuật toán.

Quan sát trên thanh công cụ, nhóm 3 có các nút mang hình các ký hiệu của lưu đồ thuật
toán. Để thêm một khối vào lưu đồ, ta click nút có hình vẽ khối đó và click vào nền của
vùng [Sơ đồ]. Chú ý:
- Nút BEGIN phải là nút đầu tiên được đặt vào lưu đồ và mỗi lưu đồ chỉ có một nút
BEGIN duy nhất.
- Luôn chon một nút để xác định nút kế tiếp của chính nó.
Ví dụ:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 32


B¸o c¸o thùc tËp tèt nghiÖp
Đặt nút BEGIN vào lưu đồ: Click vào nút lệnh Begin trên thanh công cụ. Khi con trỏ chuôt
có hình Elip bên trong là ký tự “B” thì click vào vùng [Sơ đồ]. Kết quả như sau:

Tiếp theo, giả sử ta cần tạo khối Input cho biến a: trước hết phải chọn nút Begin trên [Sơ
đồ] nếu nó chưa được chọn. Sau đó click vào nút lệnh Input trên thanh công cụ. Khi con
trỏ chuột thành hình bình hành thì click tiếp vào vùng [Sơ đồ]. Kết quả sẽ như sau:

1.4. Soạn thảo nội dung của các nút khối:


Các nút khối trừ BEGIN và End đều có thể có nội dung. Nội dung của chũng khác nhau
cho từng loại. Ví dụ: Nội dung nút khối Process là một danh sách các lệnh gán, nội dung
nút khối IF là biểu thức điều kiện của nó, nội dung của nút khối Input là các biến cần
nhập,.... Để soạn thảo nội dung cho một nút, ta click phải vào nút đó, chọn [Nội dung]
trong menu Popup:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 33


B¸o c¸o thùc tËp tèt nghiÖp

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 34


B¸o c¸o thùc tËp tèt nghiÖp
- Nếu là nút khối Input, hộp thoại [Nút nhập] sẽ hiện lên như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 35


B¸o c¸o thùc tËp tèt nghiÖp
Trong hộp thoại này, ta chọn biến cần nhập trongCombo [biến]. Nếu biến là mảng thì phải
xác định cho nó chỉ số của phần tử cần nhập. Sau đó click vào nút [Thêm]. Kết quả như
sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 36


B¸o c¸o thùc tËp tèt nghiÖp
Ta thấy trong danh sách biến phía dưới có a. Vậy nút khối Input có một biến a cần phải
nhập. Thực hiện tương tự với các biến khác. Sau khi thiết lập xong danh sách các biến
nhập, kết quả sẽ như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 37


B¸o c¸o thùc tËp tèt nghiÖp
- Nếu là nút IF, hộp thoại [Soạn thảo IF] sẽ hiện lên như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 38


B¸o c¸o thùc tËp tèt nghiÖp
Tại đây ta soạn thảo biểu thức điều kiện cho nút khối IF. Các thành phần của biểu thức
điều kiện được cung cấp bằng cây [Các biến, hàm]. Chọn các thành phần đó để tham gia
vào biểu thức bằng cách double click vào nút tương ứng. Ví dụ, nếu ta click [Biến]\ [a] và
[Phép toán]\ [Lớn hơn], dùng bàn phím gõ ‘0’kết quả sẽ như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 39


B¸o c¸o thùc tËp tèt nghiÖp
Sau đó click vào nút [Cập nhật], kết quả sẽ như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 40


B¸o c¸o thùc tËp tèt nghiÖp
- Nếu là nút Process, hộp thoại [Soạn thảo khối lệnh] sẽ hiện lên như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 41


B¸o c¸o thùc tËp tèt nghiÖp
Ở đây ta phải thiết lập các lệnh gán của khối Process. Ví dụ, muốn gán 10 cho a, ta soạn
thảo như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 42


B¸o c¸o thùc tËp tèt nghiÖp
Sau khi click vào nút [Đóng], kết quả sẽ như sau:

1.5. Chạy thử chương trình:

Sau khi soạn thảo xong lưu đồ thuật toán, ta có thể tiến hành chạy thử bằng cách chọn
[Lưu đồ]\ [Chạy thử]. Hộp thoại chạy thử như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 43


B¸o c¸o thùc tËp tèt nghiÖp
Click vào nút chạy để chạy từng bước chương trình. Kết quả từng bước, sự thay đổi giá trị
của biến sẽ được thông báo trong ô [diễn tiến]. Ví dụ:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 44


B¸o c¸o thùc tËp tèt nghiÖp

1.6. Tạo mã Pascal.


Sau khi chạy thử, ta có thể sử dụng chức năng [Lưu đồ]\ [Tạo mã Pascal] để sinh ra một
chương trình Pascal. Ví dụ với lưu đồ bài toán: In ra màn hình số nhỏ nhất trong ba số
nhập từ bàn phím, ta có lưu đồ như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 45


B¸o c¸o thùc tËp tèt nghiÖp
Chọn [Lưu đồ]\ [Tạo mã Pascal], chương trình sẽ chạy Turbo Pascal để mở chương trình
kết quả như sau:

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 46


B¸o c¸o thùc tËp tèt nghiÖp
Đây là một chương trình Pascal hoàn chỉnh có thể chạy ngay bằng cách nhấn tổ hợp phím
Ctrl+F9.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 47


B¸o c¸o thùc tËp tèt nghiÖp

Chương VI: NỘI DUNG CÁC LỚP ĐÃ CÀI ĐẶT


1. Lớp ClsNode:

VERSION 1.0 CLASS


BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "ClsNode"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
Public Enum eNodeType
ntNull = 0
ntBegin = 1
ntEnd = 2
ntCommand = 3
ntInput = 4
ntOutput = 5
ntIf = 6
End Enum

Public Enum ePosition


pTop = 1
pBottom = 2
pLeft = 3
pRight = 4
End Enum

Private mvarNodeType As eNodeType


Private mvarNextNode1 As ClsNode
Private mvarNextNode2 As ClsNode
Private mvarParentNode As ClsNodeList

Private mvarX As Long


Private mvarY As Long
Private mvarPIn As ePosition
Private mvarPOut1 As ePosition
Private mvarPOut2 As ePosition

Private mvarCommandList As ClsCommandList


Private mvarVarInList As ClsVarList
Private mvarVarOutList As ClsVarList
Private mvarIFExp As String
Private mvarKey As String

Public Sub Save(ByRef T As TextStream)


T.WriteLine "" & mvarNodeType
T.WriteLine "" & mvarX

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 48


B¸o c¸o thùc tËp tèt nghiÖp
T.WriteLine "" & mvarY
T.WriteLine mvarPIn
T.WriteLine mvarPOut1
T.WriteLine mvarPOut2
T.WriteLine mvarIFExp
T.WriteLine mvarKey
mvarCommandList.Save T
mvarVarInList.Save T
mvarVarOutList.Save T
End Sub

Public Sub Load(ByRef T As TextStream)


mvarNodeType = Val(T.ReadLine)
mvarX = Val(T.ReadLine)
mvarY = Val(T.ReadLine)
mvarPIn = Val(T.ReadLine)
mvarPOut1 = Val(T.ReadLine)
mvarPOut2 = Val(T.ReadLine)
mvarIFExp = T.ReadLine
mvarKey = T.ReadLine
mvarCommandList.Load T
mvarVarInList.Load T
mvarVarOutList.Load T
End Sub

Public Property Let IFExp(ByVal vData As String)


mvarIFExp = vData
End Property

Public Property Get IFExp() As String


IFExp = mvarIFExp
End Property

Public Property Set VarOutList(ByVal vData As ClsVarList)


Set mvarVarOutList = vData
End Property

Public Property Get VarOutList() As ClsVarList


Set VarOutList = mvarVarOutList
End Property

Public Property Set VarInList(ByVal vData As ClsVarList)


Set mvarVarInList = vData
End Property

Public Property Get VarInList() As ClsVarList


Set VarInList = mvarVarInList
End Property

Public Property Set CommandList(ByVal vData As ClsCommandList)


Set mvarCommandList = vData
End Property

Public Property Get CommandList() As ClsCommandList


Set CommandList = mvarCommandList
End Property

Public Property Let y(ByVal vData As Long)


mvarY = vData
End Property

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 49


B¸o c¸o thùc tËp tèt nghiÖp

Public Property Get y() As Long


y = mvarY
End Property

Public Property Let x(ByVal vData As Long)


mvarX = vData
End Property

Public Property Get x() As Long


x = mvarX
End Property

Public Property Set NextNode2(ByVal vData As ClsNode)


Set mvarNextNode2 = vData
End Property

Public Property Get NextNode2() As ClsNode


Set NextNode2 = mvarNextNode2
End Property

Public Property Set NextNode1(ByVal vData As ClsNode)


Set mvarNextNode1 = vData
End Property

Public Property Get NextNode1() As ClsNode


Set NextNode1 = mvarNextNode1
End Property

Public Property Let NodeType(ByVal vData As eNodeType)


mvarNodeType = vData
End Property

Public Property Get NodeType() As eNodeType


NodeType = mvarNodeType
End Property

Private Sub Class_Initialize()


Set mvarNextNode1 = Nothing
Set mvarNextNode2 = Nothing
Set mvarParentNode = New ClsNodeList
Set mvarCommandList = New ClsCommandList
Set mvarVarInList = New ClsVarList
Set mvarVarOutList = New ClsVarList
mvarPIn = pTop
mvarPOut1 = pBottom
mvarPOut2 = pLeft
End Sub

Public Property Set ParentNode(ByVal vData As ClsNodeList)


Set mvarParentNode = vData
End Property

Public Property Get ParentNode() As ClsNodeList


Set ParentNode = mvarParentNode
End Property

Public Function AddParent(ByVal Pr As ClsNode) As ClsNode


Set AddParent = mvarParentNode.Add(Pr, True)
End Function

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 50


B¸o c¸o thùc tËp tèt nghiÖp

Public Sub RemoveParent(ByVal PrKey As String)


mvarParentNode.Remove PrKey
End Sub

Public Property Let Key(ByVal vData As String)


mvarKey = vData
End Property

Public Property Get Key() As String


Key = mvarKey
End Property

Public Property Let PositionIn(ByVal vData As ePosition)


mvarPIn = vData
End Property

Public Property Get PositionIn() As ePosition


PositionIn = mvarPIn
End Property

Public Property Let PositionOut1(ByVal vData As ePosition)


mvarPOut1 = vData
End Property

Public Property Let PositionOut2(ByVal vData As ePosition)


mvarPOut2 = vData
End Property

Public Property Get PositionOut1() As ePosition


PositionOut1 = mvarPOut1
End Property

Public Property Get PositionOut2() As ePosition


PositionOut2 = mvarPOut2
End Property

Public Function MaxWidth(ByVal P As PictureBox) As Long


Dim L As Long
If mvarNodeType = ntBegin Then
L = P.TextWidth(BEGIN_LABEL)
ElseIf mvarNodeType = ntEnd Then
L = P.TextWidth(END_LABEL)
ElseIf mvarNodeType = ntCommand Then
L = mvarCommandList.MaxWidth(P)
ElseIf mvarNodeType = ntIf Then
L = P.TextWidth(mvarIFExp)
ElseIf mvarNodeType = ntInput Then
L = mvarVarInList.MaxWidth(P)
ElseIf mvarNodeType = ntOutput Then
L = mvarVarOutList.MaxWidth(P)
Else
L = 0
End If
If L < MIN_NODE_WIDTH Then L = MIN_NODE_WIDTH
MaxWidth = L
End Function

Public Function MaxWidthPrinter() As Long


Dim L As Long

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 51


B¸o c¸o thùc tËp tèt nghiÖp
If mvarNodeType = ntBegin Then
L = Printer.TextWidth(BEGIN_LABEL)
ElseIf mvarNodeType = ntEnd Then
L = Printer.TextWidth(END_LABEL)
ElseIf mvarNodeType = ntCommand Then
L = mvarCommandList.MaxWidthPrinter
ElseIf mvarNodeType = ntIf Then
L = Printer.TextWidth(mvarIFExp)
ElseIf mvarNodeType = ntInput Then
L = mvarVarInList.MaxWidthPrinter
ElseIf mvarNodeType = ntOutput Then
L = mvarVarOutList.MaxWidthPrinter
Else
L = 0
End If
If L < MIN_NODE_WIDTH Then L = MIN_NODE_WIDTH
MaxWidthPrinter = L
End Function

Public Function MaxHeight(ByVal P As PictureBox) As Long


Dim L As Long
If mvarNodeType = ntBegin Then
L = P.TextWidth(BEGIN_LABEL) / 2
ElseIf mvarNodeType = ntEnd Then
L = P.TextWidth(END_LABEL) / 2
ElseIf mvarNodeType = ntCommand Then
L = mvarCommandList.MaxHeight(P)
ElseIf mvarNodeType = ntIf Then
L = P.TextHeight(mvarIFExp)
ElseIf mvarNodeType = ntInput Then
L = P.TextHeight("V")
ElseIf mvarNodeType = ntOutput Then
L = P.TextHeight("V")
Else
L = 0
End If
If L < MIN_NODE_HEIGHT Then L = MIN_NODE_HEIGHT
MaxHeight = L
End Function

Public Function MaxHeightPrinter() As Long


Dim L As Long
If mvarNodeType = ntBegin Then
L = Printer.TextWidth(BEGIN_LABEL) / 2
ElseIf mvarNodeType = ntEnd Then
L = Printer.TextWidth(END_LABEL) / 2
ElseIf mvarNodeType = ntCommand Then
L = mvarCommandList.MaxHeightPrinter
ElseIf mvarNodeType = ntIf Then
L = Printer.TextHeight(mvarIFExp)
ElseIf mvarNodeType = ntInput Then
L = Printer.TextHeight("V")
ElseIf mvarNodeType = ntOutput Then
L = Printer.TextHeight("V")
Else
L = 0
End If
If L < MIN_NODE_HEIGHT Then L = MIN_NODE_HEIGHT
MaxHeightPrinter = L
End Function

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 52


B¸o c¸o thùc tËp tèt nghiÖp

Public Sub Draw(ByVal P As PictureBox, ByVal XView As Long, ByVal YView As


Long, Optional ByVal Sel As Boolean)
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long, X3 As Long, Y3 As
Long
Dim X4 As Long, Y4 As Long, X5 As Long, Y5 As Long, X6 As Long, Y6 As
Long
Dim X7 As Long, Y7 As Long, X8 As Long, Y8 As Long, X9 As Long, Y9 As
Long
Dim S As String
Dim Pr As ClsNode

X1 = (mvarX - MaxWidth(P) / 2) * TWIP2PIX


Y1 = (mvarY - MaxHeight(P) / 2) * TWIP2PIX
X2 = (mvarX + MaxWidth(P) / 2) * TWIP2PIX
Y2 = (mvarY + MaxHeight(P) / 2) * TWIP2PIX
X1 = X1 - XView / 100 * MAX_P_WIDTH * TWIP2PIX
X2 = X2 - XView / 100 * MAX_P_WIDTH * TWIP2PIX
Y1 = Y1 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX
Y2 = Y2 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX

If mvarNodeType = ntBegin Then

Ellipse P.hdc, X1, Y1, X2, Y2


X3 = (mvarX - P.TextWidth(BEGIN_LABEL) / 2) * TWIP2PIX
Y3 = (mvarY - P.TextHeight(BEGIN_LABEL) / 2) * TWIP2PIX
X3 = X3 - XView / 100 * MAX_P_WIDTH * TWIP2PIX
Y3 = Y3 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX
TextOut P.hdc, X3, Y3, BEGIN_LABEL, Len(BEGIN_LABEL)
ElseIf mvarNodeType = ntEnd Then
Ellipse P.hdc, X1, Y1, X2, Y2
X3 = (mvarX - P.TextWidth(END_LABEL) / 2) * TWIP2PIX
Y3 = (mvarY - P.TextHeight(END_LABEL) / 2) * TWIP2PIX
X3 = X3 - XView / 100 * MAX_P_WIDTH * TWIP2PIX
Y3 = Y3 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX
TextOut P.hdc, X3, Y3, END_LABEL, Len(END_LABEL)
ElseIf mvarNodeType = ntCommand Then
Rectangle P.hdc, X1, Y1, X2, Y2
mvarCommandList.Draw P, XView, YView, mvarX, mvarY
ElseIf mvarNodeType = ntIf Then
X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)
Y2 = (mvarY + MaxHeight(P) / 2)
X3 = (X1 + X2) / 2
Y3 = Y1
X4 = X2
Y4 = (Y1 + Y2) / 2
X5 = X3
Y5 = Y2
X6 = X1
Y6 = Y4

X3 = X3 - XView / 100 * MAX_P_WIDTH


Y3 = Y3 - YView / 100 * MAX_P_HEIGHT
X4 = X4 - XView / 100 * MAX_P_WIDTH
Y4 = Y4 - YView / 100 * MAX_P_HEIGHT
X5 = X5 - XView / 100 * MAX_P_WIDTH
Y5 = Y5 - YView / 100 * MAX_P_HEIGHT
X6 = X6 - XView / 100 * MAX_P_WIDTH

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 53


B¸o c¸o thùc tËp tèt nghiÖp
Y6 = Y6 - YView / 100 * MAX_P_HEIGHT

P.Line (X3, Y3)-(X4, Y4), vbBlack


P.Line (X4, Y4)-(X5, Y5), vbBlack
P.Line (X5, Y5)-(X6, Y6), vbBlack
P.Line (X6, Y6)-(X3, Y3), vbBlack
S = RemoveTag(Me.IFExp)
X3 = (mvarX - P.TextWidth(S) / 2) * TWIP2PIX
Y3 = (mvarY - P.TextHeight(S) / 2) * TWIP2PIX
X3 = X3 - XView / 100 * MAX_P_WIDTH * TWIP2PIX
Y3 = Y3 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX
TextOut P.hdc, X3, Y3, S, Len(S)
ElseIf mvarNodeType = ntInput Then
X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)
Y2 = (mvarY + MaxHeight(P) / 2)
X3 = X1
Y3 = Y1
X4 = X2 + LX
Y4 = Y1
X5 = X2
Y5 = Y2
X6 = X3 - LX
Y6 = Y2

X3 = X3 - XView / 100 * MAX_P_WIDTH


Y3 = Y3 - YView / 100 * MAX_P_HEIGHT
X4 = X4 - XView / 100 * MAX_P_WIDTH
Y4 = Y4 - YView / 100 * MAX_P_HEIGHT
X5 = X5 - XView / 100 * MAX_P_WIDTH
Y5 = Y5 - YView / 100 * MAX_P_HEIGHT
X6 = X6 - XView / 100 * MAX_P_WIDTH
Y6 = Y6 - YView / 100 * MAX_P_HEIGHT

P.Line (X3, Y3)-(X4, Y4), vbBlack


P.Line (X4, Y4)-(X5, Y5), vbBlack
P.Line (X5, Y5)-(X6, Y6), vbBlack
P.Line (X6, Y6)-(X3, Y3), vbBlack
S = RemoveTag(mvarVarInList.ToString1)
X3 = (mvarX - P.TextWidth(S) / 2) * TWIP2PIX
Y3 = (mvarY - P.TextHeight(S)) * TWIP2PIX

X3 = X3 - XView / 100 * MAX_P_WIDTH * TWIP2PIX


Y3 = Y3 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX

TextOut P.hdc, X3, Y3, S, Len(S)


ElseIf mvarNodeType = ntOutput Then
X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)
Y2 = (mvarY + MaxHeight(P) / 2)
X3 = X1 - LX
Y3 = Y1
X4 = X1
Y4 = Y2
X5 = X2 + LX
Y5 = Y2
X6 = X2
Y6 = Y1

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 54


B¸o c¸o thùc tËp tèt nghiÖp

X3 = X3 - XView / 100 * MAX_P_WIDTH


Y3 = Y3 - YView / 100 * MAX_P_HEIGHT
X4 = X4 - XView / 100 * MAX_P_WIDTH
Y4 = Y4 - YView / 100 * MAX_P_HEIGHT
X5 = X5 - XView / 100 * MAX_P_WIDTH
Y5 = Y5 - YView / 100 * MAX_P_HEIGHT
X6 = X6 - XView / 100 * MAX_P_WIDTH
Y6 = Y6 - YView / 100 * MAX_P_HEIGHT

P.Line (X3, Y3)-(X4, Y4), vbBlack


P.Line (X4, Y4)-(X5, Y5), vbBlack
P.Line (X5, Y5)-(X6, Y6), vbBlack
P.Line (X6, Y6)-(X3, Y3), vbBlack
S = mvarVarOutList.ToString1CrLf
X3 = (mvarX - P.TextWidth(S) / 2) * TWIP2PIX
Y3 = (mvarY - P.TextHeight(S)) * TWIP2PIX
X3 = X3 - XView / 100 * MAX_P_WIDTH * TWIP2PIX
Y3 = Y3 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX

TextOut P.hdc, X3, Y3, S, Len(S)


End If

If mvarNodeType <> ntEnd Then


AnchorOut1 P, XView, YView, X3, Y3, X4, Y4, X5, Y5
P.Line (X3, Y3)-(X4, Y4), vbBlue
If mvarNodeType = ntIf Then
TextOut P.hdc, X5 * TWIP2PIX, Y5 * TWIP2PIX, TRUE_LABEL,
Len(TRUE_LABEL)
AnchorOut2 P, XView, YView, X3, Y3, X4, Y4, X5, Y5
P.Line (X3, Y3)-(X4, Y4), vbBlue
TextOut P.hdc, X5 * TWIP2PIX, Y5 * TWIP2PIX, FALSE_LABEL,
Len(FALSE_LABEL)
End If
End If
If mvarNodeType <> ntBegin Then
AnchorIn P, XView, YView, X3, Y3, X4, Y4, X5, Y5, X6, Y6
P.Line (X3, Y3)-(X4, Y4), vbBlue
P.Line (X3, Y3)-(X5, Y5), vbBlue
P.Line (X3, Y3)-(X6, Y6), vbBlue
Dim PNode As ClsNode
For Each PNode In mvarParentNode
PNode.AnchorOut1 P, XView, YView, X5, Y5, X6, Y6, X7, Y7
If Me Is PNode.NextNode2 Then
PNode.AnchorOut2 P, XView, YView, X5, Y5, X6, Y6, X7, Y7
End If
P.Line (X4, Y4)-(X6, Y6), vbBlue
Next
End If

Dim B As Boolean
B = False
If Not IsMissing(Sel) Then
B = Sel
End If
If B Then
P.DrawWidth = 2
X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 55


B¸o c¸o thùc tËp tèt nghiÖp
Y2 = (mvarY + MaxHeight(P) / 2)
X1 = X1 - XView / 100 * MAX_P_WIDTH
X2 = X2 - XView / 100 * MAX_P_WIDTH
Y1 = Y1 - YView / 100 * MAX_P_HEIGHT
Y2 = Y2 - YView / 100 * MAX_P_HEIGHT

P.Line (X1, Y1)-(X2, Y1), vbRed


P.Line (X2, Y1)-(X2, Y2), vbRed
P.Line (X2, Y2)-(X1, Y2), vbRed
P.Line (X1, Y2)-(X1, Y1), vbRed
P.DrawWidth = 1
End If
End Sub

Public Sub Draw2Print(Optional ByVal Sel As Boolean)


Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long, X3 As Long, Y3 As
Long
Dim X4 As Long, Y4 As Long, X5 As Long, Y5 As Long, X6 As Long, Y6 As
Long
Dim X7 As Long, Y7 As Long, X8 As Long, Y8 As Long, X9 As Long, Y9 As
Long
Dim S As String
Dim Pr As ClsNode

X1 = (mvarX - MaxWidthPrinter / 2) * TWIP2PIX


Y1 = (mvarY - MaxHeightPrinter / 2) * TWIP2PIX
X2 = (mvarX + MaxWidthPrinter / 2) * TWIP2PIX
Y2 = (mvarY + MaxHeightPrinter / 2) * TWIP2PIX
If mvarNodeType = ntBegin Then
Ellipse Printer.hdc, X1, Y1, X2, Y2
X3 = (mvarX - Printer.TextWidth(BEGIN_LABEL) / 2) * TWIP2PIX
Y3 = (mvarY - Printer.TextHeight(BEGIN_LABEL) / 2) * TWIP2PIX
TextOut Printer.hdc, X3, Y3, BEGIN_LABEL, Len(BEGIN_LABEL)
ElseIf mvarNodeType = ntEnd Then
Ellipse Printer.hdc, X1, Y1, X2, Y2
X3 = (mvarX - Printer.TextWidth(END_LABEL) / 2) * TWIP2PIX
Y3 = (mvarY - Printer.TextHeight(END_LABEL) / 2) * TWIP2PIX
TextOut Printer.hdc, X3, Y3, END_LABEL, Len(END_LABEL)
ElseIf mvarNodeType = ntCommand Then
Rectangle Printer.hdc, X1, Y1, X2, Y2
mvarCommandList.Draw2Printer mvarX, mvarY
ElseIf mvarNodeType = ntIf Then
X1 = X1 / TWIP2PIX
Y1 = Y1 / TWIP2PIX
X2 = X2 / TWIP2PIX
Y2 = Y2 / TWIP2PIX
X3 = (X1 + X2) / 2
Y3 = Y1
X4 = X2
Y4 = (Y1 + Y2) / 2
X5 = X3
Y5 = Y2
X6 = X1
Y6 = Y4
Printer.Line (X3, Y3)-(X4, Y4), vbBlack
Printer.Line (X4, Y4)-(X5, Y5), vbBlack
Printer.Line (X5, Y5)-(X6, Y6), vbBlack
Printer.Line (X6, Y6)-(X3, Y3), vbBlack
S = RemoveTag(Me.IFExp)
X3 = (mvarX - Printer.TextWidth(S) / 2) * TWIP2PIX

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 56


B¸o c¸o thùc tËp tèt nghiÖp
Y3 = (mvarY - Printer.TextHeight(S) / 2) * TWIP2PIX
TextOut Printer.hdc, X3, Y3, S, Len(S)
ElseIf mvarNodeType = ntInput Then
X1 = X1 / TWIP2PIX
Y1 = Y1 / TWIP2PIX
X2 = X2 / TWIP2PIX
Y2 = Y2 / TWIP2PIX
X3 = X1
Y3 = Y1
X4 = X2 + LX
Y4 = Y1
X5 = X2
Y5 = Y2
X6 = X3 - LX
Y6 = Y2
Printer.Line (X3, Y3)-(X4, Y4), vbBlack
Printer.Line (X4, Y4)-(X5, Y5), vbBlack
Printer.Line (X5, Y5)-(X6, Y6), vbBlack
Printer.Line (X6, Y6)-(X3, Y3), vbBlack
S = RemoveTag(mvarVarInList.ToString1)
X3 = (mvarX - Printer.TextWidth(S) / 2) * TWIP2PIX
Y3 = (mvarY - Printer.TextHeight(S)) * TWIP2PIX
TextOut Printer.hdc, X3, Y3, S, Len(S)
ElseIf mvarNodeType = ntOutput Then
X1 = X1 / TWIP2PIX
Y1 = Y1 / TWIP2PIX
X2 = X2 / TWIP2PIX
Y2 = Y2 / TWIP2PIX
X3 = X1 - LX
Y3 = Y1
X4 = X1
Y4 = Y2
X5 = X2 + LX
Y5 = Y2
X6 = X2
Y6 = Y1
Printer.Line (X3, Y3)-(X4, Y4), vbBlack
Printer.Line (X4, Y4)-(X5, Y5), vbBlack
Printer.Line (X5, Y5)-(X6, Y6), vbBlack
Printer.Line (X6, Y6)-(X3, Y3), vbBlack
S = mvarVarOutList.ToString1CrLf
X3 = (mvarX - Printer.TextWidth(S) / 2) * TWIP2PIX
Y3 = (mvarY - Printer.TextHeight(S)) * TWIP2PIX
TextOut Printer.hdc, X3, Y3, S, Len(S)
End If

If mvarNodeType <> ntEnd Then


AnchorOut1Printer X3, Y3, X4, Y4, X5, Y5
Printer.Line (X3, Y3)-(X4, Y4), vbBlue
If mvarNodeType = ntIf Then
TextOut Printer.hdc, X5 * TWIP2PIX, Y5 * TWIP2PIX, TRUE_LABEL,
Len(TRUE_LABEL)
AnchorOut2Printer X3, Y3, X4, Y4, X5, Y5
Printer.Line (X3, Y3)-(X4, Y4), vbBlue
TextOut Printer.hdc, X5 * TWIP2PIX, Y5 * TWIP2PIX,
FALSE_LABEL, Len(FALSE_LABEL)
End If
End If
If mvarNodeType <> ntBegin Then
AnchorInPrinter X3, Y3, X4, Y4, X5, Y5, X6, Y6

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 57


B¸o c¸o thùc tËp tèt nghiÖp
Printer.Line (X3, Y3)-(X4, Y4), vbBlue
Printer.Line (X3, Y3)-(X5, Y5), vbBlue
Printer.Line (X3, Y3)-(X6, Y6), vbBlue
Dim PNode As ClsNode
For Each PNode In mvarParentNode
PNode.AnchorOut1Printer X5, Y5, X6, Y6, X7, Y7
If Me Is PNode.NextNode2 Then
PNode.AnchorOut2Printer X5, Y5, X6, Y6, X7, Y7
End If
Printer.Line (X4, Y4)-(X6, Y6), vbBlue
Next
End If

Dim B As Boolean
B = False
If Not IsMissing(Sel) Then
B = Sel
End If
If B Then
X1 = (mvarX - MaxWidthPrinter / 2)
Y1 = (mvarY - MaxHeightPrinter / 2)
X2 = (mvarX + MaxWidthPrinter / 2)
Y2 = (mvarY + MaxHeightPrinter / 2)

Printer.Line (X1, Y1)-(X2, Y1), vbRed


Printer.Line (X2, Y1)-(X2, Y2), vbRed
Printer.Line (X2, Y2)-(X1, Y2), vbRed
Printer.Line (X1, Y2)-(X1, Y1), vbRed
End If
End Sub

Public Function VarUsed(ByVal VName As String) As Boolean


Dim L As Boolean
If mvarNodeType = ntBegin Then
L = False
ElseIf mvarNodeType = ntEnd Then
L = False
ElseIf mvarNodeType = ntCommand Then
L = mvarCommandList.VarUsed(VName)
ElseIf mvarNodeType = ntIf Then
L = (InStr(1, mvarIFExp, VAR_BEGIN_TAG & VName & END_TAG) > 0)
ElseIf mvarNodeType = ntInput Then
L = mvarVarInList.VarUsed(VName)
ElseIf mvarNodeType = ntOutput Then
L = mvarVarOutList.VarUsed(VName)
Else
L = False
End If
VarUsed = L
End Function

Public Function HitTest(ByVal P As PictureBox, ByVal XView As Long, ByVal


YView As Long, ByVal pX As Long, ByVal pY As Long) As Boolean
Dim X1 As Long, Y1 As Long
Dim X2 As Long, Y2 As Long

X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 58


B¸o c¸o thùc tËp tèt nghiÖp
Y2 = (mvarY + MaxHeight(P) / 2)
pX = XView / 100 * MAX_P_WIDTH + pX
pY = YView / 100 * MAX_P_HEIGHT + pY
HitTest = (pX >= X1 And pX <= X2 And pY >= Y1 And pY <= Y2)
End Function

Public Sub AnchorOut1(ByVal P As PictureBox, ByVal XView As Long, ByVal


YView As Long, X3 As Long, ByRef Y3 As Long, ByRef X4 As Long, ByRef Y4 As
Long, ByRef X5 As Long, ByRef Y5 As Long)
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long
X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)
Y2 = (mvarY + MaxHeight(P) / 2)
X1 = X1 - XView / 100 * MAX_P_WIDTH
Y1 = Y1 - YView / 100 * MAX_P_HEIGHT
X2 = X2 - XView / 100 * MAX_P_WIDTH
Y2 = Y2 - YView / 100 * MAX_P_HEIGHT

If mvarPOut1 = pBottom Then


X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y2
Y4 = Y3 + IOY
X5 = X4 + IOX
Y5 = Y4 + IOY
ElseIf mvarPOut1 = pTop Then
X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y1
Y4 = Y3 - IOY
X5 = X4 + IOX
Y5 = Y4 - P.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut1 = pLeft Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X1
X4 = X3 - IOX
X5 = X4 - P.TextWidth(TRUE_LABEL) - IOX
Y5 = Y4 - P.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut1 = pRight Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X2
X4 = X3 + IOX
X5 = X4 + IOX
Y5 = Y4 + IOY
End If
End Sub

Public Sub AnchorOut1Printer(ByRef X3 As Long, ByRef Y3 As Long, ByRef X4


As Long, ByRef Y4 As Long, ByRef X5 As Long, ByRef Y5 As Long)
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long
X1 = (mvarX - MaxWidthPrinter / 2)
Y1 = (mvarY - MaxHeightPrinter / 2)
X2 = (mvarX + MaxWidthPrinter / 2)
Y2 = (mvarY + MaxHeightPrinter / 2)

If mvarPOut1 = pBottom Then


X3 = (X1 + X2) / 2

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 59


B¸o c¸o thùc tËp tèt nghiÖp
X4 = X3
Y3 = Y2
Y4 = Y3 + IOY
X5 = X4 + IOX
Y5 = Y4 + IOY
ElseIf mvarPOut1 = pTop Then
X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y1
Y4 = Y3 - IOY
X5 = X4 + IOX
Y5 = Y4 - Printer.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut1 = pLeft Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X1
X4 = X3 - IOX
X5 = X4 - Printer.TextWidth(TRUE_LABEL) - IOX
Y5 = Y4 - Printer.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut1 = pRight Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X2
X4 = X3 + IOX
X5 = X4 + IOX
Y5 = Y4 + IOY
End If
End Sub

Public Sub AnchorOut2(ByVal P As PictureBox, ByVal XView As Long, ByVal


YView As Long, ByRef X3 As Long, ByRef Y3 As Long, ByRef X4 As Long, ByRef
Y4 As Long, ByRef X5 As Long, ByRef Y5 As Long)
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long
X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)
Y2 = (mvarY + MaxHeight(P) / 2)
X1 = X1 - XView / 100 * MAX_P_WIDTH
Y1 = Y1 - YView / 100 * MAX_P_HEIGHT
X2 = X2 - XView / 100 * MAX_P_WIDTH
Y2 = Y2 - YView / 100 * MAX_P_HEIGHT

If mvarPOut2 = pBottom Then


X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y2
Y4 = Y3 + IOY
X5 = X4 + IOX
Y5 = Y4 + IOY
ElseIf mvarPOut2 = pTop Then
X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y1
Y4 = Y3 - IOY
X5 = X4 + IOX
Y5 = Y4 - P.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut2 = pLeft Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X1

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 60


B¸o c¸o thùc tËp tèt nghiÖp
X4 = X3 - IOX
X5 = X4 - P.TextWidth(TRUE_LABEL) - IOX
Y5 = Y4 - P.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut2 = pRight Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X2
X4 = X3 + IOX
X5 = X4 + IOX
Y5 = Y4 + IOY
End If
End Sub

Public Sub AnchorOut2Printer(ByRef X3 As Long, ByRef Y3 As Long, ByRef X4


As Long, ByRef Y4 As Long, ByRef X5 As Long, ByRef Y5 As Long)
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long
X1 = (mvarX - MaxWidthPrinter / 2)
Y1 = (mvarY - MaxHeightPrinter / 2)
X2 = (mvarX + MaxWidthPrinter / 2)
Y2 = (mvarY + MaxHeightPrinter / 2)

If mvarPOut2 = pBottom Then


X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y2
Y4 = Y3 + IOY
X5 = X4 + IOX
Y5 = Y4 + IOY
ElseIf mvarPOut2 = pTop Then
X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y1
Y4 = Y3 - IOY
X5 = X4 + IOX
Y5 = Y4 - Printer.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut2 = pLeft Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X1
X4 = X3 - IOX
X5 = X4 - Printer.TextWidth(TRUE_LABEL) - IOX
Y5 = Y4 - Printer.TextHeight(TRUE_LABEL) - IOY
ElseIf mvarPOut2 = pRight Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X2
X4 = X3 + IOX
X5 = X4 + IOX
Y5 = Y4 + IOY
End If
End Sub

Public Sub AnchorIn(ByVal P As PictureBox, ByVal XView As Long, ByVal


YView As Long, ByRef X3 As Long, ByRef Y3 As Long, ByRef X4 As Long, ByRef
Y4 As Long, ByRef X5 As Long, ByRef Y5 As Long, ByRef X6 As Long, ByRef Y6
As Long)
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long
X1 = (mvarX - MaxWidth(P) / 2)
Y1 = (mvarY - MaxHeight(P) / 2)
X2 = (mvarX + MaxWidth(P) / 2)

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 61


B¸o c¸o thùc tËp tèt nghiÖp
Y2 = (mvarY + MaxHeight(P) / 2)
X1 = X1 - XView / 100 * MAX_P_WIDTH
Y1 = Y1 - YView / 100 * MAX_P_HEIGHT
X2 = X2 - XView / 100 * MAX_P_WIDTH
Y2 = Y2 - YView / 100 * MAX_P_HEIGHT

If mvarPIn = pBottom Then


X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y2
Y4 = Y3 + IOY
X5 = X3 - IOX
Y5 = Y3 + IOY
X6 = X3 + IOX
Y6 = Y5
ElseIf mvarPIn = pTop Then
X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y1
Y4 = Y3 - IOY
X5 = X3 - IOX
Y5 = Y3 - IOY
X6 = X3 + IOX
Y6 = Y5
ElseIf mvarPIn = pLeft Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X1
X4 = X3 - IOX
X5 = X3 - IOX
Y5 = Y3 - IOY
X6 = X5
Y6 = Y3 + IOY
ElseIf mvarPIn = pRight Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X2
X4 = X3 + IOX
X5 = X3 + IOX
Y5 = Y3 - IOY
X6 = X5
Y6 = Y3 + IOY
End If
End Sub

Public Sub AnchorInPrinter(ByRef X3 As Long, ByRef Y3 As Long, ByRef X4 As


Long, ByRef Y4 As Long, ByRef X5 As Long, ByRef Y5 As Long, ByRef X6 As
Long, ByRef Y6 As Long)
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long
X1 = (mvarX - MaxWidthPrinter / 2)
Y1 = (mvarY - MaxHeightPrinter / 2)
X2 = (mvarX + MaxWidthPrinter / 2)
Y2 = (mvarY + MaxHeightPrinter / 2)
If mvarPIn = pBottom Then
X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y2
Y4 = Y3 + IOY
X5 = X3 - IOX
Y5 = Y3 + IOY

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 62


B¸o c¸o thùc tËp tèt nghiÖp
X6 = X3 + IOX
Y6 = Y5
ElseIf mvarPIn = pTop Then
X3 = (X1 + X2) / 2
X4 = X3
Y3 = Y1
Y4 = Y3 - IOY
X5 = X3 - IOX
Y5 = Y3 - IOY
X6 = X3 + IOX
Y6 = Y5
ElseIf mvarPIn = pLeft Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X1
X4 = X3 - IOX
X5 = X3 - IOX
Y5 = Y3 - IOY
X6 = X5
Y6 = Y3 + IOY
ElseIf mvarPIn = pRight Then
Y3 = (Y1 + Y2) / 2
Y4 = Y3
X3 = X2
X4 = X3 + IOX
X5 = X3 + IOX
Y5 = Y3 - IOY
X6 = X5
Y6 = Y3 + IOY
End If
End Sub

Public Function ToPascal(ByVal VL As ClsVarList)


Dim S As String, V As ClsVar, S1 As String, S2 As String
Dim C As ClsCommand
S = "" & vbCrLf & mvarKey & ":" & vbCrLf
If mvarNodeType = ntInput Then
For Each V In mvarVarInList
S1 = V.VarName
S1 = Basic2Pascal(S1, VL)
If V.VarType = vtSingle Then
S = S & "write('Nhap " & S1 & ": ');" & vbCrLf
S = S & "readln(" & S1 & ");" & vbCrLf
Else
S = S & "NhapMang(" & S1 & ")"
End If
S = S & vbCrLf
Next
ElseIf mvarNodeType = ntOutput Then
For Each V In mvarVarOutList
S1 = V.VarName
S1 = Basic2Pascal(S1, VL)
If V.VarType = vtSingle Then
S = S & "writeln(" & S1 & ");" & vbCrLf
Else
S = S & "InMang(" & S1 & ")"
End If
S = S & vbCrLf
Next
ElseIf mvarNodeType = ntCommand Then

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 63


B¸o c¸o thùc tËp tèt nghiÖp
For Each C In mvarCommandList
S1 = Basic2Pascal(C.VarName, VL)
S2 = Basic2Pascal("" & C.Value, VL)
S = S & S1 & ":=" & S2 & ";" & vbCrLf
Next
ElseIf mvarNodeType = ntIf Then
S1 = Basic2Pascal(mvarIFExp, VL)
S = S & "if " & S1 & " then "
If Not (mvarNextNode1 Is Nothing) Then
S = S & " goto " & mvarNextNode1.Key & " "
End If
If Not (mvarNextNode2 Is Nothing) Then
S = S & "else goto " & mvarNextNode2.Key & " "
End If
S = S & ";" & vbCrLf
ElseIf mvarNodeType = ntEnd Then
S = S & "readln;halt;" & vbCrLf
End If
If mvarNodeType <> ntIf Then
If Not (mvarNextNode1 Is Nothing) Then
S = S & "goto " & mvarNextNode1.Key & ";"
End If
End If
ToPascal = S
End Function

Public Function ToString() As String


Dim S As String
If mvarNodeType = ntBegin Then
S = "BEGIN"
ElseIf mvarNodeType = ntCommand Then
S = "PROCESS [" & RemoveTag(mvarCommandList.ToString1) & "]"
ElseIf mvarNodeType = ntEnd Then
S = "END"
ElseIf mvarNodeType = ntIf Then
S = "IF [" & RemoveTag(mvarIFExp) & "]"
ElseIf mvarNodeType = ntOutput Then
S = "OUTPUT [" & RemoveTag(mvarVarOutList.ToString1) & "]"
ElseIf mvarNodeType = ntInput Then
S = "INPUT [" & RemoveTag(mvarVarInList.ToString1) & "]"
End If
ToString = S
End Function
ClsNodeList:

2. Lớp ClsNodeList:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "ClsNodeList"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 64


B¸o c¸o thùc tËp tèt nghiÖp
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Collection" ,"ClsNode"
Attribute VB_Ext_KEY = "Member0" ,"ClsNode"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
Private mCol As Collection
Private nCount As Long

Public Sub Save(ByRef T As TextStream)


Dim i As Long, N As ClsNode, N1 As ClsNode
Dim D As Long
T.WriteLine Me.Count
For Each N In Me
N.Save T
Next
For Each N In Me
T.WriteLine N.Key
T.WriteLine N.ParentNode.Count
For Each N1 In N.ParentNode
T.WriteLine N1.Key
Next
D = 0
If Not (N.NextNode1 Is Nothing) Then
D = D + 1
End If
If Not (N.NextNode2 Is Nothing) Then
D = D + 1
End If
T.WriteLine D
If Not (N.NextNode1 Is Nothing) Then
T.WriteLine N.NextNode1.Key
End If
If Not (N.NextNode2 Is Nothing) Then
T.WriteLine N.NextNode2.Key
End If
Next
End Sub

Public Sub Load(ByRef T As TextStream)


Dim i As Long, C As Long, N As ClsNode, N1 As ClsNode
Dim D As Long, K1 As String, K2 As String, J As Long
Me.Clear
C = Val(T.ReadLine)
For i = 1 To C
Set N = New ClsNode
N.Load T
Add N, True
Next
For i = 1 To C
K1 = T.ReadLine
D = Val(T.ReadLine)
For J = 1 To D
K2 = T.ReadLine
Me(K1).AddParent Me(K2)
Next
D = Val(T.ReadLine)
If D = 1 Then
K2 = T.ReadLine
Set Me(K1).NextNode1 = Me(K2)

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 65


B¸o c¸o thùc tËp tèt nghiÖp
ElseIf D = 2 Then
K2 = T.ReadLine
Set Me(K1).NextNode1 = Me(K2)
K2 = T.ReadLine
Set Me(K1).NextNode2 = Me(K2)
End If
Next
End Sub

Public Function Add(ByRef NN As ClsNode, Optional ByVal KeepKey As


Boolean) As ClsNode
On Error Resume Next
Dim B As Boolean
B = False
If Not IsMissing(KeepKey) Then
B = KeepKey
End If
If B Then
mCol.Add NN, NN.Key
Else
mCol.Add NN, "N" & nCount
NN.Key = "N" & nCount
nCount = nCount + 1
End If
Set Add = NN
End Function

Public Property Get Item(ByVal vntIndexKey As String) As ClsNode


Attribute Item.VB_UserMemId = 0
On Error Resume Next
Set Item = Nothing
Set Item = mCol(vntIndexKey)
End Property

Public Property Get Count() As Long


Count = mCol.Count
End Property

Public Sub Remove(ByVal vntIndexKey As String)


On Error Resume Next
mCol.Remove vntIndexKey
End Sub

Public Property Get NewEnum() As IUnknown


Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = mCol.[_NewEnum]
End Property

Private Sub Class_Initialize()


Set mCol = New Collection
nCount = 0
End Sub

Private Sub Class_Terminate()


Set mCol = Nothing
End Sub

Public Sub Clear()


On Error Resume Next

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 66


B¸o c¸o thùc tËp tèt nghiÖp
Set mCol = New Collection
nCount = 0
End Sub

Public Function VarUsed(ByVal VName As String) As Boolean


Dim V As ClsNode
For Each V In Me
If V.VarUsed(VName) Then
VarUsed = True
Exit Function
End If
Next
VarUsed = False
End Function

Public Function HadBegin() As Boolean


Dim N As ClsNode
For Each N In Me
If N.NodeType = ntBegin Then
HadBegin = True
Exit Function
End If
Next
HadBegin = False
End Function

Public Function HitTest(ByVal P As PictureBox, ByVal XView As Long, ByVal


YView As Long, ByVal X As Long, ByVal Y As Long) As ClsNode
Dim N As ClsNode
For Each N In Me
If N.HitTest(P, XView, YView, X, Y) Then
Set HitTest = N
Exit Function
End If
Next
Set HitTest = Nothing
End Function

Public Function NextKey() As String


NextKey = "N" & (nCount)
End Function

3.ClsCommand:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "ClsCommand"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 67


B¸o c¸o thùc tËp tèt nghiÖp
Public Enum eCommandType
ctAssign = 1
ctProcCall = 2
End Enum

Private mvarCommandType As eCommandType


Private mvarVarName As String
Private mvarValue As String
Private mvarKey As String

Public Sub Save(ByRef T As TextStream)


T.WriteLine "" & mvarCommandType
T.WriteLine mvarVarName
T.WriteLine mvarValue
T.WriteLine mvarKey
End Sub

Public Sub Load(ByRef T As TextStream)


mvarCommandType = Val(T.ReadLine)
mvarVarName = T.ReadLine
mvarValue = T.ReadLine
mvarKey = T.ReadLine
End Sub

Public Property Let Value(ByVal vData As Variant)


mvarValue = vData
End Property

Public Property Get Value() As Variant


Value = mvarValue
End Property

Public Property Let VarName(ByVal vData As String)


mvarVarName = vData
End Property

Public Property Get VarName() As String


VarName = mvarVarName
End Property

Public Property Let CommandType(ByVal vData As eCommandType)


mvarCommandType = vData
End Property

Public Property Get CommandType() As eCommandType


CommandType = mvarCommandType
End Property

Private Sub Class_Initialize()


mvarCommandType = ctAssign
End Sub

Public Function ToString() As String


Dim V As ClsVar, TS As String, S As String
S = mvarValue
S = Replace(S, VAR_BEGIN_TAG, "")
S = Replace(S, END_TAG, "")
If mvarCommandType = ctAssign Then
TS = mvarVarName & "=" & S
End If

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 68


B¸o c¸o thùc tËp tèt nghiÖp
ToString = TS
End Function

Public Function VarUsed(ByVal VName As String) As Boolean


Dim L As Boolean
If mvarCommandType = ctAssign Then
L = (VName = mvarVarName)
Else
L = False
End If
End Function

Public Property Let Key(ByVal vData As String)


mvarKey = vData
End Property

Public Property Get Key() As String


Key = mvarKey
End Property

4. ClsCommandL ist:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "ClsCommandList"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Collection" ,"ClsCommand"
Attribute VB_Ext_KEY = "Member0" ,"ClsCommand"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
Private mCol As Collection
Private nCount As Long

Public Sub Save(ByRef T As TextStream)


Dim i As Long, C As ClsCommand
T.WriteLine Me.Count
For Each C In Me
C.Save T
Next
End Sub

Public Sub Load(ByRef T As TextStream)


Dim i As Long, C As ClsCommand, N As Long
Me.Clear
N = Val(T.ReadLine)
For i = 1 To N
Set C = New ClsCommand
C.Load T
AddAssign C.VarName, C.Value

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 69


B¸o c¸o thùc tËp tèt nghiÖp
Next
End Sub

Public Function AddAssign(ByVal VarName As String, ByVal E As String) As


ClsCommand
Dim objNewMember As ClsCommand
Set objNewMember = New ClsCommand

objNewMember.CommandType = ctAssign
objNewMember.VarName = VarName
objNewMember.Value = E

mCol.Add objNewMember, "C" & nCount


objNewMember.Key = "C" & nCount
nCount = nCount + 1
Set AddAssign = objNewMember
Set objNewMember = Nothing
End Function

Public Function AddProcCall(ByVal ProcName As String) As ClsCommand


Dim objNewMember As ClsCommand
Set objNewMember = New ClsCommand

objNewMember.CommandType = ctProcCall
objNewMember.VarName = ProcName

mCol.Add objNewMember, "C" & nCount


nCount = nCount + 1
Set AddProcCall = objNewMember
Set objNewMember = Nothing
End Function

Public Property Get Item(ByVal vntIndexKey As String) As ClsCommand


Attribute Item.VB_UserMemId = 0
On Error Resume Next
Set Item = Nothing
Set Item = mCol(vntIndexKey)
End Property

Public Property Get Count() As Long


Count = mCol.Count
End Property

Public Sub Remove(ByVal vntIndexKey As String)


On Error Resume Next
mCol.Remove vntIndexKey
End Sub

Public Property Get NewEnum() As IUnknown


Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = mCol.[_NewEnum]
End Property

Private Sub Class_Initialize()


Set mCol = New Collection
nCount = 0
End Sub

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 70


B¸o c¸o thùc tËp tèt nghiÖp
Private Sub Class_Terminate()
Set mCol = Nothing
End Sub

Public Sub Clear()


Set mCol = New Collection
nCount = 0
End Sub

Public Function MaxWidth(ByVal P As PictureBox) As Long


Dim C As ClsCommand, L As Long
L = 0
For Each C In Me
If P.TextWidth(C.ToString) > L Then
L = P.TextWidth(C.ToString)
End If
Next
MaxWidth = L
End Function

Public Function MaxWidthPrinter() As Long


Dim C As ClsCommand, L As Long
L = 0
For Each C In Me
If Printer.TextWidth(C.ToString) > L Then
L = Printer.TextWidth(C.ToString)
End If
Next
MaxWidthPrinter = L
End Function

Public Function MaxHeight(ByVal P As PictureBox) As Long


MaxHeight = Me.Count * 3 * P.TextHeight("H") / 2
End Function

Public Function MaxHeightPrinter() As Long


MaxHeightPrinter = Me.Count * 3 * Printer.TextHeight("H") / 2
End Function

Public Function ToString() As String


Dim C As ClsCommand, TS As String
TS = ""
For Each C In Me
TS = TS & C.ToString & vbCrLf
Next
ToString = TS
End Function

Public Function ToString1() As String


Dim C As ClsCommand, TS As String
TS = ""
For Each C In Me
TS = TS & C.ToString & ";"
Next
ToString1 = TS
End Function

Public Sub Draw(ByVal P As PictureBox, ByVal XView As Long, ByVal YView As


Long, ByVal X As Long, ByVal Y As Long)
Dim C As ClsCommand, Y1 As Long, S As String, X1 As Long

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 71


B¸o c¸o thùc tËp tèt nghiÖp
Dim X2 As Long, Y2 As Long
Y1 = (Y - 3 * Me.Count / 2 * P.TextHeight("P") / 2) * TWIP2PIX
For Each C In Me
S = RemoveTag(C.ToString)
X1 = (X - P.TextWidth(S) / 2) * TWIP2PIX
X2 = X1 - XView / 100 * MAX_P_WIDTH * TWIP2PIX
Y2 = Y1 - YView / 100 * MAX_P_HEIGHT * TWIP2PIX
TextOut P.hdc, X2, Y2, S, Len(S)
Y1 = Y1 + (3 * P.TextHeight(S) / 2) * TWIP2PIX
Next
End Sub

Public Sub Draw2Printer(ByVal X As Long, ByVal Y As Long)


Dim C As ClsCommand, Y1 As Long, S As String, X1 As String
Y1 = (Y - 3 * Me.Count / 2 * Printer.TextHeight("P") / 2) * TWIP2PIX
For Each C In Me
X1 = (X - Printer.TextWidth(C.ToString) / 2) * TWIP2PIX
TextOut Printer.hdc, X1, Y1, C.ToString, Len(C.ToString)
Y1 = Y1 + (3 * Printer.TextHeight(C.ToString) / 2) * TWIP2PIX
Next
End Sub

Public Function VarUsed(ByVal VName As String) As Boolean


Dim C As ClsCommand
For Each C In Me
If C.VarUsed(VName) Then
VarUsed = True
Exit Function
End If
Next
VarUsed = False
End Function

5. ClsVar:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "ClsVarList"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Collection" ,"ClsVar"
Attribute VB_Ext_KEY = "Member0" ,"ClsVar"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
Private mCol As Collection

Public Sub Save(ByRef T As TextStream)


Dim V As ClsVar
T.WriteLine Me.Count
For Each V In Me
V.Save T

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 72


B¸o c¸o thùc tËp tèt nghiÖp
Next
End Sub

Public Sub Load(ByRef T As TextStream)


Dim N As Long, i As Long, V As ClsVar, A(0 To 1000) As String
Me.Clear
N = Val(T.ReadLine)
For i = 1 To N
Set V = New ClsVar
V.Load T
If V.VarType = vtSingle Then
AddSingle V.VarName, V.DataType, V.Value
Else
AddArray V.VarName, V.DataType, A
End If
Next
End Sub

Public Function AddSingle(ByVal VarName As String, ByVal DataType As


eDataType, ByVal Value As Variant) As ClsVar
Dim objNewMember As ClsVar
Set objNewMember = New ClsVar

objNewMember.VarName = VarName
objNewMember.DataType = DataType
objNewMember.Value = Value

objNewMember.VarType = vtSingle

mCol.Add objNewMember, VarName


Set AddSingle = objNewMember
Set objNewMember = Nothing
End Function

Public Function AddVar(ByRef V As ClsVar) As ClsVar


mCol.Add V, V.VarName
Set AddVar = V
End Function

Public Function AddArray(ByVal VarName As String, ByVal DataType As


eDataType, Value() As String) As ClsVar
Dim objNewMember As ClsVar, i As Long
Set objNewMember = New ClsVar

objNewMember.VarName = VarName
objNewMember.DataType = DataType

objNewMember.VarType = vtArray
For i = LBound(Value) To UBound(Value)
objNewMember.Value(i) = Value(i)
Next
mCol.Add objNewMember, VarName
Set AddArray = objNewMember
Set objNewMember = Nothing
End Function

Public Property Get Item(ByVal vntIndexKey As String) As ClsVar

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 73


B¸o c¸o thùc tËp tèt nghiÖp
Attribute Item.VB_UserMemId = 0
On Error Resume Next
Set Item = Nothing
Set Item = mCol(vntIndexKey)
End Property

Public Property Get Count() As Long


Count = mCol.Count
End Property

Public Sub Remove(ByVal vntIndexKey As String)


On Error Resume Next
mCol.Remove vntIndexKey
End Sub

Public Property Get NewEnum() As IUnknown


Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = mCol.[_NewEnum]
End Property

Private Sub Class_Initialize()


Set mCol = New Collection
End Sub

Private Sub Class_Terminate()


Set mCol = Nothing
End Sub

Public Sub Clear()


On Error Resume Next
Set mCol = New Collection
End Sub

Public Function MaxWidth(ByVal P As PictureBox) As Long


Dim V As ClsVar, L As Long
MaxWidth = P.TextWidth(Me.ToString1)
End Function

Public Function MaxWidthPrinter() As Long


Dim V As ClsVar, L As Long
MaxWidthPrinter = Printer.TextWidth(Me.ToString1)
End Function

Public Function ToString1() As String


Dim V As ClsVar, TS As String
TS = ""
For Each V In Me
TS = TS & V.ToString1 & ","
Next
If TS <> "" Then
TS = Left(TS, Len(TS) - 1)
End If
ToString1 = TS
End Function

Public Function ToString1CrLf() As String


Dim V As ClsVar, TS As String, S As String
TS = ""
For Each V In Me

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 74


B¸o c¸o thùc tËp tèt nghiÖp
S = V.VarName
S = Replace(S, VAR_BEGIN_TAG, "")
S = Replace(S, END_TAG, "")
TS = TS & S & ", "
Next
If TS <> "" Then
TS = Left(TS, Len(TS) - Len(", "))
End If
ToString1CrLf = TS
End Function

Public Function ToString2() As String


Dim V As ClsVar, TS As String
TS = ""
For Each V In Me

TS = TS & V.ToString2 & ","


Next
TS = Left(TS, Len(TS) - 1)
ToString2 = TS
End Function

Public Function ToString2CrLf() As String


Dim V As ClsVar, TS As String
TS = ""
For Each V In Me
TS = TS & V.ToString2 & vbCrLf
Next
TS = Left(TS, Len(TS) - Len(vbCrLf))
ToString2CrLf = TS
End Function

Public Function VarUsed(ByVal VName As String) As Boolean


VarUsed = Not (Me(VName) Is Nothing)
End Function

Public Function ToPascal() As String


Dim S As String, V As ClsVar
S = ""
For Each V In Me
If V.VarType = vtSingle Then
S = S & RemoveTag(V.VarName) & ":" & V.DataTypeName & ";" &
vbCrLf
Else
S = S & RemoveTag(V.VarName) & ":array[0..1000] of " &
V.DataTypeName & ";" & vbCrLf
End If
Next
ToPascal = S
End Function

6. ClsVarL ist:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 75


B¸o c¸o thùc tËp tèt nghiÖp
END
Attribute VB_Name = "ClsProgram"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
Private mvarVarList As ClsVarList
Private mvarNodeList As ClsNodeList
Private mvarProgramName As String
Private mvarComment As String
Private mvarFileName As String
Private mvarXView As Long
Private mvarYView As Long
Public Property Let YView(ByVal vData As Long)
mvarYView = vData
End Property

Public Property Get YView() As Long


YView = mvarYView
End Property

Public Property Let XView(ByVal vData As Long)


mvarXView = vData
End Property

Public Property Get XView() As Long


XView = mvarXView
End Property

Public Property Let Comment(ByVal vData As String)


mvarComment = vData
End Property

Public Property Get Comment() As String


Comment = mvarComment
End Property

Public Property Let FileName(ByVal vData As String)


mvarFileName = vData
End Property

Public Property Get FileName() As String


FileName = mvarFileName
End Property

Public Property Let ProgramName(ByVal vData As String)


mvarProgramName = vData
End Property

Public Property Get ProgramName() As String


ProgramName = mvarProgramName
End Property

Public Property Set NodeList(ByVal vData As ClsNodeList)


Set mvarNodeList = vData
End Property

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 76


B¸o c¸o thùc tËp tèt nghiÖp
Public Property Get NodeList() As ClsNodeList
Set NodeList = mvarNodeList
End Property

Public Property Set VarList(ByVal vData As ClsVarList)


Set mvarVarList = vData
End Property

Public Property Get VarList() As ClsVarList


Set VarList = mvarVarList
End Property

Private Sub Class_Initialize()


Set mvarVarList = New ClsVarList
Set mvarNodeList = New ClsNodeList
mvarProgramName = ""
mvarComment = ""
mvarFileName = ""
mvarXView = 0
mvarYView = 0
End Sub

Public Function Load(ByVal FileName As String) As Boolean


Dim FSO As New FileSystemObject, T As TextStream
Set T = FSO.OpenTextFile(FileName)
mvarProgramName = T.ReadLine
mvarComment = T.ReadLine
mvarNodeList.Load T
mvarVarList.Load T
T.Close
Load = True
End Function

Public Function Save(ByVal FileName As String) As Boolean


Dim FSO As New FileSystemObject, T As TextStream
Set T = FSO.CreateTextFile(FileName)
T.WriteLine Me.ProgramName
T.WriteLine Me.Comment
mvarNodeList.Save T
mvarVarList.Save T
T.Close
Save = True
End Function

Public Function VarUsed(ByVal VName As String) As Boolean


Dim L As Boolean

L = mvarNodeList.VarUsed(VName)
VarUsed = L
End Function

Public Function ToPascal() As String


Dim S As String, SLabel As String, N As ClsNode
Dim SVar As String, C As ClsCommand
S = "program " & ToPascalName(mvarProgramName) & ";" & vbCrLf
S = S & "uses bstring;" & vbCrLf
S = S & "{ Ma nguon duoc tao ngay " & Date & ", thoi gian " & Time
& vbCrLf
S = S & "Chu y: Phai copy theo file Unit BSTRING.PAS }" & vbCrLf
If mvarNodeList.Count > 0 Then

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 77


B¸o c¸o thùc tËp tèt nghiÖp
SLabel = ""
For Each N In mvarNodeList
SLabel = SLabel & N.Key & ", "
Next
If SLabel <> "" Then
SLabel = Left(SLabel, Len(SLabel) - Len(", "))
End If
S = S & "label " & SLabel & ";" & vbCrLf
End If
SVar = mvarVarList.ToPascal
If SVar <> "" Then
S = S & "var " & SVar
End If
S = S & "begin" & vbCrLf
For Each N In mvarNodeList
S = S & N.ToPascal(mvarVarList)
Next
S = S & "end." & vbCrLf '
ToPascal = S
End Function

Public Sub DrawNodes(ByRef P As PictureBox, ByVal CN As ClsNode)


Dim N As ClsNode, L As ClsNodeList
Set L = mvarNodeList
For Each N In L
N.Draw P, mvarXView, mvarYView, (N Is CN)
Next
End Sub

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 78


B¸o c¸o thùc tËp tèt nghiÖp

TÀI LIỆU THAM KHẢO

1. Tin học 10 – NXB Giáo dục và Đào tạo – 1998.


2. Cấu trúc dữ liệu và Giải thuật – Đỗ Xuân Lôi - NXB
Khoa học kỹ thuật – 2001.
3. Microsoft Visual Basic 6.0 – The Complete
Reference – Peter Norton – McMilan Press -2001.
4. Coding Visual Basic – 2nd Edition – Mark Watson –
1998.

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 79


B¸o c¸o thùc tËp tèt nghiÖp

MỤC LỤC
LỜI GIỚI THIỆU.............................................................. ...........1
Chương I: MỤC ĐÍCH YÊU CẦU CỦA BÀI TOÁN..........................2
1. Mục đích:................................................................ ...........2
2. Yêu cầu:.................................................................... .........2
Chương II: CƠ SỞ LÝ THUYẾT...................................................3
1. Thuật toán:.................................................................. ......3
1.1. Định nghĩa về giải thuật..................................... ........3
1.2. Giải thuật theo cách hiểu thông thường............3
1.3. Các thao tác trong thuật giải.............................3
1.4. Định nghĩa......................................................... ..4
1.5. Từ giải thuật đến chương trình....................... .....4
2. Các phương pháp biểu diễn:.............................................4
2.1.Các phương pháp biểu diễn giải thuật.........................4
2.1.1.Phương pháp biểu diễn từng bước............................4
2.2.Thiết kế và phân tích giải thuật...................................8
Chương III: TÌM HIỂU NGÔN NGỮ THỰC HIỆN.........................11
I. Tổng quan về ngôn ngữ lập trình Visual Basic.................11
II. Cấu trúc của một ứng dụng Visual Basic.........................13
III. Chúng ta có thể làm gì với Visual Basic...................... ....13
IV. Tóm tắt ngôn ngữ...........................................................16
1. Biến................................................................. .............16
2. Các kiểu dữ liệu trong Visual Basic.............................17
3. Các toán tử và hàm trong Visual Basic..................... ...18
4. Cấu trúc tuyển và cấu trúc lặp......................... ...........20
5. Thủ tục........................................................ ................21
Chương IV: MÔ HÌNH, PHƯƠNG HƯỚNG GIẢI QUYẾT.............23
1. Mô hình.................................... .......................................23
2. Phương pháp giải quyết..................................................25
3. Thiết kế dữ liệu trong ngôn ngữ Visual Basic...............28
Chương V: Cài đặt và sử dụng chương trình...........................31
1. Cài đặt chương trình:..................................................... ..31
1.1. Chạy chương trình:.............................................. ......31
1.2. Biến.............................................................. .............31
1.3. Soạn thảo lưu đồ thuật toán.....................................32
1.4. Soạn thảo nội dung của các nút khối:.......................33
1.5. Chạy thử chương trình:.............................................43
1.6. Tạo mã Pascal................................. ..........................45
Chương VI: NỘI DUNG CÁC LỚP ĐÃ CÀI ĐẶT..........................48
1. Lớp ClsNode:.................................... ...............................48
2. Lớp ClsNodeList:....................................................... .......64

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 80


B¸o c¸o thùc tËp tèt nghiÖp

3.ClsCommand:............................................... ....................67
4. ClsCommandL ist:...........................................................69
5. ClsVar:...................................................... .......................72
6. ClsVarL ist:............................. .........................................75
TÀI LIỆU THAM KHẢO..................................... .........................79
MỤC LỤC............................................................................... ..80

Trương Viết Thiện Lớp KSII- Khoá 3. Trang 81

Rate