Tài liệu Lập trình điều khiển thiết bị: LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
1
MỤC LỤC
MỤC LỤC ............................................................................................................. 1
Bài 1 ...................................................................................................................... 6
TỔNG QUAN VỀ LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ .......................................... 6
1.1. Lập trình điều khiển thiết bị từ máy ............................................................. 6
1.2. Giới thiệu các giao diện truyền thông trên máy tính .................................... 6
1.3. Các ngôn ngữ lập trình ............................................................................... 7
1.4. Lập trình điều khiển trong Windows Form ................................................... 8
1.4.1. Thiết kế giao diện ................................................................................. 8
1.4.2. Sử dụng các điều khiển .......................................................
103 trang |
Chia sẻ: putihuynh11 | Lượt xem: 584 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Lập trình điều khiển thiết bị, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
1
MỤC LỤC
MỤC LỤC ............................................................................................................. 1
Bài 1 ...................................................................................................................... 6
TỔNG QUAN VỀ LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ .......................................... 6
1.1. Lập trình điều khiển thiết bị từ máy ............................................................. 6
1.2. Giới thiệu các giao diện truyền thông trên máy tính .................................... 6
1.3. Các ngôn ngữ lập trình ............................................................................... 7
1.4. Lập trình điều khiển trong Windows Form ................................................... 8
1.4.1. Thiết kế giao diện ................................................................................. 8
1.4.2. Sử dụng các điều khiển ........................................................................ 9
1.4.3. Sử dụng các thư viện ........................................................................... 9
Bài 2 .................................................................................................................... 10
NGÔN NGỮ LẬP TRÌNH C# .............................................................................. 10
2.1. Cấu trúc chương trình ............................................................................... 11
2.2. Kiểu dữ liệu ............................................................................................... 12
2.3. Biến, hằng và cách khai báo ..................................................................... 16
2.3.1. Biến .............................................................................................................................. 16
2.3.2. Hằng ............................................................................................................................. 18
2.4. Các phép toán ........................................................................................... 21
2.4.1. Phép toán số học ......................................................................................................... 21
2.4.2. Phép toán quan hệ ...................................................................................................... 22
2.4.3. Phép toán logic ........................................................................................................... 22
2.4.4. Phép toán tăng giảm ................................................................................................... 23
2.4.5. Thứ tự ưu tiên các phép toán ..................................................................................... 24
2.5. Biểu thức ................................................................................................... 25
2.5.1. Biểu thức số học .......................................................................................................... 25
2.5.2. Biểu thức logic ............................................................................................................. 26
2.5.3. Biểu thức điều kiện ...................................................................................................... 26
2.5.4. Biểu thức gán ............................................................................................................... 27
2.5.5. Biểu thức ép kiểu ......................................................................................................... 27
2.6. Cấu trúc rẽ nhánh ..................................................................................... 29
2.6.1. Cấu trúc rẽ nhánh if ..................................................................................................... 29
2.6.2. Cấu trúc rẽ nhánh switch ............................................................................................. 34
2.7. Cấu trúc lặp while, do .. while.................................................................... 37
2.7.1. Cấu trúc lặp While ................................................................................ 37
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
2
2.7.2. Cấu trúc lặp do...while ............................................................................... 38
2.8. Cấu trúc lặp for và một số lệnh điều khiển khác ....................................... 41
2.8.1. Cấu trúc lặp for ......................................................................................... 41
2.8.1. Cấu trúc lặp foreach .................................................................................. 46
2.8.1. Các lệnh điều khiển khác ........................................................................... 47
Bài 3 .................................................................................................................... 47
SỬ DỤNG FORM VÀ CÁC ĐIỀU KHIỂN CƠ BẢN ............................................. 47
3.1. Form .......................................................................................................... 47
3.1.1. Chức năng .............................................................................................................. 47
3.1.2. Một số thuộc tính thường dùng ............................................................................. 48
3.1.3. Một số sự kiện thường dùng .................................................................................. 51
3.1.4. Ví dụ minh họa ...................................................................................................... 52
3.2. Labels ....................................................................................................... 54
3.3. Button ........................................................................................................ 54
3.4. Texbox ...................................................................................................... 55
3.5. ComboBox, ListBox ................................................................................... 60
3.6. Checkbox, RadioButton ............................................................................ 61
Bài 4 .................................................................................................................... 62
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN CƠ BẢN ....................................... 62
4.1. Mục tiêu .................................................................................................... 62
4.2. Các kiến thức lý thuyết liên quan .............................................................. 62
4.3. Nội dung luyện tập .................................................................................... 62
Bài 5 .................................................................................................................... 62
SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH ẢNH ............................................... 62
VÀ THỜI GIAN ................................................................................................... 62
5.1. PictureBox ................................................................................................. 62
5.2. ImageList .................................................................................................. 63
5.3. Timer ......................................................................................................... 63
5.4. DateTimePicker ......................................................................................... 63
5.5. ListView ..................................................................................................... 63
5.6. TreeView ................................................................................................... 64
5.7. ProgressBar .............................................................................................. 64
Bài 6 .................................................................................................................... 64
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH ẢNH VÀ THỜI GIAN
............................................................................................................................ 64
6.1. Mục tiêu .................................................................................................... 64
6.2. Các kiến thức lý thuyết liên quan .............................................................. 64
6.3. Nội dung luyện tập .................................................................................... 64
Bài 7 .................................................................................................................... 65
KỸ THUẬT THIẾT KẾ GIAO DIỆN ...................................................................... 65
7.1. Các nguyên tắc chung trong thiết kế giao diện ......................................... 65
7.2. Thiết kế giao diện trong C# ....................................................................... 65
7.3. Kỹ thuật thiết kế giao diện điều khiển hệ thống ......................................... 66
Bài 8 .................................................................................................................... 66
THẢO LUẬN THIẾT KẾ GIAO DIỆN ................................................................... 66
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
3
8.1. Mục tiêu .................................................................................................... 66
8.2. Tổ chức ..................................................................................................... 66
Bài 9 .................................................................................................................... 67
TẠO MÔ PHỎNG THIẾT BỊ ĐIỀU KHIỂN VÀ CHUYỂN ĐỘNG TỊNH TIẾN ...... 67
9.1. Tạo mô phỏng thiết bị điều khiển .............................................................. 67
9.2. Các kỹ thuật tạo mô phỏng chuyển động tịnh tiến .................................... 67
9.2.1. Kỹ thuật thay đổi toạ độ ...................................................................... 67
9.2.2. Kỹ thuật vẽ lại hình ............................................................................. 67
9.3. Các ví dụ về tạo mô phỏng chuyển động tịnh tiến .................................... 68
Bài 10 .................................................................................................................. 68
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG .............................................................. 68
THIẾT BỊ ĐIỀU KHIỂN ........................................................................................ 68
10.1. Mục tiêu ................................................................................................. 68
10.2. Các kiến thức lý thuyết liên quan ........................................................... 68
10.3. Nội dung luyện tập ................................................................................. 68
Bài 11 .................................................................................................................. 69
TẠO MÔ PHỎNG CHUYỂN ĐỘNG QUAY ......................................................... 69
11.1. Các kỹ thuật tạo mô phỏng chuyển động quay ...................................... 69
11.1.1. Kỹ thuật vẽ lại hình .......................................................................... 69
11.1.2. Kỹ thuật thay hình ........................................................................... 69
11.2. Các ví dụ về tạo mô phỏng chuyển quay ............................................... 70
Bài 12 .................................................................................................................. 70
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG .............................................................. 70
THIẾT BỊ CHUYỂN ĐỘNG TỊNH TIẾN ............................................................... 70
12.1. Mục tiêu ................................................................................................. 70
12.2. Các kiến thức lý thuyết liên quan ........................................................... 70
12.3. Nội dung luyện tập ................................................................................. 70
Bài 13 .................................................................................................................. 71
CỔNG SONG SONG .......................................................................................... 71
13.1. Cơ bản về cổng song song .................................................................. 71
13.2. Kiến trúc phần cứng .............................................................................. 72
13.3. Các thanh ghi ......................................................................................... 75
13.4. Ghép nối qua cổng song song ............................................................... 77
Bài 14 .................................................................................................................. 80
THỰC HÀNH LẬP TRÌNH ................................................................................... 80
MÔ PHỎNG CHUYỂN ĐỘNG QUAY ................................................................. 80
14.1. Mục tiêu ................................................................................................. 80
14.2. Các kiến thức lý thuyết liên quan ........................................................... 81
14.3. Nội dung luyện tập ................................................................................. 81
Bài 15 .................................................................................................................. 82
LẬP TRÌNH CỔNG SONG SONG ...................................................................... 82
15.1. Cơ bản về lập trình cổng song song .................................................... 82
15.2. Lập trình cổng song song trong một số ngôn ngữ ................................. 82
15.3. Lập trình cổng song song trong C# ........................................................ 82
Bài 16 .................................................................................................................. 84
THẢO LUẬN GHÉP NỐI THIẾT BỊ ..................................................................... 84
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
4
QUA CỔNG SONG SONG ................................................................................. 84
16.1. Mục tiêu ................................................................................................. 84
16.2. Tổ chức .................................................................................................. 84
Bài 17 .................................................................................................................. 84
THỰC HÀNH LẬP TRÌNH CỔNG SONG SONG ................................................ 84
17.1. Mục tiêu ................................................................................................. 84
17.2. Các kiến thức lý thuyết liên quan ........................................................... 84
17.3. Nội dung luyện tập ................................................................................. 85
Bài 18 .................................................................................................................. 85
CỔNG NỐI TIẾP ................................................................................................. 85
18.1. Giới thiệu chung về cổng nối tiếp .......................................................... 85
18.2. Kiến trúc phần cứng RS232 ................................................................... 86
18.3. Giao thức truyền thông RS232 .............................................................. 90
18.4. Một số chuẩn giao tiếp nối tiếp khác ...................................................... 91
18.4.1. RS422 ............................................................................................. 91
18.4.2. Chuẩn RS423A ............................................................................... 91
18.4.3. Chuẩn RS485 .................................................................................. 91
Bài 19 .................................................................................................................. 92
LẬP TRÌNH CỔNG NỐI TIẾP ............................................................................. 92
19.1. Cơ bản về lập trình cổng nối tiếp ......................................................... 92
19.2. Cổng COM ảo ........................................................................................ 92
19.3. Lập trình cổng COM trong một số ngôn ngữ ......................................... 92
19.4. Lập trình cổng COM trong C# ................................................................ 92
Bài 20 .................................................................................................................. 93
THỰC HÀNH CƠ BẢN LẬP TRÌNH TRUYỀN THÔNG QUA CỔNG NỐI TIẾP . 93
20.1. Mục tiêu ................................................................................................. 93
20.2. Các kiến thức lý thuyết liên quan ........................................................... 93
20.3. Nội dung luyện tập ................................................................................. 93
Bài 21 .................................................................................................................. 93
THẢO LUẬN GHÉP NỐI THIẾT BỊ QUA CỔNG NỐI TIẾP ................................ 93
21.1. Mục tiêu ................................................................................................. 93
21.2. Tổ chức .................................................................................................. 93
Bài 22 .................................................................................................................. 94
THỰC HÀNH LẬP TRÌNH TRUYỀN THÔNG GIỮA HAI THIẾT BỊ QUA CỔNG
NỐI TIẾP ............................................................................................................ 94
22.1. Mục tiêu ................................................................................................. 94
22.2. Các kiến thức lý thuyết liên quan ........................................................... 94
22.3. Nội dung luyện tập ................................................................................. 94
Bài 23 .................................................................................................................. 94
MỘT SỐ GIAO DIỆN GHÉP NỐI KHÁC ............................................................. 94
23.1. Ghép nối qua cổng USB ........................................................................ 94
23.1.1. Tổng quan ....................................................................................... 94
23.1.2. Kiến trúc .......................................................................................... 95
23.1.3. Đặc tính điện ................................................................................... 98
23.1.4. Truyền dữ liệu nối tiếp qua cổng USB ............................................. 98
23.1.5. Lập trình điều khiển ......................................................................... 99
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
5
23.2. Các khe cắm mở rộng ........................................................................... 99
23.2.1. Bus mở rộng.................................................................................... 99
23.2.2. Ghép nối qua khe cắm mở rộng ...................................................... 99
23.3. Một số giao diện khác ............................................................................ 99
Bài 24 ................................................................................................................ 100
THỰC HÀNH LẬP TRÌNH ................................................................................. 100
ĐIỀU KHIỂN THIẾT BỊ QUA CỔNG NỐI TIẾP ................................................. 100
24.1. Mục tiêu ............................................................................................... 100
24.2. Các kiến thức lý thuyết liên quan ......................................................... 100
24.3. Nội dung luyện tập ............................................................................... 100
Bài 25 ................................................................................................................ 100
THỰC HÀNH LẬP TRÌNH ỨNG DỤNG TỔNG HỢP ....................................... 100
25.1. Mục tiêu ............................................................................................... 100
25.2. Các kiến thức lý thuyết liên quan ......................................................... 101
25.3. Nội dung luyện tập ............................................................................... 101
TÀI LIỆU THAM KHẢO ..................................................................................... 102
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
6
ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
Bài 1
TỔNG QUAN VỀ LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
1.1. Lập trình điều khiển thiết bị từ máy
Nhiệm vụ lập trình điều khiển các thiết bị từ máy tính:
- Tạo giao diện người dùng: biểu diễn, mô phỏng các hoạt động cần thiết
cho các thiết bị được điều khiển, thể hiện các số liệu được gửi từ thiết bị, gửi
lệnh, dữ liệu đến thiết bị.
- Thực hiện ghép nối, giao tiếp với các thiết bị thông qua các cổng giao tiếp
của máy tính như: COM, LPT, USB,...
- Thực hiện truyền thông với thiết bị, điều khiển thiết bị thông qua các giao
thức làm việc chung của thiết bị và phần mềm điều khiển trên máy tính
1.2. Giới thiệu các giao diện truyền thông trên máy tính
Các giao diện truyền thông, ghép nối trên máy tính thường được dùng để
giao tiếp và điều khiển thiết bị:
- Giao diện nối tiếp RS232 (COM): truyền thông theo giao thức chuẩn, dễ
ghép nối, tốc độ thấp, nhiều thiết bị hỗ trợ giao tiếp vật lý cũng như giao
thức truyền thông theo giao diện này. Giao diện RS232 là một trong các
giao diện được sử dụng phổ biến để ghép nối và điều khiển thiết bị.
- Giao diện song song LPT: cổng LPT được thiết kế với mục đích chủ yếu
là ghép nối với máy in và để xuất dữ liệu in ấn cũng như điều khiển máy in.
Tuy nhiên với khả năng ghép nối và điều khiển lập trình, cổng này cũng có
thể được sử dụng trong ghép nối và điều khiển các thiết bị khác. Mặc dù là
cổng song song nhưng tốc độ điều khiển, truyền dữ liệu trên cổng này cũng
không cao, khó khăn trong giao tiếp vật lý cũng như lập trình điều khiển.
Trong thực tế ít được dùng để ghép nối các thiết bị khác.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
7
- Giao diện USB: đây là chuẩn truyền thông nối tiếp cho phép truyền với
tốc độ cao và có khả năng tương thích tốt với nhiều loại thiết bị. Cổng này
hiện nay đang được sử dụng khá rộng rãi trong việc ghép nối và điều khiển
các thiết bị từ máy tính.
Cổng này có một số ưu điểm nối trội:
+ Tốc độ cao
+ Giao tiếp đơn giản
+ Dễ tương thích
+ Hỗ trợ nguồn 5V công suất nhỏ
- Một số giao diện khác: giao diện GAME (thường dùng ghép nối cần điều
khiển để điều khiển chương trình trò chơi trên máy tính), các cổng vào ra trên
Card âm thanh, các khe cắm mở rộng (ISA, PCI, ...)
1.3. Các ngôn ngữ lập trình
Tùy môi trường làm việc, phần cứng hệ thống sử dụng, người phát triển hệ
thống có thể lựa chọn các ngôn ngữ lập trình khác nhau.
Có nhiều ngôn ngữ lập trình cho phép thiết kế giao diện, truy cập các cổng
để tạo ra chương trình điều khiển hệ thống.
Trên hệ điều hành MS-DOS: các ngôn ngữ lập trình như C/C++, Pascal,
Assembly,... điều có khả năng tạo ra chương chương trình điều khiển theo các
yêu cầu nhất định. Việc truy cập trực tiếp các cổng, thiết bị phần cứng trong hệ
điều hành DOS là khá đơn giản. Trong Pascal, ta có thể gửi dữ liệu ra cổng P
nào đó bởi lệnh Port[p]:=; hay trong Assembly là các lệnh IN, OUT
để đọc hay ghi các cổng.
Trên hệ điều hành Windows: phổ biến các ngôn ngữ lập trình trực quan, dể
dùng như Visual Basic 6.0 (VB6), Visual C, bộ công cụ lập trình trên DotNet
như C#, VB.Net,... Các ngôn ngữ này có những thế mạnh riêng, tùy yêu cầu và
môi trường làm việc mà lựa chọn cho phù hợp.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
8
1.4. Lập trình điều khiển trong Windows Form
1.4.1. Thiết kế giao diện
Giao diện người sử dụng là một trong số các thành phần quan trọng nhất
của một ứng dụng. Đối với người sử dụng, giao diện chính là ứng dụng; họ
không cần chú ý đến thành phần mã thực thi bên dưới. Ứng dụng của chúng ta
có thể phổ biến được hay không phụ thuộc nhiều vào giao diện.
Thông qua giao diện, người dùng điều khiển hoạt động của chương trình.
Giao diện tốt sẽ giúp người dùng vận hành hệ thống dễ dàng, tốn ít thời gian,
giảm các nhầm lẫn trong quá trình điều khiển đồng thời có thể tạo cảm giác
thoại mái trong khi làm việc.
Cần có khảo sát cẩn thận, nghiên cứu và ứng dụng các nguyên tắc trong
thiết kế giao diện. Việc thiết kế giao diện phải đặc biệt chú ý đến tính chất
công việc, lĩnh vực hoạt động của phần mềm, đối tượng người sử dụng.
Với phần mềm điều khiển thiết bị, ngoài các nguyên tắc cơ bản đối với việc
thiết kế giao diện phần mềm nói chung, người phát triển hệ thống cần chú ý tới
tính chất điều khiển thiết bị ghép nối với máy tính. Giao diện thiết kế sao cho
có sự thống nhất với giao diện điều khiển vốn có trên thiết bị cần điều khiển.
Như vậy sẽ sẽ tạo sự thuận tiện, tận dụng được kiến thức kỹ năng vận hạnh hệ
thống có sẵn của người dùng. Thông qua giao diện người dùng không chỉ ra
các lệnh điều khiển mà còn có thể quan sát được sự biến đổi của hệ thống được
điều khiển. Do vậy, giao diện cần có phần thể hiện trạng thái hoạt động của
thiết bị được điều khiển.
Từ các yêu cầu riêng biệt của hệ thống điều khiển, giao diện cần có khả
năng mô phỏng các loại chuyển động, tạo ra được các công cụ điều khiển như
nút bấm, núm xoay, công tắc,... sao cho tương thích với bàn điều khiển của
thiết bị (nếu có).
Vấn đề còn lại là điều khiển thiết bị hoạt động thông qua ghép nối với máy
tính. Để điều khiển, cần thiết phải làm chủ được cổng truyền thông trên máy
tính được ghép nối thiết bị. Đồng thời phải hiểu rõ và sử dụng được giao thức
của thiết bị vào điều khiển, tạo dữ liệu gửi đi, phân tích thông tin nhận được từ
thiết bị và thể hiện những thông tin cần thiết trên giao diện của phần mềm điều
khiển.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
9
1.4.2. Sử dụng các điều khiển
Các điều khiển có sẵn trên các ngôn ngữ lập trình về cơ bản đáp ứng được
các yêu cầu điều khiển hoạt động của máy tính. Tuy nhiên với nhiệm vụ điều
khiển một thiết bị phần cứng bên ngoài, các điều khiển này có thể chưa đáp
ứng đủ yêu cầu của phần mềm điều khiển.
Ngoài việc tận dụng các điều khiển có sẵn trong môi trường phát triển phần
mềm của ngôn ngữ lựa chọn, người phát triển hệ thống điều khiển cần bổ sung
thêm các điều khiển thích hợp cho phần mềm như các nút gạt, xoay, công tắc,...
trên cơ sở mô phỏng và tạo các điều khiển riêng. Các điều khiển được mô
phỏng về hình ảnh, cách thức hoạt động giống với thực tế trên thiết bị sẽ giúp
quá trình học sử dụng, vận hành được thuận tiện, giảm các sai nhầm.
1.4.3. Sử dụng các thư viện
Trong quá trình phát triển phần mềm điều khiển, nhiều thao tác can thiệp
sâu đến hệ điều hành có thể không thực hiện được trong môi trường phát triển
phần mềm ứng dụng thông thường. Đôi khi vì lý do thời gian, chi phí mà người
phát triển hệ thống sử dụng các thư viện có sẵn vào hệ thống của mình.
Tùy ngôn ngữ, công cụ lập trình lựa chọn mà cách khai báo và sử dụng các
thư viện này có sự khác biệt nhất định. Ví dụ trong VB6, người lập trình có thể
khai báo các hàm API được cung cấp trong các file thư viện DLL bởi lệnh
Declare, trong C# là import,...
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
10
Bài 2
NGÔN NGỮ LẬP TRÌNH C#
Ngôn ngữ C# khá đơn giản, dễ học, dễ dùng, chỉ khoảng 80 từ khóa và hơn
mười mấy kiểu dữ liệu được xây dựng sẵn. Tuy nhiên, ngôn ngữ C# có ý nghĩa
cao khi nó thực thi những khái niệm lập trình hiện đại. C# bao gồm tất cả
những hỗ trợ cho cấu trúc, thành phần component, lập trình hướng đối tượng.
Những tính chất đó hiện diện trong một ngôn ngữ lập trình hiện đại và được
phát triển bởi Microsoft, là phần khởi đầu cho kế hoạch .NET của họ. Tên của
ngôn ngữ bao gồm ký tự thăng theo Microsoft nhưng theo ECMA là C#, chỉ
bao gồm dấu số thường. Microsoft phát triển C# dựa trên C++ và Java. C#
được miêu tả là ngôn ngữ có được sự cân bằng giữa C++, Visual Basic,
Delphi và Java.
C# theo một hướng nào đó là ngôn ngữ lập trình phản ánh trực tiếp nhất đến
.NET Framework mà tất cả các chương trình .NET chạy, và nó phụ thuộc mạnh
mẽ vào Framework này. Các loại dữ liệu cơ sở là những đối tượng, hay được
gọi là garbage-collected, và nhiều kiểu trừu tượng khác chẳng hạn như class,
delegate, interface, exception, v.v, phản ánh rõ ràng những đặc trưng của .NET
runtime.
So sánh với C và C++, ngôn ngữ này bị giới hạn và được nâng cao ở một
vài đặc điểm nào đó, nhưng không bao gồm các giới hạn sau đây:
Các con trỏ chỉ có thể được sử dụng trong chế độ không an toàn. Hầu hết
các đối tượng được tham chiếu an toàn, và các phép tính đều được kiểm tra
tràn bộ đệm. Các con trỏ chỉ được sử dụng để gọi các loại kiểu giá trị; còn
những đối tượng thuộc bộ thu rác (garbage-collector) thì chỉ được gọi bằng
cách tham chiếu.
+ Các đối tượng không thể được giải phóng tường minh.
+ Chỉ có đơn kế thừa, nhưng có thể cài đặt nhiều interface trừu tượng
(abstract interfaces). Chức năng này làm đơn giản hóa sự thực thi của thời gian
thực thi.
+ C# thì an-toàn-kiểu (typesafe) hơn C++.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
11
+ Cú pháp khai báo mảng khác nhau("int[] a = new int[5]" thay vì "int
a[5]").
+ Kiểu thứ tự được thay thế bằng tên miền không gian (namespace).
+ C# không có tiêu bản.
+ Có thêm Properties, các phương pháp có thể gọi các Properties để truy
cập dữ liệu.
+ Có reflection.
2.1. Cấu trúc chương trình
Cấu trúc một chương trình C# đơn giản có ít nhất là một lớp. Mỗi lớp được
bắt đầu bằng từ khoá class kế đó là tên lớp( tên lớp do chúng ta đặt và phải
tuân thủ theo nguyên tắc đặt tên, bên trong một lớp ta có thể khai báo các
biến(thành phần dữ liệu) và các hàm(phương thức)). Trong số các hàm bên
trong lớp có một hàm tên là Main, hàm này có đặc điểm khi một chương trình
C# được gọi ra thực hiện thì máy sẽ tiến hành thực hiện từ câu lệnh đầu tiên
của hàm Main và khi màn Main kết thúc thì chương trình C# cũng kết thúc.
Điều đó chứng tỏ hàm Main là hàm chính của chương trình C#. Một chương
trình C# muốn thực hiện được thì phải có một hàm Main và chỉ có duy nhất
một hàm Main trong toàn bộ hệ thống chương trình và hàm này sẽ gọi các hàm
khác ra để thực hiện yêu cầu bài toán. Hàm Main được khai báo như sau:
Dạng 1: (Không có tham số)
static void Main( )
{
// Các câu lệnh
}
Dạng 2: (Có tham số)
static void Main(string[] tên_biến)
{
// Các câu lệnh
}
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
12
-Chú ý: Nếu trong một chương trình C# mà không có hàm Main đặt trong
một lớp nào đó thì chương trình C# này không thể thực hiện được.
Ví dụ:
Để bắt đầu cho việc tìm hiểu ngôn ngữ C# và tạo tiền đề cho các chương
sau, chương đầu tiên trình bày một chương trình C# đơn giản nhất.
Ví dụ : Chương trình C# đầu tiên.
class ChaoMung
{
static void Main( )
{
// Xuat ra man hinh
System.Console.WriteLine(“Hello World”);
}
}
-----------------------------------------------------------------------------
Kết quả:
Hello World
-----------------------------------------------------------------------------
Sau khi viết xong chúng ta lưu dưới dạng tập tin có phần mở rộng *.cs
(C sharp). Sau đó biên dịch và chạy chương trình. Kết quả là một chuỗi
“Hello World” sẽ xuất hiện trong màn hình Console.
2.2. Kiểu dữ liệu
C# là ngôn ngữ lập trình mạnh về kiểu dữ liệu, một ngôn ngữ mạnh về kiểu
dữ liệu là phải khai báo kiểu của mỗi đối tượng khi tạo (kiểu số nguyên, số
thực, kiểu chuỗi, kiểu điều khiển...) và trình biên dịch sẽ giúp cho người lập
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
13
trình không bị lỗi khi chỉ cho phép một loại kiểu dữ liệu có thể được gán cho
các kiểu dữ liệu khác. Kiểu dữ liệu của một đối tượng là một tín hiệu để trình
biên dịch nhận biết kích thước của một đối tượng (kiểu int có kích thước là 4
byte) và khả năng của nó (như một đối tượng button có thể vẽ, phản ứng khi
nhấn,...).
Tương tự như C++ hay Java, C# chia thành hai tập hợp kiểu dữ liệu chính:
Kiểu xây dựng sẵn (built-in) mà ngôn ngữ cung cấp cho người lập trình và kiểu
được người dùng định nghĩa (user-defined) do người lập trình tạo ra.
C# phân tập hợp kiểu dữ liệu này thành hai loại: Kiểu dữ liệu giá trị (value)
và kiểu dữ liệu tham chiếu (reference). Việc phân chi này do sự khác nhau khi
lưu kiểu dữ liệu giá trị và kiểu dữ liệu tham chiếu trong bộ nhớ. Đối với một
kiểu dữ liệu giá trị thì sẽ được lưu giữ kích thước thật trong bộ nhớ đã cấp phát
là stack. Trong khi đó thì địa chỉ của kiểu dữ liệu tham chiếu thì được lưu trong
stack nhưng đối tượng thật sự thì lưu trong bộ nhớ heap.
Nếu chúng ta có một đối tượng có kích thước rất lớn thì việc lưu giữ chúng
trên bộ nhớ heap rất có ích, trong chương 4 sẽ trình bày những lợi ích và bất lợi
khi làm việc với kiểu dữ liệu tham chiếu, còn trong chương này chỉ tập trung
kiểu dữ kiểu cơ bản hay kiểu xây dựng sẵn.
Ghi chú: Tất cả các kiểu dữ liệu xây dựng sẵn là kiểu dữ liệu giá trị ngoại
trừ các đối tượng và chuỗi. Và tất cả các kiểu do người dùng định nghĩa ngoại
trừ kiểu cấu trúc đều là kiểu dữ liệu tham chiếu
Ngoài ra C# cũng hỗ trợ một kiểu con trỏ C++, nhưng hiếm khi được sử
dụng, và chỉ khi nào làm việc với những đoạn mã lệnh không được quản lý
(unmanaged code). Mã lệnh không được quản lý là các lệnh được viết bên
ngoài nền .MS.NET, như là các đối tượng COM.
Kiểu dữ liệu xây dựng sẵn: Ngôn ngữ C# đưa ra các kiểu dữ liệu xây dựng
sẵn rất hữu dụng, phù hợp với một ngôn ngữ lập trình hiện đại, mỗi kiểu dữ
liệu được ánh xạ đến một kiểu dữ liệu được hỗ trợ bởi hệ thống xác nhận ngôn
ngữ chung (Common Language Specification: CLS) trong MS.NET. Việc ánh
xạ các kiểu dữ liệu nguyên thuỷ của C# đến các kiểu dữ liệu của .NET sẽ đảm
bảo các đối tượng được tạo ra trong C# có thể được sử dụng đồng thời với các
đối tượng được tạo bởi bất cứ ngôn ngữ khác được biên dịch bởi .NET, như
VB.NET. Mỗi kiểu dữ liệu có một sự xác nhận và kích thước không thay đổi,
không giống như
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
14
C++, int trong C# luôn có kích thước là 4 byte bởi vì nó được ánh xạ từ
kiểu Int32 trong .NET.
Sau đây chúng ta đi tìm hiểu chi tiết một sô kiểu dữ liệu dựng sẵn có trong
C#:
2.2.1. Kiểu nguyên
Dùng để lưu trữ các giá trị nguyên trong giới hạn cho phép tuỳ thuộc
vào từng kiểu dữ liệu nguyên cụ thể. Trong ngôn ngữ C# có một số kiểu dữ
liệu nguyên sau:
Kiểu C#
Số
byte
Kiểu .NET Mô tả
byte 1 Byte Số nguyên dương không dấu từ 0-255
char 2 Char Ký tự Unicode
sbyte 1 Sbyte Số nguyên có dấu ( từ -128 đến 127)
short 2 Int16 Số nguyên có dấu giá trị từ -32768 đến
32767
ushort 2 Uint16 Số nguyên không dấu 0 – 65.535
int 4 Int32 Số nguyên có dấu –2.147.483.647 và
2.147.483.647
uint 4 Uint32 Số nguyên không dấu 0 – 4.294.967.295
long 8 Int64 Kiểu số nguyên có dấu có giá trị trong
khoảng : -9.223.370.036.854.775.808 đến
9.223.372.036.854.775.807
ulong 8 Uint64 Số nguyên không dấu từ 0 đến
18,446,744,073,709,551,615
Thông thường để chọn một kiểu dữ liệu nguyên để sử dụng như short, int
hay long thường dựa vào độ lớn của giá trị muốn sử dụng. Ví dụ, một biến
ushort có thể lưu giữ giá trị từ 0 đến 65.535, trong khi biến ulong có thể lưu
giữ giá trị từ 0 đến 18,446,744,073,709,551,615, do đó tùy vào miền giá trị của
phạm vi sử dụng biến mà chọn các kiểu dữ liệu thích hợp nhất. Kiểu dữ liệu int
thường được sử dụng nhiều nhất trong lập trình vì với kích thước 4 byte của nó
cũng đủ để lưu các giá trị nguyên cần thiết.
Kiểu số nguyên có dấu thường được lựa chọn sử dụng nhiều nhất trong kiểu
số trừ khi có lý do chính đáng để sử dụng kiểu dữ liệu không dấu.
Cách tốt nhất khi sử dụng biến không dấu là giá trị của biến luôn luôn
dương, biến này thường thể hiện một thuộc tính nào đó có miền giá trị dương.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
15
Ví dụ khi cần khai báo một biến lưu giữ tuổi của một người thì ta dùng kiểu
byte (số nguyên từ 0-255) vì tuổi của người không thể nào âm được.
2.2.2. Kiểu thực
Dùng để lưu trữ các giá trị thực trong giới hạn cho phép tuỳ thuộc vào từng
kiểu dữ liệu thực cụ thể. Trong ngôn ngữ C# có một số kiểu dữ liệu thực sau:
Kiểu C#
Số
byte
Kiểu .NET Mô tả
float 4 Single Kiểu dấu chấm động, giá trị xấp xỉ từ 3,4E-
38 đến 3,4E+38, với 7 chữ số có nghĩa.
double 8 Double Kiểu dấu chấm động có độ chính xác gấp
đôi, giá trị xấp xỉ từ 1,7E-308 đến
1,7E+308,
với 15,16 chữ số có nghĩa
decimal 8 Decimal Có độ chính xác đến 28 con số và giá trị
thập phân, được dùng trong tính toán tài
chính, kiểu này đòi hỏi phải có hậu tố “m”
hay “M” theo sau giá trị.
Kiểu float, double, và decimal đưa ra nhiều mức độ khác nhau về kích
thước cũng như độ chính xác.Với thao tác trên các phân số nhỏ thì kiểu float là
thích hợp nhất. Tuy nhiên lưu ý rằng trình biên dịch luôn luôn hiểu bất cứ một
số thực nào cũng là một số kiểu double trừ khi chúng ta khai báo rõ ràng. Để
gán một số kiểu float thì số phải có ký tự f theo sau.
float soFloat = 24f;
2.2.3. Kiểu ký tự
Kiểu ký tự được thể hiện bằng kiểu char, biểu diễn cho các ký tự mã
Unicode gồm các chữ cái, chữ số và các ký tự đặc biệt. Kiểu char có
65536(216) ký tự trong tập mã Unicode 16 bit. Mã của 128 ký tụ đầu của tập
Unicode hoàn toàn trùng với mã của 128 ký tự trong tập mã ASCII 7-bit và mã
của 256 ký tự ban đầu hoàn toàn tương ứng với 256 ký tự của tập mã ISO
Latin-1 8-bit.
Một hằng ký tự được bao trong dấu nháy đơn.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
16
char k=’c’;
Kiểu C# Số byte Kiểu .NET Mô tả
char 2 Char Ký tự Unicode
2.2.4. Kiểu logic
Dùng để biểu diễn các giá trị logic và chỉ chứa một trong hai giá trị true và
false
Kiểu C# Số byte Kiểu .NET Mô tả
bool 1 Boolean Giá trị logic true/ false
2.2.5. Kiểu xâu ký tự
Kiểu dữ liệu xâu ký tự (chuỗi) khá thân thiện với người lập trình
trong bất cứ ngôn ngữ lập trình nào, kiểu dữ liệu chuỗi lưu giữ một dãy các ký
tự. Để khai báo một chuỗi chúng ta sử dụng từ khoá string tương tự như cách
tạo một thể hiện của bất cứ đối tượng nào:
string tenchuoi;
Một hằng chuỗi được tạo bằng cách đặt các chuỗi trong dấu nháy đôi:
“Xin chao”
Đây là cách chung để khởi tạo một chuỗi ký tự với giá trị hằng:
string chuoi = “Xin chao”;
2.3. Biến, hằng và cách khai báo
2.3.1. Biến
Biến là yếu tố cơ bản của bất kỳ ngôn ngữ máy tính nào. Biến là vùng trống
trong bộ nhớ máy tính dành cho một kiểu dữ liệu nào đó và có đặt tên. Các biến
trong bộ nhớ ở các thời điểm khác nhau có thể cất giữ các giá trị khác nhau. Trước
khi sử dụng một biến nào đó phải khai báo nó. Chính quy khai báo:
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
17
• Kiểu 1: Khai báo biến không có giá trị khởi đầu
Kiểu_dữ_liệu Tên_biến ;
Có thể khai báo nhiều biến cùng kiểu trên cùng một dòng, các tên biến
được phân cách nhau bằng dấu phẩy
Ví dụ 1:
int a,b; /*biến có kiểu nguyên*/
float f; /*biến thực*/
char ch; /*biến ký tự*/
• Kiểu 2: Khai báo biến có giá trị khởi đầu
Kiểu_dữ_liệu Tên_biến=giá trị ;
Ví dụ 2:
int a =5;
float b=6;
char ch=’A’; hoặc char ch=’\u0041’
• Chú ý: Trong C# trước khi sử dụng một biến thì biến đó phải được khởi gán
một giá trị cụ thể, nếu không chương trình dịch sẽ báo lỗi
Ví dụ 3:
using System;
class VD_Khoi_gan_bien
{
static void Main()
{
int a, b=1;
float t;
t = a + b;
a = 2;
Console.WriteLine("Tong {0}+{1}={2}", a, b,t);
}
}
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
18
---------------------------------------------------------------------------------------------
Kết quả
Chương trình trên sẽ bị báo lỗi vì biến a chưa được khởi tạo giá trị trước
khi sử dụng
Để chương trình trên có thể chạy được ta sửa lại như sau:
---------------------------------------------------------------------------------------------
using System;
class VD
{
static void Main()
{
int a=2, b=1;
float t;
t = a + b;
Console.WriteLine("Tong {0}+{1}={2}", a, b,t);
}
}
2.3.2. Hằng
Hằng cũng là một biến nhưng giá trị của hằng không thay đổi. Tuy nhiên
khi làm việc với một giá trị được định nghĩa là không thay đổi, ta phải đảm bảo giá
trị của nó không được thay đổi trong suốt chương trình nên khi đó sử dụng biến sẽ
không thích hợp. Ví dụ, khi lập một chương trình thí nghiệm hóa học liên quan
đến nhiệt độ sôi, hay nhiệt độ đông của nước, chương trình cần khai báo hai biến
là DoSoi và DoDong, nhưng không cho phép giá trị của hai biến này bị thay đổi
hay bị gán. Để ngăn ngừa việc gán giá trị khác, ta phải sử dụng biến kiểu hằng.
a) Hằng số nguyên
- Hệ thập phân bình thường
VD: 545
- Hệ cơ số 16 (Hecxa)
Bắt đầu bằng 0x, 0X
Ví dụ: 0xAB = 171
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
19
b) Hằng số thực
Được viết theo hai cách sau:
- Dạng thập phân gồm: Phần nguyên, dấu chấm thập phân, phần thập phân
Ví dụ: 34.2 -344.122
- Dạng khoa học(dạng mũ) gồm: Phần định trị và phần mũ. Phần định trị là
số nguyên hay số thực dạng thập phân, phần mũ bắt đầu bằng E hoặc e theo sau là
dấu + hoặc – rồi đến số nguyên.
Ví dụ: 12.54E-1 = 12.54/10^1 = 1.254
12.54E+1 = 12.54*10^1 = 125.4
c) Hằng ký tự
Là một ký hiệu trong bảng mã Unicode được đặt trong hai dấu nháy đơn.
Giá trị của hằng kí tự chính là mã Unicode của kí hiệu
Ví dụ: Hằng ‘A’ có giá trị là 65
Chú ý: Hằng ký tự biểu thị mã của ký tự đó trong bảng mã Unicode. Do vậy
một hằng ký tự cũng có thể tham gia vào các phép toán.
Ví dụ:
(char) ((int)'A'+ 10)
Hằng ký tự còn có thể được viết theo cách: ‘\uc1c2c3c4’ trong đó c1c2c3c4
là một số hệ 16 mà giá trị của nó chính là mã Unicode của ký tự cần biểu diễn.
Ví dụ: ‘A’ hay ‘\u0041’
Ký tự ‘A’ có giá trị 65 trong bảng Unicode, đổi giá trị 65 hệ thập phân sang
hệ thập lục phân ta được giá trị là 41.
Một số ký tự đặc biệt:
Viết Diễn giải
\’ Dấu nháy đơn
\” Dấu nháy kép
\\ Dấu gạch chéo ngược
\n Xuống dòng mới
\0 Ký tự Null
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
20
\t Nhảy cách ngang, ký tự tab
\b Xoá trái
\r Về đầu dòng
\f Sang trang
d) Hằng xâu ký tự
Là một dãy các ký tự đặt trong hay dấu nháy kép “.”
g) Khai báo hằng
const kieu_du_kieu ten_hang = gia_tri_hang;
Một hằng phải được khởi tạo khi khai báo, và chỉ khởi tạo duy nhất một lần
trong suốt chương trình và không được thay đổi.
Ví dụ: const int DOSOI = 100;
Trong khai báo trên, 100 là một hằng số và DOSOI là tên hằng có kiểu nguyên. Ví
dụ: minh họa việc sử dụng những biểu tượng hằng.
class HangSo
{
static void Main()
{
const int DOSOI = 100; // Độ C
const int DODONG = 0; // Độ C
System.Console.WriteLine( “Do dong cua nuoc {0}”, DODONG );
System.Console.WriteLine( “Do soi cua nuoc {0}”, DOSOI );
}
}
-----------------------------------------------------------------------------
Kết quả:
Do dong cua nuoc 0
Do soi cua nuoc 100
-----------------------------------------------------------------------------
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
21
2.4. Các phép toán
2.4.1. Phép toán số học
Phép toán Ý nghĩa Ví dụ
- Đổi dấu một số thực hoặc nguyên -10, -
+ Phép cộng 2 số thực hoặc nguyên 1+2, a = 1+2
- Phép trừ 2-3, a = 2-3
* Phép nhân a = 2*3
/ Phép chia a = 2/3
% Phép lấy phần dư
a = 6 % 2 (a = 0)
3.5 % 2.5 = 1
3 % 2.5 =0.5
* Chú ý:
- Nếu phép chia hai toán hạng đều nguyên thì phép chia cho kết quả là
phần nguyên của thương hai toán hạng đó, ví dụ: 5/2=2
- Nếu một trong hai toán hạng là kiểu thực thì lúc này kết quả của
phép chia cho ta giá trị đúng, ví dụ 5/2.0=2.5
- Nếu phép chia hai toán hạng đều nguyên với số chia bằng 0 thì phép
chia sinh lỗi, ví dụ 5/0 sẽ phát sinh lỗi
- Nếu một trong hai toán hạng là kiểu thực với số chia bằng 0 thì kết
quả phép chia là infinity(dương vô cùng) hoặc –infinity(âm vô cùng), ví dụ
5.0/0 = infinity
- Phép toán % trả về phần dư của phép chia
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
22
2.4.2. Phép toán quan hệ
Những toán tử quan hệ được dùng để so sánh giữa hai giá trị, và sau
đó trả về kết quả là một giá trị logic kiểu bool (true hay false). Ví dụ toán tử
so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn
hơn giá trị bên phải của toán tử. Do vậy 5 > 2 trả về một giá trị là true, trong
khi 2 > 5 trả về giá trị false.
Các toán tử quan hệ trong ngôn ngữ C# được trình bày ở bảng bên dưới.
Phép toán ý nghĩa Ví dụ Kết quả
> So sánh lớn hơn 1>2 false
>= So sánh lớn hơn hoặc bằng 2>=2 true
< So sánh nhỏ hơn 3<3 false
<= So sánh nhỏ hơn hoặc bằng 4<2 false
== So sánh bằng nhau 4==5 false
!= So sánh không bằng nhau 2!=7 true
2.4.3. Phép toán logic
Phép toán
logic
ý nghĩa Ví dụ Kết quả
! Phép phủ định một ngôi (not) !(3>1) false
&&
Liên kết hai biểu thức logic
Phép và (and). Giá trị bằng 1
khi cả 2 toán hạng có giá trị 1
(2>1)&&(5=2) false
||
Liên kết hai biểu thức logic.
Phép hoặc (or). Giá trị biểu
thức bằng 1 khi một trong hai
toán hạng bằng 1
(4>3)||(1>8) true
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
23
Bảng giá trị của các phép toán logic
X Y X && Y X || Y ! X
true true true true false
true false false true false
false true false true true
false false false false true
2.4.4. Phép toán tăng giảm
Trong ngôn ngữ lập trình C# đưa ra hai phép toán một ngôi để tăng và
giảm các biến kiểu (nguyên và thực). Toán tử tăng ++ sẽ thêm 1 vào toán
hạng của nó, toán tử giảm – sẽ trừ đi 1.
Dấu phép toán ++ và -- có thể đứng trước hoặc đứng sau toán hạng.
Như vậy ta có thể viết: ++n, n++, --n, n--
Sự khác nhau của ++n và n++ ở chỗ: Trong phép toán n++ thì n tăng
sau khi giá trị của nó được sử dụng, còn trong ++n thì giá trị của n tăng
trước khi giá trị của nó được sử dụng. Tương tự đối với --n và n--
Ví dụ: giả sử trước mỗi phép tính int i=3, j=15;
Phép toán Tương đương Kết quả
i=++j; j=j+1; i=j; i = ?
j = ?
i=j++; i=j; j=j+1; i = ?
j = ?
j++; j=j+1; i = ?
j = ?
++j; j=j+1; i = ?
j = ?
j = ++i + 5; i=i+1; j=i+5; i = ?
j = ?
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
24
j = i++ +5; j=i+5; i=i+1; i = ?
j = ?
2.4.5. Thứ tự ưu tiên các phép toán
Trình biên dịch phải xác định thứ tự thực hiện các toán tử trong
trường hợp một biểu thức có nhiều phép toán, giả sử, có biểu thức sau:
var1 = 5+7*3;
Biểu thức trên có ba phép toán để thực hiện bao gồm (=, +,*). Ta thử xét các
phép toán theo thứ tự từ trái sang phải, đầu tiên là gán giá trị 5 cho biến
var1, sau đó cộng 7 vào 5 là 12 cuối cùng là nhân với 3, kết quả trả về là 36,
điều này thật sự có vấn đề, không đúng với mục đích yêu cầu của chúng ta.
Do vậy việc xây dựng một trình tự xử lý các toán tử là hết sức cần thiết.
Các luật về độ ưu tiên xử lý sẽ bảo trình biên dịch biết được toán tử
nào được thực hiện trước trong biểu thức.Tương tự như trong phép toán đại
số thì phép nhân có độ ưu tiên thực hiện trước phép toán cộng, do vậy 5+7*3
cho kết quả là 26 đúng hơn kết quả 36. Và cả hai phép toán cộng và phép
toán nhân điều có độ ưu tiên cao hơn phép gán. Như vậy trình biên dịch sẽ
thực hiện các phép toán rồi sau đó thực hiện phép gán ở bước cuối cùng. Kết
quả đúng của câu lệnh trên là biến var1 sẽ nhận giá trị là 26.
Trong ngôn ngữ C#, dấu ngoặc được sử dụng để thay đổi thứ tự xử lý,
điều này cũng giống trong tính toán đại số. Khi đó muốn kết quả 36 cho biến
var1 có thể viết:
var1 = (5+7) * 3;
Biểu thức trong ngoặc sẽ được xử lý trước và sau khi có kết quả là 12 thì
phép nhân được thực hiện.
Bảng sau liệt kê thứ tự độ ưu tiên các phép toán trong C#.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
25
Các phép toán được liệt kê cùng loại sẽ có thứ tự theo mục thứ thự của
bảng: thứ tự trái tức là độ ưu tiên của các phép toán từ bên trái sang, thứ tự
phải thì các phép toán có độ ưu tiên từ bên phải qua trái. Các toán tử khác
loại thì có độ ưu tiên từ trên xuống dưới, do vậy các toán tử loại cơ bản sẽ có
độ ưu tiên cao nhất và phép toán gán sẽ có độ ưu tiên thấp nhất trong các
toán tử.
2.5. Biểu thức
2.5.1. Biểu thức số học
Biểu thức số học đó là sự kết hợp giữa các toán hạng với các toán tử số
học và cho ta kết quả là một số(số thực hoặc số nguyên)
Ví dụ: (3+5)*6/4-2.4
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
26
2.5.2. Biểu thức logic
Biểu thức logic đó là sự kết hợp giữa các toán hạng với các toán tử(toán
tử số học, toán tử quan hệ, toán tử logic) v à kết quả cho ta là một giá trị
logic. Biểu thức logic được dùng làm điều kiện trong các cấu trúc điều
khiển(if, while,....) và một số trường hợp khác.
Ví dụ: (1>=2)&&(5==4)
2.5.3. Biểu thức điều kiện
Hầu hết các toán tử đòi hỏi có một toán hạng như toán tử (++, --) hay
hai toán hạng như (+,-,*,/,...). Tuy nhiên, C# còn cung cấp thêm một toán tử
có ba toán hạng (?:). Toán tử này có cú pháp sử dụng như sau:
? :
Toán tử này sẽ xác định giá trị của một biểu thức điều kiện, và biểu thức
điều kiện này phải trả về một giá trị kiểu bool. Khi điều kiện đúng thì <biểu
thức thứ 1> sẽ được thực hiện, còn ngược lại điều kiện sai thì <biểu thức thứ
2> sẽ được thực hiện. Có thể diễn giải theo ngôn ngữ tự nhiên thì toán tử này
có ý nghĩa : “Nếu điều kiện đúng thì làm công việc thứ nhất, còn ngược lại
điều kiện sai thì làm công việc thứ hai”. Cách sử dụng toán tử ba ngôi này
được
minh họa trong ví dụ sau.
-----------------------------------------------------------------------------
using System;
class Tester
{
public static void Main()
{
int a,b,c;
a= 10;
b = 20;
c = a > b ? a : b;
Console.WriteLine(“Gia tri thu nhat {0}, gia tri thu hai {1}, gia
tri lon nhat {2}”, a, b, c);
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
27
}
}
-----------------------------------------------------------------------------
Kết quả:
Gia tri thu nhat 10, gia tri thu hai 20, gia tri lon nhat 20
-----------------------------------------------------------------------------
Trong ví dụ minh họa trên toán tử ba ngôi được sử dụng để kiểm tra
xem giá trị của a có lớn hơn giá trị của b, nếu đúng thì trả về giá trị của a,
nếu sai thì trả về giá trị b, sau đó gán giá trị cho c.
2.5.4. Biểu thức gán
Trong C# dùng dấu “=” làm dấu phép gán. Biểu thức gán có thể được
thể hiện dưới các dạng như sau:
Biến = Biểu_thức
Biến op = Biểu_thức
Cá ch viết dưới tương đương Biến = (biến) op (Biểu_thức) trong đó
op là một toán tử nào đó. Giá trị của Biểu_thức sẽ được gán cho biến sau câu
lệnh này
Ví dụ: x + = y tương đương với x = x+y
Nếu ta thêm dấu ; vào sau biểu thức gán sẽ thu được một câu lệnh gán
Biểu thức gán có thể được sử dụng trong các phép toán và các câu
lệnh như các biểu thức thông thường. Chẳng hạn khi viết: a=b=5; thì điều đó
có nghĩa rằng gán giá trị của biểu thức b=5 cho biến a. Kết quả là b=5 và
a=5. Tương tự sau câu lệnh: x = (a=5) * (b=10); sẽ gán 5 cho a, 10 cho b và
sau đó gán tiếp 50 cho x
2.5.5. Biểu thức ép kiểu
Những đối tượng của một kiểu dữ liệu này có thể được chuyển sang
những đối tượng của một kiểu dữ liệu khác thông qua cơ chế chuyển đổi
tường minh hay ngầm định. Chuyển đổi nhầm định được thực hiện một cách
tự động, trình biên dịch sẽ thực hiện công việc này. Còn chuyển đổi tường
minh diễn ra khi chúng ta gán ép một giá trị cho kiểu dữ liệu khác.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
28
Việc chuyển đổi giá trị ngầm định được thực hiện một cách tự động
và đảm bảo là không mất thông tin và tuân theo chính quy sau:
Ví dụ: Chúng ta có thể gán một biến kiểu char cho một biến kiểu int,
trình biên dịch sẽ chuyển đổi kiểu một cách ngầm định từ kiểu char sang
kiểu int.
char x = ‘A’;
int y = x; // chuyển đổi ngầm định (y sẽ có giá trị 65)
Tuy nhiên, nếu chúng ta thực hiện chuyển đổi ngược lại thì trình biên dịch sẽ
báo lỗi. Trình biên dịch sẽ không thực hiện việc chuyển đổi ngầm định từ số
kiểu int sang kiểu char.
int y =65;
char x = y// Trình biên dịch không chuyển đổi ngầm định
Khi biên dịch trình biên dịch trả về thông báo lỗi:
-----------------------------------------------------------------------------
Kết quả:
Error 1 Cannot implicitly convert type 'long' to 'int'. An explicit
conversion exists (are you missing a cast?)
-----------------------------------------------------------------------------
Để không bị lỗi chúng ta phải dùng lệnh gán tường minh, đoạn mã trên được
viết lại
int y =65;
char x = (char)y ; // Ép kiểu tường minh, trình biên dịch không báo lỗi
Trong một biểu thức mà có nhiều kiểu dữ liệu khác nhau, trước khi
tính toán máy sẽ chuyển từ kiểu thấp hơn lên kiểu cao hơn theo sơ đồ như ở
trên.
Ví dụ:
short x=1,y;
byte short
char
int long float double
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
29
y=4-x; /*Khi biên dịch sẽ bị lỗi, vì 4-x sẽ cho kiểu int và không
thể gán cho biến kiểu short*/
Nếu ta viết
y=(short)(4-y);/* Khi biên dịch sẽ không bị lỗi, vì 4-x cho ta
kiểu int và sau đó được chuyển thành kiểu short*/
Biểu thức ép kiểu tường minh là:
+ (kiểu dữ liệu)Biểu thức
+ sử dụng lớp Convert thi hành các phương thức chuyển đổi
kiểu tương ứng.
short x=1, y;
y = (short )(4 - x);
y = Convert.ToInt16(4 - x); // kiểu short chính là int16.
* Chú ý: Khi ép kiểu thì bản thân biểu thức không bị thay đối kiểu mà chỉ
có giá trị của biểu thức ép kiểu mới thay đổi.
2.6. Cấu trúc rẽ nhánh
2.6.1. Cấu trúc rẽ nhánh if
a/ Cấu trúc rẽ nhánh if dạng khuyết
• Cú pháp câu lệnh
if (btđk)
công_việc;
Trong đó:
* if là từ khoá
* btđk là một biểu thức cho giá trị logic
* Công_việc có thể là một lệnh đơn, một khối lệnh hay một
cấu trúc điều khiển nào đó
Ví dụ:
if ( a>0)
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
30
Console.Write(a + “La so duong“) ;
• Sơ đồ cú pháp
• Nguyên tắc hoạt động: Đầu tiên máy tính toán giá trị của btđk. Nếu btđk có
giá trị True thì máy tiến hành thực hiện Công_việc sau đó tiến hành thực hiện
các câu lệnh tiếp theo sau câu lệnh if. Nếu btđk có giá trị là False thì máy bỏ
qua việc thực hiện Công_việc trong câu lệnh if mà tiến hành thực hiện ngay
các câu lệnh sau câu lệnh if.
b/ Cấu trúc rẽ nhánh dạng đầy đủ
• Cú pháp câu lệnh
if (btđk)
công_việc1;
else
công_việc2;
Trong đó:
* if, else là từ khoá
* btđk là một biểu thức cho giá trị logic
btđk
True
Công việc
False
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
31
* Công_việc1,Công_việc2 có thể là một lệnh đơn, một cấu
trúc điều khiển nào đó hay một khối lệnh
Ví dụ:
if ( a>0)
Console.Write(a + “La so duong“) ;
else
Console.Write(a + “La so khong duong“) ;
• Sơ đồ thực hiện
• Nguyên tắc hoạt động: Đầu tiên máy tính toán giá trị của btđk. Nếu btđk có
giá trị True thì máy tiến hành thực hiện Công_việc1 sau đó tiến hành thực hiện
các câu lệnh tiếp theo sau câu lệnh if. Nếu btđk có giá trị là False thì máy tiến
hành thực hiện công_việc2 sau đó tiến hành thực hiện các câu lệnh tiếp theo
sau câu lệnh if.
Ví dụ1: Lập chương trình giải phương trình bậc nhất dạng ax+b=0
btđk
True
Công việc 1;
False
Công việc 2;
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
32
using System;
using hue = System.Console; // Gan ten tu dat cho mot lop
class Program
{
static void Main(string[] args)
{
Double a, b, x;
hue.Write("Nhap vao gia tri a");
a = double.Parse(hue.ReadLine());
hue.Write("Nhap vao gia tri a");
b = double.Parse(hue.ReadLine());
if (a == 0)
{
if (b == 0)
{
hue.WriteLine("Phuong trinh co vo so nghiem");
}
else
{
hue.WriteLine("Phuong trinh vo nghiem");
}
}
else
{
x = -b / a;
hue.WriteLine("Phuong trinh co mot nghiem x=" + x);
}
hue.ReadLine();
}
}
Ví dụ 2: Lập chương trình giải phương trình bậc hai ax2+bx+c=0
using System;
class PTB2
{
static void Main()
{
float a, b, c, delta;
Console.WriteLine("Ban hay nhap vao ba so");
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
33
Console.Write("a="); a = float.Parse(Console.ReadLine());
Console.Write("b="); b = float.Parse(Console.ReadLine());
Console.Write("c="); c = float.Parse(Console.ReadLine());
if (a == 0)
{
Console.Write("Day la phuong trinh bac nhat Ax+C=0\n");
if (b != 0)
Console.WriteLine("Phuong trinh co nghien duy nhat x={0}", -b / c);
else
if (c == 0)
Console.WriteLine("Phuong trinh vo so nghiem");
else
Console.WriteLine("phuong trinh vo nghiem");
}
else
{
Console.WriteLine("Day la phuong trinh bac hai Ax^2+Bx+C=0");
delta = b * b - 4 * a * c;
if (delta < 0)
Console.Write(" Phuong trinh vo nghiem trong truong so thuc");
if (delta == 0)
Console.Write("Phuong trinh co nghiem kep x1=x2={0,8:N2", -b / (2 *
a));
if (delta > 0)
{
Console.WriteLine("Phuong trinh co hai nghiem phan biet:");
Console.WriteLine("x1={0,8:N2}\nx2={1,8:N2}", (-b -
Math.Sqrt(delta)) / (2 * a), (-b + Math.Sqrt(delta)) / (2 * a));
}
}
Console.ReadKey();
}
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
34
}
2.6.2. Cấu trúc rẽ nhánh switch
* Cú pháp câu lệnh
switch ( bieu_thuc)
{ case e1:Khối_lệnh_1;[break;]
case e2: Khối_lệnh_2;[break;]
.......................
case en: Khối_lệnh_n;[break;]
[default: Khối_lệnh_n+1; break;]
}
Trong đó: + switch, case, default là các từ khoá
+ bieu_thuc: là một biểu thức cho giá trị nguyên hoặc là xâu
+ ei:là giá trị nguyên mà biểu thức có thể nhận được.
+ Những phần đặt trong hai dấu [ và ] có thể có hoặc không
* Sự hoạt động của cấu trúc điều khiển switch phụ thuộc vào giá trị của
bieu_thuc
Khi giá trị này bằng ei máy sẽ nhảy tới khối lệnh có nhãn case ei và thực
hiện Khối_lệnh_i. Nếu Khối_lệnh_i là rỗng thì ta có thể đặt break sau Khối_lệnh_i
hoặc không, với trường hợp không có break thì máy sẽ tiến hành nhảy xuống thực
hiện Khối_lệnh_(i+1). Nếu Khối_lệnh_i khác rỗng(tức là có công việc phải thực
hiện) thì sau Khối_lệnh_i ta phải đặt câu lệnh break. Khi máy gặp câu lệnh break
thì máy sẽ thoát khỏi cấu trúc switch và thực hiện các câu lệnh tiếp theo sau cấu
trúc lệnh này.
Khi giá trị của bieu_thuc khác tất cả các giá trị ei thì cách làm việc của máy
lại phụ thuộc vào sự có mặt hay không có mặt của default. Khi có default máy
nhảy tới câu lệnh có nhãn default. Khi không có default máy tiến hành thực hiện
các câu lệnh sau cấu trúc này.
Ví dụ 1: Viết chương trình nhập vào một số từ 1 đến 7 in ra thứ tương ứng.
using System;
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
35
namespace ThuMay
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Nhap vao thu la con so:");
int t = int.Parse(Console.ReadLine());
switch (t)
{
case 1:
Console.WriteLine("Chu Nhat");
case 2:
Console.WriteLine("Thu hai");
break;
case 3:
Console.WriteLine("Thu ba");
break;
case 4:
Console.WriteLine("Thu tu");
break;
case 5:
Console.WriteLine("Thu nam");
break;
case 6:
Console.WriteLine("Thu sau");
break;
case 7:
Console.WriteLine("Thu bay");
break;
default :
Console.WriteLine("Thu khong hop le");
}
Console.ReadKey();
}
}
}
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
36
Ví dụ 2: Nhập vào một tháng của một năm bất kỳ sau đó cho biết tháng đó có bao
nhiêu ngày:
using System;
class Songay
{
static void Main()
{
int month, year,sumday;
Console.Write("Nhap thang="); month = int.Parse(Console.ReadLine());
Console.Write("Nhap year="); year = int.Parse(Console.ReadLine());
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: sumday=31;break;
case 4:
case 6:
case 9:
case 11: sumday = 30; break;
case 2: if (year % 400==0 || (year % 4 == 0 && year % 100 != 0))
sumday = 29;
else
sumday = 28;
break;
default: sumday = 0; break;
}
if (sumday > 0)
Console.Write("So ngay cua {0}/{1} la {2} ngay", month, year, sumday);
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
37
Console.ReadKey();
}
}
2.7. Cấu trúc lặp while, do .. while
2.7.1. Cấu trúc lặp While
• Cú pháp câu lệnh
while(btđk) Công_việc;
Trong đó:
* while là từ khoá
* btđk là một biểu thức cho giá trị logic
* Công_việc có thể là một lệnh đơn, một cấu trúc điều
khiển nào đó hay một khối lệnh.
* Sơ đồ cú pháp
• Sự hoạt động: Câu lệnh while được tiến hành lần lượt được tiến hành
theo các bước sau:
Bước 1: Tiến hành tính toán giá trị của btđk.
Bước 2: Nếu biểu thức điều kiện có giá trị là False máy sẽ thoát khỏi
chu trình và tiến hành thực hiện các câu lệnh sau câu lệnh while. Nếu biểu
thức điều kiện có giá trị là True máy sẽ tiến hành thực hiện Công_việc và
quay về bước 1.
btđk
True
Công việc
False
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
38
Ví dụ 1: Nhập vào hai số nguyên bất kỳ và cho biết ước số chung lớn nhất
của hai số nguyên đó.
using System;
class VD
{
static void Main()
{
int a, b;
Console.Write("Nhap a="); a = int.Parse(Console.ReadLine());
Console.Write("Nhap b="); b = int.Parse(Console.ReadLine());
a=Math.Abs(a);b=Math.Abs(b);
while (a != b)
{
if (a > b) a -= b;
if (b > a) b -= a;
}
Console.Write("Uscln la:{0}", a);// hoac Console.Write("Uscln la:{0}",
b);
Console.ReadKey();
}
}
2.7.2. Cấu trúc lặp do...while
* Cú pháp câu lệnh
do
{
Công việc cần thực hiện;
}while(btđk);
Trong đó:
- while ,do là từ khoá
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
39
- btđk là một biểu thức cho giá trị logic
• Sơ đồ cú pháp
• Sự hoạt động: Câu lệnh do...while được tiến hành lần lượt theo các bước
sau:
Bước 1: Thực hiện Công_việc
Bước 2: Sau khi thực hiện xong Công_việc máy tiến hành tính toán
giá trị của btđk.
+ Nếu btđk có giá trị True máy sẽ trở lại bước 1 để tiếp tục thực
hiện vòng lặp mới của chu trình.
+ Nếu btđk có giá trị bằng False máy sẽ ra khỏi chu trình và
chuyển tới câu lệnh đứng sau cấu trúc do...while.
• Ví dụ áp dụng
Ví dụ 1: Bài toán gửi tiền tiết kiệm, giả sử ta có số tiền là a gửi vào ngân
hàng. Hỏi sau bao nhiêu tháng ta thu được số tiền là b(b>a) biết rằng lãi xuất
hàng tháng là 5%
using System;
class VD1
{
static void Main()
{
double a, b;
int t=0;
do
{
btđk
Tru
e
Công việc;
False
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
40
Console.Write("Nhap so tien ban co:");
a = double.Parse(Console.ReadLine());
if (a < 0)
Console.Write("Ban nhap sai, hay nhap la");
} while (a < 0);
do
{
Console.Write("Nhap so tien ban du dinh muon co:");
b = double.Parse(Console.ReadLine());
if (b < a)
Console.Write("Ban nhap sai, hay nhap lai");
} while (b < a);
// Di tim thoi gian can thiet
do
{
a = a + a * 0.05;
t = t + 1;
} while (a < b);
Console.Write("Ban phai mat {0} nam {1} thang", t / 12, t % 12);
Console.ReadKey();
}
}
Ví dụ 2: Nhập vào một số nguyên dương sau đó phân tích số nguyên đó ra
thừa số nguyên tố
using System;
class VD2
{
static void Main()
{
int n, i;
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
41
i = 2;// la so nguyen to dau tien
Console.Write("Nhap n="); n = int.Parse(Console.ReadLine());
Console.Write("n=");
do
{
while (n % i == 0)
{
Console.Write("{0}*", i);
n = n / i;
}
if (i == 2) i = 3; else i = i + 2;
} while (n != 1);
Console.Write("\b ");
Console.ReadKey();
}
}
2.8. Cấu trúc lặp for và một số lệnh điều khiển khác
2.8.1. Cấu trúc lặp for
• Cú pháp câu lệnh
for (bt1;btđk;bt2)
Công_việc;
Trong đó:
* for là từ khoá
* bt1,bt2 là các biểu gán, btđk là một biểu thức cho giá trị
logic
* Công_việc có thể là một lệnh đơn , một cấu trúc điều
khiển nào đó hay một khối lệnh
• Sơ đồ cú pháp
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
42
• Sự hoạt động của câu lệnh for được tiến hành theo các bước sau:
Bước 1: Xác định giá trị của bt1
Bước 2: Xác định giá trị của btđk
Bước 3: Tuỳ thuộc vào tính đúng, sai của biểu thúc btđk máy sẽ
tiến hành lựa chọn một trong hai nhánh sau:
Nếu btđk có giá trị False, máy sẽ ra khỏi vòng lặp for và chuyển
tới câu lệnh sau cấu trúc for
Nếu btđk có giá trị True, máy sẽ tiến hành thực hiện các câu
lệnh trong thân for . Khi thực hiện xong Công_việc hay gặp câu lệnh
continue trong thân for máy sẽ chuyển sang buớc 4(khởi đầu lại).
Bước 4: Tính bt2 sau đó quay lại bước 2 để bắt đầu lại vòng lặp
mới của chu trình.
Chú ý:
+) Các bt1,bt2,btđk có thể vắng mặt nhưng phải để lại dấu chấm
phẩy.
+) Nếu btđk vắng mặt thì máy coi luôn đúng. Khi đó muốn thoát khỏi
vòng lặp thì phải dùng câu lệnh return, break hay goto.
+) Các bt1,bt2 có thể gồm nhiều biểu thức cách nhau bởi dấu phẩy
btđk
True
bt2
False
Công_việc;
bt1
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
43
+) Thông thường bt1 dùng để khởi gán giá trị cho các biến trong vòng
lặp, bt2 dùng để thay đổi giá trị của các biến điều khiển trong vòng lặp sao
cho lúc đầu btđk cho giá trị True nhưng sau một số hữu hạn bước thực hiện
thì btđk cho giá trị False.
Ví dụ 1: Nhập vào một số nguyên dương n sau đó tính n!
using System;
class VD6
{
static void Main()
{
int n, i,s;
Console.Write("Nhap vao so nguyen n=");
n = int.Parse(Console.ReadLine());
for (s = 1, i = 1; i <= n;++i)
s = s * i;
Console.Write("{0}!={1}", n, s);
Console.ReadKey();
}
}
Ví dụ 2: Tính S=Sin(Sin(......Sin(x))...)
using System;
class VD6
{
static void Main()
{
double x, s;
int i, n;
Console.Write("Nhap vao so nguyen n=");
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
44
n = int.Parse(Console.ReadLine());
Console.Write("Nhap x theo don vi do=");
x = double.Parse(Console.ReadLine());
x = Math.PI * x / 180;
for (s=x,i=n; i>=1;--i)
s = Math.Sin(s);
Console.Write("S={0:N3}",s);
Console.ReadKey();
}
}
Ví dụ 3: Lập chương trình tìm số có ba chữ số sao cho số đó bằng tổng lập
phương các chữ số của nó
using System;
class VD8
{
static void Main()
{
int n, a, b, c;
Console.WriteLine("Cac so thoa man yeu cau bai toan la:");
for (a = 1; a <= 9; ++a)
for (b = 0; b <= 9; ++b)
for (c = 0; c <= 9; ++c)
if (a * 100 + b * 10 + c == a * a * a + b * b * b + c * c * c)
Console.Write("{0}\t", a * 100 + b * 10 + c);
Console.ReadKey();
}
}
Ví dụ 4: Lập chương trình nhập vào một số nguyên dương n sau đó tính n!! .
n!! được tính như sau: nếu n là số chẵn thì n!!=2.4.6.N, nếu n là số lẻ thì
n!!=1.3.5.7n.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
45
using Viet = System.Console;
namespace GiaThuaKep
{
class Program
{
static void Main(string[] args)
{
Viet.WriteLine("Nhap vao so can tinh n!!");
int n = int.Parse(Viet.ReadLine());
long gt=1;
if (n % 2 == 0)
{
for(int i=2; i<=n;i+=2)
{
gt=gt*i;
}
}
else
{
for (int i = 1; i <= n; i+=2)
{
gt = gt * i;
}
}
Viet.WriteLine("{0}!!={1}", n, gt);
Viet.ReadLine();
}
}
}
Ví dụ 5: Lập chương trình giải bài toán trăm trâu, trăm cỏ: Trâu đứng ăn
năm trâu nằm ăn ba lụ khụ trâu già ba con một bó.
using Viet = System.Console;
namespace Trau_Co
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
46
{
class Program
{
static void Main()
{
int td,tn,tg;
// td co kha nang nhan cac gia tri tu 1->100%5(20)
// tn co kha nang nhan cac gia tri tu 1 ->100%3 (33)
// Thu lan luot cac gia tri co kha nang nhan duoc cua trau dung
int phuong_an = 0;
for (td = 1; td <= 20; td++)
{
// Voi moi gia tri trau dung thu cac gia tri nhan duoc trau nam
for (tn = 1; tn <= 33; tn++)
{
// trau nam = 100-td-tn.
tg = 100 - td - tn;
// neu thoa man bieu thuc thi day la mot phuong an
// Tại sao lại là 3.0 mà không phải là 3?
if ((td * 5 + tn * 3 + tg / 3.0) == 100)
{
++phuong_an;
Viet.WriteLine("Phuong an thu " + phuong_an );
Viet.WriteLine("trau dung = " + td);
Viet.WriteLine("trau nam = " + tn);
Viet.WriteLine("trau gia = " + tg);
Viet.WriteLine("-------------------------------------------");
}
}
}
Viet.ReadKey ();
} }
}
2.8.1. Cấu trúc lặp foreach
• Cú pháp câu lệnh
foreach (kdl bien in taphop)
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
47
Công_việc;
Trong đó:
* foreach, in: là từ khoá
* bien: có kiểu được xác định qua kdl
* taphop: là một tập hợp, mảng
* Công_việc có thể là một lệnh đơn , một cấu trúc điều
khiển nào đó hay một khối lệnh
• Hoạt động
Biến lần lượt nhận giá trị (tương ứng với từng phần tử của tập
hợp), với mỗi trường hợp sẽ thực hiện câu lệnh một lần. Như vậy số lần lặp
là số lượng phần tử của tập hợp.
2.8.1. Các lệnh điều khiển khác
• Lệnh break
Kết thúc một trường hợp trong câu lệnh switch, kết thúc sớm vòng lặp
• Lệnh continue
Bỏ qua các lệnh còn lại trong vòng lặp (sau lệnh này) để thực hiện tiếp
lần lặp sau.
Bài 3
SỬ DỤNG FORM VÀ CÁC ĐIỀU KHIỂN CƠ BẢN
3.1. Form
3.1.1. Chức năng
Form (hay còn gọi điều khiển Form) dùng để chứa các điều khiển khác
(Buttons, Label)
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
48
3.1.2. Một số thuộc tính thường dùng
Tên Ỹ nghĩa
Name Tên của Form. Trong một Project tên của các Form
phải khác nhau.
AcceptButton Giá trị mà thuộc tính này nhận là tên của một
Button trên Form (Nếu Form có chứa button). Khi
đó nếu bạn nhấn phím Enter thì sự kiện Click của
Button mà bạn chọn được thực thi mà không cần
nhấn chuột vào Button đó.
Autosize Nhận một trong hai giá trị True hay False
- True: Không cho phép thay đổi kích thước Form
mà che đi các điều khiển khác chứa trên Form
- False: Ngược lại
AutoSizeMode Cho phép thay đổi kích thước của Form hay không?
(Khi di chuyển chuột vào các mép của Form mà
hiện nên biểu tượng ↔ là cho phép). Và nhận một
trong hai giá trị
- GrowOnly: Cho phép
- và GrowAndShrink: Không cho phép
BackColor Chọn màu nền cho Form
BackGroundImage Chọn ảnh làm nền cho Form
CancelButton Giá trị mà thuộc tính này nhận là tên của một
Button trên Form (Nếu Form có chứa button). Khi
đó nếu bạn nhấn phím ESC thì sự kiện Click của
Button mà bạn chọn được thực thi mà không cần
nhấn chuột vào Button đó (tương tự như thuộc tính
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
49
AcceptButton ).
ControlBox Nhận một trong hai giá trị True hay False
- True: Cho phép các các nút: MaximizeBox,
MinimizeBox, Close trên Titlebar xuất hiện
- False: Không Cho phép các các nút:
MaximizeBox, MinimizeBox, Close trên
Titlebar xuất hiện (Khi đó các thuộc tính
MaximizeBox, MinimizeBox của Form cũng
mất đi)
Font Chọn kiểu Font chữ cho Form (Khi đó tất cả các
điều khiển được thêm vào Form sẽ có thuộc tính
Font giống như thuộc tính Font của Form)
ForeColor Tương tự như thuộc tính Font nhưng áp dụng đối
với màu chữ
FormBorderStyle Chọn Style cho Form (Có 7 lựa chọn khác nhau).
HelpButton Nhận một trong hai giá trị True hay False.
- True: Cho phép xuất hiện Buton có dấu ? trên
Titlebar (Với điều kiện: hai thuộc tính
MaximizeBox, MaximizeBox phải đặt giá trị là
False)
- False: Ngược lại
→ Thuộc tính này sẽ hay đi kèm với điều khiển
HelpProvider về sau
Icon Chọn một Icon (có đuôi mở rộng là .ico) trên máy
tính của bạn thay cho Icon mặc định của Form mà
VS tạo ra
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
50
KeyPreview Nhận một trong hai giá trị True hay False
- True: Cho phép các sự kiện về bàn phím của
Form (KeyUp, KeyDown, KeyPress của
Form) có hiệu lực.
- False: Ngược lại
MaximizeBox Nhận một trong hai giá trị True hay False
- True: Cho phép nút MaximizeBox trên Titlebar
có hiệu lực
- False: Ngược lại
MaximizeBox Tương tự như thuộc tính MaximizeBox
Opacity Độ trong suốt của Form
ShowIcon Nhận một trong hai giá trị True hay False
- True: Cho phép xuất hiện Icon của Form
- False: Không cho phép xuất hiện Icon của Form
ShowInTaskbar Nhận một trong hai giá trị True hay False
- True: Cho phép hiện Form dưới khay Taskbar
- False: Ngược lại
StartPosition Vị trí hiển thị của Form so với màn hình hệ thống
hay Form cha (5 lựa chọn khác nhau)
Text Giá trị Text của Form
WindowState Trạng thái hiển thị của Form khi chạy (Khi bạn
nhấn vào nút Run của VS) (Có 3 lựa chọn khác
nhau: Ẩn dưới khay Taskbar, mở rộng hết màn
hình).
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
51
3.1.3. Một số sự kiện thường dùng
Tên Ỹ nghĩa
AutoSizeChanged Xảy ra khi thuộc tính Autosize của Form chuyển từ
True → False hay ngược lại là False → True.
BackColorChanged Xảy ra khi thuộc tính BackColor của Form thay
đổi
Click Xảy ra khi người dùng Click chuột vào vùng làm
việc thuộc Form
ControlAdded Xảy ra khi một điều khiển được Add vào Form
ControlRemoved Xảy ra khi một điều khiển bị xóa khỏi Form
CursorChanged Xảy ra khi thuộc tính Cursor của Form thay đổi
DoubleClick Xảy ra khi người dùng DoubleClick vào vùng làm
việc của Form
FontChanged Xảy ra khi thuộc tính Font của Form có sự thay đổi
ForeColorChanged Xảy ra khi thuộc tính ForeColor của Form có sự
thay đổi
FormClosed Xảy ra khi Form đã đóng (Nhấn vào nút X màu đỏ
trên Titlebar)
FormClosing Xảy ra khi Form đang đóng (2 sự kiện
FormClosed và FormClosing thường dùng trong
lập trình CSDL: khi xảy ra sự kiện này thì đóng kết
nối CSDL)
KeyDown Xảy ra khi người dùng nhấn một phím hay một tố
hợp phím (tùy thuộc vào xử lý của chúng ta)
KeyPress Xảy ra khi người dùng nhấn một phím
KeyUp Xảy ra khi người dùng nhả một phím.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
52
MouseClick Xảy ra khi người dùng nhấn chuột (một trong 3 lựa
chọn: Trái, giữa, phải)
MouseDoubleClick Xảy ra khi người dùng DoubleClick chuột vào một
vùng làm việc của Form(một trong 3 lựa chọn:
Trái, giữa, phải)
MouseDown Xảy ra khi người dùng nhấn chuột
MouseHover Xảy ra khi người dùng di chuyển vào các vùng làm
việc Form
MouseLeave Xảy ra khi di chuyển chuột ra khỏi vùng làm việc
của Form
MouseMove Xảy ra khi di chuyển chuột trên một vùng làm việc
thuộc Form (nếu Form có chứa một điều khiển nào
đó, khi di chuyển chuột trên điều khiển này thì
không xảy ra sự kiện MouseMove của Form).
MouseUp Xảy ra khi người dùng nhả nhấn chuột (có thể là
chuột trái, chuột phải, chuột giữa - chuột cuộn)
Move Xảy ra khi di chuyển Form (có sự thay đổi vị trí
của Form)
StyleChanged Xảy ra khi thuộc tính FormBorderStyle của Form
thay đổi
TextChanged Xảy ra khi thuộc tính Text của Form thay đổi.
3.1.4. Ví dụ minh họa
3.1.4.1. Sự kiện FormClosed
//Sự kiện FormClosed - Sự kiện này được gọi khi Form đã đóng
private void frmForm_FormClosed(object sender, FormClosedEventArgs e)
{
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
53
MessageBox.Show("Sự kiện FormClosed được gọi",
"FormClosed",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
3.1.4.2. Sự kiện FormClosing
//Sự kiện FormClosing xảy ra khi Form đang đóng
private void frmForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Bạn có muốn đóng Form lại hay không?",
"FormClosing",
MessageBoxButtons.YesNo, MessageBoxIcon.Information) ==
DialogResult.Yes)
e.Cancel = false;// Đóng Form lại
else
e.Cancel = true;//Không đóng Form nữa
}
3.1.4.3. Sự kiện KeyPress
//Sự kiện KeyPress
private void frmForm_KeyPress(object sender, KeyPressEventArgs e)
{
//Nếu không chỉ rõ phím nào được nhấn thì khi nhấn bất cứ phím nào sự
kiện KeyPress của Form đều xảy ra
//Chỉ rõ phím nào được nhấn thì phát sinh sự kiện KeyPress làm như sau
if (e.KeyChar = 'a')
MessageBox.Show("Sự kiện KeyPress xảy ra khi bạn nhấn phím a");
}
//Sự kiện KeyUp tương tự như sự kiện KeyPress
//Sự kiện KeyDown xảy ra khi nhấn một phím hay tổ hợp phím
3.1.4.4. Sự kiện KeyDown
private void frmForm_KeyDown(object sender, KeyEventArgs e)
{
//khi nhấn một phím bất kì trên bàn phím thì sự kiện KeyPress
được gọi
//Đồng thời sự kiện KeyDown cũng được gọi → KeyPress là
trường hợp riêng của KeyDown
//Áp dụng: Nhấn một tổ hợp phím thì sự kiện KeyDown mới được
gọi
//Như Windows Media: Nhấn Ctrl+F để di chuyển bài tiếp theo
if (e.KeyCode == Keys.F && e.Modifiers == Keys.Control)
MessageBox.Show("Sự kiện KeyDown được gọi khi bạn nhấn
Ctrl + F");
}
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
54
3.1.4.5. Sự kiện MouseClick
//Sự kiện MouseClick
private void frmForm_MouseClick(object sender, MouseEventArgs e)
{
//Nếu bạn không muốn biết người dùng nhấn chuột TRÁI hay PHẢI hay
GIỮA thì khi nhấn bất kì
//Chuột nào cũng xảy ra sự kiện MouseClick của Form
//Còn nếu bạn muốn bắt được sự kiện người dùng nhấn chuột TRÁI,
PHẢI, hay GIỮA làm thế này
if (e.Button == MouseButtons.Left)
MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột
TRÁI");
else if (e.Button==MouseButtons.Middle)
MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột
GIỮA");
else if (e.Button==MouseButtons.Right)
MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột
PHẢI");
}
//Các sự kiện MouseDoubleClick, MouseDown, MouseUp... Xử lý tương
tự
3.2. Labels
3.2.1. Chức năng
Điều khiển Label sử dụng để hiển thị văn bản. Ứng dụng chủ yếu vào
các nhãn, lời nhắc, tiêu đề cho các khung nhập liệu.
3.2.2. Một số thuộc tính thường dùng
Text: hiển thị nội dung văn bản
TextAlign: căn lề văn bản
Font: xác định font chữ hiển thị
ForeColor: xác định màu chữ hiển thị
3.3. Button
3.3.1. Chức năng
Điều khiển Button cho phép người sử dụng có thể nhập dữ liệu (thể
hiện lựa chọn, quyết định của mình) bằng cách nhấn chuột lên nút lệnh hoặc
nhấn bàn phím.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
55
3.3.2. Một số thuộc tính, sự kiện thường dùng
Thuộc tính:
Text: hiển thị nội dung văn bản trên nút lệnh
TextAlign: căn lề văn bản
Font: xác định font chữ hiển thị
ForeColor: xác định màu chữ hiển thị
Image: hình ảnh hiển thị trên nút lệnh
Sự kiện:
Click: xảy ra khi nút lệnh bị kích hoạt bằng chuột hoặc bàn phím
Các sự kiện liên quan đến bàn phím (Key...)
Các sự kiện liên quan đến chuột (Mouse...)
3.4. Texbox
3.4.1. Chức năng
Điều khiển Textbox cho phép bạn nhập và hiển thị dữ liệu.
3.4.2. Một số thuộc tính thường dùng
Tên Ý nghĩa
AcceptsTab Nhận một trong hai giá trị True hay False
- True: Khi nhấn phím Tab thì con trỏ
(Focus) chỉ di chuyển bên trong Textbox
(Với điều kiện thuộc tính
Multiline=True).
- False: Khi nhấn Tab thì Focus di chuyển
qua lại giữa các điều khiển trên Form
→ Thuộc tính này hay đặt bằng True trong
các ứng dụng soạn thảo văn bản
Anchor Vị trí neo đậu của Textbox trên Form
AutoCompleteCustomSource Ba thuộc tính này ý nghĩa tương tự như của
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
56
AutoCompleteMode thuộc tính của điều khiển Combobox
AutoComplete Source
BackColor Đặt mầu nền cho Textbox
BorderStyle Chọn kiểu đường viền cho Textbox
ContextMenuStrip Chọn Menu ngữ cảnh khi nhấn chuột phải
vào Textbox
Dock Vị trí bám dính và điền đầy của Textbox với
Form
Font Chọn kiểu Font chữ cho Textbox
HideSelection Nhận một trong hai giá trị True hay False
- True: Không cho phép các thuộc tính:
SelectionStartcó hiệu lực.
- False: Ngược lại
MaxLenght Số lượng kí tự lớn nhất cho phép nhập vào
Textbox
Multiline Nhận một trong hai giá trị True hay False
- True: Cho phép nhập và hiển thị giá trị
của Textbox trên nhiều dòng (người dùng
có thể nhìn thấy toàn bộ giá trị Text của
nó)
- False: Cho phép nhập/hiển thị giá trị của
Textbox trên một dòng
PasswordChar Hiển thị giá trị của Textbox dưới dạng các kí
tự mà bạn thay thế (kí tự do người dùng nhập
vào: *, #...)
ReadOnly
ScrollBars Cho phép hiển thị thanh trượt hay không?
(Với điều kiện thuộc tính Multiline=True
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
57
mới nhìn thấy thanh cuộn)
TabIndex
Visible Cho phép Textbox hiển thị hay không?
CanUndo Trả lại hai giá trị True/False.
- True: có thể Undo lại được (như Word)
- False: Ngược lại
Các thuộc tính SelectionText o SelectedText
o SelectionStart
o SelectionLength
o .
Chú ý: Các điều khiển có rất nhiều thuộc tính giống nhau: Anchor, Dock,
Font, ForeColor, Enabled, Visible, TabIndexVề ý nghĩa các thuộc tính
này là giống nhau với tất cả các điều khiển
3.4.3. Một số phương thức thường dùng
Tên Ý nghĩa
AppendText Nối một chuỗi (string) vào giá trị Text hiện có
của Textbox
Copy
Xử lý phần nội dung bôi đen (như Word) Cut
Paste
Focus Chuyển Focus (con trỏ) vào TextBox
Clear Xóa toàn bộ Textbox
Select Lấy ra một chuỗi trong Textbox (xem Code)
SelectAll Lấy tất cả giá trị của Textbox
Undo Xử lý Undo như Word
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
58
3.4.4. Một số sự kiện thường dùng
Tên Ý nghĩa
KeyPress Xảy ra khi người dùng nhấn phím trên bàn phím
(tất nhiên Textbox phải đang Focus – Áp dụng
sự kiện này để xử lý không cho phép nhập chữ
vào Textbox)
MouseClick Xảy ra khi người dùng Click chuột trên điều
khiển Textbox
TextChanged Xảy ra khi giá trị Text của Texbox (hay gọi giá
trị Textbox) thay đổi
3.4.5. Minh họa
3.4.5.1.1. Minh họa thuộc tính Text của Textbox
private void btTextbox_Click(object sender, EventArgs e)
{
//Trước khi gán thuộc tính text
MessageBox.Show("Giá trị textbox trước khi gán: "+ textBox1.Text);
//Gán giá trị Text
textBox1.Text = "Chào các bạn";
//Sau khi gán
MessageBox.Show("Giá trị textbox sau khi gán: " + textBox1.Text);
}
3.4.5.1.2. Minh họa thuộc tính SelectedText
private void btTextbox_Click(object sender, EventArgs e)
{
//Thuộc tính SelectedText lấy ra một chuỗi mà bạn bôi đen (Chọn)
//Bạn hãy bôi đen một vài từ trong Textbox sau đó Click vào Button
này sẽ hiển thị
//Message thông báo từ bạn chọn
string str = textBox1.SelectedText;
MessageBox.Show("Từ bạn vừa chọn (bôi đen) là: "+str);
}
3.4.5.1.3. Minh họa thuộc tính SelectionStart và SelectionLength
private void btTextbox_Click(object sender, EventArgs e)
{
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
59
//Thuộc tính này dùng trong tìm kiếm rất nhiều
//Thuộc tính SelectionStart: Ví trí bắt đầu Select
//Thuộc tính SelectionLength: Chiều dài của vùng lựa chọn
//Chú ý: Đặt thuộc tính HideSelection=False
//Ví dụ: Tìm kiếm xem giá trị của Textbox có từ nào là chào hay
không. Nếu có thì nó tự Bôi đen từ đó
string str = "chào";
int i;
i = textBox1.Text.LastIndexOf(str);
if (i >= 0)
{
textBox1.SelectionStart = i;
textBox1.SelectionLength = str.Length;
}
}
3.4.5.1.4. Minh họa thuộc tính CanUndo và phương thức Undo
private void btTextbox_Click(object sender, EventArgs e)
{
//Nếu có thể Undo (có nghĩa: Bạn phải gõ văn bản vào Textbox rồi sửa,
xóa...)
//Mới có thể Undo lại được
if (textBox1.CanUndo)
textBox1.Undo();
}
3.4.5.1.5. Minh họa phương thức Select
private void btTextbox_Click(object sender, EventArgs e)
{
//Cú pháp chung: txtNoiDung.Select(Start, Length);
//Mục đích để lấy về một chuỗi từ từ vị trí nào và chiều dài của chuỗi dược
chọn (tất nhiên: bôi đen vùng này).
//-> Phương thức này tương đương với sử dụng 2 thuộc tính SelectionStart
và SelectionLength
//Ví dụ:
txtNoiDung.Select(10, 5);
// 2 câu lệnh này
//textBox1.SelectionStart = 10;
//textBox1.SelectionStart = 5;
}
3.4.5.1.6. Minh họa phương thức AppendText
private void btTextbox_Click(object sender, EventArgs e)
{
//Giá trị Textbox trước khi gọi phương thức
MessageBox.Show("Trước: "+textBox1.Text);
//Gọi phương thức
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
60
textBox1.AppendText("Khoa CNTT - UTEHY");
//Giá trị Textbox trước khi gọi phương thức
MessageBox.Show("Sau: " + textBox1.Text);
}
3.4.5.1.7. Xử lý chỉ cho phép Textbox nhập số (sự kiện KeyPress của Textbox) –
Cách 1
private void txtNoiDung_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar >= '0' && e.KeyChar <= '9')
e.Handled = false;//Handled: Được xử lý
else
e.Handled = true;
}
3.4.5.1.8. Xử lý chỉ cho phép Textbox nhập số (sự kiện KeyPress của Textbox) –
Cách 2
private void txtNoiDung_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
e.Handled = true;
//Char.IsDigit(e.KeyChar) -->
//kiểm tra xem phím vừa nhập vào textbox có phải là ký tự số hay không,
hàm này trả về kiểu bool
//Char.IsContro(e.KeyChar) -->
//kiểm tra xem phím vừa nhập vào textbox có phải là các ký tự điều khiển
//(các phím mũi tên,Delete,Insert,backspace,space bar) hay không, mục
đích dùng hàm này là để cho phép người dùng xóa số trong trường hợp nhập sai.
}
→ Sử dụng Textbox viết chương trình soạn thảo văn bản đơn giản (tham khảo
Notepad)
3.5. ComboBox, ListBox
3.5.1. Công dụng
Hiển thị dữ liệu dưới dạng danh sách, cho phép người dùng lựa chọn dữ
liệu trên danh sách có sẵn hoặc nhập mục/nội dung mong muốn (với combo)
Hai điều khiển này cơ bản có những đặc điểm ứng dụng và cách sử dụng
chính như nhau.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
61
3.5.2. Một số thuộc tính, sự kiện thông dụng
Thuộc tính:
- Items: chứa danh sách các mục chọn
- SelectedItem: mục được chọn
- SelectedValue: giá trị được chọn
Sự kiện:
- SelectedIndexChange: xảy ra khi số thứ tự mục chọn bị thay đổi (khi có
mục chọn mới).
- SelectedValueChange: xảy ra khi giá trị được chọn bị thay đổi (khi có
mục chọn mới).
3.6. Checkbox, RadioButton
3.6.1. Công dụng
Các điều khiển này cho phép người dùng nhập dữ liệu bằng cách đánh dấu
chọn hoặc không chọn trên hộp đánh dâu.
Checkbox: cho phép thiết kế nhiều mục chọn mà ở đó người dùng có thể
chọn nhiều mục cùng lúc hoặc không chọn mục nào (dạng đa lựa chọn).
RadioButton: chỉ cho phép người dùng chọn một trong số các mục chọn
trong cùng một nhóm.
3.6.2. Một số thuộc tính, sự kiện thông dụng
Thuộc tính:
- Checked: thể hiện mục đang được chọn hay không
- CheckState: thể hiện mục được chọn như thế nào (checkbox)
- Text: văn bản được hiển thị cạnh nút chọn
- SelectedValue: giá trị được chọn
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
62
Bài 4
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN CƠ BẢN
4.1. Mục tiêu
- Nêu đặc các đặc điểm chính của các điều khiển cơ bản và ứng dụng của
chúng.
- Sử dụng được các điều khiển cơ bản trong thiết kế giao diện và điều
khiển.
4.2. Các kiến thức lý thuyết liên quan
- Kiến thức sử dụng ngôn ngữ lập trình C#
- Kiến thức sử dụng bộ công cụ Visual Studio
4.3. Nội dung luyện tập
- Tạo bảng led từ hai ảnh led xanh và led đỏ
- Load tự động số lượng Led 1-10 vào trong ComboBox số lượng Led
Bài 5
SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH ẢNH
VÀ THỜI GIAN
5.1. PictureBox
5.1.1. Công dụng
Hiển thị hình ảnh, cho phép điều chỉnh kích thước, cách thức hình ảnh được
hiển thị.
5.1.2. Một số thuộc tính, sự kiện thông dụng
Thuộc tính:
- Image: chứa hình ảnh được hiển thị
- SizeMode: xác định chế độ hiển thị ảnh
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
63
- BorderStyle: xác định kiểu đường viền
Sự kiện:
- Các sự kiện liên quan đến chuột: Mouse...
- Các sự kiện liên quan đến việc nạp ảnh (load...), vẽ ảnh (paint...)
5.2. ImageList
5.2.1. Công dụng
Dùng để lưu trữ hình ảnh, không trực tiếp hiển thị.
5.2.2. Một số thuộc tính thông dụng
- Images: chứa danh sách các hình ảnh
- ImageSize: xác định kích thước hình ảnh
5.3. Timer
5.3.1. Công dụng
Dùng để điều khiển theo thời gian đặt trước.
5.3.2. Một số thuộc tính, sự kiện thông dụng
Thuộc tính:
- Enable: cho phép hoặc cấm Timer hoạt động
- Interval: xác định khoảng thời gian chờ lặp lại công việc (xảy ra sự kiện
tick), đơn vị tính mili giây.
Sự kiện:
- Tick: xảy ra sau mỗi Interval mili giây khi Enalbe=true.
5.4. DateTimePicker
Sinh viên tự đọc tài liệu.
5.5. ListView
Sinh viên tự đọc tài liệu.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
64
5.6. TreeView
Sinh viên tự đọc tài liệu.
5.7. ProgressBar
Sinh viên tự đọc tài liệu.
Bài 6
THỰC HÀNH SỬ DỤNG CÁC ĐIỀU KHIỂN XỬ LÝ HÌNH
ẢNH VÀ THỜI GIAN
6.1. Mục tiêu
- Nêu đặc các đặc điểm chính của điều khiển xử lý hình ảnh (Picturebox),
thời giam (timer) và ứng dụng của chúng.
- Sử dụng được các điều khiển xử lý hình ảnh và thời gian trong thiết kế
giao diện và điều khiển.
6.2. Các kiến thức lý thuyết liên quan
- Kiến thức sử dụng ngôn ngữ lập trình C#
- Kiến thức sử dụng bộ công cụ Visual Studio
- Kiến thức sử dụng các điều khiển cơ bản như Textbox, ComboBox,
ListBox và các điều khiển nâng cao như TreeView, ListView, ImageList
- Kiến thức sử dụng điều khiển Picture Box, Timer
6.3. Nội dung luyện tập
- Thiết kế giao diện theo mẫu.
- Thiết kế giao diện chương trình theo các bài tập thực hành trong hệ thống
bài tập thực hành đi kèm
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
65
Bài 7
KỸ THUẬT THIẾT KẾ GIAO DIỆN
7.1. Các nguyên tắc chung trong thiết kế giao diện
Có nhiều yếu tố để tạo lên một giao diện "tốt". Trong số đó, tính tiện lợi có
ảnh hưởng, tác động lớn đến người dùng. Để đạt được tính tiện lợi, giao diện
cần thỏa mãn 4 nguyên tắc:
* Tính có thể học được
– các hệ thống tương tác phải dễ học
* Tính dễ sử dụng
– Các hệ thống tương tác phải hiệu quả trong việc giúp người sử dụng đạt
được mục đích
* Tính linh động
– Các hệ thống tương tác phải thích ứng được những hoàn cảnh khác nhau
* Tính cảm xúc
– Các hệ thống tương tác phải làm cho người dùng cảm thấy thoải mái
Thảo khảo thêm tài liệu HCI được giới thiệu và cung cấp cùng học phần.
7.2. Thiết kế giao diện trong C#
- Cách sắp xếp các điều khiển (bố cục chung của giao diện): phải hài hòa,
thuận tiện cho thao tác, các điều khiển có thứ tự sử dụng liên tiếp cần phải
được đặt gần nhau.
- Kich thước điều khiển: nên theo một nguyên tắc chung, cùng kich thước,
hay cùng chiều cao, bề rộng (tùy thuộc mỗi điều khiển). Nói chung nên có sự
thống nhất về kich thước. Mặt khác cũng cần có điểm nhấn (khác biệt về kích
thước). Các điều khiển thường dùng nên đặt kích thước lớn hơn. Các điều
khiển có tầm quan trọng, ảnh hưởng lớn đến kết quả công việc (quyết định),
khó khắc phục thì nên có kích thước nhỏ hơn để hạn chế bấm nhầm.
- Mầu sắc: lựa chọn hài hòa, phụ hợp với tính chất công việc, đối tượng
người dùng. Không nên sử dụng quá nhiều màu sắc (khi không thực sự cần
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
66
thiết). Tùy yêu cầu cần sự hòa trộn hay rõ nét mà lựa chọn gam mầu cho thích
hợp.
- Lưu ý về tính năng cửa sổ, các nút điều khiển cho cửa sổ lựa chọn sao cho
hợp lý, tránh nguy cơ làm thay đổi giao diện, bố cục ngoài ý muốn.
7.3. Kỹ thuật thiết kế giao diện điều khiển hệ thống
- Mầu sắc: lựa chọn mầu phù hợp với thiết bị được điều khiển. Nên có gam
mầu đặc trưng theo mầu của thiết bị.
- Các công cụ điều khiển: trong chừng mực cho phép nên tạo các điều khiển
tương tự như các điều khiển có trên thiết bị thật và bố trị tương tự như bảng
điều khiển trên thiết bị.
- Thiết kế các mô phỏng để thể hiện các diễn biến hoạt động của thiết bị
cũng như biểu diễn các thông tin phản hồi từ thiết bị.
Bài 8
THẢO LUẬN THIẾT KẾ GIAO DIỆN
8.1. Mục tiêu
- Sinh viên nhận thức rõ vai trò của giao diện đối với một phần mềm ứng
dụng nói chung và phần mềm điều khiển nói riêng.
- Nêu được các đặc trưng riêng của giao diện phần mềm điều khiển
- Để xuất thiết kế cho tình huống ví dụ cụ thể
8.2. Tổ chức
- Sinh viên được chia thành nhóm nhỏ từ 5 đến 7 sinh viên.
- Thảo luận theo các chủ đề được giao
- Các nhóm báo cáo kết quả
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
67
Bài 9
TẠO MÔ PHỎNG THIẾT BỊ ĐIỀU KHIỂN VÀ CHUYỂN
ĐỘNG TỊNH TIẾN
9.1. Tạo mô phỏng thiết bị điều khiển
- Mục tiêu của tạo mô phỏng là để thể hiện các diễn biến hoạt động của
thiết bị cũng như biểu diễn các thông tin phản hồi từ thiết bị. Bên cạnh đó, mô
phỏng cũng nhằm tạo ra các điều mới có hình thức và hoạt động giống với thiết
bị điều khiển thực.
- Các mô phỏng hoạt động thông thường quy về 2 dạng chuyển động là
chuyển động tịnh tiến, chuyển động quay. Ngoài ra còn có thể biểu diễn ở sự
biến dạng hình ảnh.
9.2. Các kỹ thuật tạo mô phỏng chuyển động tịnh tiến
9.2.1. Kỹ thuật thay đổi toạ độ
- Đây là kỹ thuật tạo mô phỏng đơn giản, các chuyền động được thể hiện
bằng sự thay đổi vị trí.
- Trường hợp này thường dùng hình ảnh có sẵn (sử dụng Picturebox) để thể
hiện đối tượng và thay đổi tạo độ của đối tượng tương ứng sự chuyển động cần
mô phỏng (thuộc tính Top, Left của điều khiển).
9.2.2. Kỹ thuật vẽ lại hình
- Kỹ thuật tạo mô phỏng này đòi hỏi người lập trình phải xử lý để vẽ hình
ảnh của đối tượng chuyển động ở các vị trí chuyển động khác nhau.
- Kỹ thuật này phức tạp về xử lý vẽ nhưng lại có ưu điểm là không tốn
nhiều bộ nhớ cho việc lưu trữ hình ảnh có sẵn như khi thuật thay đổi tọa độ.
- Thực hiện:
+ Vẽ hình ảnh của đối tượng tại vị trí ban đầu, trễ để quan sát
+ Xóa hình ảnh cũ
+ Vẽ lại hình ảnh của đổi tượng ở vị trí mới
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
68
9.3. Các ví dụ về tạo mô phỏng chuyển động tịnh tiến
Tạo hình ảnh quả bóng chuyển động, chạm thành cửa sổ thì đổi hướng.
Bài 10
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG
THIẾT BỊ ĐIỀU KHIỂN
10.1. Mục tiêu
- Trình bày được các yêu cầu đối với thiết kế mô phỏng.
- Ứng dụng thiết kế mô phỏng vào thiết kế giao diện cho chương trình điều
khiển thiết bị.
10.2. Các kiến thức lý thuyết liên quan
- Kiến thức sử dụng ngôn ngữ lập trình C#
- Thao tác tạo các điều khiển mô phỏng cho thiết bị.
- Thao tác xử lý các trạng thái của điều khiển.
10.3. Nội dung luyện tập
- Tạo và thiết kế điều khiển được mô phỏng.
- Thao tác tạo lập trình mô phỏng.
- Bài tập: theo tài liệu Bài tập thực hành lập trình điều khiển thiết bị.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
69
Bài 11
TẠO MÔ PHỎNG CHUYỂN ĐỘNG QUAY
11.1. Các kỹ thuật tạo mô phỏng chuyển động quay
11.1.1. Kỹ thuật vẽ lại hình
Cách thực hiện: vẽ hình ảnh ở các trạng thái quay của vật cần mô phỏng
theo thời gian.
Kỹ thuật này phức tạp trong việc xử lý vẽ hình, xoay hình nhưng ít tiêu tốn
về bộ nhớ.
Thực hiện:
- Vẽ hình ở vị trí đầu tiên, trễ để quan sát
- Xóa hình cũ
- Vẽ lại hình ở vị trí mới, sử dụng thuật toán xoay, kết hợp các chi tiết bổ
sung ở vị trí mới (tùy từng đối tượng).
11.1.2. Kỹ thuật thay hình
- Đây là kỹ thuật tạo mô phỏng chuyển động quay đơn giản. Chuyển động
quay được tạo ra bằng cách hiển thị lần lượt hình ảnh của vật quay ở các trạng
thái khác nhau.
- Kỹ thuật: vẽ hoặc chụp sẵn hình ảnh ở các vị trí quay khác nhau, lưu vào
danh sách ảnh sau đó cho lần lượt hiển thị ra màn hình.
Thực hiện:
- Chuẩn bị thư viện hình ảnh của vật cần mô phỏng ở các góc quay khác
nhau (kế tiếp), thường lưu trong danh sách ảnh.
- Sử dụng chỉ số kiểm soát để lần lượt hiển thị từng ảnh. Sau mỗi lần hiển
thị, trễ để quan sát.
- Timer thường được sử dụng để điều khiển việc thay ảnh tự động theo thời
gian định trước.
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
70
11.2. Các ví dụ về tạo mô phỏng chuyển quay
Ví dụ tạo chuyển động quay của cánh quạt bằng kỹ thuật thay hình.
Bài 12
THỰC HÀNH LẬP TRÌNH MÔ PHỎNG
THIẾT BỊ CHUYỂN ĐỘNG TỊNH TIẾN
12.1. Mục tiêu
- Trình bày được các yêu cầu đối với thiết kế mô phỏng chuyển động tịnh
tiến.
- Ứng dụng thiết kế mô phỏng chuyển động tịnh tiến vào thiết kế giao diện
cho chương trình điều khiển thiết bị.
12.2. Các kiến thức lý thuyết liên quan
- Kiến thức sử dụng ngôn ngữ lập trình C#
- Thiết kế giao diện của hệ thống cần mô phỏng.
- Thao tác xử lý trên timer tạo các chuyển động cho các điều khiển.
12.3. Nội dung luyện tập
- Thiết kế giao diện cho bài tập được giao trong cuốn hệ thống bài tập.
- Lập trình và chạy chạy thử các mô phỏng chuyển động.
- Bài tập: theo tài liệu Bài tập thực hành lập trình điều khiển thiết bị
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
71
Bài 13
CỔNG SONG SONG
13.1. Cơ bản về cổng song song
Cổng song song gồm có 4 đường điều khiển, 5 đường trạng thái và 8
đường dữ liệu bao gồm 5 chế độ hoạt động:
- Chế độ tương thích (compatibility).
- Chế độ nibble.
- Chế độ byte.
- Chế độ EPP (Enhanced Parallel Port).
- Chế độ ECP (Extended Capabilities Port).
Ba chế độ đầu tiên sử dụng port song song chuẩn (SPP – Standard
Parallel Port) trong khi đó chế độ 4, 5 cần thêm phần cứng để cho phép hoạt
động ở tốc độ cao hơn. Sơ đồ chân của máy in như sau:
Chân Tín hiệu Mô tả
1 STR (Out) Mức tín hiệu thấp, truyền dữ liệu tới máy in
2 D0 Bit dữ liệu 0
3 D1 Bit dữ liệu 1
4 D2 Bit dữ liệu 2
5 D3 Bit dữ liệu 3
6 D4 Bit dữ liệu 4
7 D5 Bit dữ liệu 5
8 D6 Bit dữ liệu 6
9 D7 Bit dữ liệu 7
10 ACK (In) Mức thấp: máy in đã nhận 1 ký tự và có khả
năng nhận nữa
11 BUSY (In) Mức cao: ký tự đã được nhận; bộ đệm máy in
đầy;
khởi động máy in; máy in ở trạng thái off-line. 12 PAPER EMPTY (In) Mức cao: hết giấy
13 SELECT (In) Mức cao: máy in ở trạng thái online
14 AUTOFEED (Out) Tự động xuống dòng; mức thấp: máy in
xuống dòng tự động
15 ERROR (In) Mức thấp: hết giấy; máy in ở offline; lỗi máy in
16 INIT (Out) Mức thấp: khởi động máy in
17 SELECTIN (Out) Mức thấp: chọn máy in
18-25 GROUND 0V
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
72
13.2. Kiến trúc phần cứng
Các đầu nối trên dây cable:
Đầu nối trên thân máy:
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
73
Giao diện LPT bao gồm 25 chân trong đó có 8 chân tương ứng với 8bit
dữ liệu. Các chân điều khiển, chân trạng thái, số còn lại là chân tiếp đất. Chi
tiết được thể hiện ở bảng sau:
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
74
Biểu đồ thời gian của các chu kỳ I/O:
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
75
Chế độ Bi-directional Ports:
Sơ đồ sau cho thấy cấu trúc thanh ghi dữ liệu công LPT. Cổng LPT
chuẩn sử dụng họ 74LS.
Địa chỉ các cổng được trình bày trong bảng sau:
13.3. Các thanh ghi
Cổng song song có ba thanh ghi có thể truyền dữ liệu và điều khiển
máy in. Địa chỉ cơ sở của các thanh ghi cho tất cả cổng LPT (line printer) từ
LPT1 đến LPT4 được lưu trữ trong vùng dữ liệu của BIOS. Thanh ghi dữ
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
76
liệu được định vị ở offset 00h, thanh ghi trang thái ở 01h, và thanh ghi điều
khiển ở 02h. Thông thường, địa chỉ cơ sở của LPT1 là 378h, LPT2 là 278h,
do đó địa chỉ của thanh ghi trạng thái là 379h hoặc 279h và địa chỉ thanh
ghi điều khiển là 37Ah hoặc 27Ah. Tuy nhiên trong một số trường hợp, địa
chỉ của cổng song song có thể khác do quá trình khởi động của BIOS. BIOS
sẽ lưu trữ các địa chỉ này như sau:
Địa chỉ Chức năng
0000h:0408h Địa chỉ cơ sở của LPT1
0000h:040Ah Địa chỉ cơ sở của LPT2
0000h:040Ch Địa chỉ cơ sở của LPT3
Định dạng các thanh ghi như sau:
Thanh ghi dữ liệu (hai chiều):
7 6 5 4 3 2 1 0
Tín hiệu máy
in
D7 D6 D5 D4 D3 D2 D1 D0
Chân số 9 8 7 6 5 4 3 2
Thanh ghi trạng thái máy in (chỉ đọc):
Thanh ghi điều khiển máy in:
LẬP TRÌNH ĐIỀU KHIỂN THIẾT BỊ
77
x: không sử dụng
IRQ Enable: yêu cầu ngắt cứng; 1 = cho phép; 0 = không cho
phép
Chú ý rằng chân BUSY được nối với cổng đảo trước khi đưa vào
thanh ghi trạng thái, các bit SELECTIN , AUTOFEED và STROBE
Các file đính kèm theo tài liệu này:
- 01200049_2422_1983578.pdf