(NB) Đề cương bài giảng Lập trình điều khiển thiết bị gồm các nội dung chính được trình bày như sau: Tổng quan về lập trình điều khiển thiết bị, ngôn ngữ lập trình C#, sử dụng form và các điều khiển cơ bản, sử dụng các điều khiển xử lý hình ảnh và thời gian, tạo mô phỏng thiết bị điều khiển và chuyển động tịnh tiến
Trang 2MỤ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
Trang 32.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
Trang 48.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
Trang 5QUA 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
Trang 623.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
Trang 7ĐỀ 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
Trang 8- 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]:=<giá gtrị>; 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
Trang 91.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
Trang 101.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,
Trang 11Bà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++
Trang 12+ 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)
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 }
Trang 13-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
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
Trang 14trì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ư
Trang 15C++, 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:
byte Kiểu NET Mô tả
short 2 Int16 Số nguyên có dấu giá trị từ -32768 đến
32767
2.147.483.647
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
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
Trang 16Ví 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
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
Trang 17char k=’c’;
Kiểu C# Số byte Kiểu NET Mô tả
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ả
Đâ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:
Trang 18• Kiểu 1: Khai báo biến không có giá trị khởi đầu
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
Trang 19là 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
Trang 20b) 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
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:
\\ Dấu gạch chéo ngược
Trang 21\t Nhảy cách ngang, ký tự tab
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
Trang 22
- Phép toán % trả về phần dư của phép chia
Trang 232.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 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
Trang 24Bảng giá trị của các phép toán logic
X Y X && Y X || Y ! X
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;
i=++j; j=j+1; i=j; i = ?
j = ? i=j++; i=j; j=j+1; i = ?
Trang 25j = 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:
Trang 26Cá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ử
Trang 272.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:
<Biểu thức điều kiện > ? <Biểu thức thứ 1> : <Biểu thức thứ 2>
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
Trang 282.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
Trang 29Việ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:
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
Trang 30y=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*/
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
* 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)
Trang 31Console.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
Trang 32* 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
• 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
Trang 35case 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;
Trang 37Ví 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
int month, year,sumday;
Console.Write("Nhap thang="); month = int.Parse(Console.ReadLine()); Console.Write("Nhap year="); year = int.Parse(Console.ReadLine());
case 11: sumday = 30; break;
case 2: if (year % 400==0 || (year % 4 == 0 && year % 100 != 0))
Trang 38* 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đkTrue
Công việc
False
Trang 39Ví 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 đó
}while(btđk);
Trong đó:
- while ,do là từ khoá
Trang 40- 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%
e
Công việc;
False