Giáo trình lập trình c căn bản (nghề ứng dụng phần mềm trình độ cao đẳng)

134 7 0
Giáo trình lập trình c căn bản (nghề ứng dụng phần mềm   trình độ cao đẳng)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

UDPM-CĐ-MĐ11-LTCSCB TUYÊN BỐ BẢN QUYỀN Tài liệu thuộc loại sách giáo trình nên nguồn thơng tin phép dùng nguyên trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác mang tính lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm LỜI GIỚI THIỆU Đây tài liệu biên soạn theo chương trình đào tạo Cao đẳng nghề Công nghệ thông tin (ứng dụng phần mềm) Để học tốt mơn học này, người học nên có kiến thức lập trình Lập trình Windows mơ đun nhằm giúp người học có kiến thức kỹ lập trình sở mơi trường Windows Với phạm vi tài liệu này, cung cấp cho người học kiến thức kỹ sau:  Cài đặt sử dụng với môi trường C# Visual Studio.Net 2010 trở lên;  Khai báo lớp đối tượng, thành phần lớp đối tượng sử dụng lớp đối tượng ngôn ngữ C#;  Cài đặt xây dựng chương trình theo phương pháp hướng đối tượng ngơn ngữ lập trình C#;  Xây dựng ứng dụng Windows Forms đơn giản kết nối đến sở liệu;  Nghiêm túc, tỉ mỉ q trình tiếp cận với cơng cụ mới;  Chủ động sáng tạo tìm kiếm ứng dụng viết C# Trong q trình biên soạn, chúng tơi có tham khảo nhiều nguồn tài liệu khác từ nguồn Internet Mặc dù cố gắng biên soạn lại chắn khơng tránh khỏi thiếu sót, tác giả mong nhận ý kiến đóng góp để tài liệu ngày hoàn thiện để cung cấp cho người học kiến thức kỹ trọng tâm Cần Thơ, ngày tháng năm 20 Tham gia biên soạn Chủ biên Nguyễn Phát Minh MỤC LỤC TRANG LỜI GIỚI THIỆU GIÁO TRÌNH MÔN HỌC/MÔ ĐUN BÀI 1: CƠ BẢN VỀ C# Mã bài: MĐ 11 - 02 Tại phải sử dụng C# Kiểu liệu Biến 12 Biểu thức 16 Khoảng trắng 17 Câu lệnh 17 Toán tử 26 Namspace 32 Cách dẫn biên dịch 33 BÀI 2: XÂY DỰNG LỚP ĐỐI TƯỢNG 35 Mã bài: MĐ 11 - 03 35 Lớp đối tượng 35 Sử dụng thành viên static 43 Huỷ đối tượng 45 Truyền tham số nạp chồng phương thức 47 Đóng gói liệu với thuộc tính 52 BÀI 3: KẾ THỪA – ĐA HÌNH 56 Mã bài: MĐ 11 - 04 56 Sự kế thừa 56 1.1 Thực thi kế thừa 56 1.2 Gọi phương thức khởi dựng lớp sở 57 1.3 Gọi phương thức lớp sở 58 1.4 Điều khiển truy xuất 58 Đa hình 59 2.1 Kiểu đa hình 60 2.2 Phương thức đa hình 60 Lớp trừu tượng 63 Các lớp lồng 67 BÀI 4: NẠP CHỒNG TOÁN TỬ 71 Mã bài: MĐ 11 - 05 71 Sử dụng từ khóa operator 71 Hỗ trợ ngôn ngữ NET khác 72 Sử dụng toán tử 72 Toán tử so sánh 74 Toán tử chuyển đổi 74 BÀI 5: CẤU TRÚC 79 Mã bài: MĐ 11 - 06 79 Định nghĩa cấu trúc 79 Tạo cấu trúc 80 2.1.Cấu trúc kiểu giá trị 80 2.2 Gọi khởi dựng mặc định 81 2.3 Tạo cấu trúc không gọi new 81 BÀI 6: MẢNG, CHỈ MỤC, TẬP HỢP 83 Mã bài: MĐ 11 - 08 83 Mảng 83 1.1 Khai báo mảng 84 1.2 Giá trị mặc định 84 1.3 Truy cập thành phần mảng 85 1.4 Khởi tạo thành phần mảng 85 Câu lệnh foreach 86 Mảng đa chiều 87 Bộ mục giao diện tập hợp 93 Danh sách mảng, hàng đợi, ngăn xếp 100 Kiểu từ điển 111 BÀI 7: XỬ LÝ CHUỖI 116 Mã bài: MĐ 11 - 09 116 Lớp đối tượng string 116 1.1 Tạo chuỗi 117 1.2 Tạo chuỗi dùng phương thức ToString 117 1.3 Thao tác chuỗi 118 1.5 Chia chuỗi 123 1.6 Thao tác chuỗi dùng StringBuilder 124 Các biểu thức quy tắc 125 TÀI LIỆU THAM KHẢO 134 GIÁO TRÌNH MƠN HỌC/MƠ ĐUN Tên mơn học/mơ đun: Lập trình C# Mã mơn học/mơ đun: MĐ 11 Vị trí, tính chất, ý nghĩa vai trị mơn học/mơ đun:  Vị trí: mơ đun bố trí giảng dạy sau mơn sở nghề  Tính chất: mô đun bắt buộc thuộc chuyên môn nghề chương trình đào tạo Cao đẳng (ứng dụng phần mềm)  Ý nghĩa vai trị mơn học/mơ đun: Lập trình C# mơn học để sinh viên tìm hiểu lập trình để làm tảng học mơn chun sâu lập trình sau Mục tiêu môn học/mô đun: - Về kiến thức:  Hiểu kiến thức tảng Microsoft NET  Biết kiến thức kỹ lập trình hướng đối tượng C#  Có kiến thức kỹ xử lý mảng, chuỗi; - Về kỹ năng:  Tạo ứng dụng dạng console sử dụng ngôn ngữ C# môi trường Net; - Về lực tự chủ trách nhiệm:  Nghiêm túc, tỉ mỉ việc tiếp nhận kiến thức Chủ động, tích cực thực hành tìm kiếm nguồn tập liên quan Nội dung môn học/mô đun: Số Thời gian TT Tên mô đun Tổng Lý Thực Kiểm tra* (LT số thuyết hành, TH) Bài tập Cơ C# 4 C# gì? Chương trình Các kiểu liệu Biến & số Các lệnh có cấu trúc vịng lặp 18 Các lệnh có cấu trúc Lệnh vịng lặp Mảng, mục tập hợp 18 16 Mảng Chỉ mục Tập hợp Xử lý chuỗi Lớp đối tượng string Các biểu thức quy tắc Tổng cộng 60 30 27 BÀI 1: CƠ BẢN VỀ C# Mã bài: MĐ 11 - 02 Giới thiệu: Trong học sinh viên làm quen với ngơn ngữ lập trình phổ biến C# Mục tiêu:  Biết kiến thức chức tiên tiến C#;  Hiểu kiểu liệu dựng sẵn C#;  Hiểu chế thực thi biến, biểu thức C#;  Hiểu khoảng trắng;  Biết kiến thức không gian tên (Namespace);  Biết kiến thức toán tử;  Biết kiến thức dẫn biên dịch;  Tạo thực thi ứng dụng đơn giản C#;  Nghiêm túc, tỉ mỉ học lý thuyết làm tập Nội dung chính: Tại phải sử dụng C# Nhiều người tin không cần thiết có ngơn ngữ lập trình Java, C++, Perl, Microsoft Visual Basic, ngôn ngữ khác nghĩ cung cấp tất chức cần thiết Ngôn ngữ C# ngôn ngữ dẫn xuất từ C C++, tạo từ tảng phát triển Microsoft bắt đầu với công việc C C++ thêm vào đặc tính để làm cho ngơn ngữ dễ sử dụng Nhiều số đặc tính giống với đặc tính có ngơn ngữ Java Khơng dừng lại đó, Microsoft đưa số mục đích xây dựng ngơn ngữ Những mục đích được tóm tắt sau: • C# ngơn ngữ đơn giản • C# ngơn ngữ đại • C# ngơn ngữ hướng đối tượng • C# ngơn ngữ mạnh mẽ mềm dẻo • C# ngơn ngữ có từ khóa • C# ngôn ngữ hướng module • C# trở nên phổ biến Kiểu dữ liệu Như biết C# ngôn ngữ hướng đối tượng mạnh, cơng việc người lập trình kế thừa để tạo khai thác đối tượng Do để nắm vững phát triển tốt người lập trình cần phải từ bước dầu tiên tức vào tìm hiểu phần cốt lõi ngôn ngữ Kiểu dữ liệu C# ngơn ngữ lập trình mạnh kiểu liệu, ngôn ngữ mạnh kiểu liệu phải khai báo kiểu đối tượng tạo (kiểu số nguyên, số thực, kiểu chuỗi, kiểu điều khiển ) trình biên dịch giúp cho người lập trình khơng bị lỗi cho phép loại kiểu liệu gán cho kiểu liệu khác Kiểu liệu đối tượng tín hiệu để trình biên dịch nhận biết kích thước đối tượng (kiểu int có kích thước byte) khả (như đối tượng button vẽ, phản ứng nhấn, ) Tương tự C++ hay Java, C# chia thành hai tập hợp kiểu 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 kiểu người dùng định nghĩa (user-defined) người lập trình tạo C# phân tập hợp kiểu liệu thành hai loại: Kiểu liệu giá trị (value) kiểu liệu tham chiếu (reference) Việc phân chi khác lưu kiểu liệu giá trị kiểu liệu tham chiếu nhớ Đối với kiểu liệu giá trị lưu giữ kích thước thật nhớ cấp phát stack Trong địa kiểu liệu tham chiếu lưu stack đối tượng thật lưu nhớ heap Nếu có đối tượng có kích thước lớn việc lưu giữ chúng nhớ heap có ích, chương trình bày lợi ích bất lợi làm việc với kiểu liệu tham chiếu, chương tập trung kiểu kiểu hay kiểu xây dựng sẵn Tất kiểu liệu xây dựng sẵn kiểu liệu giá trị ngoại trừ đối tượng chuỗi Và tất kiểu người dùng định nghĩa ngoại trừ kiểu cấu trúc kiểu liệu tham chiếu Ngoài C# hỗ trợ kiểu trỏ C++, sử dụng, làm việc với đoạn mã lệnh không quản lý (unmanaged code) Mã lệnh không quản lý lệnh viết bên MS.NET, đối tượng COM Kiểu dữ liệu xây dựng sẵn Ngôn ngữ C# đưa kiểu liệu xây dựng sẵn hữu dụng, phù hợp với ngơn ngữ lập trình đại, kiểu liệu ánh xạ đến kiểu liệu hỗ trợ hệ thống xác nhận ngôn ngữ chung (Common Language Specification: CLS) MS.NET Việc ánh xạ kiểu liệu nguyên thuỷ C# đến kiểu liệu NET đảm bảo đối tượng tạo C# sử dụng đồng thời với đối tượng tạo ngôn ngữ khác biên dịch NET, VB.NET Mỗi kiểu liệu có xác nhận kích thước khơng thay đổi, khơng giống C++, int C# ln có kích thước byte ánh xạ từ kiểu Int32 NET Bảng sau mô tả số kiểu liệu xây dựng sẵn Mô tả kiểu liệu xây dựng sẵn Kiểu C# Số Kiểu byte NET Mô tả byte Byte Số nguyên dương không dấu từ 0-255 char Char Ký tự Unicode bool Boolean Giá trị logic true/ false sbyte Sbyte Số nguyên có dấu ( từ -128 đến 127) short Int16 Số nguyên có dấu giá trị từ -32768 đến32767 ushort Uịnt16 Số nguyên không dấu – 65.535 int Int32 Số nguyên có dấu –2.147.483.647 và2.147.483.647 uint Uint32 Số nguyên không dấu – 4.294.967.295 Single Kiểu dấu chấm động, giá trị xấp xỉ từ 3,4E-38 đến 3,4E+38, với chữ số có nghĩa Double Kiểu dấu chấm động có độ 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 float double decimal Có độ xác đến 28 số giá trị thập phân, Decimal dùng tính tốn tài chính, kiểu địi hỏi phải có hậu tố “m” hay “M”theo sau giá trị long Int64 Kiểu số nguyên có dấu có giá trị khoảng :-9.223.370.036.854.775.808 đến9.223.372.036.854.775.807 ulong Uint64 Số nguyên không dấu từ đến0xffffffffffffffff Kiểu giá trị logic nhận giá trị true hay false mà Một giá trị nguyên gán vào biến kiểu logic C# khơng có chuyển đổi ngầm định Điều khác với C/C++, cho phép biến logic gán giá trị nguyên, giá trị nguyên false giá trị lại true Chọn kiểu dữ liệu Thông thường để chọn kiểu liệu nguyên để sử dụng short, int hay long thường dựa vào độ lớn giá trị muốn sử dụng Ví dụ, biến ushort lưu giữ giá trị từ đến 65.535, biến ulong lưu giữ giá trị từ đến 4.294.967.295, tùy vào miền giá trị phạm vi sử dụng biến mà chọn kiểu liệu thích hợp Kiểu liệu int thường sử dụng nhiều lập trình với kích thước byte đủ để lưu giá trị nguyên cần thiết Kiểu số nguyên có dấu thường lựa chọn sử dụng nhiều kiểu số trừ có lý đáng để sử dụng kiểu liệu không dấu 10 {1}\n", s3, s3.EndsWith("CNTT")); Console.WriteLine("S3: {0}\n ket thuc voi chu Nam ? : {1}\n", s3, s3.EndsWith("Nam")); // Trả mục chuỗi Console.WriteLine("\nTim vi tri xuat hien dau tien cua chu CNTT "); Console.WriteLine("trong chuoi S3 {0}\n)"; s3.IndexOf("CNTT")); // Chèn từ nhân lực vào trước CNTT chuỗi S3 string s8 = s3.Insert(18, "nhan luc"); Console.WriteLine(" S8 : {0}\n", s8); // Ngoài ta kết hợp sau, string s9 = s3.Insert( s3.IndexOf( "CNTT" ) , "nhan luc "); Console.WriteLine(" S9 : {0}\n", s9); } // end Main } // end class } // end namespace Kết quả: So sanh hai chuoi S1: abcd S2: ABCD ket qua: -1 Khong phan biet chu thuong va hoa S1: abcd , S2: ABCD, ket qua : Chuoi S4 noi tu chuoi S1 va S2: abcdABCD Chuoi S5 duoc noi tu chuoi S1 + S2: abcdABCD S6 duoc chep tu S5: abcdABCD S7 = S6: abcdABCD S6.Equals(S7) ?: True Equals(S6, s7) ?: True S6 == S7 ?: True Chuoi S7 co chieu dai la : Ky tu thu cua chuoi S7 la : c S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu CNTT ? : False S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu Minh ? : True Tim vi tri xuat hien dau tien cua chu CNTT chuoi S3 18 S8 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam S9 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam Như xem đoạn chương trình minh họa trên, chương trình bắt đầu với ba khai báo chuỗi: string s1 = "abcd"; string s2 = "ABCD"; string s3 = @"Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam"; Hai chuỗi đầu s1 s2 khai báo chuỗi ký tự bình thường, cịn chuỗi thứ ba khai báo chuỗi nguyên văn (verbatim string) cách sử dụng ký hiệu @ trước chuỗi Chương trình bắt đầu việc so sánh hai chuỗi s1 s2 Phương thức Compare() phương thức tĩnh lớp string, phương thức nạp chồng Phiên phương thức nạp chồng lấy hai chuỗi so sánh chúng với nhau: // So sánh hai chuỗi với có phân biệt chữ thường chữ hoa result = string.Compare( s1 ,s2); Console.WriteLine("So sanh hai chuoi s1: {0} s2: {1} ket qua: {2} \n", s1 ,s2 ,result); 120 Ở việc so sánh có phân biệt chữ thường chữ hoa, phương thức trả giá trị khác phụ thuộc vào kết so sánh: Một số âm chuỗi nhỏ chuỗi thứ hai Giá trị hai chuỗi Một số dương chuỗi thứ lớn chuỗi thứ hai Trong trường hợp so sánh đưa kết chuỗi s1 nhỏ chuỗi s2 Trong Unicode ASCII thứ tự ký tự thường nhỏ thứ tự ký tự hoa: So sanh hai chuoi S1: abcd S2: ABCD ket qua: -1 Cách so sánh thứ hai dùng phiên nạp chồng Compare() lấy ba tham số Tham số Boolean định bỏ qua hay không bỏ qua việc so sánh phân biệt chữ thường chữ hoa Tham số bỏ qua Nếu giá trị tham số true việc so sánh bỏ qua phân biệt chữ thường chữ hoa Việc so sánh sau không quan tâm đến kiểu loại chữ: // Tham số thứ ba true bỏ qua kiểm tra ký tự thường – hoa result = string Compare(s1, s2, true); Console.WriteLine("Khong phan biet chu thuong va hoa\n"); Console.WriteLine("S1: {0} , S2: {1}, ket qua : {2}\n", s1, s2, result); Lúc việc so sánh hoàn toàn giống kết trả giá trị 0: Khong phan biet chu thuong va hoa S1: abcd , S2: ABCD, ket qua : Ví dụ minh họa tiếp tục với việc nối chuỗi lại với Ở sử dụng hai cách để nối liền hai chuỗi Chúng ta sử dụng phương thức Concat() phương thức public static string: string s4 = string.Concat(s1, s2); Hay cách khác đơn giản việc sử dụng toán tử nối hai chuỗi (+): string s5 = s1 + s2; Trong hai trường hợp kết nối hai chuỗi hồn tồn thành cơng sau: Chuoi S4 noi tu chuoi S1 va S2: abcdABCD Chuoi S5 duoc noi tu chuoi S1 + S2: abcdABCD Tương tự vậy, việc tạo chuỗi thiết lập hai cách Đầu tiên sử dụng phương thức static Copy() sau: string s6 = string.Copy(s5); Hoặc thuận tiện sử dụng phương thức nạp chồng tốn tử (=) thông qua việc chép ngầm định: string s7 = s6; Kết hai cách tạo hoàn toàn nhau: S6 duoc chep tu S5: abcdABCD S7 = S6: abcdABCD Lớp String NET cung cấp ba cách để kiểm tra hai chuỗi Đầu tiên sử dụng phương thức nạp chồng Equals() để kiểm tra trực tiếp S6 có S7 hay khơng: Console.WriteLine("S6.Equals(S7) ?: {0}", S6.Equals(S7)); Kỹ thuật so sánh thứ hai truyền hai chuỗi vào phương thức Equals() string: Console.WriteLine("Equals(S6, s7) ?: {0}", string.Equals(S6, S7)); Và phương pháp cuối sử dụng nạp chồng toán tử so sánh (=) String: Console.WriteLine("S6 == S7 ?: {0}", s6 == s7); Trong ba trường hợp kết trả giá trị Boolean, ta có kết sau: S6.Equals(S7) ?: True Equals(S6, s7) ?: True S6 == S7 ?: 121 True Việc so sánh hai chuỗi việc tự nhiên thường sử dụng Tuy nhiên, số ngôn ngữ, VB.NET, khơng hỗ trợ nạp chồng tốn tử Do để chắn nên sử dụng phương thức Equals() tốt Các đoạn chương trình ví dụ 10.1 sử dụng tốn tử mục ([]) để tìm ký tự xác định chuỗi Và dùng thuộc tính Length để lấy chiều dài toàn chuỗi: Console.WriteLine("\nChuoi S7 co chieu dai la : {0}", s7.Length); Console.WriteLine("Ky tu thu cua chuoi S7 la : {0}", s7[2] ); Kết là: Chuoi S7 co chieu dai la : Ky tu thu cua chuoi S7 la : c Phương thức EndsWith() hỏi xem chuỗi có chứa chuỗi vị trí cuối hay khơng Do vậy, hỏi chuỗi S3 có kết thúc chuỗi “CNTT” hay chuỗi “Nam”: // Kiểm tra xem chuỗi có kết thúc với nhóm ký tự xác định hay không Console.WriteLine("S3: {0}\n ket thuc voi chu CNTT ? : {1}\n", s3, s3.EndsWith("CNTT")); Console.WriteLine("S3: {0}\n ket thuc voi chu Nam ? : {1}\n", s3, s3.EndsWith("Nam")); Kết trả lần kiểm tra sai chuỗi S3 không kết thúc chữ “CNTT”, lần kiểm tra thứ hai đúng: S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu CNTT ? : False S3: Trung Tam Dao Tao CNTT Thanh Ho Chi Minh Viet Nam ket thuc voi chu Minh ? : True Phương thức IndexOf() vị trí bên chuỗi (nếu có) Và phương thức Insert() chèn chuỗi vào chép chuỗi ban đầu Đoạn lệnh ví dụ minh họa thực việc xác định vị trí xuất chuỗi “CNTT” chuỗi S3: Console.WriteLine("\nTim vi tri xuat hien dau tien cua chu CNTT "); Console.WriteLine("trong chuoi S3 {0}\n", s3.IndexOf("CNTT")); Và kết tìm 18: Tim vi tri xuat hien dau tien cua chu CNTT chuoi S3 18 Chúng ta chèn vào chuỗi từ “nhan luc” theo sau chuỗi khoảng trắng vào chuỗi ban đầu Khi thực phương thức trả chuỗi chèn vào chuỗi gán lại vào chuỗi S8: string s8 = s3.Insert(18, "nhan luc "); Console.WriteLine(" S8 : {0}\n", s8); Kết đưa là: S8 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam Cuối cùng, kết hợp số phép toán để thực việc chèn sau: string s9 = s3.Insert( s3.IndexOf( "CNTT" ) , "nhan luc "); Console.WriteLine(" S9 : {0}\n", s9); Kết cuối tương tự cách chèn bên trên: S9 : Trung Tam Dao Tao nhan luc CNTT Thanh Ho Chi Minh Viet Nam 1.4 Tìm chuỗi 122 Trong kiểu liệu String có cung cấp phương thức Substring() để trích chuỗi từ chuỗi ban đầu Cả hai phiên dùng mục để xác định vị trí bắt đầu trích Và hai phiên dùng mục thứ hai làm vị trí kết thúc chuỗi Trong ví dụ sau minh họa việc sử dụng phương thức Substring() chuỗi Sử dụng phương thức Substring() namespace Programming_CSharp { using System; using System.Text; public class StringTester { static void Main() { // Khai báo chuỗi để sử dụng string s1 = "Mot hai ba bon"; int ix; // lấy số khoảng trắng cuối ix = s1.LastIndexOf(" "); // lấy từ cuối string s2 = s1.Substring( ix+1); // thiết lập lại chuỗi s1 từ vị trí đến vị trí ix // s1 có giá trị mot hai ba s1 = s1.Substring(0, ix); // tìm số khoảng trắng cuối (sau hai) ix = s1.LastIndexOf(" "); // thiết lập s3 chuỗi vị trí ix // s3 = "ba" string s3 = s1.Substring(ix+1); // thiết lập lại s1 vị trí đến cuối vị trí ix // s1 = "mot hai" s1 = s1.Substring(0, ix); // ix đến khoảng trắng "mot" va "hai" ix = s1.LastIndexOf(" "); // tạo s4 chuỗi sau vị trí ix, // có giá trị "hai" string s4 = s1.Substring( ix+1); // thiết lập lại giá trị s1 s1 = s1.Substring(0, ix); // lấy số khoảng trắng cuối cùng, lúc ix -1 ix = s1.LastIndexOf(" "); // tạo chuỗi s5 số khoảng trắng, khơng có khoảng // trắng ix -1 nên chuỗi string s5 = s1.Substring(ix +1); Console.WriteLine("s2 : {0}\n s3 : {1}", s2, s3); Console.WriteLine("s4 : {0}\n s5 : {1}\n", s4, s5); Console.WriteLine("s1: {0}\n", s1); }// end Main }// end class }// end namespace Kết quả: s2 : bon s3 : ba s4 : hai s5 : mot s1 : mot Ví dụ minh họa giải pháp tốt để giải vấn đề trích lấy ký tự chuỗi Nhưng cách gần tốt minh họa hữu dụng cho kỹ thuật 1.5 Chia chuỗi Một giải pháp giải hiệu để minh họa cho ví dụ 10.2 sử dụng phương thức Split() lớp string Chức phân tích chuỗi thành chuỗi Để sử dụng Split(), truyền vào mảng ký tự phân cách, ký tự dùng để chia từ chuỗi Và phương thức trả mảng chuỗi Sử dụng phương thức Split() namespace Programming_CSharp { using System; using System.Text; public class StringTester { static void Main() { // tạo chuỗi để làm việc string s1 = "Mot, hai, ba Trung Tam Dao Tao CNTT"; // tạo ký tự khoảng trắng dấu phẩy const char Space = ‘ ‘; const char Comma = ‘,’; // tạo mảng phân cách char[] delimiters = new char[] { 123 Space, Comma }; string output = " "; int ctr = 1; // thực việc chia chuỗi dùng vòng lặp // đưa kết vào mảng chuỗi foreach ( string subString in s1.Split(delimiters) ) { output += ctr++; output += ": "; output += subString; output += "\n"; }// end foreach Console.WriteLine( output ); }// end Main }// end class } // end namespace Kết quả: 1: Mot 2: 3: hai 4: 5: ba 6: Trung 7: Tam 8: Dao 9: Tao 10: CNTT Đoạn chương trình bắt đầu việc tạo chuỗi để minh họa việc phân tích: string s1 = "Mot, hai, ba Trung Tam Dao Tao CNTT"; Hai ký tự khoảng trắng dấu phẩy dùng làm ký tự phân cách Sau phương thức Split() gọi chuỗi này, truyền kết vào vòng lặp: foreach ( string subString in s1.Split(delimiters) ) Chuỗi output chứa chuỗi kết khởi tạo chuỗi rỗng Ở tạo chuỗi output bốn bước Đầu tiên nối giá trị biến đếm ctr, thêm dấu hai chấm, đưa chuỗi chia từ chuỗi ban đầu, cuối thêm ký tự qua dòng Và bốn bước lặp đến chuỗi khơng cịn chia Có vấn đề cần nói kiểu liệu string khơng thiết kế cho việc thêm vào chuỗi định dạng sẵn để tạo chuỗi vòng lặp trên, nên phải thêm vào ký tự Một lớp StringBuilder tạo để phục vụ cho nhu cầu thao tác chuỗi tốt 1.6 Thao tác chuỗi dùng StringBuilder Lớp StringBuilder sử dụng để tạo bổ sung chuỗi Hay nói lớp phần đóng gói khởi dựng cho String Một số thành viên quan trọng StringBuilder tóm tắt bảng 10.2 sau: Phương thức lớp StringBuilder System.StringBuilder Phương thức Ý nghĩa Capacity() Truy cập hay gán số ký tự mà StringBuilder nắm giữ Chars() Chỉ mục Length() Thiết lập hay truy cập chiều dài chuỗi MaxCapacity() Truy cập dung lượng lớn StringBuilder Append() Nối kiểu đối tượng vào cuối StringBuilder Thay định dạng xác định giá trị định dạngcủa AppendFormat() đối tượng Đảm bảo StringBuilder thời có khả tối EnsureCapacity() 124 thiểulớn giá trị xác định Insert() Chèn đối tượng vào vị trí xác định Thay tất thể ký tự xác định với nhữngký Replace() tự Khơng giống String, StringBuilder dễ thay đổi Khi bổ sung đối tượng StringBuilder làm thay đổi giá trị thật chuỗi, khơng phải Ví dụ minh họa sau thay đối tượng String đối tượng StringBuilder Sử dụng chuỗi StringBuilder namespace Programming_CSharp { using System; using System.Text; public class StringTester { static void Main() { // khởi tạo chuỗi để sử dụng string s1 = "Mot, hai, ba Trung Tam Dao Tao CNTT"; // tạo ký tự khoảng trắng dấu phẩy const char Space = ‘ ‘; const char Comma = ‘,’; // tạo mảng phân cách char[] delimiters = new char[] { Space, Comma }; // sử dụng StringBuilder để tạo chuỗi output StringBuilder output = new StringBuilder(); int ctr = 1; // chia chuỗi dùng vòng lặp để đưa kết vào // mảng chuỗi foreach ( string subString in s1.Split(delimiters) ) { // AppendFormat nối chuỗi định dạng output.AppendFormat("{0}: {1}\n", ctr++, subString); }// end foreach Console.WriteLine( output ); } } } Chúng ta thay phần cuối đoạn chương trình Rõ ràng việc sử dụng StringBuilder thuận tiện việc sử dụng toán tử bổ sung chuỗi Ở sử dụng phương thức AppendFormat() StringBuilder để nối thêm chuỗi định dạng để tạo chuỗi Điều dễ dàng hiệu Kết chương trình thực tượng tự ví dụ minh họa dùng String: 1: Mot 2: 3: hai 4: 5: ba 6: Trung 7: Tam 8: Dao 9: Tao 10: CNTT Các biểu thức quy tắc Kết việc áp dụng biểu thức qui tắc đến chuỗi trả chuỗi trả chuỗi bổ sung từ vài phần chuỗi nguyên thủy ban đầu Chúng ta nên nhớ string khơng thể thay đổi khơng thể thay đổi biểu thức qui tắc Bằng cách áp dụng xác biểu thức qui tắc cho chuỗi sau: Mot, hai, ba, Trung Tam Dao Tao CNTT 125 trả hay tất danh sách chuỗi (Mot, hai, ) tạo phiên chuỗi bổ sung chuỗi (như : TrUng TAM, ) Biểu thức qui tắc định cú pháp ký tự qui tắc thân Một biểu thức qui tắc bao gồm hai kiểu ký tự: Ký tự bình thường (literal): ký tự mà sử dụng để so khớp với chuỗi ký tự đích Metacharacter: biểu tượng đặc biệt, có hành động lệnh phân tích (parser) biểu thức Bộ phân tích chế có trách nhiệm hiểu biểu thức qui tắc Ví dụ tạo biểu thức qui tắc sau: ^(From|To|Subject|Date): Biểu thức so khớp với chuỗi với từ “From”, “To”, “Subject”, “Date” miễn từ bắt đầu ký tự dòng (^) kết thúc với dấu hai chấm (:) Ký hiệu dấu mũ (^) trường hợp cho phân tích biểu thức qui tắc chuỗi mà muốn tìm kiếm phải dòng Trong biểu thức ký tự “(”,”)”, “|” metacharacter dùng để nhóm chuỗi ký tự bình thường “From”, “To”,”Subject”, “Date” lựa chọn số so khớp Ngồi ký tự “^” ký tự metacharacter bắt đầu dịng Tóm lại với chuỗi biểu thức qui tắc như: ^(From|To|Subject|Date): ta phát biểu theo ngôn ngữ tự nhiên sau: “Phù hợp với chuỗi bắt đầu dòng theo sau bốn chữ From, To, Subject, Date theo sau ký tự dấu hai chấm” Việc trình bày đầy đủ biểu thức quy tắc vượt phạm vi sách này, đa dạng phức tạp Tuy nhiên, phạm vi trình bày chương 10 này, tìm hiểu số thao tác phổ biến hữu dụng biểu thức quy tắc Sử dụng biểu thức quy tắc qua lớp Regex MS.NET cung cấp hướng tiếp cận hướng đối tượng (object- oriented approad) cho biểu thức quy tắc để so khớp, tìm kiếm thay chuỗi Biểu thức quy tắc ngôn ngữ C# xây dựng từ lớp regexp ngôn ngữ Perl5 Namspace System.Text.RegularExpressions thư viện BCL (Base Class Library) chứa đựng tất đối tượng liên quan đến biểu thức quy tắc môi trường NET Và lớp quan trọng mà biểu thức quy tắc hỗ trợ Regex Ta tạo thể lớp Regex sử dụng số phương thức tĩnh ví dụ minh họa Sử dụng lớp Regex namespace Programming_CSharp { using System; using System.Text; using System.Text.RegularExpressions; public class Tester { static void Main() { // khởi tạo chuỗi sử dụng string s1 = "Mot, hai, ba, Trung Tam Dao Tao CNTT"; // tạo chuỗi biểu thức quy tắc Regex theRegex = new Regex(" |, "); StringBuilder sBuilder = new StringBuilder(); int id = 1; // sử dụng vòng lặp để lấy chuỗi foreach ( string subString in theRegex.Split(s1)) { 126 // nối chuỗi vừa tìm biểu thức quy tắc // vào chuỗi StringBuilder theo định dạng sẵn sBuilder.AppendFormat("{0}: {1} \n", id++, subString); } Console.WriteLine("{0}", sBuilder); }// end Main }// end class }// end namespace Kết quả: 1: Mot 2: hai 3: ba 4: Trung 5: Tam 6: Dao 7: Tao 8: CNTT Ví dụ minh họa bắt đầu việc tạo chuỗi s1, nội dung chuỗi tương tự chuỗi minh họa string s1 = "Mot, hai, ba, Trung Tam Dao Tao CNTT"; Tếp theo biểu thức quy tắc tạo ra, biểu thức dùng để tìm kiếm chuỗi: Regex theRegex = new Regex(" |, "); Ở khởi tạo nạp chồng Regex lấy chuỗi biểu thức quy tắc tham số Điều gây khó hiểu Trong ngữ cảnh chương trình C#, biểu thức quy tắc: chuỗi đưa vào khởi dựng đối tượng Regex? Thật chuỗi ký tự truyền vào biểu thức quy tắc theo ý nghĩa truyền thống thuật ngữ Tuy nhiên, theo quan điểm hướng đối tượng ngôn ngữ C#, đối mục hay tham số khởi tạo đơn chuỗi ký tự, Regex đối tượng biểu thức quy tắc! Phần cịn lại chương trình thực giống ví dụ minh họa trước Ngoại trừ việc gọi phương thức Split() đối tượng Regex chuỗi s1 Regex.Split() hành động tương tự cách String.Split() Kết trả mảng chuỗi, chuỗi so khớp tìm theo mẫu đưa theRegex Phương thức Regex.Split() phương thức nạp chồng Phiên đơn giản gọi thể Regex dùng ví dụ Ngồi cịn có phiên tĩnh phương thức Phiên lấy chuỗi để thực việc tìm kiếm mẫu để so khớp Tiếp sau minh họa sau sử dụng phương thức tĩnh Sử dụng phương thức tĩnh Regex.Split() namespace Programming_CSharp { using System; using System.Text; using System.Text.RegularExpressions; public class Tester { static void Main() { // tạo chuỗi tìm kiếm string s1 = "Mot, hai, ba Trung Tam Dao Tao CNTT"; StringBuilder sBuilder = new StringBuilder(); int id = 1; // không tạo thể Regex sử dụng phương // thức tĩnh lớp Regex foreach( string subStr in Regex.Split( s1, " |, ")) { sBuilder.AppendFormat("{0}: {1}\n", id++, subStr); } Console.WriteLine("{0}", sBuilder); 127 } } } Kết ví dụ minh họa hoàn toàn tương tự minh họa 10.5 Tuy nhiên chương trình không tạo thể đối tượng Regex Thay vào sử dụng trực tiếp phương thức tĩnh Regex Split() Phương thức lấy vào hai tham số, tham số chuỗi đích cần thực so khớp tham số thứ hai chuỗi biểu thức quy tắc dùng để so khớp Sử dụng Regex để tìm kiếm tập hợp Hai lớp thêm vào namespace NET cho phép thực việc tìm kiếm chuỗi cách lập lặp lại hết chuỗi, kết trả tập hợp Tập hợp trả có kiểu MatchCollection, bao gồm khơng có hay nhiều đối tượng Match Hai thuộc tính quan trọng đối tượng Match chiều dài giá trị nó, chúng đọc ví dụ minh họa Sử dụng MatchCollection Match namespace Programming_CSharp { using System; using System.Text.RegularExpressions; class Tester { static void Main() { string string1 = "Ngon ngu lap trinh C Sharp"; // tìm chuỗi khơng có khoảng trắng // bên kết thúc khoảng trắng Regex theReg = new Regex(@"(\S+)\s"); // tạo tập hợp nhận kết so khớp MatchCollection theMatches = theReg.Matches(string1); // lặp để lấy kết từ tập hợp foreach ( Match theMatch in theMatches) { Console.WriteLine("Chieu dai: {0}", theMatch.Length); // tồn chuỗi xuất if ( theMatch.Length != 0) { Console.WriteLine("Chuoi: {0}", theMatch.ToString()); }// end if }// end foreach }// end Main }// end class }// end namespace Kết quả: Chieu dai: Chuoi: Ngon Chieu dai: Chuoi: ngu Chieu dai: Chuoi: lap Chieu dai: Chuoi: trinh Chieu dai: Chuoi: C Ví dụ bắt đầu việc tạo chuỗi tìm kiếm đơn giản: string string1 = "Ngon ngu lap trinh C Sharp"; biểu thức quy tắc để thực việc tìm kiếm chuỗi string1: Regex theReg = new Regex(@"(\S+)\s"); 128 Chuỗi \S tìm ký tự ký tự trắng dấu cộng có hay nhiều ký tự Chuỗi \s (chữ thường) khoảng trắng Kết hợp lại tìm chuỗi khơng có khoảng trắng bên theo sau khoảng trắng Chúng ta lưu ý khai báo chuỗi biểu thức quy tắc dạng chuỗi nguyên văn để dễ dàng dùng ký tự escape (\) Kết trình bày năm từ tìm thấy Từ cuối khơng tìm thấy khơng theo sau khoảng trắng Nếu chèn khoảng trắng sau chữ “Sharp” trước dấu ngoặc đóng, chương trình tìm thêm chữ “Sharp” Thuộc tính Length chiều dài chuỗi tìm kiếm Chúng ta tìm hiểu sâu thuộc tính phần sử dụng lớp CaptureCollection cuối chương Sử dụng Regex để gom nhóm Đơi lập trình cần gom nhóm số biểu thức tương tự với theo quy định Ví dụ cần tìm kiếm địa IP nhóm chúng lại vào nhóm IPAddresses tìm thấy đâu chuỗi Lớp Group cho phép tạo nhóm tìm kiếm dựa biểu thức quy tắc, thể kết từ nhóm biểu thức đơn Một biểu thức nhóm định rõ nhóm cung cấp biểu thức quy tắc, chuỗi so khớp biểu thức quy tắc thêm vào nhóm Để tạo nhóm viết sau: @"(?(\d|\ )+)\s" Lớp Match dẫn xuất từ nhóm Group, có tập hợp gọi Groups chứa tất nhóm mà Match tìm thấy Việc tạo sử dụng tập hợp Groups lớp Group minh họa ví dụ sau: Sử dụng lớp Group namespace Programming_CSharp { using System; using System.Text.RegularExpressions; class Tester { public static void Main() { string string1 = "10:20:30 127.0.0.0 Dolphin.net"; // nhóm thời gian hay nhiều số hay dấu : // theo sau khoảng trắng Regex theReg = new Regex(@"(?(\d|\:)+)\s" + // địa IP hay nhiều số hay dấu chấm theo // sau khoảng trắng @"(?(\d|\.)+)\s" + // địa web hay nhiều ký tự @"(?\S+)"); // lấy tập hợp chuỗi so khớp MatchCollection theMatches = theReg.Matches( string1 ); // sử dụng vòng lặp để lấy chuỗi tập hợp foreach (Match theMatch in theMatches) { if (theMatch.Length != 0) { Console.WriteLine("\ntheMatch: {0}", theMatch.ToString()); // hiển thị thời gian Console.WriteLine("Time: {0}", theMatch.Groups["time"]); // hiển thị địa IP Console.WriteLine("IP: {0}", theMatch.Groups["ip"]); // hiển thị địa web site Console.WriteLine("Site: {0}", theMatch.Groups["site"]); }// end if }// end foreach }// end Main }// end class 129 }// end namespace Ví dụ minh họa bắt đầu việc tạo chuỗi đơn giản để tìm kiếm sau: string string1 = "10:20:30 127.0.0.0 Dolphin.net"; Chuỗi tìm thấy nội dung tập tin log ghi nhận thông tin web server hay từ kết tìm kiếm sở liệu Trong ví dụ đơn giản có ba cột, cột ghi nhận thời gian, cột thứ hai ghi nhận địa IP, cột thứ ba ghi nhận địa web Mỗi cột ngăn cách khoảng trắng Dĩ nhiên ứng dụng thực tế ta phải giải vấn đề phức tạp nữa, cần phải thực việc tìm kiếm phức tạp sử dụng nhiều ký tự ngăn cách Trong ví dụ này, mong muốn tạo đối tượng Regex để tìm kiếm chuỗi yêu cầu phân chúng vào ba nhóm: time, địa IP, địa web Biểu thức quy tắc đơn giản, dễ hiểu Ở quan tâm đến ký tự tạo nhóm như:

Ngày đăng: 23/12/2023, 10:17

Tài liệu cùng người dùng

Tài liệu liên quan