CẤU TRÚC ĐIỀU KIỆN IF ELSE END

Tìm thấy 10,000 tài liệu liên quan tới từ khóa "CẤU TRÚC ĐIỀU KIỆN IF ELSE END":

ỨNG DỤNG MATLAB TRONG CHUYÊN NGÀNH

ỨNG DỤNG MATLAB TRONG CHUYÊN NGÀNH

CÁC CÂU LỆNH ĐIỀU KIỆN 1 CẤU TRÚC LỰA CHỌN THEO ĐIỀU KIỆN IF … ELSE … END IF ĐIỀU KIỆN 1 CÔNG VIỆC THEO ĐIỀU KIỆN 1 ELSEIF ĐIỀU KIỆN 2 CÔNG VIỆC THEO ĐIỀU KIỆN 2 ELSEIF ……… ELSE CÔNG VIỆ[r]

20 Đọc thêm

CÁC CẤU TRÚC CÂU ĐIỀU KIỆN ĐẶC BIỆT

CÁC CẤU TRÚC CÂU ĐIỀU KIỆN ĐẶC BIỆT

+ V(nguyên thể).Were + S + to + V(nguyên thể), S + would/ should +V(nguyên thể)Ví dụ:- Câu điều kiện chứa “if”: If my mother stayed at home now,she would cook a lot of delicious food. (Nếu mẹ của tôi ở nhàbây giờ, bà ấy sẽ nấu rất nhiều thức ăn ngon.)-> Câu đảo ngữ: Were my mother to stay at home now,she would cook a lot of delicious food. (Nếu mẹ của tôi ở nhàbây giờ, bà ấy sẽ nấu rất nhiều thức ăn ngon.)* Đảo ngữ câu điều kiện loại III:Đối với đảo ngữ câu điều kiện loại III ta chỉ việc đảo “had” lêntrước chủ ngữ.Had + S + VpII, S + would/should + have + VpIIVí dụ:- Câu điều kiện chứa “if”: If you had gone to the cinema withme yesterday, you would have been satisfied with the film.(Nếubạn đi xem phim với tôi ngày hôm qua, bạn sẽ thấy thỏa mãnvới bộ phim.)-> Câu đảo ngữ: Had you gone to the cinema with meyesterday, you would have been satisfied with the film. .(Nếubạn đi xem phim với tôi ngày hôm qua, bạn sẽ thấy thỏa mãnvới bộ phim.)CHÚ Ý:Trong mệnh đề điều kiện đảo ngữ, nếu có “not” thì “not” phảiđứng sau chủ ngữ.Ví dụ:- Câu điều kiện chứa “If”: If he hadn’t come on time, I would
Xem thêm

5 Đọc thêm

De cuong on tap tin lop 8 HK1 20122013 co phuong

DE CUONG ON TAP TIN LOP 8 HK1 20122013 CO PHUONG

ĐỀ CƯƠNG ÔN TẬP MÔN TIN HỌC 8
Hoc kì I – Năm học: 2012 – 2013
Phần 1: Lập trình đơn giản
Bài 1: Máy tính và chương trình máy tính
Bài 2: Làm quen với chương trình và ngôn ngữ lập trình
Bài 3: Chương trình máy tính và dữ liệu
Bài 4: Sử dụng biến trong chương trình
Bài 5 Từ bài toán đến chương trình
Bài 6: Câu lệnh điều kiện
A.PHẦN TRẮC NGHIỆM: Trả lời các câu hỏi trong sách bài tập.
Hãy khoanh tròn vào câu trả lời mà em cho là đúng nhất.
Câu 1: Sau khi soạn thảo, ta nhấn tổ hợp nào để dịch và chạy chương trình
A. Alt + F9 B. Ctrl + F6 C. Ctrl + F9 D. Alt + F6
Câu 2: Integer là kiểu dữ liệu?
A. Số nguyên B. Số thực C. Chuỗi D. Chữ
Câu 3: Cách chuyển biểu thức ax2 +bx+c nào sau đây là đúng
A. ax2 +bx+c B. axx+bx+cx
C. axx +b.x +cx D. axx + bx+c
Câu 4: Kiểu dữ liệu String có phạm vi giá trị là
A. Một ký tự trong bảng chữ cái B. Xâu ký tự tối đa 522 ký tự
C. Xâu ký tự tối đa 525 ký tự D. Xâu ký tự tối đa 255 ký tự
Câu 5: Div là phép toán gì?
A. Chia lấy phần nguyên B. Chia lấy phần dư
C. Cộng D. Trừ
Câu 6: Lệnh Write tương tự như lệnh Writeln nhưng
A. Không đưa con trỏ xuống đầu dòng tiếp theo
B. Đưa con trỏ xuống đầu dòng tiếp theo
C. Bỏ trong dấu ngoặc đơn
D. Bỏ trong dấu ngoặc kép
Câu 7: Trong Pascal, khai báo nào sau đây là đúng
A. Const x:real; B. Var 4hs: Integer C. Var Tb : real; D. Var R=30;
Câu 8: Trong một chương trình, có tất cả bao nhiêu từ khóa để khai báo biến?
A. 4 B. 2 C. 3 D. 1
Câu 9: Câu lệnh Writeln(:n:m) giúp ta làm gì?
A. Điều khiển cách in số nguyên ra màn hình
B. Điều khiển cách in số thực ra màn hình
C. Điều khiển cách in chuỗi ra màn hình
D. Tất cả đều sai
Câu 10. Khởi động Turbo Pascal bằng cách:
A. Nháy phải chuột vào biểu tượng Turbo màn hình nền
B. Nháy đúp chuột vào biểu tượng Turbo trên màn hình nền
C. Nháy chuột vào biểu tượng Turbo trên màn hình nền
D. Nháy đúp chuột phải vào biểu tượng Turbo trên màn hình
Câu 11. IF a>8 THEN b:=3 ELSE b:=5; Khi a nhận giá trị là 0 thì b nhận giá trị nào?
A. 3 B. 5 C. 0 D. 8
Câu 12. Dãy kí tự 20n10 thuộc kiểu dữ liệu
A. Real B. Integer C. String D. Char
Câu 13. Biểu thức toán học được biểu diễn trong Pascal là?
A. (184)(6+14) B. 1846+14 C. (18 4)(6+1)4 D. (184)6+14
Câu 14. Cấu trúc chung hợp lý của một chương trình Pascal là:
A. Begin > Program > End B. Program > End > Begin
C. End > Program > Begin D. Program > Begin > End
Câu 15. Biểu thức toán học (a2 + b)(1 + c)3 được biểu diễn trong Pascal như thế nào ?
A. (aa + b)(1+c)(1 + c)(1 + c) B (a.a + b)(1 + c)(1 + c)(1 + c)
C. (aa + b)(1 + c)(1 + c)(1 + c) D. (a2 + b)(1 + c)3
Câu 16: Trong Pascal, với câu lệnh như sau: Writeln (‘KQ là:’, a); cái gì sẽ in ra màn hình?
A. Ket qua la: a B. Không đưa ra gì cả
C. KQ la a D. KQ la:
Câu 27: Ngôn ngữ lập trình là
A) Chương trình máy tính B) Một thuật toán
C) Môi trường lập trình D) Ngôn ngữ dùng để viết các chương trình máy tính
Câu 18: Trong các câu lệnh Pascal sau, câu nào được viết đúng:
A. if x:=5 then; a=b B. if; x>5 then a:=b
C. if x>5; then a:=b D. if x>5 then a:=b else a<>b;
Câu 19: Quá trình giải bài toán trên máy tính theo trình tự các bước sau:
A. Xác định bài toán →Viết chương trình→Mô tả thuật toán.
B. Mô tả thuật toán→Viết chương trình→ Xác định bài toán.
C. Xác định bài toán →Mô tả thuật toán→Viết chương trình.
D. Viết chương trình→Mô tả thuật toán→ Xác định bài toán
Câu 20: Sau câu lệnh dưới đây thì giá trị của X là bao nhiêu, nếu trước đó giá trị của X bằng 11:
if X>10 then X:=X+1;
A.11 B. 10 C. 9 D.12
B. PHẦN TỰ LUẬN:
Câu 1: a, Em hãy cho biết các thành phần cơ bản của một ngôn ngữ lập trình?
b, Trình bày các thành phần chính trong cấu trúc của chương trình?
Câu 2: Em hãy viết 2 câu lệnh điều kiện: Dạng thiếu và dạng đầy đủ trong ngôn ngữ lập trình Pascal? Trình bày sơ đồ khối.
Câu 3: Cho a = 9, b=8. Tìm kết quả của biến S sau mỗi câu lện sau đây, với ban đầu giá trị của S bằng 0.
a) If (a+b) mod 2 = 0 then S:=ab;
 S=…0…vì (a+b)=(9+8)=17 mod 2 =1. Đk sai S=0;
b) If (a >=b ) or (a>9) then S:=b else S:=a;
 S= 8. Vì ĐK (a>=b) đúng nên thực hiện S:=b=8;
Câu 4: Hãy chỉ ra INPUT(đầu vào), OUTPUT(đầu ra) và mô tả thuật của bài toán: Giải phương trình bậc nhất dạng tổng quát bx+c=0
INPUT: Các số a,b,c
OUTPUT: Nghiệm của phương trình bậc nhất
Bước 1: Nếu b=0 chuyển đến bước 3
Bước 2: Tính nghiệm của phương trình x:=cb và chuyển đến bước 4.
Bước 3: Nếu c0, thông báo phương trình đã cho vô nghiệm. Ngược lại (c=0), thông báo phương trình vô số nghiệm.
Bước 4: Kết thúc.
Câu 5: Viết các biểu thức toán dưới đây bằng các kí hiệu trong Pascal:
a. = 1b+1d
b. = 1xa5(b+2)+a
c. 20 x 4 – 20 + 10 = 204 – 20+10
d. ax2 + bx + c= axx+bx+c
e. (a2 + b)(1 + c)3 = (aa + b)(1 + c)(1 + c)(1 + c)
f. 5x2 + 2x – 4x + 15 =5xx +2x4x+15
g. = (18 4)(6+1)4
h. a2x2 +bx+c = aaxx+bx+c

Các dạng Bài tập Chương trình PASCAL
1. Viết chương trình tính chu vi và diện tích của hình chữ nhật có chiều dài hai cạnh là a, b (được nhập từ bàn phím).
a. Hướng dẫn:
Nhập hai cạnh vào hai biến a, b.
Chu vi hình chữ nhật bằng 2(a+b); Diện tích hình chữ nhật bằng ab.
b. Bài giải:
Program Chu_nhat;
uses crt;
Var a, b, S, CV: real;
Begin
Write(Nhap chieu dai:); readln(a);
Write(Nhap chieu rong:); readln(b);
S := ab;
CV := (a+b)2;
Writeln(Dien tich hinh chu nhat la:,S);
Writeln(Chu vi hinh chu nhat la:,CV:10:2);
readln
end.

2. Viết chương trình tính chu vi, diện tích hình vuông có cạnh a (được nhập từ bàn phím).
a. Hướng dẫn:
Nhập cạnh vào biến canh.
Chu vi hình vuông bằng 4canh; Diện tích hình vuông bằng canhcanh.
b. Bài giải:
Program HINH_VUONG;
uses crt;
Var canh: real;
Begin
clrscr;
Write(Nhap do dai canh:);readln(canh);
Writeln(Chu vi hinh vuong la:,4canh:10:2);
Writeln(Dien tich hinh vuong la:,canhcanh:10:2);
readln
end.
3. Viết chương trình tính chu vi và diện tích hình tròn có bán kính r (được nhập từ bàn phím).
a. Hướng dẫn:
Nhập bán kính vào biến r.
Chu vi đường tròn bằng 2r.
Diện tích hình tròn bằng rr.
b. Bài giải:
Program HINH_TRON;
uses crt;
Var r: real;
Begin
clrscr;
Write(Nhap ban kinh:); readln(r);
Writeln(Chu vi duong tron la:,2pir:10:2);
Writeln(Dien tich hinh tron la:,pirr:10:2);
readln
end.
4. Viết chương trình cho phép tính trung bình cộng của bốn số.
a. Hướng dẫn:
Nhập bốn số vào bốn biến a, b, c, d
Trung bình cộng của a, b, c, d bằng (a + b + c + d)4.
b. Bài giải:
Program TB_Cong_4_So;
uses crt;
Var a, b, c, d: real;
Begin
Clrscr;
Write(Nhap so thu nhat:);readln(a);
Write(Nhap so thu hai:);readln(b);
Write(Nhap so thu ba:);readln(c);
Write(Nhap so thu tu:);readln(d);
Writeln(Trung binh cong: ,(a+b+c+d)4):10:2;
Readln
end.
5. Viết chương trình in ra số lớn hơn trong hai số (được nhập từ bàn phím).
a. Hướng dẫn:
Nhập hai số vào hai biến a, b.
Nếu a > b thì in a. Nếu a <= b thì in b.
Hoặc: Nếu a > b thì in a. Ngược lại thì in b.
b. Bài giải:
Program SO_SANH1;
uses crt;
var a,b: real;
begin
clrscr;
write(nhap so thu nhat: ); readln(a);
write(nhap so thu hai: ); readln(b);
if a> b then writeln( So lon la:,a);
if a<= b then writeln( So lon la:,b:10:2);
Xem thêm

5 Đọc thêm

Đề tài các thuật toán cơ bản trong pascal

ĐỀ TÀI CÁC THUẬT TOÁN CƠ BẢN TRONG PASCAL

0 thì hai đoạn thẳng có hướng và cộng tuyến. Ngược chiều kim đồng hồ Cùng chiều kim đồng hồ Hình 1.3. Dùng đại lượng C(, ) để xác định chiều quay của các đoạn thẳng có hướng liên tiếp và 1.6. Xác định hai đoạn thẳng giao nhau Để kiểm tra hai đoạn thẳng và có giao nhau hay không ta tiến hành qua hai giai đoạn. Giai đoạn thứ nhất là phép loại nhanh các đoạn thẳng không thể giao nhau đó là trường hợp hai hình chữ nhật định cận không giao nhau. Hình chữ nhật định cận của một hình là hình chữ nhật nhỏ nhất chứa hình đó và có các cạnh song song với hai trục toạ độ. Với đoạn thẳng thì hình chữ nhật định cận là hình chữ nhật được biểu diễn thông qua hai điểm và , trong đó , , , . Hai hình chữ nhật định cận của và là (, ) và (, ) giao nhau nếu và chỉ nếu phép hội là đúng. Các hình chữ nhật phải giao nhau theo cả hai chiều; chiều của trục x (thể hiện ở hai phép so sánh đầu tiên) và chiều của trục y (thể hiện ở hai phép so sánh cuối cùng). Giai đoạn thứ hai để xác định hai đoạn thẳng có giao nhau hay không khi biết các hình chữ nhật định cận đã giao nhau. Để biết được điều này, chúng ta xét xem mỗi đoạn thẳng có nằm trên đường thẳng chứa đoạn thẳng kia hay không. Nếu thoả mãn điều kiện trên thì ta kết luận hai đoạn thẳng giao nhau. a)P4 P3 P2 P1 b)P2 P3 P4 P1 c)P2 P3 P4 P1 d) P2 P1 P3 P4 Hình 1.4. Xác định xem đoạn thẳng nằm trên đường thẳng chứa đoạn thẳng . (a) Nếu nó nằm trên, thì các dấu của các và khác nhau; (b) Nếu nó không nằm trên, thì các dấu của hai đại lượng trên là giống nhau; (c)(d) Tồn tại một đại lượng bằng 0 nếu có ít nhất một cận của nằm trên đường thẳng kia. Ta có thể dùng phương pháp tích vectơ để xác định đoạn thẳng có nằm trên đường thẳng chứa đoạn thẳng hay không. Như đã nêu trong hình 1.4. (a) và (b), ta xét xem các đoạn thẳng có hướng và có hướng trái ngược nhau tương đối với hay không. Tức là, dấu của đại lượng và có khác nhau hay không. Nếu có, thì đoạn thẳng nằm trên đường thẳng, ngược lại thì đoạn thẳng không nằm trên đường thẳng. Trong trường hợp hoặc nằm trên đường thẳng chứa đoạn thẳng thì sẽ có một đại lượng hoặc bằng 0. Ta gọi đây là trường hợp cận như đã thấy trong hình 1.4. (c) và (d). Độ dài một đoạn thẳng bằng 0 khi và chỉ khi bằng 0. Sau đây là đoạn chương trình minh hoạ hai đoạn thẳng có giao nhau hay không. Giá trị trả về là 1 nếu hai đoạn thẳng giao nhau; 0 nếu hai đoạn thẳng không giao nhau. FUNCTION Intersect(L1,L2 : Line) : Boolean; Var x1, x2, x3, x4, y1, y2, y3, y4 : Integer; Begin x1:=Min(L1.P1.x,L1.P2.x); y1:=Min(L1.P1.y,L1.P2.y); x2:=Max(L1.P1.x,L1.P2.x); y2:=Max(L1.P1.y,L1.P2.y); x3:=Min(L2.P1.x,L2.P2.x); y3:=Min(L2.P1.y,L2.P2.y); x4:=Min(L2.P1.x,L2.P2.x); y4:=Min(L2.P1.y,L2.P2.y); If (x2>x3) and (x4>x1) and (y2>y3) and (y4>y1) Then If (ccw(l1.p1,l2.p2,l1.p2)ccw(l1.p1,l2.p1,l1.p2)<=0) and (ccw(l2.p1,l1.p2,l2.p2)ccw(l2.p1,l1.p1,l2.p2)<=0) Then Intersect:=True Else Intersect:=False Else Intersect:=False; End; 2. Các thuật toán cơ bản 2.1. Đường khép kín đơn Bài toán: Cho một tập N điểm xác định trên mặt phẳng, các điểm đôi một không trùng nhau. Yêu cầu: Tìm một đường đi (là các đoạn thẳng nối các điểm đã cho lại với nhau) qua tất cả các điểm rồi quay trở về điểm ban đầu sao cho chúng không cắt nhau. Đường đi như trên được gọi là đường khép kín đơn. Bài toán tìm đường đi khép kín đơn được ứng dụng trong nhiều lĩnh vực như tìm đường đi cho người đưa thư đi đến mỗi nhà mà không đi qua những đường đã đi, hay bài toán về cách vẽ các điểm bằng plotter sao cho hợp lý, ... a)A M I K G F E D C B H J L Đường khép kín đơn ABCDEFGHIJKLM b)A M I K G F E D C B H J L Không là đường khép kín đơn AFBCDEGHIJKLM Hình 2.1. a) Đường khép kín đơn và b) Không là đường khép kín đơn Để tìm đường khép kín đơn đi qua N điểm từng đôi một khác nhau A1, A2, ..., An đã cho trên mặt phẳng toạ độ. Đầu tiên, ta chọn một điểm làm gốc (thường là điểm có tung độ bé nhất). Tiếp đó tìm các góc của các đoạn thẳng nối giữa gốc và các điểm Ai còn lại so với trục hoành. Như vậy, các góc này có giá trị nằm trong đoạn 0, 360. Sau khi đã tìm được các góc tương ứng với các điểm Ai, ta sắp xếp các điểm Ai theo thứ tự tăng dần của góc, nếu có nhiều góc bằng nhau thì sắp xếp ưu tiên điểm gần gốc trước, điểm xa gốc sau trừ các góc cuối cùng. Đối với các góc cuối cùng thì chúng ta ưu tiên điểm xa góc toạ độ trước. Với thứ tự đó chúng ta có một đường khép kín đơn đi qua tất cả các điểm đã cho. y A5 A0 A4 A2 A3 x A1 Hình 2.2. Tính các góc thông qua đường chuẩn của gốc Thứ tự là: A0, A1, A3, A4, A2, A5 Bây giờ chúng ta sẽ tìm hiểu cách tính các góc ứng với các điểm. Gọi dx, dy là khoảng cách từ điểm gốc đến một điểm cần tính góc tương ứng theo trục hoành (trục x) và trục tung (trục y) thì gốc cần tính ở đây là tang1(dydx). Mặc dù đã có nhiều ngôn ngữ hỗ trợ tính hàm tang1 (arctang), nhưng nó thường chậm, hơn nữa chúng ta lại gặp những rắc rối khi dx = 0 và điểm đang xét nằm trong góc phần tư nào. Với mục đích chỉ dùng để sắp xếp các điểm trong phần này, chúng ta có thể sử dụng một hàm khác dễ tính hơn nhưng vẫn có cùng thuộc tính như hàm arctang, đó là hàm dy(dx+dy). Sau đây là đoạn chương trình trả về một giá trị trong đoạn 0, 360 có tính chất tương tự như góc tạo bởi đường thẳng so với phương ngang. FUNCTION theta(P1, P2 :Point) : Real; Var dx, dy, ax, ay : Integer; t : Real; Begin dx:=P2.x–P1.x; dy:=P2.y–P1.y; ax:=abs(dx); ay:=abs(dy); If (dx=0) and (dy=0) Then t:=0 Else t:=dy(ax+ay); If dx<0 Then t:=2–t Else If dy<0 Then t:=4+t; theta:=t90.0; End; Sau đây là thuật toán tìm đa giác đơn khép kín từ một tập hợp điểm đã cho, thuật toán này thực chất chỉ là một phép sắp xếp theo các góc theta đối với một điểm góc đã được chọn trước (đó là điểm có tung độ y nhỏ nhất, nếu trường hợp có nhiều điểm như vậy thi ta chọn điểm có hoành độ x lớn nhất). Để đơn giản chúng tôi làm một thuật toán sắp xếp quen thuộc thông thường. Chúng ta cũng cần phải có một thủ tục để dùng để sắp xếp chi tiết khi có các góc bằng nhau. Thủ tục ArangeDetail có nhiệm vụ sắp xếp các điểm có cùng góc theo thứ tự tăng dần của khoảng cách đối với điểm gốc nếu như góc đó không phải là góc cuối cùng và sắp xếp theo thứ tự giảm dần nếu như đó là góc cuối. PROCEDURE ArrangeDetail(Var Poly :Polygon, N : Integer); Var i, j, k ,h : Integer; P : Point; Begin i:=1; While (i<=n) do Begin j:=i; While (ij Then For k:=j to i1 do For h:=k+1 to i do If dist(Poly1,Polyk)>dist(Poly1,Polyh) Then Begin {dist là hàm khoảng cách giữa hai điểm} P:=Polyk; Polyk:=Polyh; Polyh:=P; End; End Else If i>j Then For k:=j to i1 do For h:=k+1 to i do If dist(Poly1,Polyk)PolyMin.x Then Min:=i; P:=Poly1; Poly1:=PolyMin; PolyMin:=P; For i:=2 to n1 do For j:=i+1 to n do If theta(Poly1, Polyi)>theta(Poly1, Polyj) Then Begin P:=Polyi; Polyi:=Polyj; Polyj:=P; End; ArrangeDetail(Poly, n); End; 2.2. Thuật toán tìm bao lồi Bao lồi của một tập hợp điểm Q là đa giác lồi P nhỏ nhất chứa tất các điểm của Q. Như vậy bất kỳ một điểm nào của tập hợp Q cũng nằm trong P hoặc trên biên của P và nếu ta lấy bất kỳ hai điểm nào của Q nối lại với nhau thì đoạn thẳng nối hai điểm này nằm trong P. Theo trực giác, ta có thể hình dung mỗi điểm của Q như một chiếc đinh lồi ra từ tấm ván. Bao lồi của Q là hình dáng của dãi cao su bao quanh các chiếc đinh đó. c. Thuật toán diễu hành Jarvis (Thuật toán bao gói) Thuật toán diễu hành Jarvis tính toán bao lồi của một tập hợp Q các điểm bằng một kỹ thuật có tên là đóng gói. Thuật toán bao gói để tìm bao lồi là một thuật toán đơn giản và khá tự nhiên. Bắt đầu từ một điểm chắc chắn nằm trên bao lồi (điểm mốc), điểm này có thể là điểm có tung độ nhỏ nhất (hoặc tung độ lớn nhất, hoặc hoành độ nhỏ nhất, hoặc hoành độ lớn nhất). Dùng một tia quét ngược chiều kim đồng hồ cho đến khi đụng một điểm khác: điểm mới này phải thuộc bao lồi. Lấy điểm này làm mốc và tiếp tục quét cho đến khi gặp điểm tiếp theo, quá trình tiếp tục cho đến khi gặp lại điểm ban đầu. Như vậy ta thấy rằng, hàm theta vừa thiết lập ở trên là một trong những công cụ để ta làm tia quét. Thuật toán chạy trong thời gian O(hN), trong đó h là số đỉnh của bao lồi. Do vậy, thuật toán diễu hành Jarvis hội tụ nhanh hay chậm phụ thuộc vào số đỉnh của bao lồi P của tập hợp điểm Q. Thuật toán này có nhược điểm là khi tất cả các điểm đều thuộc bao lồi thì thời gian thực hiện của nó là N2 (với N là số điểm của tập cần tìm bao lồi). Bắt đầu từ một điểm P0 là điểm có tung độ y nhỏ nhất (trong trường hợp có nhiều điểm có tung độ y nhỏ nhất thì ta lấy điểm có hoành độ x lớn nhất), ta tìm điểm P1 có góc cự bé nhất đối với điểm P0 (trong trường hợp có nhiều góc cự bé nhất bằng nhau thì ta có thể lấy điểm xa nhất hoặc gần nhất so với P0 tuỳ theo từng yêu cầu cụ thể). Tiếp đến ta tìm điểm P2 là điểm có góc cực bé nhất đối với điểm P1. Quá trình cứ tiếp tục như vậy cho đến khi đạt đến điểm có hoành độ lớn nhất Pk, và như vậy chúng ta đã kiến tạo được xích phải của bao lồi. Để kiến tạo xích trái, ta bắt đầu từ điểm Pk và chọn Pk+1 với tư cách là điểm có góc cực bé nhất đối với Pk, nhưng so với trục x âm. Cứ tiếp tục như thế cho đến khi gặp điểm Po ban đầu. Tuy nhiên trong khi cài đặt chương trình chúng ta không cần phải chia ra thành hai phần xích trái và xích phải, mà ta gộp chung vào thành một. Rõ ràng điều này có thể thực hiện được bởi vì khi tính các điểm trên xích trái thì góc cực bé nhất đối với trục x âm cũng tương đương với góc cực ứng với trục x dương. Chúng ta có thể hình dung bằng hai hình vẽ minh hoạ sau: Hình 2.3. a. Hình ảnh các góc cực với xích trái và xích phải b. Hình ảnh các góc cực không phân biệt xích trái hay xích phải Sau đây là đoạn chương trình minh hoạ cho thuật toán diễu hành Jarvis. Kết quả trả về của chương trình là số M (số điểm của bao lồi) và bao lồi là tập các điểm P1, P2, ..., PM. FUNCTION jarvis(Var Poly : Polygon, n : Integer) : Integer; Var i, j, Min, M : Integer; Minangle : Real; P : Point; Begin Min:=1; For i:=2 to n do If Polyi.yPolyMin.x Then Min:=i; P:=Poly1; Poly1:=PolyMin; PolyMin:=P; PolyN+1:=Poly1; j:=2; Repeat M:=j1; Min:=j; Minagle:=theta(PolyM, Polyj); For i:=j+1 to n+1 do If Minagle>theta(PolyM, Polyi) Then Begin Min:=i; Minagle:=theta(PolyM, Polyi); End; P:=Polyj; Polyj:=PolyMin; PolyMin:=P; j:=j+1; Until Min=N+1 jarvis:=M; End; b. Thuật toán quét graham Thuật toán quét Graham bắt đầu bằng việc xây dựng một đa giác khép kín đơn từ tập hợp điểm đã cho. Từ đa giác đơn tìm được ta tìm cách lấy ra các điểm nằm trên bao lồi theo cách: Thử đặt một điểm vào bao lồi rồi kiểm tra những điểm trước đó xem có còn thuộc bao hay không nếu không thuộc bao thì ta loại các điểm này ra; nếu thuộc bao thì ta giữ lại. Để làm được việc này ta thực hiện như sau: Khi đặt một điểm Pi vào bao lồi, ta lần quanh điểm đã được đưa vào bao lồi trước đó Pi1 với Pi2 (tức là xem xét ba điểm PiPi1Pi2) và kiểm tra nó có quay phải (theo chiều kim đồng hồ) hay không; nếu có quay phải thì chúng ta loại điểm Pi1 ra khỏi bao lồi, rồi cứ tiếp tục như vậy với Pi2 (PiPi2Pi3),... cho đến khi nào không còn quay phải nữa. Quá trình lặp lại cho đến khi điểm cần xét cuối cùng PN+1. H G C A B E D F H G C A B E D F H G C A B E D F H G C A B E D F H G C A B E D F H G C A B E D F H G C A B E D F H G C A B E D F H G C A B E D F Hình 2.4. Tiến trình của thuật toán quét Graham tìm bao lồi của một tập hợp điểm Việc cài đặt thuật toán không mấy phức tạp, đầu tiên ta dùng một thuật toán sắp xếp lại các điểm theo thứ tự tăng dần của các góc so với một điểm gốc để được một đa giác đơn khép kín. Tiếp theo ta thực hiện việc đặt vào các điểm và loại bỏ các điểm để có được bao lồi. Thuật toán có thể minh hoạ như sau: FUNCTION grahamscan(Var Poly : Polygon, n : Integer) : Integer; Var i, M : Integer; P : Point; Begin simpleclosepath(Poly, n); M:=3; For i:=4 to n do Begin While ccw(PolyM, PolyM1, Polyi)=1 Do M:=M1; M:=M+1; P:=PolyM; PolyM:=Polyi; Polyi:=P; End; Grahamscan:=M; End; 2.3. Điểm nằm trong đa giác Để xét xem một điểm có P nằm trong đa giác hay không, chúng ta có thể sử dụng hai thuật toán sau: Thuật toán số lần cắt (Crossing Number cn) Thuật toán số lần cắt đếm số lần một tia xuất phát từ điểm P cắt cạnh của đa giác. Điểm P nằm ngoài đa giác thì số lần cắt là chẵn; ngược lại khi số lần cắt là lẻ thì điểm P nằm trong đa giác. Thuật toán này nhiều khi còn được gọi là thuật toán kiểm tra chẵn lẻ. Thuật toán số lần bao gói (Winding Number wn) Thuật toán này đếm số lần đa giác bao quanh điểm P. Nếu số lần bao gói lớn hơn 0 thì ta kết luận điểm P nằm trong đa giác; ngược lại thì kết luận điểm P nằm ngoài đa giác. Nếu đa giác chúng ta xét là đa giác đơn (nghĩa là nó không tự cắt), thì cả hai phương pháp trên cho cùng một kết quả như nhau với tất cả các điểm P cần kiểm tra. Nhưng với những đa giác không đơn (nghĩa là nó tự cắt), thì hai phương pháp có thể cho kết quả khác nhau đối với một số điểm. Ví dụ, khi một đa giác có phần chồng lên chính nó, thì những điểm P ở vùng chồng nhau được cho là nằm ngoài đa giác đối với thuật toán số lần cắt (do có số lần cắt các cạnh đa giác là chẵn), nhưng đối với thuật toán bao gói thì điểm P là nằm trong (do có số lần bao gói lơn hơn 0). Chúng ta có thể thấy rõ qua hình ảnh minh hoạ sau: Hình 2.5. a. Thuật toán số điểm cắt b. Thuật toán số lần bao gói Trong hình vẽ ví dụ này, chúng ta thấy những điểm nằm trong phần chồng nhau của đa giác thì thuật toán số lần bao gói cho kết quả wn=2, nghĩa là nó nằm trong đa giác hai lần. Tuy nhiên đối với thuật toán số điểm cắt thì cn là chẵn, vì vậy nó không nằm trong đa giác. Rõ ràng, thuật toán số lần bao gói tốt hơn so với thuật toán số điểm cắt, nhưng việc cài đặt khó hơn nhiều và độ phức tạp thuật toán cao hơn. a. Thuật toán số lần cắt Như đã đề cập ở trên, thuật toán này đếm số lần một tia xuất phát từ điểm P cần kiểm tra cắt các cạnh của đa giác. Nếu số lần cắt là chẵn, thì điểm P nằm ngoài đa giác; ngược lại số lần cắt lẻ thì điểm P nằm trong đa giác. Với một tia xuất phát từ P, thì rõ ràng điểm cuối của nó phải nằm ngoài đa giác. Vì vậy, nếu một điểm nằm trong đa giác thì chuỗi tuần tự của nó khi tia cắt các cạnh của đa giác như sau: in®out®...®in®out. Nếu một điểm nằm ngoài đa giác thì chuỗi tuần tự khi tia cắt các cạnh như sau: out®in®...®in®out. Có thể thấy điều này qua hình vẽ minh hoạ sau: Hình 2.6. Điểm nằm trong đa giác có số lần cắt các cạnh của đa giác là lẻ, điểm nằm ngoài đa giác có số lần cắt các cạnh của đa giác là chẵn. Tuy nhiên chúng ta cần phải lưu ý một số trường hợp đặc biệt như tia bắt đầu từ P đi qua đỉnh của đa giác, nằm chồng trên một cạnh của đa giác. Chúng ta có thể minh hoạ các trường hợp thông qua hình vẽ sau: Hình 2.7. Các trường hợp đặc biệt cần xử lý khi tính cn của thuật toán số lần cắt. Đối với trường hợp a, tia kiểm tra đi qua một đỉnh của đa giác có hai cạnh nằm về hai phía, chúng ta đếm số lần cắt là 1. Đối với trường hợp b và c, tia kiểm tra đi qua một đỉnh của đa giác có hai cạnh nằm về một phía, chúng ta đếm số lần cắt là 0. Đối với trường hợp d, tia kiểm tra trùng một cạnh của đa giác có hai cạnh nối với cạnh trùng (có tia kiểm tra đi qua) nằm khác phía, chúng ta đếm số lần cắt là 1 (cũng có thể áp dụng cho nhiều cạnh trùng liên tiếp). Nếu điểm P nằm trên cạnh trùng với tia kiểm tra thì số lần cắt được đếm là 1. Đối với trường hợp e và f, tia kiểm tra trùng một cạnh của đa giác có hai cạnh nối với cạnh trùng (có tia kiểm tra đi qua) nằm cùng phía, chúng ta đếm số lần cắt là 0 (cũng có thể áp dụng cho nhiều cạnh trùng liên tiếp). Nếu điểm P nằm trên cạnh trùng với tia kiểm tra thì số lần cắt được đếm là 1. Để cho thuật toán đơn giản tia xuất phát từ P ta lấy là tia nằm ngang (song song với trục x, nghĩa là điểm cuối của tia có toạ độ (maxint, P.y)), điều này sẽ thuận lợi cho việc nhận biết giao điểm của các cạnh với tia kiểm tra có nằm ở các đỉnh của đa giác hay không, hoặc một cạnh có trùng với tia kiểm tra hay không. Khi tia kiểm tra giao với một cạnh PiPi+1 của đa giác, nếu Pi.y hoặc Pi+1.y bằng P.y thì có một đỉnh (tương ứng Pi hoặc Pi+1) của cạnh đó; nếu Pi.y và Pi+1.y bằng P.y thì cạnh này trùng với tia kiểm tra; còn nếu Pi.y và Pi+1.y khác P.y thì tia kiểm tra cắt cạnh PiPi+1 tại một điểm giữa cạnh này. Sau đó tiến hành kiểm tra tính cùng phía hay khác phía của các cạnh liên quan. Đối với trường hợp tia kiểm tra đi qua một đỉnh Pi+1 của đa giác (nghĩa là Pi+1.y = P.y) ta sẽ xét đối với các cạnh: PiPi+1, Pi+1Pi+2, nếu (Pi.y P.y)´(Pi+2.y P.y)>0 thì hai cạnh này cùng phía so với tia kiểm tra, ngược lại hai cạnh này khác phía so với tia kiểm tra. Đối với trường hợp tia kiểm tra đi qua một cạnh PiPi+1 của đa giác (nghĩa là Pi.y = Pi+1.y = P.y) ta sẽ xét với các cạnh: Pi1Pi, Pi+1Pi+2, nếu (Pi1.y P.y)´(Pi+2.y P.y)>0 thì hai cạnh này cùng phía với nhau so với tia kiểm tra, ngược lại hai cạnh này khác phía với nhau so với tia kiểm tra. Trong thuật toán sau đây ta đã hoán đổi đa giác ban đầu về một đa giác cùng hình dạng nhưng đỉnh bắt đầu là đỉnh Q1. Q1 là đỉnh có toạ độ y nhỏ nhất. Trong trường hợp có nhiều đỉnh có cùng toạ độ y nhỏ nhất thì ta lấy đỉnh có toạ độ x nhỏ nhất. Trong cài đặt thuật toán, ta sử dụng kỹ thuật dùng một điểm Q0 có toạ độ (∞, ∞) để làm lính canh cho việc xử lý trường hợp đỉnh Q1. Kết quả trả về của đoạn chương trình là True nếu điểm P nằm trong đa giác; False nếu điểm P nằm ngoài đa giác. FUNCTION cn_poly(P: Point; Poly: Polygon, n: Integer):Boolean; Var d1, d2, cn, i, j, Min : Integer; L1, L2 : Line; Q : Polygon; Begin Min:=1; For i:=2 to n do If Polyi.y=Qi.x) and (P.x<=Qi+1.x)) or ((P.x>=Qi+1.x) and (P.x<=Qi.x)) Then cn:=cn+1 Else Begin d1:=Qi1.x – P.x; d2:=Qi+2.x – P.x; If d1d2 < 0 Then cn:=cn+1; End; Else Begin d1:=Qi1.x – P.x; d2:=Qi+1.x – P.x; If d1d2 < 0 Then cn:=cn+1; End; End; Else If (P.y Qi+1) Then cn:=cn+1; End; End; If (cn mod 2 = 0) Then cn_poly:=False; Else cn_poly:=True; End; b. Thuật toán số lần bao gói Thuật toán số lần bao gói đếm số lần đa giác bao quanh điểm P, nếu số lần này lơn hơn 0 thì điểm P nằm trong đa giác. Thuật toán này cho phép ta kiểm tra đối với đa giác tự cắt (có các phần chồng lên nhau). Với một đa giác P1, P2, ...,Pn và điểm P cho trước. Một tia xuất phát từ P song song với trục hoành dùng để xét xem tia kiểm tra này có cắt các cạnh hay không? Khi tia kiểm tra cắt một cạnh của đa giác, ta sẽ quyết định cộng thêm cho số lần bao gói (wn) 1 đơn vị, hay trừ đi số lần bao gói 1 đơn vị tuỳ theo hướng của cạnh bị cắt. Hình ảnh sau minh hoạ việc cộng thêm 1 đơn vị hay trừ đi 1 đơn vị cho wn. Hình 2.8. Khi tia kiểm tra cắt các cạnh của đa giác thì số lần bao gói tăng lên hoặc giảm xuống 1 đơn vị tuỳ theo cạnh đó đi lên hay đi xuống Khi tia kiểm tra xuất phát từ P cắt cạnh PiPi+1, ta xét xem cạnh này đi lên hay đi xuống để biết P nằm bên trái hay bên phải của cạnh PiPi+1. Nếu tam giác PiPi+1P ngược chiều kim đồng hồ thì P nằm bên trái cạnh PiPi+1, lúc này ta cho wn tăng lên 1 đơn vị; ngược lại PiPi+1P cùng chiều kim đồng hồ thì P nằm bên phải cạnh PiPi+1 và cho wn giảm đi 1 đơn vị. Vì vậy, chúng ta cần thiết kế một hàm mà kết quả trả về cho biết điểm P nằm phía bên trái hay phía bên phải hay trên một cạnh của đa giác. Nếu kết quả trả về là 1 thì P nằm bên trái của cạnh đó; nếu kết quả trả về là 0 thì P nằm trên cạnh đó; nếu kết quả trả về là 1 thì P nằm bên phải của cạnh đó. P Pi Pi+1 Hình 2.9. a. Cạnh đi lên, P nằm bên phải cạnh PiPi+1. P Pi Pi+1 b. Cạnh đi xuống P nằm bên phải trái PiPi+1. Sau đây là đoạn chương trình cho biết điểm P nằm bên trái hay bên phải hay trên cạnh PiPi+1 của một đa giác. FUNCTION isLeft(P, P1, P2 : Point) : Integer; Var d : Integer; Begin d:=((P1.xP.x)P2.yP.y)(P2.xP.x)(p1.yP.y)); If d>0 Then isLeft:=1 Else If d=0 Then isLeft:=0 Else isLeft:=1 End; Tiếp theo đây là đoạn chương trình cho biết điểm P có nằm trong đa giác hay không. Kết quả tra về là True nếu điểm P nằm trong đa giác; ngược lại kết quả trả về là False nếu điểm P nằm ngoài đa giác. FUNCTION wn_poly(P: Point; Poly: Polygon, n: Integer):Boolean; Var wn, i, j, Min : Integer; L1, L2 : Line; Q : Polygon; Begin wn:=0; For i:=1 to n1 do Begin If (Polyi.y<=P.y) Then Begin If (Polyi+1>P.y) Then If (isLeft(P, Polyi, Polyi+1)>0) Then wn:=wn+1 End Else Begin If (Polyi+1.y<=P.y) Then If (isLeft(P, Polyi, Polyi+1)<0) Then wn:=wn1; End; End; If (wn > 0) Then wn_poly:=True; Else wn_poly:=False; End; Phần này đã trình bày hai thuật toán dùng để kiểm tra xem một điểm có nằm trong đa giác hay không. Đối với thuật toán cn, ta cũng có thể cải tiến theo hướng như thuật toán wn để quá trình kiểm tra đỡ phức tạp hơn, hiệu quả của thuật toán cao hơn, và độ phức tạp thuật toán bé hơn. Độ phức tạp của hai thuật toán trên là O(N) 4. Giao và hợp của các đối tượng cơ bản Các bài toán tìm phần giao và phần hợp của các đối tượng hình học phẳng như hình tròn, đa giác, ... là những bài toán khá hay và để tìm ra các lời giải tối ưu thì đòi hỏi người lập trình phải có tư duy tốt về toán học. Đặc biệt, tìm giao của hai đa giác là một trong những bài toán cơ sở của hình học tính toán và có nhiều ứng dụng trong các lĩnh vực khác nhau của đồ hoạ máy tính, CAD, GIS, ... 4.1. Giao của hai đường thẳng tổng quát Một đường thẳng tổng quát trong mặt phẳng toạ độ bao giờ cũng có phương trình là ax + by = c (1). Tuy nhiên, không phải lúc nào ta cũng có phương trình đường thẳng như dạng trên, mà thay vào đó là đường thẳng đi qua hai điểm P1(x1, y1), P2(x2, y2). Trong trường hợp như vậy, ta phải tìm cách chuyển về dạng (1) để cho việc tìm giao điểm được dễ dàng hơn. Đối với đường thẳng đi qua hai điểm phân biệt P1(x1, y1), P2(x2, y2) ta có thể chuyển về dạng (1) theo cách: viết phương trình đường thẳng đi qua hai điểm P1(x1,y1), P2(x2,y2) như sau: Û (x x1)(y2 – y1) = (y – y1)(x2 – x1) Û (y2 – y1)x + (x1 – x2)y = (x1 – x2)y1 + (y2 – y1)x1 Û (y2 – y1)x + (x1 – x2)y = x1y2 x2y1 Đây chính là phương trình dạng (1) đã được đề cập ở trên. Vấn đề đặt ra là tìm giao điểm của hai đường thẳng tổng quát có phương trình lần lượt là: a1x + b1y = c1 và a2x + b2y = c2. Việc tìm giao điểm này thực chất là việc giải hệ phương trình: (2) Sau đây là đoạn chương trình tìm giao điểm của hai đường thẳng dựa trên việc giải hệ phương trình (2). Kết quả trả về của hàm là True và toạ độ của điểm giao nhau (một cặp số thực thông qua bản ghi Point) nếu hai đường thẳng này giao nhau, ngược lại, nếu hai đường thẳng không giao nhau thì hàm trả về kết quả là False. FUNCTION int_point(a1,b1,c1,a2,b2,c2:Real; Var P:Point):Boolean; {Ở đây chúng ta có thể xem Point là một bản ghi có hai thành phần đều là số thực} Var D, DX, DY : Real; Begin D:=a1b2a2b1; DX:=c1b2c2b1; DY:=a1c2a2c1; If D0 Then Begin P.x:=DXD; P.y:=DYD; int_point:=True; End Else int_point:=False; End; 4.2. Giao và hợp của hai đường tròn Bài toán: Với hai đường tròn có tâm và bán kính cho trước lần lượt là P1(x1, y1), R1 và P2(x2, y2), R2. Yêu cầu: Tìm phần giao và phần hợp của hai đường tròn này. Hình 2.12. Phần diện tích giao nhau của hai hình tròn là phần được gạch chéo Việc tìm phần giao của hai đường tròn này được thực hiện thông qua phương pháp chia lưới, nghĩa là chúng ta chia mặt phẳng ra thành một lưới các ô vuông bởi các đường thẳng song song với trục tung và trục
Xem thêm

28 Đọc thêm

BÀI GIẢNG TIẾNG ANH CÂU ĐIỀU KIỆN IF

BÀI GIẢNG TIẾNG ANH CÂU ĐIỀU KIỆN IF

BÀI GIẢNG TIẾNG ANH CÂU ĐIỀU KIỆN IF. Chào các em từ lớp 9 các em đã bắt đầu học về câu điều kiện, sau đó lên cấp 3 mỗi năm các em đều học lại cấu trúc này nhưng chương trình càng lúc càng nâng cao. Trong phần này sẽ được chia làm 2 cấp độ : cấp độ cơ bản và cấp độ nâng cao. Các em nhất thiết phải học theo thứ tự, chỉ khi nào nắm vững cấp cơ bản thì mới học phần nâng cao, nếu không sẽ bị rối và không hiểu được bài.

12 Đọc thêm

Luận văn nghiên cứu hệ thống biểu quyết điện tử số

LUẬN VĂN NGHIÊN CỨU HỆ THỐNG BIỂU QUYẾT ĐIỆN TỬ SỐ

DCE>DTE Remote Loopback: Tạo ra bởi DCE khi tín hiệu nhận 14 STxD DTE>DCE Secondary Transmitted Data 16 SRxD DCE>DTE Secondary Received Data 19 SRTS DTE>DCE Secondary Request To Send 13 SCTS DCE>DTE Secondary Clear To Send 12 SDSRD DCE>DTE Secondary Received Line Signal Detector 25 TM Test Mode 9 Dành riêng cho chế độ test 10 Dành riêng cho chế độ test 11 Không dùng Bảng 1.2: Chức năng các chân của cổng nối tiếp. 25 2.3.1 Truyền thông giữa hai nút Các sơ đồ khi kết nối dùng cổng nối tiếp: Hình 2.5: Kết nối đơn giản trong truyền thông nối tiếp Khi thực hiện kết nối như trên là kết nối không móc nối, quá trình truyền phải bảo đảm tốc độ ở đầu phát và thu giống nhau. Khi có dữ liệu đến DTE, dữ liệu này sẽ được đưa vào bộ đệm và tạo ngắt. Ngoài ra, khi thực hiện kết nối giữa hai DTE theo cách móc nối cứng, ta dùng sơ đồ sau: Hình 2.6: Kết nối trong truyền thông nối tiếp dùng tín hiệu bắt tay Khi DTE1 cần truyền dữ liệu thì cho DTR tích cực tác động lên DSR của DTE2 cho biết sẵn sàng nhận dữ liệu và cho biết đã nhận được sóng mang của MODEM (ảo). Sau đó, DTE1 tích cực chân RTS để tác động đến chân CTS của DTE2 cho biết DTE1 có thể nhận dữ liệu. Khi thực hiện kết nối giữa DTE và DCE, do tốc độ truyền khác nhau nên phải thực hiện điều khiển lưu lượng. Quá trinh điều khiển này có thể thực hiện bằng phần mềm hay phần cứng. Quá trình điều khiển bằng phần mềm thực hiện bằng hai ký tự Xon có giá trị 11h và Xoff có giá tri 13h. Ký tự Xon được DCE gửi đi khi rỗi (có thể nhận dữ liệu). Nếu DCE bận thì sẽ gửi ký tự Xoff. Quá trình điều khiển bằng phần cứng dùng hai chân RTS và CTS. Nếu DTE muốn truyền dữ liệu thì sẽ nâng đường tín hiệu 26 RTS lên mức cao để yêu cầu truyền rồi kiểm tra trạng thái dây CTS cho đến khi CTS ở mức cao, khi CTS ở mức thấp có nghĩa bên thu vẫn bận chưa nhận được dữ liệu.Khi bên thu nhận xong dữ liệu từ bộ đệm của nó thì RTS nối với CTS của bên phát sẽ nhảy lên mức cao. Quá trình nhận dữ liệu cũng giống như quá trình truyền. Khi DCE muốn phát tới DTE , DSR bên thu sẽ trở nên tích cực. Nếu bên thu không thể nhận dữ liệu thì DSR ở trạng thái không tích cực. 2.3.2 Truy xuất trực tiếp thông qua cổng COM Các cổng nối tiếp trong máy tính được đánh số là COM1, COM2, COM3, COM4 với các địa chỉ như sau: Tên Địa chỉ Ngắt Vị trí chứa địa chỉ COM1 3F8h 4 0000h:0400h COM2 2F8h 3 0000h:0402h COM3 3E8h 4 0000h:0404h COM4 2E8h 3 0000h:0406h Bảng 1.3: Các ngắt cổng COM 27 CHƯƠNG 3 GIAO DIỆN ĐIỂU KHIỂN TỪ XA ĐẾN HỆ THỐNG DCN 3.1 Mô hình hệ thống điều khiển từ xa Sơ đồ ghép nối điều khiển từ xa hệ thống biểu quyết điện tử được trình bày trên hình 3.1 dưới đây. Hình 3.1: Sơ đồ ghép nối với bộ điều khiển từ xa. Bộ điều khiển từ xa hệ thống DCN được kết nối qua đường RS 232 đến bộ điều khiển trung tâm CCU. Để bộ điều khiển từ xa điều khiển được CCU phải thông qua các giao thức truyền dẫn (protocol) simple hoặc (protocol) Full của bộ điều khiển trung tâm CCU. 3.2 Các thông số điều khiển từ xa Thiết bị (PC, bộ điều khiển, …) kết nối với cổng nối tiếp là bộ điều khiển hệ thống thứ hai đến bộ điểu khiển trung tâm CCU. Các thiết bị này được gọi là bộ điều khiển từ xa. Trên hình vẽ máy tính điều khiển DCN kết nối qua kênh ACN hoặc qua cổng COM. Bộ điều khiển từ xa điều khiển các ứng dụng từ xa sử dụng đường nối tiếp của bộ điều khiển trung tâm. Chẳng hạn như: điều khiển từ xa, điều khiển biểu quyết, hiển thị kết quả biểu quyết… Các phần mềm điều khiển từ xa này sử dụng giao thức ghép nối từ xa với bộ điều khiển trung tâm CCU. 3.2.1 Kiểu thông báo định dạng: Truyền thông giữa bộ điều khiển từ xa và bộ điều khiển trung tâm CCU dựa trên bản tin thông báo( Message format). 28 3.2.2 Kiểu định dạng thông báo cơ bản: Type Length Data Khai báo cấu trúc được định nghĩa như sau: typedef struct { BYTEbyType; Loại thông báo WORDwLength; Độ dài thông báo BYTEbyData ; Dữ liệu thông báo. } T_MESSAGE; where: byType Loại thông báo. Các kiểu thông báo truyền thông với bộ điều khiển trung tâm CCU:  MDSC_REMOTEPROCEDURE_REQ  MDSC_REMOTEPROCEDURE_RSP  MDSC_NOTIFY wLength Độ dài thực sự của dữ liệu trong dãy dữ liệu được truyền phát có giới hạn = 5000. byData Dãy dữ liệu truyền đi phụ thuộc vào loại thông báo. 3.2.3 Định dạng yêu cầu điều khiển từ xa Định dạng yêu cầu điều khiển từ xa này là một thông báo luôn được truyền tới bộ điều khiển trung tâm. Thông báo MDSC_REMOTEPROCEDURE_REQ này có cấu trúc như sau: typedef struct { WORD wFnId; khai báo chức năng. REQSTRUC tStructure; Tham số chức năng } RSMT_REMOTEPROCEDURE_REQ; wFnId khai báo chức năng. tStructure Tham số chức năng. Sau khi yêu cầu chức năng điều khiển từ xa gửi tới bộ điều khiển trung tâm, bộ điều khiển trung tâm luôn luôn gửi lại một đáp ứng dựa trên việc nhận chức năng điều khiển từ xa. Bộ điều khiển từ xa sẽ đợi chắc chắn đáp ứng được trả lời trước khi gửi các chức năng điều khiển từ xa khác đến bộ điều khiển 29 trung tâm CCU. 3.2.4 Định dạng đáp ứng điều khiển từ xa Dựa trên việc nhận chức năng điều khiển từ xa bộ điều khiển trung tâm CCU sẽ xử lý các chức năng yêu cầu và tạo ra một đáp ứng tương ứng với chức năng điều khiển từ xa đó. Cấu trúc đáp ứng trả lời chức năng điều khiển từ xa như sau: typedef struct { Word wFnId; định nghĩa chức năng. Word wError; trả mã lỗi Tstructure; } RSMT_REMOTEPROCEDURE_RSP; trong đó: wFnId Khai báo chức năng. wError Trả về mã lỗi của hàm chức năng. Nểu giá trị là khác không thì nội dung của tham số ‘tStructure’ là không hợp lệ. tStructure Cấu trúc chứa thông tin đáp ứng sau khi xử lý chức năng điều khiển từ xa. 3.2.5 Định dạng thông báo cập nhật MDSC_NOTIFY: Dựa vào trạng thái cập nhật thông tin bộ điều khiển trung tâm CCU sẽ gửi một thông điệp cập nhật đến bộ điểu khiển từ xa. Bộ điều khiển trung tâm chờ trả lời lại của bộ điều khiển từ xa trên cơ sở các thông điệp đó. Việc cập nhật thông điệp luôn luôn được cập nhật từ bộ điểu khiển từ xa CCU và chỉ gửi đến bộ điều khiển từ xa nếu có đăng ký cho ứng dụng. typedef struct { WORD wFnId; NTFSTRUC tStructure; } RSMT_NOTIFY; wFnId Khai báo thông báo The notification identifier. tStructure Cấu trúc chứa thông tin cập nhật. 30 3.2.6 Định dạng thông số truyền thông DSC_COMMUNICATION_PARAMS Trong thủ tục (protocol) Full có rất nhiều tham số để điều khiển các chức năng của thủ tục. Một số chức năng này có thể thay đổi chức năng điều khiển từ xa với thời gian tốt hơn dựa vào hệ thống sử dụng bộ điều khiển từ xa. Khi truyền thông tin có thể chuyển từ bộ điều khiển từ xa 1 đến bộ điều khiển từ xa 2 khi này bộ điều khiển thứ 1 từ chối công việc mà không mất mát thông tin liên lạc. Thời gian heart – beat time lớn hơn thời gian chuyển mạch. Để thay đối thông số truyền thông thì sử dụng tham số truyền thông như sau: typedef struct {WORDwFnId; WORDwHeartbeatTime; WORDwNrRetries; WORDwRetryTime; } RSMT_COMMUNICATION_PARAMS; wFnId Đặt thông số truyền thông. Thông số này phải đặt giá trị RSMC_SET_COMMUNICATION_PARAMS cho việc thiết lập thông số truyền thông. wHeartbeatTime Thời gian heartbeat time là số giây được sử dụng có giá trị thay đổi từ 01000. Giá trị 0 để gán cho chức năng tắt kiểm tra thời gian heartbeat. wNrRetries Số lượng lần thực hiện lại trước khi gói dữ liệu bị loại bỏ, giá trị thay đổi từ 010. Số đếm này là số lần truyền lại dựa vào gói NAK. wRetryTime Thời gian thực hiện lại khi không nhận các đáp ứng trả lời.Giá trị thay đổi từ 1 100. 3.3. Thủ tục truyền thông của bộ điều khiển trung tâm: Tất cả các thông báo nêu trên phải được truyền giữa bộ điều khiển trung tâm CCU và bộ điều khiển từ xa. Kỹ thuật truyền dẫn sử dụng các thủ tục phát hiện lỗi đường truyền. Truyền thông nối tiếp trong CCU có 3 loại giao thức truyền: Giao thức truyền đầu cuối dữ liệu (Terminal protocol ): Giao thức này ít được sử dụng để truyền dữ liệu.Thiết lập này được sử dụng cho đầu cuối dữ liệu ASCII. Giao thức truyền Camera (camera protocol): Giao thức này được sử dụng truyền thông giữa hệ thống chuyển mạch video đến bộ điều khiển trung tâm CCU. 31 Giao thức đầy đủ (Full protocol): bao gồm phát hiện lỗi và truyền lại thông tin. kỹ thuật kiểm tra được sử dụng truyền thông là heart beat. Giao thức đơn giản (Single protocol): Chỉ kiểm tra lỗi đường truyền. Kiểu gói dữ liệu: Truyền thông cơ bản giữa bộ điều khiển trung tâm với bộ điều khiển từ xa được dựa trên gói cơ bản như sau: Tiêu đề (header) Thông tin (message) Bít kiểm tra chksum 3.3.1 Đặc tính của giao thức truyền thông Full Trong hệ thống biểu quyết điện tử số DCN sử dụng giao thức truyền thông Full cung cấp đầy đủ chức năng giao thức bao gồm truyển lại và kiểm tra truyền thông. Trong hệ thống Multi CCU thì đòi hỏi số lượng lớn bộ nhớ khi sử dụng giao thức này. Đặc tính của giao thức truyền Full: Ưu tiên sử dụng phát hiện header bằng việc sử dụng escape handling. Thủ tục cung cấp thông tin ACK và NACK Thông tin được gửi bằng một khối. Bộ điều khiển trung tâm kiểm tra nếu mỗi byte nhận được trong 50 ms của byte trước. Nếu không thì gói NACK được gửi đi. Dựa vào việc nhận gói NACK sau đó thông tin được gửi lại. Mỗi thông tin bao gồm một số tuần tự. Việc nhận sử dụng dãy tuần tự này để nhận thông tin. Khi không có gói ACK được nhận trong 2 giây sau khi kết thúc việc truyền dữ liệu thì sẽ truyền lại.Tổng số truyền lại thông tin là 2 lần trước khi truyền gói dữ liệu bị huỷ bỏ. Kiểm tra kết nối sử dụng heartbeat. Mỗi gói nhận được có giá trị heart beat chính xác. Khi vượt qua thời gian heartbeat thì truyền thông sẽ dừng lại. Tất cả gói dữ liệu bị tạm dừng sẽ bị huỷ bỏ. Trên các ứng dụng sẽ thông báo đến bộ điều khiển từ xa là truyền thông lỗi, thất bại. Trong trường hợp đặc biệt thay đổi thông số truyền thông được thiết lập thông qua MDSC_COMMUNICATION_PARAMS: sau khi truyền thông tin này hệ thống đợi trả lời. Điều này giảm thông số truyền qua. 1. Định dạng thông tin header: Header có kiểu như sau: Escape Header type Sequence 32 typedef struct { BYTEbyEscape; có giá trị 0xC8 BYTEbyHeaderType; BYTEbySequence; } RSMT_HEADER; byEscape Escape byte dùng cho nhận dạng phần header. Dạng escape byte kết hợp cùng với loại tiêu đề để định nghĩa ra mục đích của gói dữ liệu. byHeaderType Thông tin loại gói dữ liệu bySequence Thông tin tuần tự khi gói dữ liệu được kích hoạt 2.Định nghĩa kiểu gói dữ liệu: Đặc tính giao thức Full sử dụng nhiều loại header để nhận biết thông tin truyền đi. Sau đây là các loại headertypes: ‘’ Gói chứa thông tin dữ liệu. ‘’ Gói thông tin xác nhận ACK. Gói dữ liệu này chỉ chứa header và checksum. ‘’ Gói không xác nhận trả lời NAK. Gói dữ liệu này chỉ chứa header và checksum không có thông tin trong gói này. Gói này yêu cầu truyền lại dữ liệu xác định với số tuần tự trong header. ‘?’ Gói dữ liệu heartbeat . Khi số tuần tự được truyền qua thì số tiếp theo của gói tiếp được truyền. Gói này được sử dụng để kiểm tra truyền thông. 3.Tính toán kiểm tra lỗi Checksum: Gói dữ liệu kết thúc bằng vùng checksum. Kiểm tra tất cả thông tin bên trong header và dữ liệu. Gói checksum có cấu tạo: correction checksum typedef struct { BYTEbyCorrection; BYTEbyChecksum; 33 } RSMT_CHECKSUM; byCorrection Giá trị chính xác này tính toán bằng giá trị 0xC8. Cũng có thể giá trị này gồm: 0x00 hoặc 0x13. byCheck Tính toán checksum thông qua header, thông tin dữ liệu và giá trị xác định. The Checksum được tính toán theo thứ tự như sau: 1. Đặt byte chính xác bằng giá trị 0x00. 2. Tính tổng tất cả các bytes với tiêu đề, thông tin và kiểm lỗi. 3. Đảo bít của checksum để đưa về module 256. 4. Kiểm tra lại checksum có bằng giá trị (0xC8). Khi bằng: a. Gán giá trị kiểm lỗi bằng 0x13. b. Trừ giá trị cũ bằng giá trị (0x00) và cộng giá trị mới (0x13) rồi tính tổng như bước 2. c. Đưa module 256 vào tính toán checksum và thực hiện đảo ngược bit của checksum. Kết quả không bao giờ bằng giá trị escape. Việc tính toán checksum này gửi đi phụ thuộc vào gói dữ liệu. Việc nhận được thực hiện chỉ ở bước 2 và 3 . 3.3.2 Tham số nhận biết thông tin Để nhận ra thông tin tiêu đề header trong luồng dữ liệu bytes là rất khó, bởi vì dữ liệu có thể là các số tuần tự giống nhau trong header. Vì lý do đó escape byte để phân biệt the header. Escape byte có giá trị 0xC8.Bởi vì dữ liệu được tryền cũng chứa giá trị escape. Điều này thể hiện dữ liệu phải quét chuyển giá trị escape thành các chuỗi escape. Giao thức ‘full’ sử dụng giá trị 0xC8 như là chuỗi escape. Chuỗi escape luôn theo sau các ký tự khác, nó thông tin chính xác các byte. 0xC8 Chuỗi bytes 0xC8 này sử dụng trong dữ liệu nếu dữ liệu chứa 0xC8 trong quá trình chuẩn bị thông tin ‘’ Định nghĩa header của gói dữ liệu mới. Sau header sẽ là thông tin và checksum. ‘’ Định nghĩa gói xác nhận thông tin ACK. ‘’ Gói thông tin xác nhận không trả lời ‘?’ Gói dữ liệu heartbeat. others.... Các giá trị khác báo lỗi và phớt lờ sau khi truyền thông tin NAK. 34 3.3.3 Giao thức truyền thông Giao thức bắt tay kết nối giữa bộ điểu khiển trung tâm CCU và bộ điều khiển từ xa sử dụng giao diện RS 232. Dữ liệu được kiểm tra lỗi bằng việc nhận checksum và thông tin xác nhận ACK. Giao thức truyền thông “Full” được thể hiện qua sơ đồ trạng thái truyền dẫn như hình vẽ : Hình 3.2: Sơ đồ trạng thái truyền trong thủ tục truyền “ FULL” Giao thức truyền thông full được thực hiện như sau: Trước khi chấp nhận bất kỳ dữ liệu thông tin nào thì gói dữ liệu heartbeat được nhận trước. Bởi vì heartbeat bao gồm số tiếp theo của gói dữ liệu tiếp theo. Việc nhận chỉ kiểm tra nếu gói dữ liệu nhận được là chuỗi sau khi nhận heartbeat. Số phân cách được tìm thấy cùng dữ liệu. Mỗi gói dữ liệu được gửi cùng với checksum, sau mỗi thông tin được gửi, bộ phát đợi thông tin xác nhận ACK hoặc thông tin không xác nhận NACK từ bộ nhận. Dựa vào việc nhận dữ liệu, checksum được kiểm tra và phản hồi gói dữ liệu ACK hoặc gói NAK gửi lại theo kết quả. Sau khi gửi dữ liệu thông báo bộ phát sẽ đợi đúng giá trị ACK hoặc NAK. Không có bất kỳ dữ liệu được nhận chính xác trước khi thông báo ACK bị bỏ qua. Bên gửi truyền lại dữ liệu dựa trên việc nhận NAK hoặc sau thời gian time out. 35 Tối đa 2 lần thực hiện lại. Độ dài tối đa được hạn chế 5000 bytes. Kiểm tra kết nối cơ khí khi thời gian trễ tối đa giữa 2 bytes là 50ms. 3.3.3.1 Gói dữ liệu không trả lời : Khi checksum lỗi, không chính xác thì NAK sẽ phát yêu cầu truyền lại gói dữ liệu. Để giúp bên gửi dữ liệu, bên nhận gửi gói chuỗi dữ liệu tuần tự. Chuỗi dữ liệu có các giá trị sau: Số tuần tự nhận biết: Bên nhận đợi gói dữ liệu hoặc thông báo heartbeat. Trong trường hợp này, Bên nhận không có thông báo tạm hoãn, tạm treo ( trên hình vẽ không có thông báo được đánh dấu), vì vậy không có trả lời ACK đã chờ đợi. Bên gửi dữ liệu: Đáp ứng gói NAK bằng việc yêu cầu phát lại dữ liệu. Khi không có gói dữ liệu bị treo heartbeat phải được truyền lại. 36 3.3.3.2 Giá trị thời gian của kết nối đường truyền Thông số kết nối đường truyền Giá trị Độ trễ tối đa giữa hai consecutive bytes of a message 50 ms Số lượng thông báo độc lập cho các thông báo, Thời gian đợi truyền gói ACK. 1 Số lượng thực hiện lại trước khi huỷ thông báo. Số này bao gồm số truyền lại sau khi nhận gói NAK. 2 Thời gian bắt đầu phát lại thông tin. Thời gian được tính sau byte cuối cùng được phát. 2 sec. Thời gian truyền giữa 2 consecutive heartbeat 5 sec. Thời gian heartbeat timeout. Sau thời gian không nhận bất kỳ gói dữ liệu nào 10 sec. Độ dài gói dữ liệu tối đa 5000 bytes Thời gian thực hiện chức năng điều khiển từ xa < 0,5 sec. Bảng 1.4: Thông số kết nối đường truyền 37 CHƯƠNG 4 XÂY DỰNG PHẦN MỀM BIỂU QUYẾT 4.1 Chức năng đăng ký đại biểu Để truy cập được hệ thống biểu quyết điện tử số DCN, đại biểu được gắn các quyền đăng nhập hệ thống như sau: Đăng ký tham dự. Kiểm tra quyền truy cập hệ thống. Nhận biết đại biểu. Các chức năng này dùng để phân quyền truy cập cho đại biểu: Dự thính. Có quyền phát biểu với tư cách khách mời, không có quyền biểu quyết. Đầy đủ các chức năng biểu quyết, phát biểu, truy cập hệ thống. 4.1.1 Đăng ký tham dự Đăng ký tham dự là một ứng dụng cho phép điều khiển từ xa để giữ lại những dấu hiệu sự hiện diện của các đại biểu trong hệ thống như thời gian bắt đầu truy cập hệ thống (có mặt) và thời gian thoát khỏi hệ thống (vắng mặt). Để đăng nhập vào hệ thống biểu quyết điện tử, đại biểu phải tự đăng ký bằng cách sử dụng một trong những lựa chọn sau: Nhấn nút điểm danh ở vị trí của mình. Nhập mã nhận dạng PIN ở vị trí của mình. Cài IDcard vào thiết bị đọc thẻ. Để thoát khỏi hệ thống, đại biểu rút ICcard khỏi bộ đọc thẻ. 4.1.2 Điều khiển truy cập hệ thống Để truy cập hệ thống biểu quyết điện tử số, Đại biểu phải thực hiện các bước truy cập như sau: Vào mã PIN tại vị trí đại biểu. Cắm thẻ đại biểu ID – card vào hộp đại biểu. 4.1.3 Nhận biết đại biểu Chức năng này cung cấp thông tin vị trí ngồi của đại biểu cho hệ thống biểu quyết nhận biết đại biểu thông qua kết qủa của việc nhập ID card vào hoặc rút chúng ra khỏi vị trí đại biểu. 38 Nhận biết đại biểu có 2 khả năng: Đại biểu ngồi đúng vị trí: Đại biểu phải ngồi đúng vị trí mới có quyền truy cập hệ thống: đăng ký phát biểu, phát biểu, biểu quyết. Đại biểu ngồi không đúng vị trí: đại biểu không ngồi đúng vị trí không có quyền truy cập hệ thống ngoại trừ hệ thống biểu quyết thiết lập chế độ ngồi tự do. 4.1.4 Kết hợp giữa đăng ký tham dự với truy cập hệ thống Dựa vào có sự kết hợp này mà có thể kiểm soát được chặt chẽ hệ thống biểu quyết: Khi “Mã hiện diện” được lựa chọn để đánh dấu sự có mặt, việc điều khiển đường vào không thể hoạt động. Khi đại biểu ngồi sai vị trí việc đăng ký tham dự sử dụng Mã hiện diện là không thể. 4.1.5 Thông số chức năng Thông số Ý nghĩa SeatAttend Xác định vị trí nơi đăng ký: vị trí míc, vị trí chỗ ngồi. SeatAccess Cho phép truy cập hay không được truy cập đến thiết bị. ControlType Xác định đại biểu đăng nhập vào hệ thống bằng cách: Ấn phím điểm danh, vào mã PIN, cài thẻ đại biểu ID Card hoặc cài thẻ đại biểu ID và mã PIN. 4.2 Điều khiển microphone trong hệ thống biểu quyết điện tử số 4.2.1 Các bước đăng ký phát biểu Khi đại biểu tham gia vào hội nghị, đại biểu có quyền đăng ký phát biểu, phát biểu thì đại biểu thực hiện các thao tác sau: Ấn phím đăng ký phát biểu “Mic” tại hộp đại biểu để vào danh sách đăng ký phát biểu. Hủy bỏ đăng ký phát biểu đại biểu ấn lại phím “Mic” tại hộp đại biểu. Người quản trị hệ thống sẽ căn cứ vào chủ tọa điều hành mà điều khiển việc bật tắt microphone của đại biểu. Kết thúc phát biểu thì đại biểu ấn nút “Mic”. 39 Lưu đồ điều khiển microphone như sau: 4.2.2 Chương trình kiểm soát danh sách đại biểu Khi phát biểu thảo luận hội nghị, phần quan trọng để điều hành hội nghị phải kiểm soát được danh sách đại biểu đăng ký phát biểu và biết đại biểu nào đang phát biểu. Do đó, ta xây dựng phần mềm hiển thị danh sách đăng ký phát biểu và danh sách phát biểu như sau: Thiết lập trạng thái Bắt đầu Kiểm tra yêu cầu và trạng thái micro Bật tắt Kiểm tra điều khiển bậttắt Kết thúc Dừng chương trình Không Có Có 40 Xây dựng giao diện chương trình chính bằng ngôn ngữ Visual Basic 6.0 như trên hình 4.1. Hình 4.1: Giao diện chính phần mềm biểu quyết. + Thiết kế form quản lý danh sách đăng ký và phát biểu như hình 4.2 Hình 4.2: Giao diện Danh sách đăng ký phát biểu. 41 4.3 Biểu quyết điện tử 4.3.1 Các kiểu loại biểu quyết điện tử số Biểu quyết điện tử số tuỳ vào thực tế sử dụng mà người ta chia làm nhiều kiểu loại khác nhau như sau: Biểu quyết nghị viện: Đại biểu tham dự biểu quyết với 3 trạng thái biểu quyết: tán thành, không tán thành, bỏ phiếu trống hoặc đại biểu không tham gia biểu quyết. Biểu quyết ForAgaint: Đại biểu chỉ bỏ phiếu với 2 trạng thái: đồng ý hoặc phản đối. Biểu quyết đáp ứng một số vấn đề: có 5 loại câu hỏi để đại biểu trả lời: rất phản đối, phản đối, bỏ phiếu trống, đồng ý, rất đồng ý. Đại biểu lựa chọn các ý kiến. Hệ thống biểu quyết sẽ tính tỷ lệ để chỉ thị sự đồng ý với các trạng thái. Tại các kỳ họp Quốc hội nước ta sử dụng kiểu biểu quyết nghị viện với 3 trạng thái biểu quyết: Tán thành, không tán thành, không biểu quyết. 4.3.2 Các bước thực hiện biểu quyết điện tử số Đặt các thông số biểu quyết: thời gian biểu quyết. Chọn loại biểu quyết: nghị viện công khai. Khởi tạo biểu quyết. Hiển thị kết quả biểu quyết ra màn hình. Kết thúc biểu quyết. 42 Quá trình biểu quyết điện tử số được thực hiện theo lưu đồ sau: Bắt đầu biểu quyết Kiểm tra biểu quyết Kiểm tra thời gian Thuật toán thống kê đưa ra màn hình Kết thúc Hết thời gian Còn thời gian 43 4.3.3 Xây dựng chương trình hiển thị kết quả biểu quyết + Xây dựng form màn hình hiển thị biểu quyết như sau: Hình 4.3: Giao diện hiển thị kết quả biểu quyết 4.4 Điều khiển MSComm trong Visual Basic Visual Basic 6 là ngôn ngữ lập trình hướng đối tượng có nhiều tính năng trong đó có điều khiển ActiveX MSComm dùng truyền thông nối tiếp. Các tính chất của điều khiển này được dùng để thiết lập giao tiếp với các thiết bị ngoại vi qua cổng RS232. Các tính chất của MSComm được sắp xếp theo chức năng: Thiết lập tham số cho cổng: + CommID: trả lại handles đồng nhất tới thiết bị truyền thông, có kiểu Long. Tính chất này không có lúc thiết kế mà chỉ có khi thi hành, thuộc tính này là ReadOnly. + CommPort: dạng object.CommPort = value. Value là chỉ số của cổng Com có giá trị từ 1 ‐> 16 và mặc định có giá trị =1. Thiết lập thông số này trước khi mở cổng. Sẽ có lỗi error 68 (Device unavailable) nếu như không mở được cổng này. + InBuferSize: thiết lập hoặc trả lại kích thước của bộ đệm nhận, tính = byte. Mặc định là 1024 byte. + InputLen: object.InputLen = value thiết lập hoặc trả lại số byte mỗi lần thuộc tính Input đọc trong bộ đệm nhận. Mặc định giá trị Value = 0 tức là thuộc tính Input sẽ đọc hết nội dung của bộ đệm nhận khi thuộc tính này được 44 gọi. Nếu số kí tự trong bộ đệm nhận không = InputLen thì thuộc tính Input sẽ trả lại kí tự rỗng. Vì thế, chọn cách kiểm tra InBufferCount để chắc chắn số kí tự yêu cầu đã có đủ trước khi dùng lệnh Input. Tính chất này có ích khi đọc dữ liệu một máy mà dữ liệu ra được định dạng bằng các khối có kích thước cố định. + InputMode: object.InputMode = value . Value = 0 hay = comInputModeText dữ liệu nhận được dạng văn bản kiểu kí tự theo chuẩn ANSI. Dữ liệu nhận được sẽ là một sâu. Value =1 hay = comInputModeBinary dùng nhận mọi kiểu dữ liệu như kí tự điều khiển nhúng, kí tự NULL,.. Giá trị nhận được từ Input sẽ là một mảng kiểu Byte. + NullDiscard: object.NullDiscard = value tính chất này quyết định kí tự trống có được truyền từ cổng đến bộ đệm nhận hay không. Nếu value= True kí tự này không được truyền. value = false kí tự trống sẽ được truyền. Kí tự trống được định nghĩa theo chuẩn ASCII là kí tự 0 – chr(0). + OutBuferSize: giống như InBuferSize, mặc định là 512. + ParityReplace: thiết lập và trả lại kí tự thay thế kí tự không đúng trong lỗi giống nhau. + PortOpen: thiết lập và trả lại tính trạng của cổng (đóng hoặc mở). object.PortOpen = value . value = true cổng mở. value =false cổng đóng và xóa toàn bộ dữ liệu trong bộ đệm nhận và truyền. Cần phải thiết lập thuộc tính CommPort đúng với tên của cổng trước khi mở cổng giao tiếp. Thêm vào đó, cổng giao tiếp của thiết bị phải hỗ trợ giá trị trong thuộc tính Setting thì thiết bị mới hoạt động đúng, còn không thì chạy không tốt. Đường DTR và RTS luôn giữ lại trạng thái của cổng. + RthresHold: object.Rthreshold = value value kiểu số nguyên. Thiết lập số kí tự nhận được trước khi gây lên sự kiện comEvReceive. Mặc định = 0 tức là không có sự kiện OnComm khi nhận được dữ liệu. Thiết lập = 1 tức là sự kiện OnComm xảy ra khi bất kì kí tự nào được chuyển đến bộ đệm nhận. + Settings: object.Settings = value thiết lập hoặc trả lại các thông số truyền: baudrate, bít dữ liệu, bít chẵn lẻ, bít stop. Nếu Value không có giá trị khi mở sẽ gây ra lỗi 380 (Invalidproperty value). + SThreshold: thiết lập và và trả lại số kí tự nhỏ nhất được cho phép trong bộ đệm gửi để xảy ra sự kiện OnComm = comEvSend . Theo mặc định giá trị này = 0 tức là khi truyền sẽ không gây ra sự kiện OnComm. Nếu thiết lập thông số này =1 thì sự kiện OnComm xảy ra khi bộ đệm truyền rỗng. Sự kiện OnComm = comEvSend chỉ xảy ra khi mà số kí tự trong bộ đệm truyền nhỏ hơn hoặc = Sthreshold. Nếu số kí tự trong bộ đệm này luôn lớn hơn Sthreshold thì sự kiện này không thể xảy ra. Truyền nhận dữ liệu: + CommEvent: trả lại phần lớn sự kiện giao tiếp hoặc có lỗi. CommEvent xảy ra khi có lỗi hoặc khi xảy ra sự kiện nào đó. 45 Sau đây là một số hằng số lỗi: Sự kiện Giá trị Miêu tả sự kiện comEventBreak 1001 khi nhận được một tín hiệu Break. comEventFrame 1004 Lỗi hệ thống. Phần cứng phát hiện ra một lỗi hệ thống comEventOverrun 1006 Xảy ra khi cổng tự tràn( Overrun). Kí tự không được đọc từ phần cứng trước khi kí tự tiếp theo tới và do đó kí tự này bị mất. comEventRxOver 1008 Xảy ra khi bộ đệm nhận bị tràn. Không có đủ chỗ cho dữ liệu trong bộ đệm nhận. comEventRxParity 1009 Lỗi Parity. Phần cứng phát hiện ra một lỗi Parity. comEventTxFull 1010 Xảy ra khi bộ đệm truyền bị đầy. Bộ đệm truyền bị đầy trong khi ghi dữ liệu lớn vào bộ đệm comEventDCB 1011 Một lỗi không mong muốn khi đang khôi phục lại khối điều khiển thiết bị( DCB – Device Control Block) cho cổng Bảng 1.5: Sự kiện comevent Một số sự kiện : Sự kiện Giá trị Miêu tả sự kiện comEvSend 1 Xảy ra khi số kí tự trong bộ đệm truyền nhỏ hơn giá trị SthresHold. comEvReceive 2 Xảy ra khi bộ đệm nhận được số kí tự bằng giá trị RthresHold. Sự kiện này được tạo ra liên tục cho tới khi dùng thuộc tính Input để lấy hết dữ liệu từ trong bộ đệm nhận. RcomEvCTS 3 Xảy ra khi có thay đổi trong đường CTS( Clear To Send) comEvDSR 4 Xảy ra khi thay đổi trong đường DSR( Data Set Ready). Sự kiện này chỉ xảy ra khi đường DSR thay đổi từ 1 ‐> 0. 46 comEvCD 5 Xảy ra khi có thay đổi trong đường CD( Carrier Detect) comEvRing 6 Phát hiện chuông (Ring).Một số UART không hỗ trợ sự kiện này. comEvEOF 7 Xảy ra khi nhận được kí tự kết thúc file ( kí tự 26 trong bảng mã ASCII) Bảng 1.6: Bảng các sự kiện EOFEnable : object.EOFEnable = value quyết định các hành động nếu MSComm tìm thấy kí tự kết thúc file. Nếu value=true khi tìm thấy kí tự kết thúc file thì sẽ gây lên sự kiện comEvEOF trong OnCommEvent. Nếu value= false thì sẽ không gây lên sự kiện này. + InBufferCout: trả lại số kí tự đang có trong bộ đệm nhận, có thể xoá bộ đệm nhận bằng cách đặt thuộc tính này =0. Không nhầm với thuộc tính InBufferSize là tổng kích thước của bộ đệm nhận. + Input: nhận và xoá dữ liệu trong bộ đệm nhận. Nếu InputMode là comInputModeText thì giá trị trả về sẽ là một xâu tức có kiểu String, dữ liệu dạng text trong một biến kiểu Variant. Nếu InputMode = comInputModeBinary thì thuộc tính này sẽ trả lại dữ liệu dạng nhị phân dưới dạng một mảng kiểu byte trong một biến Variant. + OutBufferCount: trả lại số kí tự trong bộ đệm truyền. + Output: ghi dữ liệu vào bộ đệm truyền. có thể truyền kiểu text hoặc kiểu nhị phân. Nếu truyền bằng kiểu text thì cho một biến Variant = kiểu String, nếu truyền kiểu nhị phân thì cho Output= variant = một mảng kiểu Byte. Bắt tay( handshaking): + Break : thiết lập hoặc xoá tín hiệu. object.Break = value value = true hoặc false. Khi set value= true thì thông số Break này sẽ gửi một tín hiệu break. Tín hiệu break trì hoãn việc truyền dữ liệu và đưa đường truyền vào trạng thái break tới khi mà value = false. + CDHolding: quyết định xem sự truyền này đến đâu bằng cách truy vấn đường CD( Carrier Detect). Carrier Detect là tín hiệu gửi từ modem tới máy tính kết nối với nó thông báo rằng nó đang online. Nếu giá trị = true thì nó đường CD đang ở mức cao, nếu = false thì đường dây này đang ở mức thấp. Tính chất này không có trong lúc thiết kế chỉ có trong khi chạy chương trình.Carrier Detect được biết như là Receive Line Signal Detect (RLSD). + CTSHolding: quết định khi nào gửi dữ liệu bằng cách truy vấn trạng thái đường Clear To Send (CTS). Thông thường tín hiệu CTS được gửi từ modem tới máy tính kết nối với nó để báo rằng đang quá trình truyền dữ liệu. Thuộc tính Readonly chỉ xuất hiện khi chạy chương trình. Đường Clear To Send dùng trong RTSCTS (Request To SendClear To Send) bắt tay phần cứng. CTSHolding để tự tay dò đường Clear To Send để biết trạng thái của nó. 47 + DSRHolding: biết trạng thái của đường Data Set Ready (DSR). Tín hiệu Data Set Ready truyền từ modem tới máy tính nối với nó để thông báo rằng modem đã sẵn sàng hoạt động. Tính chất này dùng khi viết Data Set ReadyData Terminal Ready handshaking routine cho máy Data Terminal Equipment (DTE)‐ máy trang bị đầu cuối dữ liệu. + DTREnable: tính chất này quyết định khi nào cho phép đường Data Terminal Ready (DTR) trong truyền thông. Tín hiệu DTR gửi từ máy tính tới modem để báo rằng máy tính sẵn sàng là nơi nhận dữ liệu. Khi DTREnable = true thì đường Data Terminal Ready set lên cao khi cổng mở, và thấp khi cổng đóng. Nếu DTREnable = false thì đường đó luôn mức thấp. Trong phần lớn trường hợp set đường Data Terminal Ready thành thấp để hang up telephone. + Handshaking: thiết lập và trả lại giao thức bắt tay phần cứng. object.Handshaking =value . Các giá trị của value: comNone 0 (Mặc định) Không bắt tay comXOnXOff 1 Bắt tay XONXOFF comRTS 2 Bắt tay RTSCTS (Request To SendClear To Send) comRTSXOnXOff 3 Dùng cả bắt tay Request To Send and XONXOFF Bảng 1.7: Bảng thiết lập giao thức bắt tay Handshaking chỉ là giao thức truyền thông nội tại quyết định bởi dữ liệu nào được truyền từ cổng phần cứng tới bộ đệm nhận. Khi kí tự của dữ liệu tới cổng nối tiếp, thiết bị truyền thông sẽ chuyển nó vào trong bộ đệm nhận. Nếu không có bộ đệm dữ liệu hoặc cần đọc kí tự trực tiếp từ phần cứng, có thể mất dữ liệu bởi vì kí tự từ phần cứng đến rất nhanh. Giao thức Handshaking đảm bảo dữ liệu không bị mất, khi dữ liệu đến cổng quá nhanh thì thiết bị truyền thông sẽ chuyển dữ liệu vào trong bộ đệm nhận. + RTSEnable: quyết định khi nào cho phép đường Request To Send (RTS), Tín hiệu RTS từ máy tính tới modem để yêu cầu được tryền dữ liệu. Khi RTSEnable = true thì đường RTS mức cao khi cổng mở, tích mức thấp khi cổng đóng. Và hiển nhiên khi RTSEnable thì đường RTS luôn mức thấp.RTS dùng trong RTSCTS hardware handshaking. RTSEnable cho phép dò đường RTS khi cần biết tình trạng của đường này. 48 + Đoạn chương trình sử dụng MSCom để bắt dữ liệu biểu quyết điện tử số từ cổng( port 1) của CCU: Private Sub MSComm1_OnComm() Dim dem As String Dim ii As Integer Dim CoMat As Integer Dim TanThanh As Integer Dim KhongTanThanh As Integer Dim KhongThamGia As String Dim KhongBieuQuyet As Integer If MSComm1.CommEvent = comEvReceive Then dem = MSComm1.Input ii = Asc(dem) Neu doc vao ma ket thuc=27 hoac xuong dong=32 thi bo qua Doc ky tu tiep theo If (ii = 27) Then ChuoiThu = dem = MSComm1.Input ii = Asc(dem) End If If (ii = 32) Then dem = MSComm1.Input ii = Asc(dem) End If Chuoi thu duoc ChuoiThu = ChuoiThu Chr(ii) End If Reset bien If Check = 1 Then Me.LblThoiGian.Caption = 00:00 Me.lblCoMat.Caption = 0 Me.lblTanThanh.Caption = 0 Me.lblKhongTanThanh.Caption = 0 Me.lblKhongBieuQuyet.Caption = 0 Me.lblCoMat_PT.Caption = 0% Me.lblTanThanh_PT.Caption = 0% Me.lblKhongTanThanh_PT.Caption = 0% Me.lblKhongBieuQuyet_PT.Caption = 0% End If Xu ly thoi gian 49 Me.LblThoiGian.Caption = Mid(ChuoiThu, 4, 4) Phut = Mid(Me.LblThoiGian.Caption, 1, 2) Giay = Mid(Me.LblThoiGian.Caption, 3, 2) Me.LblThoiGian.Caption = Phut : Giay Xu ly chuoi thu duoc If Len(ChuoiThu) = 28 Then CoMat = CInt(Trim(Mid(ChuoiThu, 8, 4))) Me.lblCoMat.Caption = CoMat TanThanh = CInt(Trim(Mid(ChuoiThu, 12, 4))) Me.lblTanThanh.Caption = TanThanh KhongTanThanh = CInt(Trim(Mid(ChuoiThu, 16, 4))) Me.lblKhongTanThanh.Caption = KhongTanThanh KhongBieuQuyet = CInt(Trim(Mid(ChuoiThu, 20, 4))) + Trim(Mid(ChuoiThu, 24, 4)) Me.lblKhongBieuQuyet.Caption = KhongBieuQuyet Tinh phan tram bieu quyet Me.lblCoMat_PT.Caption = Round(CoMat 100 493, 2) % Me.lblTanThanh_PT.Caption = Round(TanThanh 100 493, 2) % Me.lblKhongTanThanh_PT.Caption = Round(KhongTanThanh 100 493, 2) % Me.lblKhongBieuQuyet_PT.Caption = Round(KhongBieuQuyet 100 493, 2) % End If 50 Sử dụng Access 97 để thiết kế cơ sở dữ liệu như sau: Cơ sở dữ liệu đại biểu TableDelegate: Hình 4.4: Cơ sở dữ liệu đại biểu Cơ sở dữ liệu các tỉnh, thành phố.Table GroupID: Hình 4.5: Cơ sở dữ liệu các tỉnh, thành phố 51 4.4 Kết quả ghép nối giữa máy tính với bộ điều khiển trung tâm: Toàn cảnh phiên họp Quốc hội: Hình 4.6: Toàn cảnh phiên họp Quốc hội Toàn cảnh hệ thống biểu quyết điện tử số: 52 Hình 4.7: Hệ thống biểu quyết tại Hội trường Bộ Quốc phòng Màn hình điều khiển hệ thống biểu quyết điện tử số: Hình 4.8: Giao diện điều khiển microphone và biểu quyết 53 Phần mềm biểu quyết điện tử được xây dựng bằng ngôn ngữ Visual Basic 6, cơ sở dữ liệu đại biểu được xây dựng bằng Access 97 với các tính năng chính sau: 1. Tra cứu thông tin Đại biểu Quốc hội: Hình 4.9: Tra cứu thông tin đại biểu 2.Hiển thị Danh sách đăng ký phát biểu: Hình 4.10: Hiển thị danh sách đăng ký phát biểu 54 3. Hiển thị kết quả biểu quyết: Hiển thị kết quả biểu quyết khởi tạo biểu quyết: Hình 4.11: Kết quả bắt đầu biểu quyết Hiển thị kết quả biểu quyết sau khi hết thời gian biểu quyết: Hình 4.12:Kết quả biểu quyết khi hết thời gian biểu quyết 55 KẾT LUẬN Bản luận văn đi sâu nghiên cứu hệ thống biểu quyết điện tử số DCN với nguyên lý hoạt động, định tuyến âm thanh, thông số truyền thông, giao thức truyền giữa bộ điều khiển trung tâm CCU với các thiết bị điều khiển từ xa. Luận văn nêu tổng quan hệ thống biểu quyết số và nêu bật được các đặc tính truy cập hệ thống, các loại biểu quyết điện tử, các bước thực hiện điều khiển microphone, biểu quyết điện tử số và chuẩn ghép nối RS 232C, đi sâu tìm hiểu trình điểu khiển MS Com trong ngôn ngữ Visual Basic 6. Đặc biệt, việc xây dựng phần mềm biểu quyết trong luận văn đã hiển thị được kết quả biểu quyết điện tử của hệ thống biểu quyết điện tử số DCN tại phiên họp của Quốc hội, Danh sách đăng ký đại biểu Quốc hội, truy cập thông tin đại biểu Quốc hội. Việc thực hiện ghép nối giữa máy tính với hệ thống biểu quyết số qua cổng port 1 của bộ điều khiển trung tâm trong hệ thống biểu quyết số tại hội trường Bộ Quốc phòng sử dụng trình điều khiển MS Com của Visual Basic 6. Trong luận văn này xây dựng phần mềm biểu quyết căn bản đã hiển thị được kết quả biểu quyết, danh sách đăng ký phát biểu. Vì vậy, cần hoàn thiện phần mềm biểu quyết thêm các tính năng về cơ sở dữ liệu đại biểu có kèm theo hình ảnh, lưu trữ chi tiết kết quả biểu quyết, tìm kiếm đại biểu theo tỉnh, thành phố, tên đại biểu v.v… làm cho phần mềm hoàn thiện hơn. Trên cơ sở nghiên cứu nguyên lý cơ bản của hệ thống biểu quyết điện tử số, hướng nghiên cứu tiếp của đề tài luận văn là thiết kế mạch biểu quyết ứng dụng thực tế. 56 TÀI LIỆU THAM KHẢO Tiếng Việt 1. Phạm Văn Ất (2008), Hướng dẫn sử dụng Access 2003 2007, NXB Giao thông vận tải, Hà Nội. 2. Phạm Thị Ngọc Mai (2005), Microsoft Visual Basic 6.0 lập trình cơ sở dữ liệu, NXB Lao động Xã hội, Hà Nội. 3. Trần Quang Vinh (2008), Cấu trúc máy vi tính, NXB Đại học Quốc gia Hà Nội, Hà Nội. Tiếng Anh 4. Bosch Security System (2003), General Remote Interface Description. 5. Bosch Security System (2003), AT Remote Interface Description. 6. Bosch Security System (2003), VT Remote Interface Description. 7. Bosch Security System (2003), MM Remote Interface Description. 8. Philips Comunication, Security Image (2002), Digital Congress Network DCN Instalation Operating Manual. 9. Bosch Security System (2003), SC SI Remote Interface Description. 10. MSDN Library (2001), Visual Tools and Languages Visual Studio 6.0 Documentation Visual Basic Documentation Reference Control Reference ActiveX Control MSComm Control. 57 PHỤ LỤC Khai báo các biến giá trị theo hệ thống biểu quyết số: Sub InitCommandTable() CmdTable(cmdMicroOn) = 1 CmdTable(cmdMicroOff) = 2 CmdTable(cmdAllMicroOff) = 3 CmdTable(cmdPrioMicroOn) = 4 CmdTable(cmdPrioMicroOff) = 5 CmdTable(cmdRemainSpeech) = 6 CmdTable(cmdRequestOn) = 1 CmdTable(cmdRequestOff) = 2 CmdTable(cmdAllRequestOff) = 3 CmdTable(cmdVoteIndYes) = 1 CmdTable(cmdVoteIndNo) = 2 CmdTable(cmdVoteIndAbstain) = 3 CmdTable(cmdVoteIndNoVoted) = 4 CmdTable(cmdVoteTotal) = %1 CmdTable(cmdVoteTotalResYes) = %2 CmdTable(cmdVoteTotalResNo) = %3 CmdTable(cmdVoteTotalResAbstain) = %4 CmdTable(cmdVoteTotalResNoVoted) = %5 CmdTable(cmdCardIn) = 1 CmdTable(cmdCardOut) = 2 End Sub Sub GetCommand() Dim CRLF As String Dim tmp As TCmd Dim i As Integer Dim j As Integer Dim s As String Dim n As Integer Dim cmd As String Dim Idx As Integer CRLF = Chr(13) j = InStr(InputBuffer, CRLF) While j > 0 s = Left(InputBuffer, j) InputBuffer = Right(InputBuffer, Len(InputBuffer) j) n = Len(s) 58 For i = 1 To n 2 cmd = Mid(s, i, 2) Select Case cmd Case CmdTable(cmdMicroOn) tmp.CmdID = cmdMicroOn tmp.Seat = Val(Mid(s, i + 2, 4)) tmp.Index = ConvertToInt(Mid(s, i + 6, 4)) SendCmdToAllUser tmp Exit For Case CmdTable(cmdMicroOff) tmp.CmdID = cmdMicroOff tmp.Seat = Val(Mid(s, i + 2, 4)) tmp.Index = ConvertToInt(Mid(s, i + 6, 4)) SendCmdToAllUser tmp Exit For Case CmdTable(cmdVoteIndYes) Idx = ConvertToInt(Mid(s, i + 2, 4)) If Idx < MaxDelegate 1 Then VoteIndTable(Idx) = cmdVoteIndYes End If Exit For Case CmdTable(cmdVoteIndNo) Idx = ConvertToInt(Mid(s, i + 2, 4)) If Idx < MaxDelegate 1 Then VoteIndTable(Idx) = cmdVoteIndNo End If Exit For Case CmdTable(cmdVoteIndAbstain) Idx = ConvertToInt(Mid(s, i + 2, 4)) If Idx < MaxDelegate 1 Then VoteIndTable(Idx) = cmdVoteIndNoVoted End If Exit For Case CmdTable(cmdVoteIndNoVoted) Idx = ConvertToInt(Mid(s, i + 2, 4)) If Idx < MaxDelegate 1 Then VoteIndTable(Idx) = cmdVoteIndNoVoted End If Exit For Case CmdTable(cmdVoteTotal) tmp.CmdID = cmdVoteTotal tmp.Total = Val(Mid(s, i + 2, 4)) SendCmdToAllUser tmp Exit For Case CmdTable(cmdVoteTotalResYes) tmp.CmdID = cmdVoteTotalResYes 59 tmp.Total = Val(Mid(s, i + 2, 4)) SendCmdToAllUser tmp Exit For Case CmdTable(cmdVoteTotalResNo) tmp.CmdID = cmdVoteTotalResNo tmp.Total = Val(Mid(s, i + 2, 4)) SendCmdToAllUser tmp Exit For Case CmdTable(cmdVoteTotalResAbstain) tmp.CmdID = cmdVoteTotalResAbstain tmp.Total = Val(Mid(s, i + 2, 4)) SendCmdToAllUser tmp Exit For Case CmdTable(cmdCardIn) tmp.CmdID = cmdCardIn tmp.Card = Val(Mid(s, i + 2, 4)) tmp.Seat = Val(Mid(s, i + 6, 4)) tmp.Index = ConvertToInt(Mid(s, i + 10, 4)) SendCmdToAllUser tmp Exit For Case CmdTable(cmdCardOut) tmp.CmdID = cmdCardOut tmp.Card = Val(Mid(s, i + 2, 4)) tmp.Seat = Val(Mid(s, i + 6, 4)) tmp.Index = ConvertToInt(Mid(s, i + 10, 4)) SendCmdToAllUser tmp Exit For End Select Next i j = InStr(InputBuffer, CRLF) Wend End Sub Sub SendCmdToAllUser(cmd As TCmd) Dim i As Integer For i = 0 To cUser 1 SendCmdToUser i, cmd Next i End Sub Sub SendCmdToUser(uid As Integer, cmd As TCmd) Dim n As Integer n = UserCmds(uid).Pointer + UserCmds(uid).Counter If n >= BufferLen Then UserCmds(uid).Buffer(n BufferLen) = cmd Else UserCmds(uid).Buffer(n) = cmd End If 60 UserCmds(uid).Counter = UserCmds(uid).Counter + 1 If UserCmds(uid).Counter = BufferLen Then UserCmds(uid).Counter = UserCmds(uid).Counter 1 UserCmds(uid).Pointer = UserCmds(uid).Pointer + 1 If UserCmds(uid).Pointer = BufferLen Then UserCmds(uid).Pointer = 0 End If End If End Sub Sub SendMsgToUser(uid As Integer, Sender As String, Msg As String) Dim n As Integer n = UserMsgs(uid).Pointer + UserMsgs(uid).Counter If n >= MaxMsgNote Then UserMsgs(uid).Sender(n MaxMsgNote) = Sender UserMsgs(uid).MsgNote(n MaxMsgNote) = Msg Else UserMsgs(uid).Sender(n) = Sender UserMsgs(uid).MsgNote(n) = Msg End If UserMsgs(uid).Counter = UserMsgs(uid).Counter + 1 If UserMsgs(uid).Counter = MaxMsgNote Then UserMsgs(uid).Counter = UserMsgs(uid).Counter 1 UserMsgs(uid).Pointer = UserMsgs(uid).Pointer + 1 If UserMsgs(uid).Pointer = MaxMsgNote Then UserMsgs(uid).Pointer = 0 End If End If End Sub Function ConvertToInt(s As String) As Integer Dim ch As String Dim tmp As Integer Dim rate(5) As Integer Dim n As Integer Dim i As Integer Dim x As Integer rate(4) = 1 rate(3) = 16 rate(2) = 16 16 rate(1) = 16 16 16 tmp = 0 s = Trim(s) If s = ???? Then ConvertToInt = 0 Exit Function End If 61 n = Len(s) For i = n To 1 Step 1 x = Asc(Mid(s, i, 1)) Asc(0) If x >= 0 And x <= 15 Then tmp = tmp + x rate(i) Else tmp = 0 Exit For End If Next i If tmp > 255 And tmp < 384 Then tmp = tmp 128 End If If tmp > 511 And tmp < 640 Then tmp = tmp 256 End If If tmp > 767 Then tmp = tmp 384 End If ConvertToInt = tmp End Function Function SendCmdToFile(uid As Integer, cmd As TCmd) As Boolean Dim hf As Integer Dim fn As String On Error Resume Next fn = UserCmdFileName(uid) If Trim(fn) = Then SendCmdToFile = False Exit Function End If If Dir(fn) = Then hf = FreeFile Open fn For Binary As hf Len = LenB(cmd) Put hf, , cmd Close hf SendCmdToFile = True Else SendCmdToFile = False End If End Function Function SendMsgToFile(uid As Integer, Sender As String, Msg As String) As Boolean Dim hf As Integer Dim fn As String Dim s As String 60 62 Dim s1 As String 255 On Error Resume Next s = Trim(Sender) s1 = Trim(Msg) fn = UserMsgFileName(uid) If Trim(fn) = Then SendMsgToFile = False Exit Function End If If Dir(fn) = Then hf = FreeFile Open fn For Binary As hf Put hf, , s Put hf, , s1 Close hf SendMsgToFile = True Else SendMsgToFile = False End If End Function Sub InitComm(ComObj As Control, ComPort As Integer, Setting As String) On Error Resume Next ComObj.CommPort = ComPort ComObj.Settings = UCase(Setting) ComObj.InputLen = 0 ComObj.PortOpen = True InputBuffer = End Sub Sub ComEvent(ComObj As MSComm) Dim s As String s = ComObj.Input InputBuffer = InputBuffer s GetCommand InputBuffer End Sub Đoạn chương trình hiển thị Danh sách đăng ký phát biểu: Private Sub cmdRegister_Click() Dim tmp As TCmd Dim i As Integer Dim c As Integer If tCardNumber.Text = Then Exit Sub If IndexToSeat(Val(tCardNumber.Text)) = 0 Then Exit Sub 63 c = lbRequestOn.ListCount For i = 0 To c 1 If Val(tCardNumber.Text) = LRequestIndex(i).Index And _ Val(tOrder.Text) > c Then tOrder.Text = c + 1 tCardNumber.Text = tCardNumber.SetFocus Exit Sub End If Next i Request On tmp.CmdID = cmdRequestOn tmp.cmdIndex = Val(tOrder.Text) 1 tmp.Index = Val(tCardNumber.Text) tmp.Seat = IndexToSeat(Val(tCardNumber.Text)) SendCmdToAllUser tmp lblInfo.Caption = tCardNumber.Text = tCardNumber.SetFocus End Sub Private Sub Form_Activate() Dim c As Integer c = lbRequestOn.ListCount tCardNumber.SetFocus tOrder.Text = Trim(Str(c + 1)) End Sub Private Sub lbMicroOn_GotFocus() If Me.Visible Then lbMicroOn.ListIndex = 1 tCardNumber.SetFocus End If End Sub Private Sub lbrequeston_GotFocus() If Me.Visible Then tCardNumber.SetFocus End If End Sub Private Sub SSFrame2_Click() 64 End Sub Private Sub tCardNumber_Change() Dim dInfo As TDelegate Dim s As String Dim i As Integer If Len(Trim(tCardNumber.Text)) > 3 Or _ Val(tCardNumber.Text) > MaxDelegate Or _ Val(tCardNumber.Text) < 0 Then tCardNumber.Text = lblInfo.Caption = Exit Sub End If For i = 1 To Len(tCardNumber.Text) If Asc(Mid(tCardNumber.Text, i, 1)) < Asc(0) Or _ Asc(Mid(tCardNumber.Text, i, 1)) > Asc(9) Then tCardNumber.Text = lblInfo.Caption = Exit Sub End If Next i If IndexToSeat(Val(tCardNumber.Text)) > 0 Then i = DelegateSearch(Val(tCardNumber.Text)) If i = 1 Then ResetDelegateInfo dInfo Else dInfo = DelegateTable(i) End If s = Padr(Trim(dInfo.DelegateName), 25, ) + _ Padr(Trim(dInfo.GroupName), 25, ) + _ Sè ghÕ : + Padr(Trim(Str(IndexToSeat(dInfo.CardNumber))), 4, ) + _ Micro : + Trim(Str(STML(IndexToSeat(dInfo.CardNumber)))) lblInfo.Caption = s Else lblInfo.Caption = End If End Sub Private Sub tCardNumber_KeyDown(KeyCode As Integer, Shift As Integer) Dim tmp As TCmd Dim Idx As Integer Dim i As Integer Dim Shiftdown As Integer Dim c As Integer Arrow Up was pressed If KeyCode = vbKeyUp And lbRequestOn.ListCount > 0 Then If lbRequestOn.ListIndex = 1 Then lbRequestOn.ListIndex = 0 65 ElseIf lbRequestOn.ListIndex > 0 Then lbRequestOn.ListIndex = lbRequestOn.ListIndex 1 End If End If Arrow Down was pressed If KeyCode = vbKeyDown And lbRequestOn.ListCount > 0 Then If lbRequestOn.ListIndex = 1 Then lbRequestOn.ListIndex = 0 ElseIf lbRequestOn.ListIndex < lbRequestOn.ListCount 1 Then lbRequestOn.ListIndex = lbRequestOn.ListIndex + 1 End If End If Home key was pressed If KeyCode = vbKeyHome And lbRequestOn.ListCount > 0 Then lbRequestOn.ListIndex = 0 End If End key was pressed If KeyCode = vbKeyEnd And lbRequestOn.ListCount > 0 Then lbRequestOn.ListIndex = lbRequestOn.ListCount 1 End If If Trim(tCardNumber.Text) = Or _ Val(tCardNumber.Text) > 999 Then tCardNumber.Text = Exit Sub End If Shiftdown = (Shift And vbShiftMask) > 0 Idx = Val(tCardNumber.Text) c = frmTMicro.lbRequestOn.ListCount Delete key was pressed Xoa mot dong trong Danh sach dai bieu DANG KY PHAT BIEU If Not Shiftdown And KeyCode = vbKeyDelete Then If c > 0 Then For i = 0 To lbRequestOn.ListCount 1 If Idx = LRequestIndex(i).Index Then off current request tmp.CmdID = cmdRequestOff tmp.cmdIndex = Idx tmp.Index = Val(tCardNumber.Text) tmp.Seat = IndexToSeat(tmp.Index) SendCmdToAllUser tmp lblInfo.Caption = tCardNumber.Text = 66 tCardNumber.SetFocus End If Next i End If End If Shift + Delete key pressed Xoa mot dong trong Danh sach dai bieu PHAT BIEU If Shiftdown And KeyCode = vbKeyDelete And _ lbMicroOn.ListCount 0 Then For i = 0 To lbMicroOn.ListCount 1 If Idx = LMicroIndex(i, 0) Then off current micro tmp.CmdID = cmdMicroOff tmp.Index = LMicroIndex(i, 0) tmp.Seat = LMicroIndex(i, 1) SendCmdToAllUser tmp tCardNumber.Text = tCardNumber.SetFocus Exit For End If Next i End If shift + Insert ket was pressed If Shiftdown And KeyCode = vbKeyInsert Then For i = 0 To lbMicroOn.ListCount 1 If Idx = LMicroIndex(i, 0) Then tCardNumber.Text = Exit Sub End If Next i On new micro tmp.CmdID = cmdMicroOn tmp.Seat = IndexToSeat(Idx) tmp.Index = Val(tCardNumber.Text) SendCmdToAllUser tmp tCardNumber.Text = tCardNumber.SetFocus End If End Sub Private Sub tOrder_Change() Dim c As Integer Dim i As Integer 67 c = frmTMicro.lbRequestOn.ListCount If Len(tOrder.Text) > 2 Or _ Val(tOrder.Text) > 99 Or _ Val(tOrder.Text) <= 0 Or _ Val(tOrder.Text) > c + 1 Then tOrder.Text = Trim(Str(c + 1)) tOrder.SelStart = 0 tOrder.SelLength = 3 Exit Sub End If For i = 1 To Len(tOrder.Text) If Asc(Mid(Trim(tOrder.Text), i, 1)) < Asc(0) Or _ Asc(Mid(Trim(tOrder.Text), i, 1)) > Asc(9) Then tOrder.Text = Trim(Str(c + 1)) tOrder.SelStart = 0 tOrder.SelLength = 3 Exit Sub End If Next i End Sub Private Sub tOrder_GotFocus() tOrder.SelStart = 0 tOrder.SelLength = 3 End Sub Đoạn chương trình hiển thị thông tin đại biểu: Private Sub Form_Load() Dim s As String For i = 0 To TotalDelegate 1 s = Padr(DelegateTable(i).DelegateName, 25, ) + _ Padr(DelegateTable(i).GroupName, 25, ) + _ Padr(Str(DelegateTable(i).CardNumber), 4, ) lDelegate.AddItem s Next i End Sub
Xem thêm

50 Đọc thêm

Một số câu lệnh và hàm thông dụng trong Visual Basic

MỘT SỐ CÂU LỆNH VÀ HÀM THÔNG DỤNG TRONG VISUAL BASIC

Một số câu lệnh và hàm thông dụng trong VB
Các Phát biểu và hàm chuẩn trong Visual Basic
I. CÁC PHÁT BIỂU ĐIỀU KHIỂN
a. Cấu trúc chọn lựa IF :

IF < Biểu thức Logic điều kiện> THEN
‘Khi điều kiện đúng
‘Nội dụng các câu lệnh cần thực hiện
ELSE
‘Khi điều kiện sai
‘Nội dụng các câu lệnh cần thực hiện
END IF
Trong câu lệnh không nhất thiết phải sử dụng ELSE, có thể bỏ qua nó tùy vào mục đích

b. Cấu trúc SELECT CASE :
SELECT CASE
CASE
CASE

CASE
CASE ELSE
‘Khi tất cả các giá trị ở trên đều không đúng
‘Nội dung các lệnh cần thực hiện
END SELECT
Tương tự như IF trong câu lệnh không nhất thiết phải sử dụng CASE ELSE, có thể bỏ qua nó tùy vào mục đích

II. CÁC CẤU TRÚC LẶP :
a. Cấu trúc DO WHILE ... LOOP :
DO WHILE
‘Các câu lệnh muốn thực thi biểu thức điều kiện còn đúng
LOOP ‘Quay về DO WHILE để kiểm tra biểu thức điều kiện
Khi VB thực hiện vòng lặp này, đầu tiên sẽ kiểm tra biểu thức điều kiện. Nếu Sai, nó sẽ dừng lại vòng lặp ngay và thực hiện câu lệnh kế tiếp còn nếu đúng thì thực hiện các lệnh bên trong. Vậy cấu trúc DO WHILE… LOOP thực hiện các câu lệnh bên trong nó khi điều kiện đúng.

b. Cấu trúc DO … LOOP WHILE :
DO
‘Các câu lệnh thực thi
LOOP WHILE ‘Quay về DO nếu điều kiện đúng
Khi VB thực hiện vòng lặp này, đầu tiên sẽ thực hiện khối lệnh bên trong nó ngai. Sau khi thực hiện nó sẽ kiểm tra điều kiện. Nếu đúng sẽ quay lại còn sai thì dừng vòng lặp.

c. Cấu trúc DO … LOOP UNTIL :
DO
‘Các câu lệnh thực thi
LOOP UNTIL ‘Quay về DO nếu điều kiện sai
Giống như DO … LOOP WHILE nhưng nó sẽ thoát khỏi vòng lặp khi điều kiện Đúng

d. Cấu trúc FOR … NEXT
FOR TO STEP khoảng tăng
‘ Phần các lệnh thực thi khi biến chưa đạt giá trị cuối
NEXT Biến

(Phần Step có thể có hoặc không, VB ngầm hiểu là +1)
Cấu trúc này lặp với số lần biết trước, lặp từ Giá trị đầu đến giá trị cuối (giá trị đầu có thể lớn hơn giá trị cuối nếu step <0)

III. MỘT SỐ LỆNH :
1 .EXIT FOR
Câu lệnh : EXIT FOR
Lồng vào trong vòng lặp For khi muốn dừng lại vòng lặp bất cứ lúc nào.

2 .EXIT DO
Câu lệnh : EXIT DO
Lồng vào trong vòng lặp có cấu trúc DO khi muốn dừng lại vòng lặp bất cứ lúc nào.

3 .EXIT FOR
Câu lệnh : EXIT SUB
Thoát khỏi thủ tục mà bất cứ lúc nào mà không cần thực hiện các lệnh bệnh trong nó.

4 .END
Chấm dứt chương trình ngay, tất cả các cửa sổ chương trình đều đóng lại khi bạn thực hiện thao tác này.

5. Beep
Phát ra tiếng kêu Beep

6. Lệnh Date :
Cho phép bạn đặt lại ngày hệ thống, hay lấy ngày hệ thống
Cú pháp : DATE =
VD: Date = June 12, 2000

7. TIME
Cho phép đặt lại giờ hệ thống, hay lấy giờ hệ thống
Cú pháp : TIME =
VD: Time = 5 : 12 : 45 PM

8.LOAD
Xem thêm

9 Đọc thêm

BÀI CẤU TRÚC RẼ NHÁNH (BÀI SOẠN ĐI THI)

BÀI CẤU TRÚC RẼ NHÁNH (BÀI SOẠN ĐI THI)

writeln(‘x1= ‘,x1:8:3,’ x2= ‘,x2:8:3);end;Readln;End.Program Giai_PTB2;Var a, b, c:real;D, x1, x2: real;Beginwrite(‘a,b,c:’); readln(a,b,c);D:=b*b – 4*a*c;if DelsebeginIf D=0 then writlen(‘phuong trinh co nghiem kep x=‘,-b/(2*a):6:2)elseBeginx1:=(-b-sqrt(D))/(2*a); x2:=-b/a – x1;writeln(‘x1= ‘,x1:8:3,’ x2= ‘,x2:8:3);end;end;Readln;End.Câu 1. Câu lệnh If-then nào dưới đâyviết đúng cú phápa) If a&gt;b then a:=b;b) If-then a&gt;b, a:=b;

13 Đọc thêm

TÀI LIỆU ĐIỀU KIỆN DOCX

TÀI LIỆU ĐIỀU KIỆN DOCX

Bài 8 Điều kiệnMục tiêu:Kết thúc bài học này, bạn có thể: Sử dụng: Câu lệnh if Câu lệnh ifelse Câu lệnh với nhiều if Câu lệnh if lồng nhau Câu lệnh switch.Các bước trong bài học này được trình bày chi tiết, rõ ràng và cẩn thận. Điều này giúp ta hiểu rõ vềcông cụ lập trình. Thực hiện theo các bước sau thật cẩn thận.Phần I - Trong thời gian 1 giờ 30 phút đầu:8.1 Lệnh if:Ví dụ 1:Trong phần này chúng ta sẽ viết một chương trình để tính tiền hoa hồng phải trả cho người bán hàngdựa vào số lượng hàng họ bán được.Bài toán:Công ty SARA sẽ trả 10% tiền hoa hồng cho nhân viên bán hàng của công ty nếu doanh số bán hàngcủa nhân viên đạt $10,000 hoặc hơn. Tính tiền hoa hồng phải trả cuối mỗi thánng.Bài toán khai báo hai biến kiểu ‘float’ là sales_amt và com. Chú ý, các biến được khai báo trong cùngmột dòng trong chương trình thì sử dụng dấu phẩy (,) để phân cách giữa các biến.Theo dõi đoạn mã lệnh dưới đây:printf(“Enter the Sales Amount: “);scanf(“%f”,&amp;sales_amt);Trong hàm printf(), chúng ta hiển thị thông điệp yêu cầu nhập doanh số bán hàng, và trong hàmscanf() sử dụng %f để nhận một giá trị từ người dùng. Giá trị nhập vào sẽ được gán cho biếnsales_amt.if (sales_amt &gt;= 10000)com = sales_amt * 0.1;Câu lệnh trên được dùng để kiểm tra giá trị của biến sales_amt có lớn hơn hoặc bằng 10000 không. &gt;=là toán tử so sánh, sẽ trả về giá trị đúng hoặc sai. Trong trường hợp, nếu bạn nhập vào giá tri 15000,
Xem thêm

8 Đọc thêm

TÀI LIỆU KỸ THUẬT ĐỆ QUY VÀ QUAY LUI PPT

TÀI LIỆU KỸ THUẬT ĐỆ QUY VÀ QUAY LUI PPT

Kỹ thuật đệ quy và quay lui1. Dùng dữ liệu thay cho xử lý: mảng bool, mảng bit ... đánh dấu ứng cử viên đã dùng.2. Dùng hàng rào giới hạn vùng xử lý: đặc trưng là bài mã đi tuần dùng ma trận (n+2)*(n+2) để dễ xử lý hơn.3. Dùng câu lệnh IF để dễ dàng giới hạn dừng đệ quy: đặc biệt có ích khi xử lý bài map với dữ liệu mảng 2 chiều (IF i&gt;10 ---&gt; Tăng i, đưa j về 1 và exit). Đặt câu lệnh này trước quá trình đệ quy, với ý nghĩa là "điểm mốc" của đệ quy.4. Đặt cờ báo đã tìm ra kết quả, chấm dựt sự đệ quy cũng như quay lui để tránh lãng phí thời gian "trả về các giá trị" trong chương trình quay lui.Cấu trúc 1 thủ tục đệ quy:beginIF quá giới hạn OR tìm thấy THEN exit;IF hết dòng THEN xuống dòng;khởi tạo cột =1;exit;IF chưa sử dụng AND thỏa điều kiệnGán vào;Đánh dấu đã sử dụng;Đệ quy bước kế tiếp;Gỡ bỏ giá trị đã gán;end;Các bài tập:1. Số hạng thứ k: Dãy số nguyên n&lt;=30k ptử và số nguyên dương k&lt;=n. Chỉ ra số hạng lớn thứ k trong dãy (có k số ko bé hơn nó và n-k số ko lớn hơn nó).NumK.inp NumK.out4 2 10110
Xem thêm

4 Đọc thêm

CÂU ĐIỀU KIỆN LOẠI 3

CÂU ĐIỀU KIỆN LOẠI 3

Cấu trúc này được dùng khi ta muốn đặt một giả thiết ngược lại với điều gì đó đã xảy ra trong quá khứ.. - Nói cách khác, ở câu điều kiện loại 3, mệnh đề IF dùng thì quá khứ hoàn thành, m[r]

1 Đọc thêm

Ôn tap ngôn ngữ lập trình pascal

ÔN TAP NGÔN NGỮ LẬP TRÌNH PASCAL

Tài liệu ôn tập ngôn ngữ lập trình pascal.I.Cấu trúc điều khiển
1.Cấu trúc rẽ nhánh if…then
a.Dạng thiếu if <Điều kiện> then ;
Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh
b.Dạng đủ If <Điều kiện> then
Else ;
Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh 1, điều kiện sai thì thực hiện Câu lệnh 2.
2.Câu lệnh rẽ nhánh Case…of
Cú pháp: Case of
: Câu lệnh 1;
: Câu lệnh 2;
…….
Xem thêm

32 Đọc thêm

LẬP TRÌNH C CƠ BẢN

LẬP TRÌNH C CƠ BẢN

Khi có nhiều sự lựa chọn thì đây là cấu trúc phù hợp thay vì phải dùng nhiều lệnh if… else lồng nhau 3.1 CÚ PHÁP TRANG 9 _case n1:_ _các câu lệnh_ _case n2:_ _các câu lệnh_ _………_ _case n[r]

26 Đọc thêm

TOEIC PART 5 TIẾT 3 LUYEN TAP

TOEIC PART 5 TIẾT 3 LUYEN TAP

3. (A) hear(B) hearing(C) heard(D) have heardBest regards,TimPart 7:Questions 1-2 refer to the following notice.FAXRecipient: J. Harrison (1 -847-562-2533)Sender: Jeremy Lee (1 -312-455-7000)Remarks: Lease ContractMessage:I am contacting you regarding the lease contract we previously discussed.Attached to this facsimile is a copy of this contract. Please note that this is only a copy and istherefore not the original. You must visit our office to sign the original contract within 15days. If the contract is not signed by then, the lease will be provided to someone else.Sincerely,Jeremy LeeMoon.vnHotline: 04.32.99.98.983Moon.vnCô VŨ MAI PHƯƠNG – KHÓA TOEIC 2016
Xem thêm

10 Đọc thêm

HK2 45P NO 2 ANH 6 THÍ ĐIỂM

HK2 45P NO 2 ANH 6 THÍ ĐIỂM

reduce_______(reduce) electric bill2. She (not/buy)_____didn’t buy________ anything for her mum last year3. They (not/meet)__haven’t met_____________for a long time4. Students (get)___will get____________good marks if they (study)____study__________hard.III. READING: Read the text and then choose T (true) or F (false) for these sentences (1,5)Scientists believe that the smart home may be the home of the future. These homes may be ofdifferent shapes and sizes. They may also float on the water. Scientist have designed the ecohouseboat- a kind of house floating on the sea. But the houseboat is stable and doesn’t rockheavily when there are big waves. It makes use of waste and solar energy to move it around andprovide power. It also has solar panels on the top of the house to generate electricity. And it canrecycle all kinds of household waste.A robot controls everything in the house and does the housework. In the kitchen, smartrefrigerators and diswashers can automatically work by themselves. A smart oven can cook yourfavorite dishes. All these things and other advances will make our life much better.The smart home will be looked the same in shapes and sizes.FIt may float on the waterTAn eco houseboat will rock heavily if there are big wavesFIt is powered by eletricityFIn the house, a robot will cook your favorite dishFThere are smart refrigerators and diswashers in this houseboatTIV. WRITING:1. Rewrite the sentences to keep the same meaning (0,5)
Xem thêm

5 Đọc thêm

Đề thi môn điện tử số (ngôn ngữ phần cứng VHDL) trường đại học điện lực có đáp án

ĐỀ THI MÔN ĐIỆN TỬ SỐ (NGÔN NGỮ PHẦN CỨNG VHDL) TRƯỜNG ĐẠI HỌC ĐIỆN LỰC CÓ ĐÁP ÁN

Đề thi môn điện tử số ngôn ngữ phần cứng VHDL trường đại học điện lực có đáp ánCách 2library ieee; khai báo thư việnuse ieee.std_logic_1164.all;entity bai_2 is port ( x1,x2,CLK,RST: in std_logic; Khai báo các chân vào z: out std_logic Khai báo các chân ra );end bai_2;architecture bai_2 of bai_2 iskhoi JKFFcomponent JKFF is Khai báo khối component JKFF cấp thấpport( J,K,CLK,RST: in std_logic; y,ynot : out std_logic);end component;cong NOT component inverter is Khai báo khối component cổng NOT cấp thấpport( x: in std_logic; y: out std_logic);end component;cong OR_2 component OR_2 is Khai báo khối component cổng OR_2 cấp thấpport( x,y: in std_logic; z: out std_logic );end component;cong NOR_2 component NOR_2 is Khai báo khối component cổng NOR_2 cấp thấpport( x,y: in std_logic; z: out std_logic );end component;cong AND_2component AND_2 is Khai báo khối component cổng AND_2 cấp thấpport( x,y: in std_logic; z: out std_logic );end component;signal S1,S2,S3,S4,S5,S6,S7,S8: std_logic; Khai báo các tín hiệu để lưu trữ tạm thời các giá trị trung gianbeginCong_not: inverter port map(x1,S1); Kết nối các khối component cấp thấp lại với nhau port_name => signal_nameCong_OR : OR_2 port map(x2,S8,S2);JKFF_1 : JKFF port map(S1,S2,CLK,RST,S3,S4);Cong_NOR: NOR_2 port map(S1,S3,S5);JKFF_2 : JKFF port map(S5,S6,CLK,RST,S7,S8);Cong_AND: AND_2 port map(S7,S4,z);end bai_2;Bài 3 phat hien chuoi 0100 FSM VHDLKhai bao thu vienlibrary ieee;use ieee.std_logic_1164.all;Khai bao thuc theentity FSM is port ( X :in std_logic; Input X CLK :in std_logic; Input clock RST :in std_logic; Input resetZ :out std_logic Output );end FSM;architecture FSM of FSM istype state is (S0,S1,S2,S3,S4); Khai báo state là dữ liệu kiểu liệt kê các trạng tháisignal pr_state, nx_state: state; Pr_state(trang thai hien tai), nx_state(trang thai tiep theo)beginPhan mach tuan tu ben duoiprocess(RST,CLK)beginif (RST=1) thenpr_state <= S0;elsif (CLKevent and CLK=1) then Nếu có xung clock mức cạnh lên thìpr_state <= nx_state; Trạng thái hiện tại được gán bằng trạng thái tiếp theoend if; end process;Phan mach to hop ben duoiprocess(X,pr_state) Danh sách cảm nhận là trạng thái hiện tại và đầu vào Xbegincase pr_state is Với trạng thái hiện tại là:when S0 => Khi trạng thái hiện tại là S0Z <= 0; Đầu ra Z=0if(X=0) then nx_state <= S1; Nếu đầu vào X=0 thì trạng thái tiếp theo là S1 else nx_state <= S0; Nếu đầu vào X=1 thì trạng thái tiếp theo là S0 end if;when S1 => Khi trạng thái hiện tại là S1Z <= 0; Đầu ra Z=0if(X=1) then nx_state <= S2; Nếu đầu vào X=1 thì trạng thái tiếp theo là S2 else nx_state <= S1; Nếu đầu vào X=0 thì trạng thái tiếp theo là S1 end if;when S2 => Khi trạng thái hiện tại là S2Z <= 0; Đầu ra Z=0if(X=0) then nx_state <= S3; Nếu đầu vào X=0 thì trạng thái tiếp theo là S3 else nx_state <= S0; Nếu đầu vào X=1 thì trạng thái tiếp theo là S0end if;when S3 => Khi trạng thái hiện tại là S3Z <= 0; Đầu ra Z=0if(X=0) then nx_state <= S4; Nếu đầu vào X=0 thì trạng thái tiếp theo là S4 else nx_state <= S2; Nếu đầu vào X=1 thì trạng thái tiếp theo là S2end if; when S4 => Khi trạng thái hiện tại là S4Z <= 1; Đầu ra Z=1if(X=0) then nx_state <= S1; Nếu đầu vào X=0 thì trạng thái tiếp theo là S1 else nx_state <= S2; Nếu đầu vào X=1 thì trạng thái tiếp theo là S2end if;end case; end process; end FSM;
Xem thêm

25 Đọc thêm

THAM KHAO TRIGGER

THAM KHAO TRIGGER

Đỗ Thị Minh Phụng Trang 9 END IF @Msg='TC' PRINT 'Da luu thanh cong' ELSE BEGIN PRINT @Msg ROLLBACK TRAN END -- Tang gia tri cho cot TotalAmount trong table ORDERS DECLARE @nOrderID int,[r]

13 Đọc thêm

TIỂU LUẬN MÔN PHÂN TÍCH VÀ ĐÁNH GIÁ THUẬT TOÁN THUẬT TOÁN CHI ĐỂ TRỊ VÀ ỨNG DỤNG VÀO BÀI TOÁN SẮP XẾP

TIỂU LUẬN MÔN PHÂN TÍCH VÀ ĐÁNH GIÁ THUẬT TOÁN THUẬT TOÁN CHI ĐỂ TRỊ VÀ ỨNG DỤNG VÀO BÀI TOÁN SẮP XẾP

Giải thuật sắp xếp trộn sau đây có thể tốt hơn nếu các mảng U và V là các biến toàncục và xem việc sắp xếp chèn Insert(T) như là giải thuật cơ bảnProcedure mergesort(T[1..n]);{If n đủ nhỏ then Insert(T)//giải thuật sx đơn giảnElse{int U[1..1+],V[1..1+;U[1,l]:=T[1,mid];V[1,r]:=T[mid +1,n];}Mergesrt(U);mergesort(V);merge(U,V,T);c. Đánh giá thuật toán:Giải thuật sắp xếp này minh hoạ tất cả các khía cạnh của chia để trị. Khi số lượngcác phần tử cần sắp là nhỏ thì ta thường sử dụng các giải thuật sắp xếp đơn giản.Khi số phần tử đủ lớn thì ta chia mảng ra 2 phần, tiếp đến trị từng phần một và cuốicùng là kết hợp các lời giải.Giả sử t(n) là thời gian cần thiết để giải thuật này sắp xếp một mảng n phần tử. Việctách T thành U và V là tuyến tính. Ta cũng dễ thấy merge(U,V,T) cũng tuyến tính. Do vậy:t(n)=t([n/2]) + t([n/2]) + g(n)trong đó g( n ) = O( n )hay t( n )=2t( n /2)+g( n )Theo định lý chủTa có: l=2; b=2và k=1Nên t(n)= Ρ (nlogn), vì bk =lNhư vậy hiệu quả của mergesort tương tự heapsort. Trong thực tế sắp xếp trộn có thể
Xem thêm

16 Đọc thêm

PYTHON TUTORIAL HƯỚNG ĐỐI TƯỢNG C++

PYTHON TUTORIAL HƯỚNG ĐỐI TƯỢNG C++

Financial Accounting TutorialAbout the TutorialPython is a general-purpose interpreted, interactive, object-oriented, and high-levelprogramming language. It was created by Guido van Rossum during 1985- 1990.Like Perl, Python source code is also available under the GNU General Public License(GPL). This tutorial gives enough understanding on Python programming language.AudienceThis tutorial is designed for software programmers who need to learn Pythonprogramming language from scratch.PrerequisitesYou should have a basic understanding of Computer Programming terminologies. Abasic understanding of any of the programming languages is a plus.Disclaimer &amp; Copyright Copyright 2014 by Tutorials Point (I) Pvt. Ltd.All the content and graphics published in this e-book are the property of TutorialsPoint (I) Pvt. Ltd. The user of this e-book is prohibited to reuse, retain, copy,distribute or republish any contents or a part of contents of this e-book in any mannerwithout written consent of the publisher.We strive to update the contents of our website and tutorials as timely and asprecisely as possible, however, the contents may contain inaccuracies or errors.Tutorials Point (I) Pvt. Ltd. provides no guarantee regarding the accuracy, timelinessor completeness of our website or its contents including this tutorial. If you discoverany errors on our website or in this tutorial, please notify us atcontact@tutorialspoint.com.i
Xem thêm

461 Đọc thêm