Lập trình điều khiển thiết bị

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 .......................................................

pdf103 trang | Chia sẻ: putihuynh11 | Lượt xem: 519 | Lượt tải: 0download
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:

  • pdf01200049_2422_1983578.pdf