Giáo trình Kỹ thuật lập trình nâng cao - Nghề: Tin học ứng dụng - Trình độ: Trung cấp - Trường Cao đẳng kinh tế kỹ thuật Thành phố Hồ Chí Minh

pdf 119 trang Gia Huy 17/05/2022 2280
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Kỹ thuật lập trình nâng cao - Nghề: Tin học ứng dụng - Trình độ: Trung cấp - Trường Cao đẳng kinh tế kỹ thuật Thành phố Hồ Chí Minh", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_ky_thuat_lap_trinh_nang_cao_nghe_tin_hoc_ung_dung.pdf

Nội dung text: Giáo trình Kỹ thuật lập trình nâng cao - Nghề: Tin học ứng dụng - Trình độ: Trung cấp - Trường Cao đẳng kinh tế kỹ thuật Thành phố Hồ Chí Minh

  1. ỦY BAN NHÂN DÂN THÀNH PH Ố H Ồ CHÍ MINH TR ƯỜNG CAO ĐẲ NG KINH T Ế K Ỹ THU ẬT THÀNH PH Ố H Ồ CHÍ MINH  GIÁO TRÌNH MÔ ĐUN: KỸ THU ẬT L ẬP TRÌNH NÂNG CAO NGH Ề: TIN H ỌC ỨNG D ỤNG TRÌNH ĐỘ: TRUNG C ẤP (Ban hành kèm theo Quy ết đị nh s ố: /Q Đ-CĐKTKT ngày tháng n ăm 2020 của Hi ệu tr ưởng Tr ường Cao đẳ ng Kinh t ế - Kỹ thu ật Thành ph ố H ồ Chí Minh) Thành ph ố H ồ Chí Minh, năm 2020
  2. ỦY BAN NHÂN DÂN THÀNH PH Ố H Ồ CHÍ MINH TR ƯỜNG CAO ĐẲ NG KINH T Ế K Ỹ THU ẬT THÀNH PH Ố H Ồ CHÍ MINH  GIÁO TRÌNH MÔ ĐUN: KỸ THU ẬT L ẬP TRÌNH NÂNG CAO NGH Ề: TIN H ỌC ỨNG D ỤNG TRÌNH ĐỘ: TRUNG C ẤP THÔNG TIN CH Ủ NHI ỆM ĐỀ TÀI Họ tên: Nguy ễn Gia Quang Đă ng Học v ị: Th ạc s ỹ Đơ n v ị: Khoa Công ngh ệ thông tin Email: nguyengiaquangdang@hotec.edu.vn TR ƯỞNG KHOA TỔ TR ƯỞNG CH Ủ NHI ỆM BỘ MÔN ĐỀ TÀI Lê Nh ư Dzi Võ Đào Th ị H ồng Tuy ết Nguy ễn Gia Quang Đă ng HI ỆU TR ƯỞNG DUY ỆT Tháng 10 năm 2020
  3. TUYÊN B Ố B ẢN QUY ỀN Tài li ệu này thu ộc lo ại sách giáo trình nên các ngu ồn thông tin có th ể được phép dùng nguyên b ản ho ặc trích dùng cho các m ục đích v ề đào t ạo và tham kh ảo. Mọi m ục đích khác mang tính l ệch l ạc ho ặc s ử d ụng v ới m ục đích kinh doanh thi ếu lành m ạnh s ẽ b ị nghiêm c ấm.
  4. LỜI GI ỚI THI ỆU Giáo trình này được biên so ạn dựa trên ch ươ ng trình chi ti ết mô đun bậc trung c ấp chuyên ngành Tin h ọc ứng d ụng Khoa Công ngh ệ thông tin của Tr ường Cao đẳ ng Kinh tế K ỹ thu ật Thành Ph ố H ồ Chí Minh. Đây là quy ển giáo trình được biên so ạn l ần th ứ nh ất cho môn h ọc này t ại khoa Công ngh ệ thông tin c ủa nhà tr ường. Nh ằm cung c ấp ki ến th ức n ền t ảng, giúp học sinh sinh viên n ắm v ững và v ận d ụng các k ỹ thu ật ph ổ bi ến vi ết ứng d ụng trên ngôn ng ữ l ập trình C#. Từ đó, sinh viên có th ể t ự h ọc các ki ến th ức chuyên sâu h ơn. Trong tài li ệu này tác gi ả sử d ụng ph ươ ng pháp lập trình trên ngôn ng ữ C# truy xu ất trên môi tr ường Dos và ứng d ụng windows forms. Qua đó, giúp sinh viên n ắm b ắt ki ến th ức và k ỹ năng th ực hành c ơ b ản để v ận d ụng vi ết được các ứng d ụng trong th ực ti ễn. Trong quá trình biên so ạn ch ắc ch ắn giáo trình s ẽ còn nhi ều thi ếu sót và hạn ch ế. Rất mong nh ận được s ự đóng góp ý ki ến quý báu c ủa học sinh sinh viên và các bạn đọc để giáo trình ngày m ột hoàn thi ện h ơn. Thành ph ố H ồ Chí Minh , ngày tháng 9 năm 2020 Tác gi ả biên so ạn Nguy ễn Gia Quang Đă ng KHOA CÔNG NGH Ệ THÔNG TIN 1
  5. MỤC L ỤC LỜI GI ỚI THI ỆU 1 GIÁO TRÌNH MÔ ĐUN 3 Bài 1: Gi ới thi ệu ngôn ng ữ C# 4 1.1. T ổng quan v ề ngôn ng ữ l ập trình C# 4 1.1.1. Khái ni ệm ngôn ng ữ C# 4 1.1.2. .NET Framework 5 1.1.3. M ột s ố công ngh ệ trong .NET Framework 10 1.2. C ấu trúc ch ươ ng trình C# 10 1.2.1. Các thành ph ần chính c ủa Visual Studio 10 1.2.2. C ấu trúc ch ươ ng trình 11 1.3. M ột s ố khái ni ệm c ơ b ản 12 1.4. T ạo ứng d ụng b ằng C# 13 1.5. Bài t ập áp d ụng 19 Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# 20 2.1. Các thành ph ần c ơ b ản 20 2.2. Nh ập/ xu ất trong C# 24 2.3. Các ki ểu d ữ li ệu 31 2.4. Cách khai báo 35 2.5. Các phép toán 39 2.6. Các bi ểu th ức 45 2.7. Các c ấu trúc điều khi ển 45 2.8. M ảng m ột chi ều 55 2.9. Bài t ập áp d ụng 59 Bài 3: Ch ươ ng trình con trong C# 62 3.1. Đặt v ấn đề 62 3.2. Ph ạm vi ho ạt độ ng c ủa bi ến, hàm 62 3.3. C ấu trúc m ột hàm 69 3.4. Nguyên t ắc ho ạt độ ng 70 3.5. Cách g ọi hàm 72 3.6. Bài t ập áp d ụng 74 Bài 4: Windows Forms 75 4.1. Gi ới thi ệu v ề Windows Applications 75 4.1.1. Gi ới thi ệu 75 4.1.2. T ạo m ới giao di ện ứng d ụng 76 4.2. Các điều khi ển c ơ b ản trong C# 83 4.3. Các điều khi ển h ộp tho ại 87 4.4. Bài t ập áp d ụng 98 Bài 5: Thao tác v ới chu ỗi 105 5.1. Thao tác trên chu ỗi dùng String 105 5.2. Thao tác trên chu ỗi dùng StringBuilder 109 5.3. S ử d ụng bi ểu th ức quy t ắc qua l ớp Regex 111 5.4. Bài t ập áp d ụng 113 TÀI LI ỆU THAM KH ẢO 114 DANH M ỤC HÌNH 115 DANH M ỤC B ẢNG BI ỂU 116 KHOA CÔNG NGH Ệ THÔNG TIN 2
  6. GIÁO TRÌNH MÔ ĐUN Tên mô đun: Kỹ thu ật l ập trình nâng cao Mã mô đun: MĐ2101081 Vị trí, tính ch ất, ý ngh ĩa và vai trò c ủa mô đun: - Vị trí: mô đun chuyên môn cho ngành tin h ọc ứng d ụng - Tính ch ất: là mô đun bắt bu ộc - Ý ngh ĩa và vai trò c ủa mô đun: giúp cho ng ười h ọc trang b ị được ki ến th ức v ề l ập trình trên môi tr ường ứng d ụng. Mục tiêu c ủa mô đun: Về ki ến th ức: - Trình bày được quy trình xây d ựng m ột ch ương trình C# đơ n gi ản. - Xác định được các thành ph ần c ơ b ản trong ngôn ng ữ l ập trình C#. - Trình bày được cú pháp câu l ệnh trong l ập trình C# - Phát bi ểu được s ự ho ạt độ ng c ủa câu l ệnh ch ươ ng trình con. - Khái quát hóa được trong ph ươ ng pháp l ập trình h ướng đố i tượng - Phân bi ệt được các điều khi ển trong l ập trình window form. Về k ỹ n ăng: - Ứng d ụng vi ết được các ch ươ ng trình x ử lý tính toán c ơ b ản trên ngôn ng ữ C#; - Phân tích được các câu l ệnh, cú pháp trong m ột ch ươ ng trình C#; - Xây d ựng được các l ớp x ử lý cho ứng d ụng; - Sử d ụng được các control c ơ b ản trong Visual studio để thi ết k ế form. Về n ăng l ực t ự ch ủ và trách nhi ệm: - Rèn luy ện t ư duy nghiên c ứu và phân tích bài toán; - Phát huy tính tích c ực sáng t ạo trong các ph ươ ng pháp gi ải; - Cẩn th ận, chính xác trong khi vi ết chươ ng trình C#. Nội dung c ủa mô đun: KHOA CÔNG NGH Ệ THÔNG TIN 3
  7. Bài 1: Gi ới thi ệu ngôn ng ữ C# BÀI 1: GI ỚI THI ỆU NGÔN NG Ữ C# Gi ới thi ệu: Khái ni ệm t ổng quan v ề c ấu trúc ngôn ng ữ l ập trình C# Mục tiêu: - Trình bày được c ấu trúc c ủa m ột ch ươ ng trình C# - Phát bi ểu l ại được khái ni ệm c ơ b ản v ề l ập trình - Trình bày các b ước vi ết m ột ch ươ ng trình b ằng ngôn ng ữ C# Nội dung chính: 1.1. T ổng quan v ề ngôn ng ữ l ập trình C# 1.1.1. Khái ni ệm ngôn ng ữ C# C# là m ột ngôn ng ữ r ất đơn gi ản, v ới kho ảng 80 t ừ khoá và h ơn m ười ki ểu d ữ li ệu dựng s ẵn, nh ưng C# có tính di ễn đạ t cao. C# h ỗ tr ợ l ập trình có c ấu trúc, h ướng đối tượng, h ướng thành ph ần (component oriented). Tr ọng tâm c ủa ngôn ng ữ h ướng đố i t ượng là l ớp. L ớp đị nh ngh ĩa ki ểu d ữ li ệu mới, cho phép m ở r ộng ngôn ng ữ theo h ướng c ần gi ải quy ết. C# có nh ững t ừ khoá dành cho vi ệc khai báo l ớp, ph ươ ng th ức, thu ộc tính (property) m ới. C# h ỗ tr ợ đầy đủ khái ni ệm tr ụ c ột trong l ập trình h ướng đố i t ượng: đóng gói, th ừa k ế, đa hình. Định ngh ĩa l ớp trong C# không đòi h ỏi tách r ời t ập tin tiêu đề v ới t ập tin cài đặt nh ư C++. H ơn th ế, C# h ỗ trợ ki ểu s ưu li ệu m ới, cho phép s ưu li ệu tr ực ti ếp trong t ập tin mã ngu ồn. Đế n khi biên d ịch s ẽ t ạo t ập tin s ưu li ệu theo đị nh d ạng XML. C# h ỗ tr ợ khái ni ệm giao di ện, interfaces (t ươ ng t ự Java). M ột l ớp ch ỉ có th ể kế th ừa duy nh ất m ột l ớp cha nh ưng có th ế cài đặt nhi ều giao di ện. C# có ki ểu c ấu trúc, struct (không gi ống C++). C ấu trúc là ki ểu h ạng nh ẹ và b ị gi ới hạn.C ấu trúc không th ể th ừa k ế l ớp hay được k ế th ừa nh ưng có th ể cài đặt giao di ện. C# cung c ấp nh ững đặ c tr ưng l ập trình h ướng thành ph ần nh ư property, s ự ki ện và dẫn h ướng khai báo ( được g ọi là attribute). L ập trình h ướng component được h ỗ tr ợ bởi CLR thông qua siêu d ữ li ệu (metadata). Siêu d ữ li ệu mô t ả các l ớp bao g ồm các ph ươ ng th ức và thu ộc tính, các thông tin b ảo m ật . Assembly là m ột t ập hợp các t ập tin mà theo cách nhìn c ủa l ập trình viên là các th ư vi ện liên k ết độ ng (DLL) hay t ập tin th ực thi (EXE). Trong .NET m ột assembly là một đơn v ị c ủa vi ệc tái s ử d ụng, xác đị nh phiên b ản, b ảo m ật, và phân ph ối. CLR cung c ấp m ột s ố các l ớp để thao tác v ới assembly. KHOA CÔNG NGH Ệ THÔNG TIN 4
  8. Bài 1: Gi ới thi ệu ngôn ng ữ C# C# c ũng cho truy c ập tr ực ti ếp b ộ nh ớ dùng con tr ỏ ki ểu C++, nh ưng vùng mã đó được xem nh ư không an toàn. CLR s ẽ không th ực thi vi ệc thu d ọn rác t ự độ ng các đối t ượng được tham chi ếu b ởi con tr ỏ cho đế n khi l ập trình viên t ự gi ải phóng. 1.1.2. .NET Framework .NET Framework là m ột n ền t ảng l ập trình và c ũng là m ột n ền t ảng th ực thi ứng dụng ch ủ y ếu trên h ệ điều hành Microsoft Windows được phát tri ển b ởi Microsoft. Các ch ươ ng trình được vi ết trên n ền.NET Framework s ẽ được tri ển khai trong môi tr ường ph ần m ềm (ng ược l ại v ới môi tr ường ph ần c ứng) được bi ết đế n v ới tên Common Language Runtime (CLR). Môi tr ường ph ần m ềm này là m ột máy ảo trong đó cung c ấp các d ịch v ụ nh ư an ninh ph ần m ềm (security), qu ản lý b ộ nh ớ (memory management), và các x ử lý l ỗi ngo ại l ệ (exception handling). .NET framework bao g ồm t ập các th ư vi ện l ập trình l ớn, và nh ững th ư vi ện này h ỗ tr ợ vi ệc xây d ựng các ch ươ ng trình ph ần m ềm nh ư l ập trình giao di ện; truy c ập, k ết nối c ơ s ở d ữ li ệu; ứng d ụng web; các gi ải thu ật, c ấu trúc d ữ li ệu; giao ti ếp m ạng CLR cùng v ới b ộ th ư vi ện này là 2 thành ph ần chính c ủa.NET framework. .NET framework đơ n gi ản hóa vi ệc vi ết ứng d ụng b ằng cách cung c ấp nhi ều thành ph ần được thi ết k ế s ẵn, ng ười l ập trình ch ỉ c ần h ọc cách s ử d ụng và tùy theo sự sáng tạo mà g ắn k ết các thành ph ần đó l ại v ới nhau. Nhi ều công c ụ được t ạo ra để h ỗ tr ợ xây d ựng ứng d ụng.NET và IDE (Integrated Developement Environment) được phát tri ển và h ỗ tr ợ b ởi chính Microsoft là Visual Studio. Bảng 1-1 Lịch s ử .NET Framework Phiên Số hi ệu Ngày phát Được phát hành kèm Visual Studio bản phiên b ản hành theo Windows XP Tablet and 1.0 1.0.3705.0 13/2/2002 Visual Studio .NET Media Center Editions Visual Studio.NET 1.1 1.1.4322.573 24/4/2003 Windows Server 2003 2003 2.0 2.0.50727.42 7/11/2005 Visual Studio 2005 Windows Server 2003 R2 Windows Vista, Windows 3.0 3.0.4506.30 6/11/2006 Server 2008 KHOA CÔNG NGH Ệ THÔNG TIN 5
  9. Bài 1: Gi ới thi ệu ngôn ng ữ C# Windows 7, Windows 3.5 3.5.21022.8 19/11/2007 Visual Studio 2008 Server 2008 R2 4.0 4.0.30319.1 12/4/2010 Visual Studio 2010 Windows 8, Windows 4.5 4.5.50709 15/8/2012 Visual Studio 2012 Server 2012 4.6 20/7/2015 Visual Studio 2015 Windows 10 v1803-v1809, Visual Studio 2017 7 SP1, 8.1 Update, 10 4.7.2 30/4/2018 2019 15.8 v1607-v1709 Visual Studio 2019 7 SP1, 8.1 Update, 10 4.8 v1903-v1909 18/4/2019 16.3 v1607-v1809 .NET Framework 1.0 Đây là phiên b ản đầ u tiên c ủa.NET framework, nó được phát hành vào n ăm 2002 cho các h ệ điều hành Windows 98, NT 4.0, 2000 và XP. Vi ệc h ỗ tr ợ chính th ức t ừ Microsoft cho phiên b ản này k ết thúc vào 10/7/2007, tuy nhiên th ời gian h ỗ tr ợ m ở rộng được kéo dài đến 14/7/2009. .NET Framework 1.1 Phiên b ản nâng c ấp đầ u tiên được phát hành vào 4/2003. S ự h ỗ tr ợ c ủa Microsoft kết thúc vào 14/10/2008, và h ỗ tr ợ m ở r ộng được đị nh đế n 8/10/2013. Nh ững thay đổ i so v ới phiên b ản 1.0: • Tích h ợp h ỗ tr ợ mobile ASP.NET (tr ước đây ch ỉ là ph ần m ở r ộng tùy ch ọn) • Thay đổi v ề ki ến trúc an ninh - sử d ụng sandbox khi th ực thi các ứng d ụng t ừ Internet. • Tích h ợp h ỗ tr ợ ODBC và cơ s ở d ữ li ệu Oracle • .NET Compact Framework • Hỗ tr ợ IPv6 (Internet Protocol version 6 ) • Vài thay đổi khác trong API KHOA CÔNG NGH Ệ THÔNG TIN 6
  10. Bài 1: Gi ới thi ệu ngôn ng ữ C# .NET Framework 2.0 Kể t ừ phiên b ản này,.NET framework h ỗ tr ợ đầ y đủ n ền t ảng 64-bit. Ngoài ra, c ũng có m ột s ố thay đổ i trong API; h ỗ tr ợ các ki ểu "generic"; b ổ sung s ự h ỗ tr ợ cho ASP.NET; .NET Micro Framework - một phiên b ản.NET framwork có quan h ệ với Smart Personal Objects Technology . .NET Framework 3.0 Đây không ph ải là m ột phiên b ản m ới hoàn toàn, th ực t ế ch ỉ là m ột b ản nâng c ấp của.NET 2.0. Phiên b ản 3.0 này còn có tên g ọi khác là WinFX , nó bao g ồm nhi ều s ự thay đổi nh ằm h ỗ tr ợ vi ệc phát tri ển và chuy ển đổ i ( porting ) các ứng d ụng trên Windows Vista. Tuy nhiên, không có s ự xu ất hi ện c ủa.NET Compact Framework 3.0 trong l ần phát hành này. Bốn thành ph ần chính trong phiên b ản 3.0: • Windows Presentation Foundation (WPF - tên mã là Avalon ): Đây là m ột công ngh ệ m ới, và là m ột n ỗ l ực c ủa Microsoft nh ằm thay đổ i ph ươ ng pháp hay cách ti ếp c ận vi ệc l ập trình m ột ứng d ụng s ử d ụng giao di ện đồ h ọa trên Windows với s ự h ỗ tr ợ c ủa ngôn ng ữ XAML. • Windows Communication Foundation (WCF - tên mã là Indigo ): M ột n ền t ảng mới cho phép xây d ựng các ứng d ụng h ướng d ịch v ụ ( service-oriented ). • Windows Workflow Foundation (WF): M ột ki ến trúc h ỗ tr ợ xây d ựng các ứng dụng workflow (lu ồng công vi ệc) m ột cách d ễ dàng h ơn. WF cho phép định ngh ĩa, th ực thi và qu ản lý các workflow t ừ c ả cách nhìn theo h ướng k ĩ thu ật và hướng th ươ ng m ại. • Windows CardSpace (tên mã là InfoCard ): m ột ki ến trúc để qu ản lý đị nh danh (identity management ) cho các ứng d ụng được phân phối. Ngoài ra Silverlight (hay WPF / E ), m ột phiên b ản nhánh.NET Framework h ỗ tr ợ các ứng d ụng trên n ền web, được Microsoft t ạo ra để c ạnh tranh v ới Flash. Có th ể minh h ọa.NET 3.0 b ằng m ột công th ức đơn gi ản: .NET 3.0 =.NET 2.0 + WPF + WCF + WF + WCS .NET Framework 3.5 Được phát hành vào 11/2007, phiên b ản này s ử d ụng CLR 2.0. Đây có th ể được xem là t ươ ng đươ ng v ới phiên b ản .NET Framework 2.0 SP1 và .NET Framework 3.0 SP1 cộng l ại. .NET Compact Framework 3.5 được ra đờ i cùng v ới phiên b ản.NET framework này. KHOA CÔNG NGH Ệ THÔNG TIN 7
  11. Bài 1: Gi ới thi ệu ngôn ng ữ C# Các thay đổi k ể t ừ phiên b ản 3.0: • Các tính n ăng m ới cho ngôn ng ữ C# 3.0 và VB.NET 9.0 • Hỗ tr ợ Expression Tree và Lambda • Các ph ươ ng th ức m ở r ộng ( Extension methods ) • Các ki ểu ẩn danh ( Anonymous types ) • LINQ • Phân trang ( paging ) cho ADO.NET • API cho nh ập xu ất m ạng không đồ ng b ộ ( asynchronous network I/O ) • Peer Name Resolution Protocol resolver • Cải thi ện WCF và WF • Tích h ợp ASP.NET AJAX • Namespace m ới System.CodeDom • Microsoft ADO.NET Entity Framework 1.0 Cũng nh ư phiên b ản 3.0, có th ể minh h ọa s ự thay đổ i c ủa.NET 3.5 b ằng công th ức: .NET 3.5 =.NET 3.0 + LINQ + ASP.NET 3.5 + REST .NET Framework 4.0 Phiên b ản beta đầ u tiên c ủa.NET 4 xu ất hi ện vào 5/2009 và phiên b ản RC ( Release Candidate ) được ra m ắt vào 2/2010. B ản chính th ức c ủa.NET 4 được công b ố và phát hành cùng v ới Visual Studio 2010 vào 12/4/2010. Các tính n ăng m ới được Microsoft b ổ sung trong.NET 4: • Dynamic Language Runtime • Code Contracts • Managed Extensibility Framework • Hỗ tr ợ các t ập tin ánh x ạ b ộ nh ớ ( memory-mapped files ) • Mô hình l ập trình m ới cho các ứng d ụng đa lu ồng ( multithreaded ) và b ất đồ ng bộ ( asynchronous ) • Cải thi ện hi ệu n ăng, các mô hình workflow. .NET Framework 4.5 KHOA CÔNG NGH Ệ THÔNG TIN 8
  12. Bài 1: Gi ới thi ệu ngôn ng ữ C# Nh ững thông tin đầ u tiên c ủa.NET 4.5 được Microsoft công b ố vào 14/9/2011 tại BUILD Windows Conference , và nó chính th ức được ra m ắt vào 15/8/2012. Kể t ừ phiên b ản này, Microsoft b ắt đầ u cung c ấp 2 gói cài đặt riêng bi ệt, gói đầ y đủ và gói gi ản ch ức n ăng client profiles. .NET Framework 4.6 Các tính n ăng m ới được Microsoft b ổ sung trong.NET 4.6: . Mở ngu ồn m ở các gói .NET Framework, nh ững gói Open Source .Net Framework: trong b ộ .Net Framwork 4.6 v ới nh ững gói .Net Core CLR được xây đựng cho Windows, Mac và Linux . .NET Compact Framework: là m ột phiên b ản thu nh ỏ được dùng cho các thi ết bị điện toán di độ ng nh ư Windows Mobile/Windows Phone luôn đảm b ảo thi ết bị có hi ệu su ất cao. . Hỗ Tr ợ Cho Code Page Encodings: .Net Framwork 4.6 t ăng c ường h ỗ tr ợ nhi ều b ảng mã khác nhau thay vì ch ỉ có m ột bảng mã duy nh ất nh ư tr ước (Unicode) và m ặc đị nh h ỗ tr ợ cho code page encodeings. Hi ện .Net Framwork 4.6 h ỗ tr ợ các b ảng mã sau: 1. ASCII (code page 20127) 2. ISO-8859-1 (code page 28591) 3. UTF-7 (code page 65000) 4. UTF-8 (code page 65001) 5. UTF-16 and UTF-16LE (code page 1200) 6. UTF-16BE (code page 1201) 7. UTF-32 and UTF-32LE (code page 12000) 8. UTF-32BE (code page 12001) .NET Framework 4.8 .NET Framework 4.8 được phát hành vào ngày 18 tháng 4 n ăm 2019. Đây là phiên b ản cu ối cùng c ủa .NET Framework, t ất c ả các công vi ệc trong t ươ ng lai s ẽ đi vào n ền t ảng .NET Core cu ối cùng s ẽ tr ở thành .NET 5 tr ở đi. B ản phát hành bao gồm các c ải ti ến JIT được chuy ển t ừ .NET Core 2.1, các c ải ti ến DPI cao cho các ứng d ụng WPF, c ải thi ện kh ả n ăng truy c ập, c ập nh ật hi ệu su ất và c ải ti ến b ảo m ật. KHOA CÔNG NGH Ệ THÔNG TIN 9
  13. Bài 1: Gi ới thi ệu ngôn ng ữ C# Nó h ỗ tr ợ Windows 7 , Server 2008 R2 , Server 2012 , 8.1 , Server 2012 R2 , 10 , Server 2016, 2019 và c ũng được v ận chuy ển d ưới d ạng đóng gói Windows. Bản phát hành g ần đây nh ất là 4.8.0 Build 3928, được phát hành vào ngày 25 tháng 7 n ăm 2019 v ới kích th ước trình cài đặt là 111 MB và ngày ch ữ ký s ố là ngày 25 tháng 7 n ăm 2019. 1.1.3. M ột s ố công ngh ệ trong .NET Framework Hi ện nay, m ột h ệ th ống thông tin th ường có nh ững d ạng ứng d ụng sau: Ứng d ụng Console ph ục v ụ x ử lý các v ấn đề liên quan đến h ệ th ống và giao ti ếp vào ra; Ứng dụng Desktop ph ục v ụ xây d ựng các ph ần m ềm ứng d ụng v ới giao di ện thân thi ện; Ứng d ụng Internet ph ục v ụ vi ệc xây d ựng các website; Đố i v ới m ỗi d ạng ứng d ụng khác nhau, Visual Studio cung c ấp các d ạng Project khác nhau. Các d ạng Project được Visual Studio cung c ấp g ồm có: • Console: xây d ựng ứng d ụng v ới giao di ện dòng l ệnh; • Windows Forms: xây d ựng ứng d ụng desktop (giao di ện đồ h ọa) cho windows; • Windows Presentation Foundation: công ngh ệ m ới xây d ựng ứng d ụng desktop (giao di ện đồ h ọa) cho windows; • ASP.NET: n ền t ảng để phát tri ển các ứng d ụng web ch ạy trong ch ươ ng trình máy ch ủ IIS, bao g ồm ASP.NET Web Forms, ASP.NET MVC, ASP.NET Web API; • ADO.NET và Entity Framework: Công ngh ệ cho phép ch ươ ng trình k ết n ối và s ử d ụng c ơ s ở d ữ li ệu quan h ệ (SQL Server, MySQL, V.v.); • Windows Communications Foundation: công ngh ệ cho phép phát tri ển ứng dụng m ạng h ướng d ịch v ụ (Service Oriented Application, SOA). 1.2. C ấu trúc ch ươ ng trình C# 1.2.1. Các thành ph ần chính c ủa Visual Studio Visual Studio là b ộ công c ụ tuy ệt v ời để phát tri ển các ứng d ụng trên .NET Framework. Nó g ồm các thành ph ần chính: * Solution Explorer : C ửa s ố này giúp qu ản lý project, nh ư thêm/b ớt/ đổ i tên một Class, thêm Form, thêm m ột Assembly * Code Editor : đây là c ửa s ổ để vi ết mã l ệnh, nó r ất nhi ều ti ện ích để giúp cho vi ệc vi ết mã l ệnh c ũng nh ư quan sát mã l ệnh được thu ận ti ện, ví d ụ nh ư KHOA CÔNG NGH Ệ THÔNG TIN 10
  14. Bài 1: Gi ới thi ệu ngôn ng ữ C# chức n ăng comment (phím t ắt là Ctrl + E,C), uncomment (phím t ắt là Ctrl+ E,U), ch ức n ăng thu g ọn (Collapse) và m ở r ộng (Expand) m ột đoạn mã, ch ức năng refactor để đổ i tên m ột bi ến, m ột ph ươ ng th ức * Properties Windows : là c ửa s ổ để thi ết l ập các thu ộc tính cho các đối tượng trong project, thu ộc tính c ủa project, cho các điều khi ển trong ứng d ụng Winform. * Debug : là công c ụ để g ỡ l ỗi. * MSDN : đây là b ộ tài li ệu tuy ệt v ời, không th ể có tài li ệu nào nói v ề .NET Framework đầy đủ và ch ỉ ti ết h ơn MSDN. Tra c ứu MSDN khi phát tri ển ứng dụng .NET là m ột yêu c ầu b ắt bu ộc v ới sinh viên. Trong Visual Studio, mu ốn mở MSDN các b ạn ấn phím F1, MSDN s ẽ m ở ra, ng ười dùng có th ể dùng ch ức năng Search ho ặc Index để tìm tài li ệu v ề v ấn đề mình c ần tìm hi ểu. 1.2.2. C ấu trúc ch ương trình Một ch ươ ng trình C# giao ti ếp v ới ng ười dùng qua dòng l ệnh g ọi là Console Application. C ấu trúc c ủa m ột Console Application nh ư sau: Đầu tiên là khai báo th ư vi ện b ằng t ừ khóa using, ví d ụ trong th ư vi ện (namespace) System có l ớp Console. Do đó muốn s ử d ụng l ớp Console chúng ta ph ải khai báo th ư vi ện System b ằng t ừ khóa using ngay ở đầ u ch ươ ng trình. Sau ph ần khai báo th ư vi ện đế n ph ần khai báo các l ớp, trong l ớp g ồm có thu ộc tính, ph ươ ng th ức và đặc bi ệt ph ải có và ch ỉ có duy nh ất m ột ph ươ ng th ức Main. Ch ươ ng trình s ẽ th ực thi t ừ ph ươ ng th ức Main. N ếu không có ph ươ ng th ức Main thì khi biên d ịch trình biên d ịch s ẽ báo l ỗi. Ph ươ ng th ức Main có th ể có đố i s ố ho ặc không có đố i s ố nh ưng b ắt bu ộc ph ải có t ừ khóa static đặt tr ước, không nh ất thi ết ph ải có t ừ khóa public đặ t tr ước ph ươ ng th ức Main. KHOA CÔNG NGH Ệ THÔNG TIN 11
  15. Bài 1: Gi ới thi ệu ngôn ng ữ C# Hình 1-1 Giao di ện ch ươ ng trình Console App Một ch ươ ng trình C# g ồm các ph ần sau: . Khai báo Namespace . Một class . Ph ươ ng th ức c ủa l ớp . Thu ộc tính c ủa l ớp . Một ph ươ ng th ức Main . Lệnh và biểu th ức . Comment 1.3. M ột s ố khái ni ệm c ơ b ản C# là ngôn ng ữ đơn gi ản Nh ư ta đã bi ết thì ngôn ng ữ C# d ựng trên n ền t ảng C++ và Java nên ngôn ng ữ C# khá đơ n gi ản. N ếu chúng ta thân thi ện v ới C và C++ ho ậc th ậm chí là Java, chúng ta sẽ th ấy C# khá gi ống v ề diện m ạo, cú pháp, bi ểu th ức, toán t ử và nh ững ch ức n ăng khác được l ấy tr ực ti ếp t ừ ngôn ng ữ C và C++, nh ưng nó đã được c ải ti ến để làm cho ngôn ng ữ đơn gi ản h ơn. M ột vài trong các s ự c ải ti ến là lo ại b ỏ các d ư th ừa, hay là thêm vào nh ững cú pháp thay đổ i. C# là ngôn ng ữ hi ện đạ i KHOA CÔNG NGH Ệ THÔNG TIN 12
  16. Bài 1: Gi ới thi ệu ngôn ng ữ C# Một vài khái ni ệm khá m ới m ẻ khá m ơ h ồ v ới các b ạn v ừa m ới h ọc l ập trình, nh ư xử lý ngo ại l ệ, nh ững ki ểu d ữ li ệu m ở r ộng, bảo m ật mã ngu ồn v v Đây là nh ững đặc tính được cho là c ủa m ột ngôn ng ữ hi ện đạ i c ần có. Và C# ch ứa t ất c ả các đặ t tính ta v ừa nêu trên. Các b ạn s ẽ d ần tìm hi ểu được các đặ t tính trên qua các bài h ọc trong series này. C# là m ột ngôn ng ữ l ập trình thu ần hướng đố i t ượng Lập trình h ướng đố i t ượng(ti ếng Anh: Object-oriented programming, vi ết t ắt: OOP) là m ột ph ươ ng pháp l ập trình có 4 tính ch ất. Đó là tính tr ừu t ượng (abstraction ), tính đóng gói (encapsulation), tính đa hình (polymorphism) và tính kế th ừa (inheritance). C# h ỗ tr ợ cho chúng ta tất c ả nh ững đặ c tính trên. Và để hi ểu rõ hơn thì chúng ta s ẽ có m ột ch ương trình bày v ề ph ần này. C# là m ột ngôn ng ữ ít t ừ khóa C được s ử d ụng để mô t ả thôn# là ngôn ng ữ s ử d ụng gi ới h ạn nh ững t ừ khóa (g ồm kho ảng 80 t ừ khóa và m ười m ấy ki ểu d ữ li ệu xây d ựng s ẵn). N ếu b ạn ngh ĩ rằng ngôn ng ữ có càng nhi ều t ừ khóa thì s ẽ càng mạnh m ẽ hơn. Điều này không ph ải s ự th ật, l ấy ví d ụ ngôn ng ữ C# làm điển hình nhé. N ếu b ạn h ọc sâu v ề C# b ạn sẽ th ấy rằng ngôn ng ữ này có th ể được s ử d ụng để làm b ất c ứ nhi ệm v ụ nào. Ngoài nh ững đặ c điểm trên thì còn m ột s ố ưu điểm n ổi b ật của C#: • C# có c ấu trúc khá gần g ũi v ới các ngôn ng ữ l ập trình truy ền th ống, nên cũng khá d ể dàng ti ếp c ận và h ọc nhanh v ới C#. • C# có th ể biên d ịch trên nhi ều n ền t ảng máy tính khác nhau. • C# được xây d ựng trên n ền t ảng c ủa C++ và Java nên nó được th ừa h ưởng nh ững ưu điểm c ủa ngôn ng ữ đó. • C# là m ột ph ần c ủa .NET Framework nên được s ự ch ống l ưng khá l ớn đế n t ừ bộ ph ận này. • C# có IDE Visual Studio cùng nhi ều plug-in vô cùng m ạnh m ẽ. 1.4. T ạo ứng d ụng b ằng C# Để vi ết ch ươ ng trình C# trên n ền Console Application ta c ần t ạo m ột project Console Application nh ư sau: . File > New > Project Ho ặc ta có th ể s ử d ụng t ổ h ợp phím Ctrl+Shift+N. . Tìm đến project c ủa C# Console App(.NET Framework) , ch ọn Next và Create. KHOA CÔNG NGH Ệ THÔNG TIN 13
  17. Bài 1: Gi ới thi ệu ngôn ng ữ C# Hình 1-2 Hình t ạo project Console Nh ư b ạn th ấy thì có 2 phiên b ản Console App và Console App (.Net Framework). B ạn có th ể ch ọn cái nào c ũng được. Nh ưng trong chu ỗi bài v ề C# mình s ẽ ch ọn .Net Framework Sau khi t ạo xong project Cosole Application thì ta nh ận đoạn mã sau: Hình 1-3 Giao di ện code Console v ừa t ạo Nh ấn nút Start trong visual studio ho ặc F5 trên bàn phím để ch ạy ch ươ ng trình. K ết qu ả s ẽ nh ư bên d ưới: KHOA CÔNG NGH Ệ THÔNG TIN 14
  18. Bài 1: Gi ới thi ệu ngôn ng ữ C# Hình 1-4 Kết qu ả ch ạy đầ u ti ền Ứng d ụng Console Màn hình DOS màu đen in ch ữ “Hello C#” trong ảnh trên được g ọi là ứng d ụng console, ứng d ụng này giao ti ếp v ới ng ườidùng thông quan bàn phím và không có giao di ện ng ười dùng (UI), gi ống nh ư các ứngd ụng th ường th ấy trong Windows. Trong các ch ươ ng xây d ựng các ứng d ụng nâng cao trên Windows hay Web thì ta m ới dùng các các giao di ện đồ h ọa. Còn để tìm hi ểu v ề ngôn ng ữ C# thu ần tuý thì cách t ốt nh ất là ta vi ết các ứng d ụng console. Trong ứng d ụng đơn gi ản trên ta đã dùng ph ươ ng th ức WriteLine() của lớp Console. Ph ươ ng th ức này s ẽ xu ất ra màn hình dòng l ệnh hay màn hình DOS chu ỗi tham số đưa vào, c ụ th ể là chu ỗi “Hello C#”. Sau đây chúng ta s ẽ cùng tìm hi ểu t ừng thành ph ần c ủa ch ươ ng trình trên. Using Cú pháp: using Ý ngh ĩa: . Dùng để ch ỉ cho trình biên d ịch bi ết r ằng nh ững th ư viện được s ử d ụng trong ch ươ ng trình. Các b ạn hoàn toàn có th ể không s ử d ụng th ư viên nào trong ch ươ ng trình c ủa mình. KHOA CÔNG NGH Ệ THÔNG TIN 15
  19. Bài 1: Gi ới thi ệu ngôn ng ữ C# Namespace Cú pháp: namespace { // Các thành ph ần bên trong namespace bao g ồm các l ớp, enum, delegate ho ặc các // namespace con } Nh ư chúng ta đã bi ết .NET cung c ấp m ột th ư vi ện các l ớp đồ s ộ và th ư vi ện này có tên là FCL (Framework Class Library). Trong đó Console ch ỉ là m ột l ớp nh ỏ trong hàng ngàn l ớp trong th ư vi ện. M ỗi l ớp có m ột tên riêng, vì v ậy FCL có hàng ngàn tên nh ư ArrayList, Dictionary, FileSelector, Điều này làm n ảy sinh v ấn đề , ng ười l ập trình không th ể nào nh ớ h ết được tên của các lớp trong .NET Framework. T ệ h ơn n ữa là sau này có th ể ta t ạo l ại m ột l ớp trùng v ới l ớp đã có ch ẳng h ạn. Ví d ụ trong quá trình phát tri ển m ột ứng d ụng ta c ần xây d ựng m ột l ớp từ điển và l ấy tên là Dictionary, và điều này d ẫn đế n s ự tranh ch ấp khi biên d ịch vì C# ch ỉ cho phép m ột tên duy nh ất. Ch ắc ch ắn r ằng khi đó chúng ta ph ải đổ i tên c ủa l ớp t ừ điển mà ta v ừa t ạo thành một cái tên khác ch ẳng h ạn nh ư myDictionary. Khi đó s ẽ làm cho vi ệc phát tri ển các ứng d ụng tr ở nên ph ức t ạp, c ồng k ềnh. Đế n m ột s ự phát tri ển nh ất đị nh nào đó thì chính là c ơn ác mộng cho nhà phát tri ển. Gi ải pháp để gi ải quy ết v ấn đề này là vi ệc t ạo ra m ột namespace, namsespace s ẽ hạn ch ế ph ạm vi c ủa m ột tên, làm cho tên này ch ỉ có ý ngh ĩa trong vùng đã định ngh ĩa. Ý ngh ĩa: . Báo cho trình biên d ịch bi ết r ằng các thành ph ần bên trong kh ối { } ngay bên dưới tên namespace thu ộc vào chính namespace đó. . Hạn ch ế ph ạm vi của m ột tên, làm cho tên này ch ỉ có ý ngh ĩa trong vùng đã định ngh ĩa. Ví d ụ v ề namespace: namespace Parent KHOA CÔNG NGH Ệ THÔNG TIN 16
  20. Bài 1: Gi ới thi ệu ngôn ng ữ C# { public class Action { } namespace Child { } } Với khai báo trên thì ta th ấy các thành ph ần trong namespace Child sẽ thu ộc namespace Parent . Class Cú pháp: class { } Ý ngh ĩa: báo cho trình biên d ịch bi ết r ằng nh ững thành ph ần trong kh ối { } ngay sau tên l ớp thu ộc vào chính l ớp đó. Chi ti ết v ề l ớp s ẽ được trình bày sau. Ví d ụ v ề l ớp: class Program { static void Main(string[] args) { } } Dễ th ấy ph ươ ng th ức Main này kh ối { } của l ớp Program nên ph ươ ng th ức này thu ộc l ớp Program. Hàm (Ph ươ ng th ức) Main Đây là hàm được t ạo s ẵn khi t ạo project v ới c ấu trúc nh ư sau: static void Main (string[] args) { } Hàm chính c ủa toàn ch ươ ng trình. M ỗi khi trình biên d ịch d ịch ch ươ ng trình ra s ẽ đi vào hàm Main đầu tiên để b ắt đầ u vòng đời c ủa ch ươ ng trình. T ừ th ời điểm này chúng ta s ẽ vi ết code (mã ch ươ ng trình) bên trong kh ối { } của hàm Main. Comment – Chú thích Khi vi ết code nhu c ầu chú thích ý ngh ĩa đoạn code c ũng r ất thi ết th ực. . Đôi khi b ạn không nh ớ đoạn code mình vi ết ra dùng để làm gì. Thì chú thích l ại ý ngh ĩa c ủa nó c ũng r ất c ần thi ết. . Hay b ạn có th ể đóng đoạn code không dùng t ới mà không c ần xóa nó đi. Khi nào c ần s ử d ụng thì l ại mở nó ra sài l ại. KHOA CÔNG NGH Ệ THÔNG TIN 17
  21. Bài 1: Gi ới thi ệu ngôn ng ữ C# Một ch ươ ng trình được vi ết t ốt thì c ần ph ải có chú thích các đoạn mã được vi ết. Các đoạn chú thích này s ẽ không được biên d ịch và c ũng không tham gia vào ch ươ ng trình. Mục đích chính là làm cho đoạn mã ngu ồn rõ ràng và d ễ hi ểu. Chúng ta hãy cùng tìm hi ểu v ề comment nhé! Có 3 cách để comment code trong Visual Studio: Sử d ụng ký t ự // Bất k ỳ đoạn code hay ch ữ nào phía sau ký t ự // cũng s ẽ không được biên d ịch. Sử d ụng ký t ự / / Vậy n ếu v ẫn mu ốn comment nh ưng comment gi ữa đoạn code. Hay các dòng comment khác s ẽ liên ti ếp nhau d ễ đọ c h ơn. Thì chúng ta cùng tìm hi ểu ký t ự comment ti ếp theo / / . Bất k ỳ đoạn code hay ch ữ nào n ằm trong kh ối / / đều tính là comment. M ỗi khi xu ống dòng thì v ẫn là comment. Sử d ụng ký t ự /// Thêm 1 cách comment code để ti ện s ử d ụng n ữa là ký t ự /// . B ạn gõ ký t ự này ở phía trên namespace, class, method thì Visual Studio s ẽ t ự độ ng sinh ra cho b ạn 1 đoạn comment nh ư sau: Hình 1-5 Cách ghi chú thích trong Code C# KHOA CÔNG NGH Ệ THÔNG TIN 18
  22. Bài 1: Gi ới thi ệu ngôn ng ữ C# Dấu ch ấm ph ẩy (;) Có m ột điểm c ần l ưu ý khi vi ết code. Mỗi khi k ết thúc m ột dòng l ệnh. Chúng ta s ẽ vi ết thêm 1 d ấu ; ngay phía sau đoạn code đó để báo hi ệu chúng ta đã k ết thúc dòng l ệnh hi ện t ại. Bạn hoàn toàn có th ể vi ết ti ếp dòng l ệnh ti ếp theo ngay trên cùng 1 hàng v ới dòng l ệnh c ũ. Nh ưng khuy ến cáo không nên để code rõ ràng. Chú ý: . Mỗi dòng code là 1 hàng. . Các đoạn code con thì để trong kh ối l ệnh { } . . C# là phân bi ệt ki ểu ch ữ (case sensitive). . Tất c ả l ệnh và bi ểu th ức ph ải k ết thúc v ới m ột d ấu ch ấm ph ảy (;). . Sự th ực thi ch ươ ng trình b ắt đầ u t ại ph ươ ng th ức Main. . Không gi ống Java, tên file ch ươ ng trình có th ể khác tên l ớp. 1.5. Bài t ập áp d ụng 1. Nền t ảng .NET Framework là gì? 2. Các công ngh ệ c ốt lõi s ử d ụng trong .NET Framework là gì? 3. Li ệt kê ra các thành ph ần c ủa .NET Framework 4. .NET Framework có h ỗ tr ợ ngôn ng ữ l ập trình C/C++ không? 5. Có th ể dùng ngôn ng ữ C# vi ết các ch ươ ng trình ch ạy trên các thi ết b ị di độ ng? 6. Trong m ột ứng d ụng có th ể có bao nhiêu ph ươ ng th ức Main? 7. Ch ươ ng trình C# s ẽ b ắt đầ u th ực thi t ừ đâu? KHOA CÔNG NGH Ệ THÔNG TIN 19
  23. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# BÀI 2: CÁC THÀNH PH ẦN C Ơ B ẢN TRONG NGÔN NG Ữ C# Gi ới thi ệu: Gi ới thi ệu v ề các phép toán, c ũng nh ư các ph ươ ng th ức nh ập xu ất s ử d ụng trong ngôn ng ữ C#. Mục tiêu: - Phát bi ểu nh ận di ện được các t ừ khóa trong ngôn ng ữ C# - Trình bày được các phép toán ứng d ụng - Vận dụng được các hàm nh ập/ xu ất trong C# Nội dung chính: 2.1. Các thành ph ần c ơ b ản C# là ngôn ng ữ l ập trình h ướng đố i t ượng. Trong ph ươ ng pháp l ập trình h ướng đố i tượng, m ột ch ươ ng trình bao g ồm nhi ều đố i t ượng khác nhau có tác độ ng qua l ại l ẫn nhau b ởi nh ững hành vi c ủa chúng, cái được g ọi là method. Nh ững đố i t ượng cùng lo ại ch ất thì được cho là cùng ki ểu hay cùng m ột class. Hãy xét m ột class Hình ch ữ nh ật v ới hai thu ộc tính là chi ều dài và chi ều r ộng. V ề mặt thi ết k ế, ta c ần ph ải gán giá tr ị cho chi ều dài, chi ều r ộng và có các x ử lý tính chu vi, di ện tích và hi ển th ị các thông s ố trên. Sau đây là m ột th ể hi ện đầ y đủ c ủa class Rectangle b ằng cú pháp C# c ơ b ản: using System; namespace RectangleApplication { class Rectangle { // Khai báo bi ến double length; double width; public void Acceptdetails() { length = 4.5; KHOA CÔNG NGH Ệ THÔNG TIN 20
  24. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# width = 3.5; } public double GetArea() { return length * width; } public double GetCircuit() { return (length + width)*2; } public void Display() { Console.WriteLine("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {0}", GetArea()); Console.WriteLine("Circuit: {0}", GetCircuit()); } } class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(); r.Acceptdetails(); r.Display(); Console.ReadLine(); KHOA CÔNG NGH Ệ THÔNG TIN 21
  25. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# } } } Sau khi biên d ịch và th ực thi ta nh ận được k ết qu ả nh ư sau: Length: 4.5 Width: 3.5 Area: 15.75 Circuit: 16 Phân tích đoạn code trên: • Bi ến: Bi ến là thu ộc tính ho ặc d ữ li ệu c ủa l ớp, được s ử d ụng để l ưu tr ữ d ữ li ệu. Ở ch ươ ng trình trên, class Rectangle có hai bi ến là length và width . • Hàm: hàm là m ột nhóm các câu l ệnh đả m nhi ệm m ột ch ức n ăng riêng bi ệt. Hàm của m ột class được khai báo bên trong class. Trong ví d ụ class Rectangle ch ứa 4 hàm: AccesptDetails , GetArea , GetCircuit và Display . • Kh ởi t ạo m ột class : class ExcuteRectangle trong ví d ụ trên bao g ồm ph ươ ng th ức Main () và kh ởi t ạo đố i t ượng Rectangle bên trong ph ươ ng th ức. • Định danh: một đị nh danh là tên dùng để xác đị nh m ột class, bi ến, hàm hay b ất kỳ m ột item do ng ười dùng định ngh ĩa. Quy t ắc c ơ b ản để đặ t tên class trong C# được qui định nh ư sau: o Tên ph ải b ắt đầ u b ằng m ột ch ữ cái, theo sau có th ể là chu ỗi ch ữ cái, con s ố ho ặc d ấu g ạch d ưới. Ký t ự đầ u tiên c ủa tên không được là con s ố. o Tên không được ch ứa b ất k ỳ kho ảng tr ắng ho ặc ký t ự đặ c bi ệt nh ư ? – + ! @ # $ % ^ & * ( ) [ ] { } . ; : “ ‘ / và \. o Tên không được trùng t ừ khóa c ủa C#. • Từ khóa: là nh ững t ừ dành riêng được đị nh ngh ĩa t ừ tr ước b ởi ng ười biên so ạn ra ngôn ng ữ C#. Nh ững t ừ khóa đó không th ể s ử d ụng nh ư m ột đị nh danh. Tuy nhiên, nếu b ạn mu ốn s ử d ụng t ừ khóa đó nh ư định danh, b ạn có th ể thêm ti ền t ố @ vào tr ước từ khóa. Trong C#, m ột s ố đị nh danh có ý ngh ĩa đặ t bi ệt trong ph ạm vi code, ch ẳng KHOA CÔNG NGH Ệ THÔNG TIN 22
  26. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# hạn nh ư get và set được g ọi là t ừ khóa theo ng ữ c ảnh. D ưới đây là danh sách t ừ khóa dành riêng và t ừ khóa ng ữ c ảnh trong C#: Bảng 2-1 Bảng danh sách t ừ khóa C# Reserved Keywords abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for in (generic foreach goto if implicit in int modifier) interface internal is lock long namespace new out (generic null object operator out override params modifier) private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void volatile while Contextual Keywords add alias ascending descending dynamic from get global group into join let orderby partial KHOA CÔNG NGH Ệ THÔNG TIN 23
  27. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# (type) partial remove select set (method) 2.2. Nh ập/ xu ất trong C# Trong C# có 5 l ệnh dùng để nh ập xu ất đó là: Console.Write(); Console.WriteLine(); Console.Read(); Console.ReadLine(); Console.ReadKey(); Console.Write(); Cú pháp: Console. Write( ); Ý ngh ĩa: In giá tr ị ra màn hình console. Giá tr ị này có th ể là 1 ký t ự, 1 chu ỗi, một giá tr ị có th ể chuy ển v ề ki ểu chu ỗi. Ví d ụ 1: Các b ạn t ạo m ới m ột Project Console Application static void Main( string [] args) { // In ra màn hình dòng ch ữ Khoa Cong nghe thong tin Hotec Console.Write( "Khoa Cong nghe thong tin Hotec" ); // In ra màn hình s ố 10 Console.Write(10); // In ra màn hình s ố 10.9 (f bi ểu th ị cho ki ểu d ữ li ệu float) Console.Write(10.9f); // In ra màn hình ch ữ true c ủa ki ểu d ữ li ệu bool Console.Write( true ); KHOA CÔNG NGH Ệ THÔNG TIN 24
  28. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# } Th ực hi ện ch ạy ch ươ ng trình thì ta th ấy màn hình console v ừa hi ện lên đã t ắt. Vậy làm sao để xem được k ết qu ả? Để gi ải quy ết v ấn đề này chúng ta có nhi ều cách: • Sử d ụng s ự tr ợ giúp c ủa công c ụ h ỗ tr ợ l ập trình (c ụ th ể ở đây là Visual Studio): • Ta th ực hi ện ch ạy ch ươ ng trình b ằng cách vào Debug > Run Without Debugging . • Phím t ắt Ctrl + F5 . Sử d ụng m ẹo nh ỏ để gi ải quy ết: • Ý t ưởng: ta s ẽ dùng m ột l ệnh nào đó là cho ch ươ ng trình ph ải d ừng l ại đợ i mình nh ấn m ột phím b ất k ỳ m ới k ết thúc nh ư v ậy tr ước khi chúng ta nh ấn m ột phím bất k ỳ thì chúng ta có th ể quan sát được k ết qu ả trên màn hình console. • Lệnh để th ực hi ện điều này: Console.Read(); Console.ReadLine(); Console.ReadKey(); Chúng ta ch ỉ c ần thêm 1 trong 3 l ệnh trên vào cu ối ch ươ ng trình là xong. Có v ẻ nh ư k ết qu ả in ra không nh ư chúng ta mong mu ốn thì ph ải. V ấn đề đặ t ra bây gi ờ là “chúng ta mu ốn in m ỗi giá tr ị trên m ột dòng thì ph ải làm sao?” Để tr ả l ời cho câu h ỏi này chúng ta cùng qua ph ần ti ếp theo Console.WriteLine(); Cú pháp: Console. WriteLine ( ); Ý ngh ĩa: Lệnh này c ũng t ượng t ự nh ư Console.Write() Nh ưng s ẽ khác khi in giá tr ị ra màn hình xong nó s ẽ t ự độ ng đưa con tr ỏ xu ống dòng. Điều này giúp ta có th ể gi ải quy ết được v ấn đề đã đặt ra ở ph ần trên. Ngoài ra, để xu ống dòng ta còn có nhi ều cách khác nh ư: KHOA CÔNG NGH Ệ THÔNG TIN 25
  29. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • Sử d ụng ký t ự đặ c bi ệt: chúng ta s ử d ụng ký t ự “\n” trong chu ỗi in ra màn hình thì trình biên d ịch s ẽ t ự độ ng đổ i nó thành ký t ự xu ống dòng. o Nh ư v ậy thay vì dùng Console.WriteLine (“Khoa Cong nghe thong tin”) ta có th ể dùng Console.Write (“Khoa Cong nghe thong tin \n”) o Các ký t ự đặ c bi ệt s ẽ được gi ới thi ệu trong ph ần sau c ủa bài h ọc. • Sử d ụng l ệnh xu ống dòng: ta s ử d ụng thêm 1 l ệnh xu ống dòng là Environment.NewLine Nh ư v ậy thay vì dùng 2 cách trên ta s ẽ vi ết Console.Write(Environment.NewLine); Cách này khá dài dòng so v ới 2 cách trên và c ũng r ất ít ng ười s ử d ụng. H ầu h ết khi xu ống dòng ta s ử d ụng Console.WriteLine () ho ặc “\n” Ví d ụ 2: Sử d ụng câu l ệnh Write và WriteLine xu ất l ệnh static void Main( string [] args) { Console.Write( "Khoa Cong nghe thong tin \n" ); // S ử d ụng ký t ự đặ c bi ệt để xu ống dòng Console.WriteLine(5); // S ử d ụng l ệnh in ra màn hình có xu ống dòng Console.Write(6.5f); // In ra giá tr ị nh ưng không xu ống dòng Console.Write(Environment.NewLine); // s ử d ụng l ệnh xu ống dòng Console.Write( true ); Console.ReadLine(); } Kết qu ả khi ch ạy ch ươ ng trình là: Hình 2-1 Kết qu ả ví d ụ dùng l ệnh Console.WriteLine KHOA CÔNG NGH Ệ THÔNG TIN 26
  30. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Nh ư v ậy chúng ta đã tìm hi ểu qua 2 l ệnh xu ất d ữ li ệu ra màn hình r ồi. Điểm khác bi ệt c ơ b ản gi ữa 2 l ệnh là: • Console. Write ( ): in giá tr ị ra màn hình nh ưng không đư a con tr ỏ xu ống dòng. • Console. WriteLine ( ): in giá tr ị ra màn hình và đư a con tr ỏ xu ống dòng. Lưu ý: Giá tr ị in ra màn hình có th ể được c ộng d ồn và có th ể in ra giá tr ị c ủa bi ến. Cộng d ồn chu ỗi in ra màn hình Thay vì chúng ta vi ết: int a = 5; // khai báo bi ến ki ểu nguyên có tên là a và kh ởi t ạo giá tr ị là 5. Console.Write( "a = " ); // In ra màn hình giá tr ị "a = ". Console.Write(a); // In ra giá tr ị c ủa a là 5 Thì ta có th ể vi ết g ọn l ại là Console.Write("a = “ + a); vẫn in ra màn hình a = 5. Nh ư v ậy để cho ch ươ ng trình ng ắn g ọn, tr ực quan ta có th ể c ộng tr ực ti ếp nh ư vậy thay vì vi ết ra nhi ều dòng Console.Write() . In ra giá tr ị c ủa bi ến Cộng d ồn là m ột cách in ra giá tr ị c ủa bi ến. Ngoài ra ta c ũng có th ể ch ỉ đị nh vị trí in ra giá tr ị c ủa bi ến trong chu ỗi b ằng cú pháp { } . Ví d ụ 3: int a = 5; // khai báo bi ến ki ểu nguyên có tên là a và kh ởi t ạo giá tr ị là 5. Console.Write( "a = {0}" , a); // In ra màn hình giá tr ị "a = 5" . Cú pháp chung: Console. Write ("{0} {1} {2} { }" , , , , ); Trong đó: • sẽ được điền t ươ ng ứng vào v ị trí s ố 0 tươ ng t ự nh ư v ậy cho các giá tr ị còn l ại. KHOA CÔNG NGH Ệ THÔNG TIN 27
  31. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Với 2 cách trên ta đã có th ể thao tác bi ến hóa làm cho code tr ở nên g ọn gàng, tr ực quan hơn r ồi. Console.Read(); Cú pháp: Console. Read (); Ý ngh ĩa: Đọc 1 ký t ự từ bàn phím và tr ả v ề ki ểu s ố nguyên là mã ASCII ( American Standard Code for Information Interchange - Chuẩn mã trao đổi thông tin Hoa K ỳ, là bộ ký tự và b ộ mã ký tự d ựa trên b ảng chữ cái La Tinh được dùng trong ti ếng Anh hi ện đạ i và các ngôn ng ữ Tây Âu khác) c ủa ký t ự đó. Chú ý: lệnh này không đọc được các phím ch ức n ăng nh ư Ctrl , Shift , Alt , Caps Lock , Tab , . . . Ví d ụ 4: Để bi ết ch ắc r ằng máy tính có đọ c được ký t ự mình v ừa nh ấn hay không thì chúng ta s ẽ th ử vi ết ch ươ ng trình đọc 1 ký t ự và in ký t ự đó ra màn hình nh ư sau: static void Main( string [] args) { Console.WriteLine(Console.Read()); // đọc 1 ký t ự t ừ bàn phím b ằng l ệnh Console.Read() sau đó in ra ký t ự v ừa đọ c được. Console.ReadKey(); // l ệnh này dùng v ới m ục đích d ừng màn hình để xem k ết qu ả. } Kết qu ả khi ch ạy ch ươ ng trình khi gõ ch ữ a sẽ xu ất hi ện s ố 97 Nh ư đã gi ải thích l ệnh Console. Read () dùng để đọ c 1 ký t ự và tr ả v ề 1 s ố nguyên là mã ASCII c ủa ký t ự đó nên khi ta nh ập a thì màn hình s ẽ in ra s ố 97 (là mã ASCII c ủa ký t ự a). Console.ReadLine(); Cú pháp: Console. ReadLine (); KHOA CÔNG NGH Ệ THÔNG TIN 28
  32. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Ý ngh ĩa: Đọc d ữ li ệu t ừ bàn phím cho đến khi g ặp ký t ự xu ống dòng thì d ừng (Nói cách khác là đọc cho đế n khi mình nh ấn enter thì d ừng) và giá tr ị đọ c được luôn là m ột chu ỗi. Ví d ụ 5: static void Main( string [] args) { Console.WriteLine(Console.ReadLine()); // đọc d ữ li ệu t ừ bàn phím cho đến khi g ặp ký t ự xu ống dòng thì d ừng. Sau đó in giá tr ị đã nh ập ra màn hình. Console.ReadKey(); // l ệnh này dùng v ới m ục đích d ừng màn hình để xem k ết qu ả. } • Màn hình có 2 ch ữ “ Khoa Cong nghe thong tin ” là vì ch ữ đầ u tiên do ng ười dùng nh ập t ừ bàn phím ch ữ th ứ 2 là máy tính in ra b ằng l ệnh Console.WriteLine () Console.ReadKey(); Cú pháp: Console. ReadKey ( ) Ý ngh ĩa: • Lệnh này c ũng dùng để đọ c m ột ký t ự t ừ bàn phím nh ưng tr ả v ề ki ểu ConsoleKeyInfo (là m ột ki ểu d ữ li ệu có c ấu trúc được đị nh ngh ĩa s ẵn để ch ứa nh ững ký t ự c ủa bàn phím bao g ồm các phím ch ức n ăng). • Tham s ố ki ểu bool bao g ồm 2 giá tr ị: true ho ặc false . N ếu truy ền vào true thì phím được ấn s ẽ không hi ển th ị lên màn hình console mà được đọ c ng ầm ng ược l ại thì phím được ấn s ẽ hi ển th ị lên màn hình console. Nếu không truy ền tham s ố vào thì m ặc đị nh s ẽ là false . Ứng d ụng c ủa l ệnh này r ất m ạnh nh ưng trong ph ạm vi bài h ọc hôm nay chúng ta ch ỉ tìm hi ểu cú pháp và ý ngh ĩa c ơ b ản. Vì th ế ph ần ví d ụ ch ỉ trình bày minh ho ạ cho vi ệc truy ền tham s ố cho các b ạn hi ểu tr ước. static void Main( string [] args) { Console.WriteLine( "Khoa Cong nghe thong tin"); KHOA CÔNG NGH Ệ THÔNG TIN 29
  33. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Console.ReadKey(); // không truy ền tham s ố vào thì m ặc đị nh là false. Console.ReadKey( false ); // hi ển th ị phím ấn lên màn hình. Console.ReadKey( true ); // Không hi ển th ị phím ấn lên màn hình. } Các b ạn ch ạy ch ươ ng trình b ằng cách ấn Ctrl + F5 . Xem k ết qu ả khi ch ạy. Khi ch ạy ch ươ ng trình ta th ử ấn 3 ký t ự b ất k ỳ, ở đây mình ấn 3 l ần phím ‘ C’ nh ưng trên màn hình ch ỉ có 2 ch ữ C được hi ển th ị. Ví d ụ ch ươ ng trình nh ập xu ất c ơ b ản trong C# Để hi ểu k ỹ h ơn v ề các l ệnh nh ập xu ất, chúng ta cùng xem th ử ví d ụ sau: static void Main( string [] args) { Console.WriteLine( "Khoa Cong nghe thong tin Hotec" ); // In ch ữ "K team" sau đó xu ống dòng. Console.Write( " Moi ban nhap ten cua minh: " ); // In không xu ống dòng. Console.WriteLine( "Ten cua ban la: " + Console.ReadLine()); // Quy t ắc chung trong th ực hi ện l ệnh là l ệnh bên trong th ực hi ện tr ước r ồi đế n l ệnh bên ngoài ch ứa nó. Do đó ch ạy đế n đây ch ươ ng trình s ẽ th ực hi ện l ệnh Console.ReadLine() sau đó th ực hi ện c ộng chu ỗi và cu ối cùng in chu ỗi ra màn hình. Console.Write( " Moi ban nhap ngay sinh: " ); Console.WriteLine( " Ngay sinh: " + Console.ReadLine()); // Xu ống dòng Console.Write( " Moi ban nhap noi sinh: " ); Console.WriteLine( " Noi sinh: " + Console.ReadLine()); // Xu ống dòng Console.ReadKey(); } Kết qu ả khi ch ạy ch ươ ng trình trên là: KHOA CÔNG NGH Ệ THÔNG TIN 30
  34. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Hình 2-2 Kết qu ả các l ệnh nh ập xu ất Bài t ập c ủng c ố 1. Vi ết ch ươ ng trình cho phép ng ười dùng nh ập tên c ủa mình và hi ển th ị câu: Truong Cao dang TPHCM xin chào . 2. Vi ết ch ươ ng trình nh ập vào các thông tin: • Tên • Tu ổi • Địa ch ỉ Xu ất ra màn hình theo định d ạng: B ạn tên , tu ổi, ở 2.3. Các ki ểu d ữ li ệu • Khái ni ệm o Trong các ngôn ng ữ l ập trình cấp cao luôn có các qui đị nh v ề đị nh ngh ĩa d ữ li ệu trong l ập trình o Ki ểu là khái ni ệm ám ch ỉ vi ệc đị nh ngh ĩa hình thái, c ấu trúc và giá tr ị c ủa d ữ li ệu, bao g ồm cách bi ểu di ễn và x ử lý c ủa d ữ li ệu o Ki ểu d ữ li ệu trong .NET được mô t ả chi ti ết trong m ột c ấu trúc g ọi là Common Type System (CTS) • Ki ểu d ữ li ệu trong .NET được chia thành nhi ều lo ại: o Ki ểu giá tr ị (Value Types) o Ki ểu tham chi ếu (Reference Types) o Ki ểu do ng ười dùng định ngh ĩa (User-defined Types) o Ki ểu li ệt kê (Enumerations) KHOA CÔNG NGH Ệ THÔNG TIN 31
  35. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • Mỗi ki ểu d ữ li ệu trong .NET là m ột đố i t ượng, ngh ĩa là nó có các thu ộc tính và ph ươ ng th ức riêng. M ột trong nh ững ph ươ ng th ức th ường dùng nh ất là Parse và ToString • Cách t ạo và s ử d ụng các ki ểu d ữ li ệu o Các ki ểu giá tr ị (Value Types) o Các ki ểu tham chi ếu (Reference Types) Các ki ểu giá tr ị (Value Types) • Bao g ồm các ki ểu d ữ li ệu s ố h ọc ngày gi ờ, ki ểu lu ận lý, ki ểu do ng ười dùng định ngh ĩa và ki ểu li ệt kê • Các bi ến có ki ểu giá tr ị là nh ững bi ến ch ứa tr ực ti ếp d ữ li ệu c ủa chúng thay vì ch ứa m ột tham chi ếu tới d ữ li ệu được l ưu tr ữ t ại m ột n ơi nào đó trong b ộ nh ớ (memory) • Các instance c ủa ki ểu giá tr ị được l ưu tr ữ trong m ột vùng nh ớ được g ọi là stack, ở đó t ại th ời điểm v ận hành (runtime) có th ể t ạo (create), đọ c (read), c ập nh ật (update), và lo ại b ỏ (remove) chúng m ột cách nhanh chóng Các ki ểu giá tr ị t ổng quát: • Các ki ểu giá tr ị được xây d ựng s ẵn (Built-in types) • Các ki ểu do ng ười dùng định ngh ĩa (User-defined types) • Các ki ểu li ệt kê (Enumerations) Ki ểu giá tr ị được xây d ựng s ẵn (Built-in types) • Là các ki ểu c ơ s ở do NET Framework cung c ấp, các ki ểu d ữ li ệu khác đề u được xây d ựng d ựa trên các ki ểu d ữ li ệu c ơ s ở này • Tất c ả các ki ểu d ạng s ố (numeric types) được xây d ựng s ẵn đề u thu ộc lo ại ki ểu giá tr ị • Vi ệc s ử d ụng alias hoàn toàn t ươ ng đươ ng v ới cách s ử d ụng tên ki ểu theo cách đầy đủ , tuy nhiên h ầu h ết các l ập trình viên s ử d ụng alias để chúng ng ắn g ọn h ơn. • Khi gán các bi ến ki ểu giá tr ị v ới nhau, d ữ li ệu được sao chép t ừ bi ến này t ới bi ến kia và được l ưu tr ữ t ại hai v ị trí khác nhau trên stack • Các ki ểu giá tr ị th ường được dùng để trình bày các giá tr ị đơn gi ản • Bảng sau li ệt kê các ki ểu s ố th ường dùng nh ất: KHOA CÔNG NGH Ệ THÔNG TIN 32
  36. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Bảng 2-2 Các ki ểu d ữ li ệu trong C# Ki ểu do ng ười dùng định ngh ĩa (User-defined Types) • Ki ểu do ng ười dùng định ngh ĩa còn được g ọi là các struct. Gi ống nh ư các ki ểu giá trị khác, các instance c ủa các ki ểu do ng ười dùng định ngh ĩa được l ưu tr ữ trên stack và ch ứa tr ực ti ếp d ữ li ệu c ủa chúng • struct là m ột ki ểu c ấu trúc h ỗn h ợp c ủa nhi ều ki ểu khác nh ằm m ục đích d ễ dàng làm vi ệc v ới d ạng d ữ li ệu quan h ệ • struct có c ấu trúc t ươ ng tự nh ư class, tuy nhiên struct có ki ểu giá tr ị còn class có ki ểu tham chi ếu //Kh ởi t ạo struct Nhan_Vien KHOA CÔNG NGH Ệ THÔNG TIN 33
  37. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# { public string Ma_so; public string Ho_ten; public date Ngay_sinh; public double He so luong; } //Khai báo bi ến nhân viên và gán các giá tr ị Nhan_Vien nv; nv.Ma_so = "MS01" nv.Ho_ten = "Võ Nh ật Nam" nv.Ngay_sinh = DateTime.Parse("10/10/1989") nv.He_so_luong = 2.0 Ki ểu li ệt kê (Enumerations) • Ki ểu li ệt kê là các ký hi ệu có cùng m ột h ọ (có liên quan v ới nhau) có các giá tr ị cố đị nh. • Ki ểu li ệt kê được dùng để cung c ấp m ột danh sách ch ọn l ựa cho l ập trình viên s ử dụng • Lưu ý: khi khai báo ki ểu li ệt kê ch ỉ có th ể s ử d ụng các ki ểu s ố nguyên nh ư byte, sbyte, short, ushort, int, uint, long ho ặc ulong enum Titles : int { Mr, Ms, Mrs, Dr }; Nếu chúng tao t ạo một instance c ủa ki ểu Titles, Visual Studio s ẽ hi ển th ị m ột danh sách các giá tr ị có s ẵn để gán giá tr ị cho bi ến. Titles t=Titles.Dr; Console.WriteLine(“{0}.”,t);//Hi ển th ị là “Dr.” Hằng s ố • Là m ột bi ến nh ững giá tr ị không thay đổ i trong su ốt ch ươ ng trình. KHOA CÔNG NGH Ệ THÔNG TIN 34
  38. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • Bắt bu ộc ph ải kh ởi t ạo giá tr ị khi khai báo. Vi ệc gán m ột tên cho giá tr ị h ằng được xem là m ột bi ểu t ượng h ằng. Xét l ại câu l ệnh: x = 10; thì x được xem là bi ểu t ượng h ằng. Cú pháp để t ạo m ột bi ểu t ượng h ằng: const = ; Có th ể th ấy cú pháp này khá gi ống v ới cú pháp khai báo nh ưng có 2 điểm c ần l ưu ý: • Ph ải có t ừ khóa const phía tr ước khai báo. • Ph ải kh ởi t ạo giá tr ị ngay t ại khai báo. 2.4. Cách khai báo Các ki ểu giá tr ị có m ột kh ởi t ạo (constructor) ng ầm đị nh, do v ậy chúng ta không cần ph ải bao g ồm trong ph ần khai báo t ừ khóa New nh ư khi khai báo v ới class bool b = false; Trong C# m ỗi câu l ệnh được k ết thúc b ởi d ấu ";" .NET cung c ấp m ột ki ểu m ới đó là ki ểu Nullable cho phép ki ểm tra li ệu m ột bi ến đã được gán giá tr ị hay ch ưa Nullable b = null; // C# cho phép s ử d ụng ký hi ệu th ể hi ện nhanh nh ư sau bool? b = null; Một bi ến có ki ểu nullable cho phép s ử d ụng các thành viên HasValue và Value. Chúng ta có th ể s ử d ụng HasValue để ki ểm tra li ệu có hay không m ột giá tr ị đã được thi ết l ập if (b.HasValue) Console.WriteLine("b is {0}.", b.Value); else Console WriteLine("b is not set "); KHOA CÔNG NGH Ệ THÔNG TIN 35
  39. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Các ki ểu tham chi ếu (Reference Types) • Các ki ểu tham chi ếu l ưu tr ữ đị a ch ỉ d ữ li ệu c ủa chúng c , c ũng được hi ểu nh ư là một con tr ỏ (pointer), trên stack. • Dữ li ệu th ực s ự mà các tham chi ếu đị a ch ỉ tham chi ếu t ới được l ưu tr ữ trong m ột vùng b ộ nh ớ được g ọi là heap • Hầu h ết các ki ểu trong .NET Framework là ki ểu tham chi ếu. Các ki ểu tham chi ếu cung c ấp r ất nhi ều cho tính linh độ ng, uy ển chuy ển, chúng mang đến kh ả n ăng th ực thi hoàn h ảo khi g ởi chúng t ới các ph ươ ng th ức. Các ki ểu tham chi ếu được xây d ựng s ẵn • Th ời điểm v ận hành (runtime) qu ản lý b ộ nh ớ b ằng vi ệc s ử d ụng heap thông qua một ti ến trình được g ọi là garbage collection. Garbage collection s ẽ kh ởi t ạo b ộ nh ớ theo chu k ỳ d ựa theo nhu c ầu b ằng cách lo ại b ỏ các đố i t ượng không còn được tham chi ếu n ữa. • Có kho ảng 2500 ki ểu tham chi ếu được xây d ựng s ẵn trong .NET Framework (không được d ẫn xu ất t ừ System.ValueType) • Các ki ểu tham chi ếu th ường dùng: Bảng 2-3 Bảng Ki ểu tham chi ếu th ường dùng Sự chuy ển đổ i gi ữa các ki ểu • Chuy ển đổ i ng ầm đị nh: C# ch ấp nh ận s ự chuy ển ki ểu ng ầm đị nh n ếu ki ểu đích có th ể thích h ợp v ới t ất c ả các giá tr ị có th ể nh ận t ừ ki ểu ngu ồn. • Chuy ển đổ i t ường minh: t ất c ả các bi ến trong C# ph ải được khai báo ki ểu m ột cách rõ ràng, và trình biên d ịch ki ểm tra tính nh ất quán v ề ki ểu c ủa bi ểu th ức. int i = 1; KHOA CÔNG NGH Ệ THÔNG TIN 36
  40. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# double d = 1.0001; d = i; // S ự chuy ển đổ i được ch ấp nh ận • Có th ể th ực hi ện vi ệc chuy ển đổ i ki ểu t ường minh b ằng cách s ử d ụng toán t ử chuy ển ki ểu (hay ép ki ểu - cast operator), nó có d ạng: long L = 32769; int I = (int) L; • Cơ ch ế Boxing và Unboxing: boxing chuy ển đổ i m ột ki ểu giá tr ị t ới m ột ki ểu tham chi ếu, và unboxing chuy ển đổ i m ột ki ểu tham chi ếu t ới m ột ki ểu giá tr ị. int i = 123; object o = (object) i; // c ơ ch ế boxing object j = 123; int k = (int)j; //c ơ ch ế unboxing • Sử d ụng toán t ử as: toán t ử as c ũng được dùng gi ống nh ư ép ki ểu v ới m ột s ố lưu ý: int j; object i = "35"; j = i as int ; // Đoạn l ệnh trên s ẽ x ảy ra l ỗi do int là ki ểu giá tr ị //N ếu không th ể chuy ển đổ i ki ểu nó s , nó s ẽ tr ả v ề giá tr ị null string j; object i = "35"; j = i as string; if (j == null) Console.WriteLine("i không ph ải là chu ỗi"); else Console.WriteLine("i là chu ỗi"); • Sử d ụng các ph ươ ng th ức Convert: KHOA CÔNG NGH Ệ THÔNG TIN 37
  41. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# o Các thành viên public được chia s ẽ c ủa l ớp System.Convert có th ể được s ử dụng để chuy ển đổ i m ột ki ểu d ữ li ệu c ơ s ở t ới ki ểu d ữ li ệu c ơ s ở khác o Sử d ụng Object Browser để xem và tìm hi ểu nh ững ph ươ ng th ức chuy ển đổ i sẵn có ( Để m ở công c ụ Object Browser: ch ọn th ưc đơ n view => Object Browser) Hình 2-3 nh ững ph ươ ng th ức chuy ển đổ i s ẵn //chuy ển đổ i t ừ ki ểu s ố th ực sang ki ểu s ố nguyên double SoThuc = 23.15; try { int SoNguyen = System.Convert.ToInt32(SoThuc); } catch (System.OverflowException) { System.Console.WriteLine("L ỗi: số chuy ển > bi ến ch ứa."); } KHOA CÔNG NGH Ệ THÔNG TIN 38
  42. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# //chuy ển đổ i t ừ ki ểu s ố th ực sang ki ểu chu ỗi double SoThuc = 23.15; string strNumber = System.Convert.ToString(SoThuc); //S ử d ụng ph ươ ng th ức Parse c ủa ki ểu d ữ li ệu: //Ví d ụ 1: gán giá tr ị vào cho bi ến có ki ểu ngày DateTime Ngay = DateTime.Parse(“01/25/2008”); //Ví d ụ 2: chuy ển đổ i s ố nguyên sang s ố th ực double SoThuc; int SoNguyen = 3; SoThuc = double Parse(SoNguyen); 2.5. Các phép toán Toán t ử đó là các ký hi ệu (+ - * / % && ! ), được được dùng để thi hành các tính toán v ề toán h ọc hay bi ểu th ức logic. Trong C# nó h ỗ tr ợ nh ững toán t ử v ề s ố h ọc sau: Bảng 2-4 Các toán t ử s ố h ọc Toán t ử Ý ngh ĩa a b Phép toán Kết qu ả + Phép c ộng 7 4 a + b 11 - Phép tr ừ 7 4 a - b 3 * Phép nhân 7 4 a * b 28 / Phép chia 7 4 a / b 3 % Phép chia l ấy d ư (modules) 11 3 a % b 2 Th ứ t ự ưu tiên c ủa các toán t ử trong bi ểu th ức Một bi ểu th ức có th ể có nhi ều s ố h ạng, k ết h ợp l ại b ởi nhi ều toán t ử và ký hi ệu (), Lúc này c ần bi ết th ứ t ự ưu tiên để tính được chính xác giá tr ị bi ểu th ức. Trong bi ểu th ức, toán t ử nào có độ ưu tiên cao h ơn s ẽ được tính tr ước. KHOA CÔNG NGH Ệ THÔNG TIN 39
  43. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Độ ưu tiên t ừ cao xu ống th ấp là: (1) trong ngo ặc (), (2) số m ũ - căn, (3) nhân ho ặc chia * /, (4) cộng ho ặc tr ừ + - Khi độ ưu tiên ngang nhau, s ẽ tính t ừ trái qua ph ải Console.WriteLine(5 + 3 * 2); // 11 Console.WriteLine(6 / 2 + 3 * 2); // 9 Console.WriteLine(6 / (2 + 3) * 2); // 2 Toán t ử gán trong C# Toán t ử gán, dùng để gán giá tr ị (bi ểu th ức giá tr ị) vào bi ến. Các toán t ử gán gồm: Bảng 2-5 Bảng toán t ử gán giá tr ị Toán t ử Di ễn t ả Ví d ụ Toán t ử gán: int x = 10 + 12; = Gán bi ểu th ức bên ph ải c ủa = vào bi ến bên trái // x b ằng 22 Toán t ử công thêm: int x = 10; += Công thêm vào bi ến bên trái += giá tr ị bên x += 2; // x b ằng 12 ph ải Toán t ử tr ừ b ớt: int c = 10; Bớt đi giá tr ị bi ến bên trái c ủa -= một l ượng -= c -= 3; // c = 7 bằng bi ểu th ức bên ph ải Toán t ử nhân v ới: int x = 2; *= a *= b t ươ ng đươ ng a = a * b; x *= 3; //x = 6 Toán t ử chia cho: int a = 6; /= a / b t ươ ng đươ ng a = a / b a /= 2; // a = 3 Toán t ử gán module: int a = 10; %= a %=b t ươ ng đươ ng a = a % b; KHOA CÔNG NGH Ệ THÔNG TIN 40
  44. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Toán t ử Di ễn t ả Ví d ụ a %= 3; // a = 1 Toán t ử t ăng ++ và gi ảm trong C# Toán t ử ++ thêm vào bi ến 1 đơn v ị, còn bớt đi m ột đơn v ị, toán t ử này có th ể vi ết bên trái ho ặc bên ph ải bi ến. int a = 10; a++; // a là 11 (thêm 1) ++a; // a là 12 (thêm 1) a ; // a là 11 (b ớt 1) a; // a là 10 (b ớt 1) Nếu bi ến độ c l ập, thì vi ệc vi ết ++ ho ặc bên trái hay bên ph ải không có khác bi ệt. Tuy nhiên trong bi ểu th ức thì có s ự khác bi ệt. Nếu vi ết tr ước ++x thì toán t ử ++ thi hành tr ước r ồi m ới áp d ụng vào bi ểu th ức, n ếu vi ết sau d ạng x++ thì bi ểu th ức thi hành xong m ới đế n ++ (t ươ ng t ự với ) Ví d ụ: static void Main( string [] args) { int i = 5, j = 5; Console.WriteLine(i++); // S ử d ụng giá tr ị i để in ra r ồi m ới t ăng i Console.WriteLine(++j); // T ăng j lên r ồi m ới in giá tr ị j ra màn hình Console.ReadKey(); } • Bi ến i đã được sử d ụng để in ra màn hình r ồi sau đó m ới t ăng lên 1 đơ n v ị cho nên màn hình m ới in ra s ố 5. KHOA CÔNG NGH Ệ THÔNG TIN 41
  45. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • Bi ến j thì ng ược l ại, t ăng lên 1 đơ n v ị tr ước r ồi m ới s ử d ụng giá tr ị m ới để in ra màn hình nên màn hình in ra s ố 6. Các phép toán so sánh Gi ả s ử bi ến a có giá tr ị bằng 100 và bi ến b có giá tr ị b ằng 99: Bảng 2-6 Bảng phép toán so sánh Toán t ử Mô t ả Ví d ụ So sánh 2 toán h ạng có b ằng nhau hay không. a == b s ẽ == Nếu bằng thì tr ả v ề true nếu không b ằng thì tr ả tr ả v ề false về false So sánh 2 toán h ạng có b ằng nhau hay không. a != b s ẽ tr ả != Nếu không b ằng thì tr ả v ề true nếu bằng thì tr ả về true về false So sánh 2 toán h ạng bên trái có lớn h ơn toán h ạng a > b s ẽ tr ả > bên ph ải hay không. N ếu lớn h ơn thì tr ả về true về true nếu không l ớn h ơn thì tr ả v ề false So sánh 2 toán h ạng bên trái có nh ỏ h ơn toán h ạng a = b s ẽ >= bằng toán h ạng bên ph ải hay không. N ếu lớn h ơn tr ả v ề true ho ặc b ằng thì tr ả v ề true nếu nh ỏ h ơn thì tr ả v ề false So sánh 2 toán h ạng có nh ỏ h ơn ho ặc b ằng hay a <= b s ẽ <= không. N ếu nh ỏ h ơn ho ặc b ằng thì tr ả tr ả v ề false về true nếu lớn h ơn thì tr ả v ề false Toán t ử logic Giả s ử m ệnh đề A là đúng và m ệnh đề B là sai: KHOA CÔNG NGH Ệ THÔNG TIN 42
  46. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Bảng 2-7 Bảng toán t ử logic Toán t ử Mô t ả Ví d ụ Hay còn g ọi là toán t ử logic AND (và). Tr ả A && B k ết qu ả && về true nếu tất c ả toán h ạng đề u mang giá là false tr ị true. Hay còn gọi là toán t ử logic OR (ho ặc). Tr ả A || B k ết qu ả || về true nếu có ít nh ất 1 toán h ạng mang giá là true. tr ị true. Hay còn g ọi là toán t ử logic NOT (ph ủ đị nh). !A k ết qu ả ! Có ch ức n ăng đảo ng ược tr ạng thái logic c ủa là false toán h ạng. Ví d ụ ch ươ ng trình sử d ụng m ột s ố toán t ử Ví d ụ 1: sử d ụng phép toán c ơ b ản Lưu ý: đối v ới phép toán c ho ặc c khi đứng độ c l ập thì không có khác bi ệt gì. Ví d ụ 2: Kết h ợp các phép toán để vi ết ch ươ ng trình ki ểm tra s ố nh ập vào là số âm số dươ ng : static void Main( string [] args) { KHOA CÔNG NGH Ệ THÔNG TIN 43
  47. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# string strsn; // Bi ến ch ứa d ữ li ệu nh ập vào t ừ bàn phím int sn; // Bi ến ch ứa s ố nh ập vào t ừ bàn phím string kq; // Bi ến ch ứa k ết qu ả ki ểm tra s ố v ừa nh ập là âm hay d ươ ng strsn = Console.ReadLine(); // Đọc d ữ li ệu nh ập vào t ừ bàn phím (d ữ li ệu này ở d ạng chu ỗi) sau đó gán giá tr ị vào bi ến strsn sn = Int32.Parse(strsn); // Ép ki ểu d ữ li ệu v ừa nh ập vào (d ạng chu ỗi) sang dạng s ố r ồi gán giá tr ị vào bi ến sn kq = (sn <0) ? "So Am" : "So Duong" ; // S ử d ụng toán t ử 3 ngôi để ki ểm tra số âm hay D ươ ng Console.WriteLine( "{0} la {1}" , sn, kq); // In k ết qu ả ra màn hình Console.ReadKey(); } Kết qu ả sau khi ch ạy ch ươ ng trình: Đầu tiên ta có 3 bi ến: • strsn : Ch ứa d ữ li ệu nh ập vào t ừ bàn phím. Vì d ữ li ệu nh ập vào t ừ bàn phím m ặc định là d ạng chu ỗi nên c ần bi ến ki ểu chu ỗi để ch ứa giá tr ị. • sn : Ch ứa d ữ li ệu nh ập vào t ừ bàn phím ở d ạng s ố. T ừ d ữ li ệu d ạng chu ỗi c ủa bi ến strsn ta ép ki ểu sang ki ểu s ố để d ễ x ử lý. • kq : Ch ứa k ết qu ả ki ểm tra s ố v ừa nh ập là Âm hay Dươ ng . K ết qu ả này ở d ạng chu ỗi để có th ể in ra màn hình luôn. Ti ếp theo ta nh ận k ết qu ả nh ập t ừ bàn phím b ằng l ệnh Console.ReadLine() rồi gán giá tr ị cho bi ến strsn . Ép ki ểu k ết qu ả v ừa nh ập sang d ạng s ố r ồi gán giá tr ị vào bi ến sn . Sử d ụng toán t ử 3 ngôi ki ểm tra xem s ố vừa nh ập có âm hay không (n ếu sn < 0 sẽ tr ả v ề true ng ược l ại s ẽ tr ả v ề false). N ếu nh ỏ h ơn 0 thì tr ả v ề chu ỗi “So Am” ng ược lại tr ả v ề chu ỗi “So Duong”. KHOA CÔNG NGH Ệ THÔNG TIN 44
  48. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# 2.6. Các bi ểu th ức Bi ểu th ức là s ự k ết h ợp gi ữa toán h ạng và toán t ử Ví d ụ bi ểu th ức: 2* y + 3 Trong biểu th ức trên : * và + là toán t ử, còn s ố 2, bi ến y và s ố 3 g ọi là toán h ạng. Bi ểu th ức bao gi ờ c ũng tr ả v ề giá tr ị ho ặc đố i t ượng. 2.7. Các c ấu trúc điều khi ển Câu l ệnh if (D ạng thi ếu) Cú pháp: if ([Bi ểu th ức điều ki ện] ) • if là t ừ khóa b ắt bu ộc. • là bi ểu th ức d ạng boolean (tr ả v ề true ho ặc false). • là câu l ệnh mu ốn th ực hi ện n ếu là đúng. Ý ngh ĩa: Nếu tr ả v ề true thì th ực hi ện ng ược lại thì không làm gì c ả. Ví d ụ: int n=100 ; if (n==100) Console.WriteLine("n=100"); // Bi ểu th ức điều ki ện s ử d ụng toán t ử == đề so sánh xem giá tr ị bi ến n có b ằng 100 hay không. N ếu b ằng tr ả thì tr ả v ề true ng ược l ại thì tr ả v ề false. Console.WriteLine("n=100"); // In ra màn hình ch ữ “n=100” n ếu bi ểu th ức trên đúng. Câu l ệnh if (D ạng đủ ) Cú pháp: if else KHOA CÔNG NGH Ệ THÔNG TIN 45
  49. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • if, else là t ừ khóa b ắt bu ộc. • là bi ểu th ức d ạng boolean (tr ả v ề true ho ặc false). • là câu l ệnh mu ốn th ực hi ện n ếu là đúng. • là câu l ệnh mu ốn th ực hi ện n ếu là sai. Ý ngh ĩa: Nếu tr ả v ề true thì th ực hi ện ng ược lại thì th ực hi ện . Ví d ụ 1: int n=100; if (n==100) Console.WriteLine("n=100"); // In ra màn hình n=100 else Console.WriteLine("n # 100"); // In ra màn hình n # 100 Một s ố l ưu ý khi s ử d ụng câu l ệnh điều ki ện: có th ể ch ứa nhi ều bi ểu th ức con bên trong và các bi ểu th ức con liên k ết v ới nhau b ằng các toán t ử quan h ệ nh ưng t ất c ả ph ải tr ả v ề ki ểu boolean (true ho ặc false ). Nếu mu ốn th ực hi ện nhi ều câu l ệnh thì ta có th ể nhóm chúng vào trong c ặp ngo ặc nh ọn { } . Ngoài c ấu trúc if . . . else . . . c ơ b ản trên còn có c ấu trúc nh ỏ khác là If. . . else if. . . else. Ví d ụ 2: if { //Th ực hi ện khi đúng KHOA CÔNG NGH Ệ THÔNG TIN 46
  50. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# } eslse if { // Th ực hi ện khi sai và đúng } else { //Th ực hi ện khi c ả 2 bi ểu th ức điều ki ện trên đều sai (các trường h ợp còn l ại) } • Có th ể hi ểu ng ắn g ọn là “N ếu. . . thì. . . Ng ược l ại, n ếu. . . thì. . . Tr ường h ợp khác. . .”. • Các bi ểu th ức điều ki ện được ki ểm tra t ừ trên xu ống d ưới và không ki ểm tra l ại. • Nếu bi ểu th ức điều ki ện đang ki ểm tra tr ả v ề true thì o Th ực hiện kh ối l ệnh bên trong nó. o Thoát ra kh ỏi c ấu trúc. o Không ki ểm tra các bi ểu th ức điều ki ện còn l ại. Ví d ụ 3: Vi ết ch ươ ng trình gi ải ph ươ ng trình b ậc 1: Ax + B = 0. static void Main( string [] args) { string strA, strB; int A, B; double Nghiem; Console.Write( "A=" ); strA = Console.ReadLine(); Console.Write( "B=" ); KHOA CÔNG NGH Ệ THÔNG TIN 47
  51. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# strB = Console.ReadLine(); // ki ểm tra ng ười dùng có th ực s ự nh ập s ố nguyên vào hay không. Nếu ép ki ểu thành công s ẽ tr ả v ề true, ng ược l ại tr ả v ề false if (int .TryParse(strA, out A) == false || int .TryParse(strB, out B) == false ) { Console.WriteLine( "Du lieu nhap sai !" ); return ; // L ệnh này t ạm hi ểu là d ừng và thoát ch ươ ng trình mà không th ực hi ện nh ững câu l ệnh sau nó n ữa. } else { Console.WriteLine( "\n Phuong trinh cua ban vua nhap la: {0}x + {1} = 0" , A, B); if (A == 0) Console.WriteLine( "\n Phuong trinh co vo so nghiem !" ); else if (B == 0) Console.WriteLine( "\n Phuong trinh co nghiem x = 0" ); else { Nghiem = ( double )-B / A; // Ép ki ểu để cho ra k ết qu ả chính xác Console.WriteLine( "\n Phuong trinh co nghiem x = {0}" , Nghiem); } } } Trong ví d ụ đã s ử d ụng c ả 2 d ạng câu l ệnh điều ki ện là: • . . else. . . • . . else if. . . else. . . KHOA CÔNG NGH Ệ THÔNG TIN 48
  52. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Kết qu ả khi ch ạy ch ươ ng trình trên là: Cấu trúc r ẽ nhánh Switch case trong C# Cú pháp: switch ( ) { case : ; break ; case : ; break ; . . . case : ; break ; default : ; break ; } Trong đó: • switch , case , default là t ừ khóa b ắt bu ộc. • ph ải là bi ểu th ức tr ả v ề k ết qu ả ki ểu: o Số nguyên ( int , long , byte , . . .) o Ký t ự ho ặc chu ỗi ( char , string ) o Ki ểu li ệt kê KHOA CÔNG NGH Ệ THÔNG TIN 49
  53. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • v ới i = 1 n là giá tr ị mu ốn so sánh v ới giá tr ị c ủa . • với i = 1 n là câu l ệnh mu ốn th ực hi ện khi tươ ng ứng b ằng v ới giá tr ị c ủa . • là câu l ệnh s ẽ được th ực hi ện n ếu giá tr ị không b ằng v ới nào. Ý ngh ĩa: Duy ệt l ần l ượt t ừ trên xu ống d ưới và ki ểm tra xem giá tr ị c ủa có b ằng v ới đang xét hay không. N ếu b ằng thì th ực hi ện tươ ng ứng. N ếu không bằng t ất c ả các thì s ẽ th ực hi ện Ví d ụ 4: Nh ập vào x ếp h ạng t ừ 1-3. Xu ất thông báo “Xep hang cua ban la thu ” Kết qu ả: KHOA CÔNG NGH Ệ THÔNG TIN 50
  54. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Câu l ệnh l ặp C# cung c ấp m ột b ộ m ở r ộng các câu l ệnh l ặp, bao g ồm các câu l ệnh l ặp for, while và do while . Ngoài ra ngôn ng ữ C# còn b ổ sung thêm m ột câu l ệnh l ặp foreach, l ệnh này m ới đố i v ới ng ười l ập trình C/C++ nh ưng khá thân thi ện v ới ng ười lập trình Visual Basic. Cu ối cùng là các câu l ệnh nh ảy nh ư goto, break, continue, và return .  Vòng l ặp while: Cú pháp: while(bi ểu th ức) { Kh ối l ệnh th ực hi ện; } Làm vi ệc: Bước 1: Xác đị nh giá tr ị bi ểu th ức Bước 2: Tùy thu ộc vào tính đúng sai c ủa bi ểu th ức này, s ẽ ch ọn 1 trong 2 nhánh:  Nếu bi ểu th ức có giá tr ị sai, s ẽ thoát kh ỏi chu trình l ặp chuy ển t ới câu l ệnh sau while.  Nếu bi ểu th ức có giá tr ị đúng, s ẽ th ực hi ện các câu l ệnh trong thân while . Khi gặp d ấu ngo ặc nh ọn đóng cu ối cùng c ủa thân while s ẽ tr ở l ại B ước 1. Ví d ụ 1: Vi ết ch ươ ng trình hi ển th ị giá tr ị i t ừ 0 đế n 9 dùng vòng l ặp while. KHOA CÔNG NGH Ệ THÔNG TIN 51
  55. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C#  Vòng l ặp for: Cú pháp: for([ph ần kh ởi t ạo];[bi ểu th ức điều ki ện]; [b ước l ặp]) { ; } Làm vi ệc: • Ban đầu trình biên d ịch s ẽ di vào ph ần kh ởi t ạo ch ạy đoạn l ệnh kh ởi t ạo. • Ti ếp theo ki ểm tra bi ểu th ức điều ki ện l ặp. R ồi th ực hi ện kh ối code bên trong vòng l ặp for. Khi đến ký hi ệu } thì s ẽ quay lên bước l ặp l ại. • Sau đó l ại ki ểm tra điều ki ện l ặp rồi ti ếp t ục th ực hi ện đoạn code trong kh ối lệnh. Đế n khi điều ki ện l ặp không còn thõa mãn thì s ẽ k ết thúc vòng l ặp for. Ví d ụ 2: Vi ết ch ươ ng trình hi ển th ị giá tr ị i t ừ 0 đến 9 dùng vòng l ặp for  Vòng l ặp do while: KHOA CÔNG NGH Ệ THÔNG TIN 52
  56. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Cú pháp: do { ; } while(bi ểu th ức điều ki ện); Làm vi ệc: - Bi ểu th ức điều ki ện l ặp là m ột bi ểu th ức logic b ắt bu ộc ph ải có v ới k ết qu ả tr ả về b ắt bu ộc là true ho ặc false. - Từ khóa do while bi ểu th ị đây là m ột vòng l ặp do while. Các câu l ệnh trong kh ối lệnh s ẽ được l ặp l ại đế n khi không còn th ỏa mãn điều ki ện l ặp sẽ k ết thúc vòng l ặp do while. - Ti ến trình: • Đầu tiên trình biên d ịch s ẽ đi vào dòng do và th ực hi ện kh ối l ệnh bên trong. Sau đó khi g ặp ký tự } s ẽ ki ểm tra bi ểu th ức điều ki ện l ặp có th ỏa mãn hay không. N ếu kết qu ả là true thì s ẽ quay l ại ký t ự { th ực hi ện kh ối code. Quá trình ch ỉ k ết thúc khi điều ki ện l ặp là false. • Bi ểu th ức điều ki ện l ặp luôn b ằng true thì vòng l ặp while sẽ tr ở thành vòng lặp vô t ận. • Bi ểu th ức điều ki ện l ặp luôn b ằng false thì vòng l ặp s ẽ không được th ực thi. Lưu ý: vòng l ặp do while sẽ th ực hi ện câu l ệnh trong kh ối code xong r ồi m ới ki ểm tra điều ki ện l ặp. Cu ối vòng l ặp do while có d ấu ; ở cu ối. Ví d ụ 3: Vi ết ch ươ ng trình hi ển th ị đế m số l ần nh ập ký t ự a t ừ bàn phím dùng vòng l ặp do while. Khi ng ười dùng nh ập ký t ự khác a s ẽ thoát ch ươ ng trình. KHOA CÔNG NGH Ệ THÔNG TIN 53
  57. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C#  Vòng l ặp foreach: Cho phép duy ệt qua 1 m ảng hay 1 t ập h ợp Một s ố đặ c tr ưng c ủa foreach: • Foreach không duy ệt m ảng ho ặc t ập h ợp thông qua ch ỉ s ố ph ần t ử nh ư c ấu trúc lặp for. • Foreach duy ệt tu ần t ự các ph ần t ử trong m ảng ho ặc t ập h ợp. • Foreach ch ỉ dùng để duy ệt m ảng ho ặc t ập h ợp ngoài ra không th ể làm gì khác. Cú pháp: foreach ( in ) { // Code x ử lý } Trong đó: • Các t ừ khoá foreach, in là t ừ khoá b ắt bu ộc. • là ki ểu d ữ li ệu c ủa các ph ần t ử trong m ảng ho ặc t ập h ợp. • là tên 1 bi ến t ạm đạ i di ện cho ph ần t ử đang xét khi duy ệt m ảng ho ặc t ập hợp. • là tên c ủa m ảng ho ặc t ập h ợp c ần duy ệt. Làm vi ệc: Foreach cũng có nguyên t ắc ho ạt độ ng t ươ ng t ự nh ư các c ấu trúc l ặp khác c ụ th ể nh ư sau: KHOA CÔNG NGH Ệ THÔNG TIN 54
  58. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • Ở vòng l ặp đầ u tiên s ẽ gán giá tr ị c ủa ph ần t ử đầ u tiên trong m ảng vào bi ến t ạm. • Th ực hi ện kh ối l ệnh bên trong vòng l ặp foreach. • Qua m ỗi vòng l ặp ti ếp theo s ẽ th ực hi ện ki ểm tra xem đã duy ệt h ết m ảng ho ặc tập h ợp ch ưa. N ếu ch ưa thì ti ếp gán giá tr ị c ủa ph ần t ử hi ện t ại vào bi ến t ạm và ti ếp tục th ực hi ện kh ối l ệnh bên trong. • Nếu đã duy ệt qua h ết các ph ần t ử thì vòng l ặp s ẽ k ết thúc. Ví d ụ 4: Vi ết ch ươ ng trình tính t ổng các ph ần t ử trong m ảng 1 chi ều có 10 ph ần t ử giá tr ị t ừ 0 đế n 9. 2.8. M ảng m ột chi ều Mảng là • Tập h ợp các đố i t ượng có cùng ki ểu d ữ li ệu. • Mỗi đố i t ượng trong m ảng được g ọi là m ột ph ần t ử. • Các ph ần t ử phân bi ệt v ới nhau b ằng ch ỉ s ố ph ần t ử. Trong C# ch ỉ s ố ph ần t ử là các s ố nguyên không âm và b ắt đầ u t ừ 0 1 2 3 Đặc điểm c ủa m ảng: • Các ph ần t ử trong m ảng dùng chung m ột tên và được truy xu ất thông qua ch ỉ số ph ần t ử. • Một m ảng c ần có gi ới h ạn s ố ph ần t ử mà m ảng có th ể ch ứa. KHOA CÔNG NGH Ệ THÔNG TIN 55
  59. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • Ph ải c ấp phát vùng nh ớ m ới có th ể s ử d ụng m ảng. • Vị trí ô nh ớ c ủa các ph ần t ử trong m ảng được c ấp phát li ền k ề nhau. Nh ững lợi ích khi s ử d ụng m ảng: • Gom nhóm các đối t ượng có chung tính ch ất l ại v ới nhau giúp code g ọn gàng hơn. • Để thao tác, d ễ qu ản lý, nâng c ấp s ửa ch ữa. Vì lúc này vi ệc thay đổ i s ố l ượng sinh viên ta ch ỉ c ần thay đổ i s ố ph ần t ử c ủa m ảng là được. • Dễ dàng áp d ụng các c ấu trúc l ặp vào để x ử lý d ữ li ệu. Khai báo m ảng 1 chi ều Cú pháp: [] ; • Trong đó: • là ki ểu d ữ li ệu c ủa các ph ần t ử trong m ảng. • Cặp d ấu [] là ký hi ệu cho khai báo m ảng 1 chi ều. • là tên c ủa m ảng, cách đặ t tên m ảng c ũng nh ư cách đặt tên bi ến. Để s ử d ụng được m ảng ta ph ải kh ởi t ạo giá tr ị ho ặc c ấp phát vùng nh ớ cho m ảng. C ấp phát vùng nh ớ: • Được th ực hi ện thông qua toán t ử new • Lưu ý là khi c ấp phát vùng nh ớ cho m ảng 1 chi ều ta c ần ch ỉ ra s ố ph ần t ử t ối đa của m ảng. Ví d ụ 1: /* * Khai báo m ảng 1 chi ều ki ểu string và có tên là arr. * Sau đó th ực hi ện c ấp phát vùng nh ớ v ới s ố ph ần t ử t ối đa c ủa m ảng là 3. */ string[] arr = new string[3]; • Sau khi m ảng được c ấp phát vùng nh ớ thì các ph ần t ử trong m ảng s ẽ mang giá tr ị m ặc đị nh:  Đối v ới s ố nguyên là 0 KHOA CÔNG NGH Ệ THÔNG TIN 56
  60. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C#  Đối v ới s ố th ực là 0.0  Đối v ới ki ểu ký t ự là ‘’ (ký t ự r ỗng)  Đối v ới ki ểu tham chi ếu là null • Chúng ta có th ể kh ởi t ạo giá tr ị khác mà chúng ta mong mu ốn ngay khi c ấp phát vùng nh ớ b ằng cú pháp sau: [] = new [] { , , }; • Các giá tr ị kh ởi t ạo n ằm trong c ặp d ấu ngo ặc ng ọn {} và cách nhau b ởi d ấu ph ẩy. • Chúng ta không c ần cung c ấp s ố ph ần t ử t ối đa mà trình biên d ịch s ẽ t ự đế m xem b ạn đã kh ởi t ạo bao nhiêu giá tr ị và xem nó nh ư s ố ph ần t ử t ối đa. Vì th ế dù vi ệc khai báo s ố ph ần t ử t ối đa không l ỗi nh ưng trong tr ường h ợp này nó không có ý ngh ĩa l ắm! Kh ởi t ạo giá tr ị Cú pháp: [] = { , , }; Ví d ụ 2: int [] IntArray = { 3, 9, 10 }; Về b ản ch ất thì cách này trình biên dịch v ẫn xem xét s ố ph ần t ử kh ởi t ạo và c ấp phát vùng nh ớ cho bi ến m ảng sau đó th ực kh ởi t ạo giá tr ị cho các ph ần t ử trong m ảng. Nh ưng cách vi ết này có v ẻ nhanh và g ọn h ơn so v ới cách c ấp phát vùng nh ớ r ồi m ới kh ởi t ạo giá tr ị. Tóm l ại ta có 3 cách khai báo và kh ởi t ạo sau :  Khai báo và c ấp phát vùng nh ớ string [] Array = new string [3];  Khai báo, c ấp phát và kh ởi t ạo giá tr ị cho m ảng string [] Kteam = new string [] { "HowKteam" , "Free Education" };  Kh ởi t ạo giá tr ị cho m ảng int [] IntArray = { 3, 9, 10 }; Ngôn ng ữ C# cung c ấp cú pháp chu ẩn cho vi ệc khai báo nh ững đố i t ượng Array → đối tượng c ủa ki ểu System.Array KHOA CÔNG NGH Ệ THÔNG TIN 57
  61. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Một s ố các thu ộc tính và ph ươ ng th ức c ủa l ớp System.Array Bảng 2-8 Bảng thu ộc tính và ph ươ ng th ức c ủa l ớp System.Array KHOA CÔNG NGH Ệ THÔNG TIN 58
  62. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# Ví dụ 3 : S ử d ụng ph ươ ng th ức Array.Reverse() để đả o ng ược m ảng đã được s ắp x ếp 2.9. Bài t ập áp d ụng 1. Vi ết ch ươ ng trình nh ập vào m ột s ố t ươ ng ứng là n ăm. Xu ất ra màn hình n ăm v ừa nh ập và tu ổi c ủa m ột ng ười t ươ ng ứng v ới n ăm v ừa nh ập đó. 2. Từ câu 1. Thêm ch ức n ăng: - Nếu tu ổi ng ười đó , tu ổi v ị thành niên. - Nếu tu ổi ng ười đó >= 16 và , tu ổi tr ưởng thành. Nếu tu ổi ng ười đó >= 18 thì hi ện thông báo theo format: Bạn , già r ồi. 3. Vi ết trò ch ơi Kéo Búa Bao v ới cách ch ơi: Ng ười dùng s ẽ nh ập vào các s ố 1 ho ặc 2 ho ặc 3 t ươ ng ứng v ới kéo ho ặc búa ho ặc bao. Máy s ẽ ng ẫu nhiên sinh ra m ột s ố trong 3 s ố và tính toán máy ho ặc ng ười chi ến th ắng. Nh ớ ph ải in k ết qu ả ra màn hình. 4. Vi ết ch ươ ng trình tính n ăm âm l ịch t ừ n ăm d ươ ng l ịch đã nh ập. Thu ật toán tính n ăm âm l ịch : • Năm âm l ịch = Can + Chi. Vì th ế c ần tính được Can và Chi sau đó ghép l ại là xong. KHOA CÔNG NGH Ệ THÔNG TIN 59
  63. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# • Tính Can b ằng cách: o Tìm ph ần d ư c ủa phép chia n ăm d ươ ng l ịch cho 10. o Tra b ảng sau để tìm ra Can t ươ ng ứng Năm d ươ ng 0 1 2 3 4 5 6 7 8 9 % 10 Can Canh Tân Nhâm Quý Giáp Ất Bính Đinh Mậu Kỷ • Tìm Chi b ằng cách: o Tìm ph ần d ư c ủa phép chia n ăm d ươ ng l ịch cho 12. o Tra b ảng sau để tìm ra Chi t ươ ng ứng: Năm d ươ ng 0 1 2 3 4 5 6 7 8 9 10 11 % 12 Chi Thân Dậu Tu ất Hợi Tý Sửu Dần Mẹo Thìn Tỵ Ng ọ Mùi • Nối Can và Chi l ại để được k ết qu ả. 5. T ạo m ột Console Application để vi ết ch ươ ng trình gi ải ph ươ ng trình b ậc 2 6. Trong Console Application đã t ạo, t ạo thêm m ột project và s ử d ụng vòng l ặp for – while để vi ết ch ươ ng trình hi ện 100 s ố t ừ 1 đế n 100 7. Trong Console Application đã t ạo, t ạo thêm m ột project và s ử d ụng vòng l ặp foreach in để t ổng m ột dãy s ố cho tr ước. 8. Trong Console Application đã t ạo, t ạo thêm m ột project và s ử d ụng câu l ệnh switch để vi ết ch ươ ng trình tính chu vi và di ện tích c ủa hình ch ữ nh ật, hình vuông, hình tam giác. 9. Vi ết m ột Console Application s ử d ụng câu l ệnh switch để l ựa ch ọn các toán t ử +, - , *, / để tính toán 2 s ố được nh ập t ừ bàn phím. 10. Tạo m ột Console Application đã t ạo, t ạo thêm project, nh ập vào s ố ti ền g ồm 4 ch ữ số, đọ c ra thành ch ữ. KHOA CÔNG NGH Ệ THÔNG TIN 60
  64. Bài 2: Các thành ph ần c ơ b ản trong ngôn ng ữ C# 11. Trong Console Application đã t ạo, t ạo thêm m ột project, nh ập vào n ki ểm tra n có ph ải là s ố nguyên t ố hay không. 12. Trong Console Application đã t ạo, t ạo thêm m ột project, nh ập vào n và xu ất ra t ất cả s ố nguyên t ố. 13. Vi ết m ột ch ươ ng trình t ạo ra m ột m ảng m ột chi ều nguyên ch ứa giá tr ị c ủa các ph ần t ử được nh ập vào t ừ bàn phím. S ắp x ếp các thành ph ần c ủa m ảng theo th ứ t ự t ăng dần và hi ện k ết qu ả. Làm t ươ ng t ự v ới tr ường h ợp s ắp x ếp m ảng theo th ứ t ự gi ảm d ần. 14. Vi ết ch ươ ng trình s ử d ụng ArrayList để t ạo m ột m ảng. S ử d ụng thu ộc tính Count và Capacity. 15. Vi ết ch ươ ng trình đếm có bao nhiêu s ố nguyên t ố trong m ảng. KHOA CÔNG NGH Ệ THÔNG TIN 61
  65. Bài 3: Ch ươ ng trình con trong C# BÀI 3: CH ƯƠ NG TRÌNH CON TRONG C# Gi ới thi ệu: Trong l ập trình C# x ử lý r ất nhi ều công vi ệc khác nhau, m ỗi công vi ệc có đặc điểm riêng giúp ng ười l ập trình d ễ s ửa ch ữa và nâng c ấp ch ươ ng trình trong t ươ ng lai. Mục tiêu: - Phát bi ểu được t ối ưu trong vi ệc s ử d ụng ch ươ ng trình con trong l ập trình - Trình bày được ph ạm vi hoạt độ ng c ủa các bi ến trong l ập trình. - Phân bi ệt được cách l ập trình có s ử d ụng ch ươ ng trình con và không có ch ươ ng trình con. Nội dung chính: 3.1. Đặt v ấn đề Trong khi l ập ch ươ ng trình chúng ta th ường g ặp nh ững đoạn ch ươ ng trình được l ặp đi l ặp l ại nhi ều lần ở nh ững ch ỗ khác nhau. Để tránh r ườm rà, nh ững đoạn ch ươ ng trình này được thay th ế b ằng ch ươ ng trình con t ươ ng ứng và khi c ần, ta ch ỉ vi ệc làm th ủ t ục g ọi ch ươ ng trình đó ra(v ới các tham s ố t ươ ng ứng c ần thi ết) mà không ph ải vi ết lại c ả đoạn ch ươ ng trình đó. Thí d ụ khi làm toán l ượng giác, th ường xuyên ta c ần tính sin c ủa m ột giá tr ị hay m ột bi ến x nào đó. Nh ư v ậy ta c ần l ập m ột ch ươ ng trình còn có tên Sin và tham s ố c ần thi ết là x. Nh ững ch ươ ng trình con thông d ụng này đã được l ập sẵn và để trong “th ư vi ện” Trong C#, các ch ươ ng trình con chu ẩn này được phân lo ại và ch ứa trong các l ớp nh ư: L ớp ch ứa các hàm toán h ọc Math, l ớp ch ứa các hàm x ử lý th ời gian Timer, Lý do th ứ hai để xây d ựng ch ươ ng trình con là: m ột v ấn đề l ớn ph ức t ạp s ẽ t ươ ng ứng v ới m ột ch ương trình có th ể r ất l ớn , r ất dài. Do đó vi ệc nhìn t ổng quan c ả ch ươ ng trình c ũng nh ư vi ệc g ỡ r ối, hi ệu ch ỉnh s ẽ r ất khó kh ăn. Ta có th ể phân tác v ấn đề ph ức tạp đó ra thành nhi ều các v ấn đề nh ỏ h ơn(t ươ ng ứng v ới các ch ươ ng trình con) để d ễ ki ểm tra, g ỡ r ối t ừng kh ối m ột và sau đó ghép l ại thành ch ươ ng trình l ớn. Trong ngôn ng ữ l ập trình C# ch ươ ng trình con ch ỉ t ồn t ại d ưới d ạng các hàm. 3.2. Ph ạm vi ho ạt độ ng c ủa bi ến, hàm Trong C# bi ển và hàm ph ải được khai báo bên trong m ột l ớp. Nh ững bi ến được khai báo bên trong m ột l ớp và bên ngoài các hàm (trong l ập trình h ướng đố i tượng (OOP) các bi ến đó g ọi là d ữ li ệu c ủa l ớp, các hàm được g ọi là các ph ươ ng th ức, t ạm g ọi các bi ến này là bi ển toàn c ục trong m ột l ớp) các bi ến này có ph ạm vi tác KHOA CÔNG NGH Ệ THÔNG TIN 62
  66. Bài 3: Ch ươ ng trình con trong C# động trong toàn b ộ l ớp ngh ĩa là các hàm bên trong l ớp có th ể truy xu ất được. Khi khai báo các bi ến này ta ph ải thêm t ừ khoá static vì: + Các hàm này được g ọi trong hàm Main, mà hàm Main là m ột hàm t ĩnh (vì có t ừ khóa static), trong hàm t ĩnh ch ỉ truy xu ất được đế n bi ến và hàm t ĩnh (vi ệc này s ẽ được tìm hi ểu k ỹ trong l ập trình h ướng đố i t ượng và nó được c ấp phát b ộ nh ớ ngay t ừ khi ta th ực hi ện ch ươ ng trình Ví d ụ 1: Các bi ến static double x; và static int n; trong ví d ụ trên có ph ạm v ị tác động trong toàn b ộ l ớp, ngh ĩa là t ất c ả các ph ươ ng th ức trong cùng l ớp đề u có th ể truy nh ập. Chú ý: Thông th ường nh ững bi ến dùng chung cho các hàm trong cùng m ột l ớp thì ta hay khai báo toàn c ục (bên ngoài l ớp) Nh ững bi ến được khai báo bên trong m ột hàm được g ọi là bi ến c ục b ộ, ph ạm vi ho ạt độ ng c ủa các bi ển này ch ỉ ở bên trong hàm mà nó được khai báo, các bi ến này ch ỉ được c ấp phát b ộ nh ớ khi hàm mà có ch ứa các bi ến này được g ọi ra th ực hi ện và khi th ực hi ện xong thì nó s ẽ b ị gi ải phóng kh ỏi b ộ nh ớ. Ví d ụ 2: Các bi ến double s; và int i; trong ví d ụ trên Chú ý: Nh ững bi ến dùng để cài đặt thu ật toán cho m ột hàm thì ta nên khai báo bi ến này là bi ến c ục b ộ, n ếu bi ến c ục b ộ và bi ến toàn c ục mà trùng tên nhau thì máy s ẽ ưu tiên bi ến c ục b ộ tr ước  Các bi ến được khai báo bên trong hai d ấu “(“ và ”)” sau tên hàm được g ọi là các đối c ủa hàm. • Đối ki ểu tham tr ị  Đối s ố có ki ểu d ữ li ệu là giá tr ị thì s ẽ được truy ền giá tr ị vào cho hàm. Điều này có ngh ĩa r ằng khi m ột đố i t ượng có ki ều là giá tr ị được truy ền vào cho m ột hàm, thì có m ột b ản sao chép đố i t ượng đó được tạo ra bên trong hàm. M ột khi làm được th ực hi ện xong thì đối t ượng sao chép này s ẽ được h ủy. Ki ểud ữli ệu TênHàm(Ki ểud ữ li ệu Tên đối1,Ki ểud ữ li ệu Tên đối2, ) Ví d ụ 3: static double Mu(double x,int n) + Trong l ời g ọi hàm thì giá tr ị c ủa tham s ố th ực s ự s ẽ được chuy ển vào cho đối s ố ki ểu tham tr ị. Vì ch ỉ truy ền giá tr ị nên n ếu bên trong hàm có thay đổi giá tr ị c ủa các đối s ố thì sau khi thoát kh ỏi hàm giá tr ị c ủa các tham s ố th ực s ự không b ị thay đổ i + Ta có th ể truy ền vào m ột h ằng s ố trong l ời g ọi hàm KHOA CÔNG NGH Ệ THÔNG TIN 63
  67. Bài 3: Ch ươ ng trình con trong C# Ví d ụ 4: Nh ập vào hai s ố a, b tìm ước s ố chung c ủa hai s ố. class Program { static void Main( string [] args) { Console.Write( "Nhap vao so a: " ); int a = int .Parse(Console.ReadLine()); Console.Write( "Nhap vao so b: " ); int b = int.Parse(Console.ReadLine()); Console.WriteLine( "Gia tri a và b vua nhap là: a= {0},b={1}" , a, b); Console.WriteLine( "Uoc so chung nho nhat cua a và b la: {0}" , UocChung(a, b)); Console.WriteLine( "Gia tri a và b sau khi goi ham là: a= {0},b={1}" , a, b); Console.Read(); } static int UocChung( int a, int b) { while (a != b) { if (a > b) a = a - b; if (b > a) b = b - a; } Console.WriteLine( "Gia tri a và b trong ham khi tinh là: a= {0},b={1}" , a, b); return a; } } KHOA CÔNG NGH Ệ THÔNG TIN 64
  68. Bài 3: Ch ươ ng trình con trong C# Kết qu ả sau khi th ực hi ện: • Đối ki ểu tham chi ếu Ngôn ng ữ C# còn cung c ấp kh ả n ăng cho phép ta truy ền các đố i t ượng có ki ều giá tr ị d ưới hình th ức là tham chi ếu. Ngôn ng ữ C# đưa ra m ột b ổ sung tham s ố là ref cho phép truy ền các đố i t ượng giá tr ị vào trong ph ươ ng th ức theo ki ểu tham chi ếu. Ki ểud ữli ệu TênHàm( ref Ki ểud ữli ệu Tên đối1, ref Ki ểud ữli ệu Tên đối2, ) Ví d ụ 5: static void HoanVi(ref int x, ref int y) + Ta không th ể chuy ển vào m ột h ằng s ố trong l ời g ọi hàm + Tr ước khi g ọi hàm thì tham s ố th ực s ự ph ải được kh ởi gán + Khi g ọi hàm thì ph ải có t ừ khóa ref phía tr ước tham s ố th ực s ự + Trong l ời g ọi hàm thì địa ch ỉ c ủa tham s ố th ực s ự s ẽ được chuy ển vào cho đối số ki ểu tham chi ếu c ủa hàm. Vì v ậy sau khi thoát kh ỏi hàm thì giá tr ị c ủa tham s ố th ực s ự bị thay đổ i n ếu trong hàm ta thay đổi giá tr ị c ủa đố i s ố mà tham s ố th ực s ự truy ền vào. Nh ững hàm ch ỉ có th ể tr ả v ề duy nh ất m ột giá tr ị, m ặc dù giá tr ị này có - th ể là m ột tập h ợp các giá tr ị. N ếu chúng ta mu ốn hàm tr ả v ề nhi ều h ơn m ột giá tr ị thì cách th ực hi ện là t ạo các tham s ố d ưới hình th ức tham chi ếu. Khi đó trong hàm ta s ẽ x ử lý và gán các giá tr ị m ới cho các tham s ố tham chi ếu này, k ết qu ả là sau khi hàm th ực hi ện xong ta dùng các tham s ố truy ền vào nh ư là các k ết qu ả tr ả v ề. Ví d ụ 6: Nh ập vào hai s ố a, b, tìm ước s ố chung b ội s ố chung c ủa hai s ố class Program { //USCLN và USCNN static void Main( string [] args) { KHOA CÔNG NGH Ệ THÔNG TIN 65
  69. Bài 3: Ch ươ ng trình con trong C# Console.Write( "Nhap vao so a: "); int a = int .Parse(Console.ReadLine()); Console.Write( "Nhap vao so b: " ); int b = int .Parse(Console.ReadLine()); Console.WriteLine( "Gia tri a và b vua nhap là: a= {0},b={1}" , a, b); int us = 0, bs = 0; UocBoi(a, b, ref us, ref bs); Console.WriteLine( "Uoc so chung LON nhat cua a và b la: {0}" ,us); Console.WriteLine( "Boi so chung NHO nhat cua a và b la: a= {0}" , bs); Console.Read(); } static void UocBoi( int a, int b, ref int uc, ref int bc) { int a1 = a, b1 = b; while (a != b) { if (a > b) a = a - b; if (b > a) b = b - a; } uc = a; bc = ( int )((a1 * b1) / uc); } } Kết qu ả sau khi th ực hi ện: KHOA CÔNG NGH Ệ THÔNG TIN 66
  70. Bài 3: Ch ươ ng trình con trong C# • Đổi ki ểu tham chi ếu ch ỉ nh ận giá tr ị Ngôn ng ữ C# b ắt bu ộc ph ải th ực hi ện m ột phép gán cho bi ến tr ước khi s ử d ụng, do đó khi khai báo m ột bi ến nh ư ki ều c ơ b ản thì tr ước khi có l ệnh nào s ử d ụng các bi ến này thì ph ải có l ệnh th ực hi ện vi ệc gán giá tr ị xác đị nh cho bi ến Để m ở r ộng cho yêu c ầu trong tr ường h ợp này ngôn ng ữ C# cung c ấp thêm m ột b ổ sung tham chi ếu là out. Khi s ử d ụng tham chi ếu out thì yêu c ầu b ắt bu ộc ph ải kh ởi t ạo các tham s ố tham chi ếu được b ỏ qua. Các tham s ố này không cung c ấp b ất c ứ thông tin nào cho ph ươ ng th ức mà ch ỉ đơn gi ản là c ơ ch ế nh ận thông tin và đư a ra bên ngoài. Do vậy ta có th ể đánh d ấu t ất c ả các tham s ố tham chi ếu này là out , khi đó ta s ẽ gi ảm được công vi ệc ph ải kh ởi t ạo các bi ến này tr ước khi đưa vào ph ươ ng th ức. Lưu ý là bên trong ph ươ ng th ức có các tham s ố tham chi ếu out thì các tham s ố này ph ải được gán giá tr ị tr ước khi tr ở v ề Ki ểud ữli ệu TênHàm(out Ki ểud ữli ệu Tên đốil, out Ki ểud ữ li ệu Tên đối2, ) Ví d ụ 7: static void Ham(int x,int y, out int phannguyenm, out int phandu) Các đối c ủa hàm có nguyên t ắc ho ạt độ ng gi ống nh ư bi ến c ục b ộ. Khi xây d ựng m ột hàm chúng ta ph ải bi ết được hàm c ủa chúng ta c ần bao nhiêu đối, đố i đó thu ộc ki ểu gì? + Ta không th ể chuy ền vào m ột h ằng s ố trong l ời g ọi hàm + Tr ước khi g ọi hàm thì tham s ố th ực s ự không c ần ph ải kh ởi gán + Khi g ọi hàm thì ph ải có t ừ khóa out phía tr ước tham s ố th ực s ự + Trong l ời g ọi hàm thì địa ch ỉ c ủa tham s ố th ực s ự s ẽ được chuy ền vào cho đối s ố ki ểu tham chi ếu c ủa hàm. Vì v ậy sau khi thoát kh ỏi hàm thì giá tr ị c ủa tham s ố th ực s ự bị thay đổ i n ếu trong hàm ta thay đổi giá tr ị c ủa đố i s ố mà tham s ố th ực s ự truy ền vào. Ví d ụ 8: Nh ập vào hai s ố a, b, tìm ước s ố chung b ội s ố chung c ủa hai s ố class Program KHOA CÔNG NGH Ệ THÔNG TIN 67
  71. Bài 3: Ch ươ ng trình con trong C# { //USCLN và USCNN static void Main( string [] args) { Console.Write( "Nhap vao so a: " ); int a = int .Parse(Console.ReadLine()); Console.Write( "Nhap vao so b: " ); int b = int .Parse(Console.ReadLine()); Console.WriteLine( "Gia tri a và b vua nhap là: a= {0},b={1}" , a, b); int us, bs; UocBoi(a, b, out us, out bs); Console.WriteLine( "Uoc so chung LON nhat cua a và b la: {0}" ,us); Console.WriteLine( "Boi so chung NHO nhat cua a và b la: a= {0}" , bs); Console.Read(); } static void UocBoi( int a, int b, out int uc, out int bc) { int a1 = a, b1 = b; while (a != b) { if (a > b) a = a - b; if (b > a) b = b - a; } uc = a; bc = ( int )((a1 * b1) / uc); } } KHOA CÔNG NGH Ệ THÔNG TIN 68
  72. Bài 3: Ch ươ ng trình con trong C# Kết qu ả sau khi th ực hi ện: 3.3. C ấu trúc m ột hàm Hàm là m ột đơn v ị độ c c ủa ch ươ ng trình, do v ậy khi đị nh ngh ĩa m ột hàm chúng ta không được đị nh ngh ĩa m ột hàm bên trong m ột hàm khác. M ột hàm có d ạng t ổng quát nh ư sau: Ki ểud ữli ệu TênHam(Danh sách các đối s ố) { //Các câu l ệnh trong thân hàm [return bi ểu th ức]; } Trong đó: + Ki ểu d ữ li ệu c ủa hàm có th ể là các ki ểu d ữ li ệu c ơ s ở, các ki ểu d ữ li ệu do ng ười dùng định ngh ĩa. N ếu hàm không có giá tr ị tr ả v ề thì ta khai báo hàm tr ả v ề ki ểu void. Nếu hàm tr ả v ề m ột giá tr ị thu ộc ki ểu d ữ li ệu c ụ th ể nào đó thì tr ước khi k ết thúc hàm ta ph ải gán giá tr ị cho hàm b ằng câu l ệnh return Bi ểuTh ức. Khi g ặp câu l ệnh này máy sẽ tính toán giá tr ị c ủa bi ểu th ức được bao nhiêu gán cho tên hàm và thoát kh ỏi hàm. + Tên hàm là m ột tên do ng ười dùng định ngh ĩa và ph ải tuân th ủ theo nguyên t ắc đặt tên và đặt làm sao nó mang ý ngh ĩa phù h ợp v ới công vi ệc c ủa hàm. + Danh sách các tham đối có th ể là các ki ểu đố i nh ư đã nêu ở trên, n ếu có nhi ều đố i gi ữa các đố i đặ t cách nhau b ởi d ấu ph ẩy. N ếu nh ư hàm không có đối | thì chúng ta v ẫn ph ải vi ết hai d ấu “(“và”)” sau tên hàm + Ph ần thân c ủa hàm b ắt đầ u b ằng d ấu { và k ết thúc b ằng d ấu } và ở gi ữa là các câu lệnh th ực hi ện yêu c ầu c ủa hàm. KHOA CÔNG NGH Ệ THÔNG TIN 69
  73. Bài 3: Ch ươ ng trình con trong C# 3.4. Nguyên t ắc ho ạt độ ng Nh ư ở trên chúng ta đã tìm hi ểu m ỗi hàm có th ể có đố i ho ặc không. N ếu nh ư hàm có đối thì sau khi xây d ựng xong chúng ta có th ể g ọi chúng ra th ực hi ện. M ỗi m ột đố i ta ph ải truy ền cho nó m ột tham s ố t ươ ng ứng tu ỳ thu ộc đố i đó là ki ểu gì.  Nếu đố i là ki ểu tham tr ị tr ước tiên máy sẽ c ấp phát b ộ nh ớ cho đố i ki ểu tham tr ị đó, sau đó ti ến hành sao chép giá tr ị c ủa tham s ố th ực th ụ v ới nó đưa vào đối này. T ừ đó ta th ấy tham s ố th ực th ụ t ươ ng ứng v ới đố i có ki ểu tham tr ị có th ể là m ột h ằng, m ột bi ến, m ột bi ểu th ức và có ki ểu t ươ ng ứng. B ởi vì đối ki ểu tham tr ị khi mà hàm ch ứa đối này được g ọi ra th ực hi ện thì nó được c ấp phát b ộ nh ớ riêng sau đó sao chép giá tr ị của tham s ố th ực th ụ t ươ ng ứng v ới nó đưa vào và sau đó máy ti ến hành các thao tác trên đối này mà không làm ảnh h ưởng t ới tham s ố th ực th ụ t ươ ng ứng v ới nó và c ũng bởi vì nó ch ỉ sao chép giá tr ị c ủa tham s ố th ực th ụ t ươ ng ứng v ới nó do v ậy tham s ố th ực th ụ t ươ ng ứng v ới nó c ứ cho m ột giá tr ị là được. Vì v ậy tham s ố th ực th ụ t ươ ng ứng v ới đố i ki ểu tham tr ị có th ể là hàng, bi ến, bi ểu th ức mi ễn là có cùng ki ểu. Ghi chú : Theo nh ững phân tích ở trên nh ững đố i ch ỉ nh ằm m ục đích cung c ấp d ữ li ệu đầ u vào cho hàm thì chúng ta khai báo đối đó là đối ki ểu tham  Nếu đố i là ki ểu tham chi ếu đố i này s ẽ tham chi ếu t ới tham s ố t ươ ng ứng v ới nó. Ngh ĩa là trong thân hàm khi ta thao tác trên đối tham chi ếu này th ực ch ất là thao tác trên tham s ố truy ền vào t ươ ng ứng v ới đố i này. Do v ậy m ọi thay. đổ i giá tr ị c ủa đố i tham chi ếu c ũng đồ ng ngh ĩa v ới vi ệc thay đổ i giá tr ị c ủa tham s ố t ươ ng ứng truy ền vào. Điều này ch ứng t ỏ r ằng tham s ố t ươ ng ứng v ới đố i là ki ểu tham chi ếu ph ải là m ột bi ến hay ph ần t ử c ủa m ảng có bi ểu t ươ ng ứng và khi hàm ch ứa đố i ki ểu tham chi ếu này k ết thúc thì tham s ố t ươ ng ứng v ới nó l ưu l ại được s ự thay đổ i khi ra kh ỏi hàm. Trong C# có hai lo ại đố i ki ểu tham chi ếu đó là: đối ki ểu tham chi ếu ref và đối ki ểu tham chi ếu out. N ếu đố i là ki ểu tham chi ếu ref thì tham s ố t ươ ng ứngv ới nó ph ải được kh ởi gán giá tr ị tr ước khi truy ền vào và nó có th ể tham gia tính toán trong các bi ểu th ức. N ếu đổi là ki ểu tham chi ếu out thì tham s ố t ươ ng ứng v ới nó không c ần kh ởi t ạo giá tr ị ban đầ u, chính vì l ẽ đó nó ch ỉ dùng để nh ận giá tr ị và không được tham gia tính toán trong các bi ểu th ức. Ghi chú: Theo nh ững phân tích ở trên nh ững đố i dùng để cung c ấp d ữ li ệu đầ u vào cho hàm và đồng th ời l ưu l ại được s ự thay đổ i khi chúng ta tác độ ng trên nh ững đố i này, nh ững đố i nh ư v ậy thì chúng ta khai báo đổi ki ểu tham chi ếu(ref). Nh ững đố i ch ỉ nh ằm m ục đích nh ận giá tr ị khi ra kh ỏi hàm thì nh ững đố i này chúng ta khai báo đối theo ki ểu tham chi ếu out. KHOA CÔNG NGH Ệ THÔNG TIN 70
  74. Bài 3: Ch ươ ng trình con trong C# Tham s ố truy ền vào cho đối tham chi ếu ph ải kèm theo hai t ừ khoá ref ho ặc out tươ ng ứng v ới đố i ki ểu tham chi ếu ref và đối ki ểu tham chi ếu out. Ví d ụ 1: Nh ấp vào ba s ố nguyên d ươ ng sau đó ti ến hành s ắp x ếp ba s ố nguyên đó theo th ứ t ự t ăng d ần. class Program { static void swap( ref int x, ref int y) { int tg = x; x = y; y = tg; } static void Main( string [] args) { Console.Write( "Nhap vao so a: " ); int a = int .Parse(Console.ReadLine()); Console.Write( "Nhap vao so b: " ); int b = int .Parse(Console.ReadLine()); Console.Write( "Nhap vao so c: " ); int c = int .Parse(Console.ReadLine()); if (a > b) swap( ref a, ref b); if (a > c) swap( ref a, ref c); if (b > c) swap( ref b, ref c); Console.WriteLine( "a={0}\tb={1}\tc={2}" , a, b, c); Console.Read(); } } KHOA CÔNG NGH Ệ THÔNG TIN 71
  75. Bài 3: Ch ươ ng trình con trong C# Kết qu ả sau khi th ực hi ện: 3.5. Cách g ọi hàm Trong cùng m ột l ớp m ột hàm có quy ền g ọi các hàm khác ra s ử d ụng(th ứ t ự các hàm trong cùng m ột l ớp là không quan trong), m ột hàm có th ể g ọi chính nó ra th ực hi ện. Ta gọi đó là g ọi đệ quy, đệ quy và gi ải thu ật đệ quy chúng ta s ẽ nghiên c ứu trong các tài li ệu khác, ở đây tôi ch ỉ gi ới thi ệu s ơ b ộ v ề cách g ọi đệ quy trong vi ệc xây d ựng m ột hàm trong C# thông qua m ột ví d ụ nh ư sau: Ví d ụ 1: Xây d ựng ch ươ ng trình tính giá tr ị c ủa bi ểu th ức sau: S=x/1!+x 2/2!+x 3/3!+ +x n/n! class Program { static double x; static int n; static void nhap() { Console.Write( "Nhap vao so x: " ); x = double .Parse(Console.ReadLine()); Console.Write( "Nhap vao so b: " ); n = int .Parse(Console.ReadLine()); } static double Mu( double x, int n) { if (n == 0) return 1; KHOA CÔNG NGH Ệ THÔNG TIN 72
  76. Bài 3: Ch ươ ng trình con trong C# else return x * Mu(x, n - 1); } static double GiaiThua( int n) { if (n == 0) return 1; else return n * GiaiThua(n - 1); } static void Main( string [] args) { double s = 0; nhap(); for (int i = 1; i <= n; i++) s = s + Mu(x, i) / GiaiThua(i); Console.WriteLine( "S={0:N2}" , s); Console.Read(); } } Kết qu ả sau khi th ực hi ện: KHOA CÔNG NGH Ệ THÔNG TIN 73
  77. Bài 3: Ch ươ ng trình con trong C# 3.6. Bài t ập áp d ụng 1. Vi ết ch ươ ng trình gi ải ph ươ ng trình b ậc 2. 2. Tạo m ột Console Application để vi ết ch ươ ng trình nh ập vào n và tính S=1+2+3+ .+n 3. Trong Console Application đã t ạo, t ạo thêm m ột project, nh ập n và tính S=1-2+3- 4+ +(-1)n. 4. Trong Console Application đã t ạo, t ạo thêm m ột project, nh ập n và tính T=1x2x3x xn=n! 5. Tạo m ột Console Application đã t ạo, thêm 1 project, nh ập vào n và tính S=1 2/1+2 2/2+3 2/3+ +n 2/n KHOA CÔNG NGH Ệ THÔNG TIN 74
  78. Bài 4: Windows Forms BÀI 4: WINDOWS FORMS Gi ới thi ệu: Trong ngôn ng ữ l ập trình C# trong môi tr ường windows Application cho phép ng ười dùng s ử d ụng m ột s ố điều khi ển (control) h ỗ tr ợ trong thi ết k ế và x ử lý tạo nên ứng d ụng. Mục tiêu: - Trình bày được các ch ức n ăng c ủa các điều khi ển trong C# - Sử d ụng được các thu ộc tính trong các điều khi ển. Nội dung chính: 4.1. Gi ới thi ệu v ề Windows Applications 4.1.1. Gi ới thi ệu − Windows applications được th ể hi ện trong ch ế độ giao di ện đồ h ọa và th ỏa mãn các t ươ ng tác c ủa ng ười s ử d ụng. − .Net cung c ấp WinForm và các điều khi ển khác qua l ớp c ơ s ở trong namespace System.Windows.Forms. − Khi ng ười dùng th ực hi ện m ột thao tác v ới bi ểu m ẫu ho ặc m ột trong các điều khi ển, hành động s ẽ t ạo ra m ột s ự ki ện. Ứng d ụng của b ạn ph ản ứng v ới các s ự ki ện này b ằng cách s ử d ụng mã và x ử lý các s ự ki ện khi chúng x ảy ra. − Windows Forms ch ứa nhi ều lo ại điều khi ển mà b ạn có th ể thêm vào bi ểu m ẫu: điều khi ển hi ển th ị h ộp v ăn b ản, nút, h ộp th ả xu ống, nút radio và th ậm chí các trang Web. N ếu m ột điều khi ển hi ện có không đáp ứng nhu c ầu c ủa b ạn, Windows Forms cũng h ỗ tr ợ t ạo điều khi ển tùy ch ỉnh c ủa riêng b ạn b ằng cách s ử dụng lớp UserControl . − Với tính n ăng kéo và th ả Windows Forms Designer trong Visual Studio, b ạn có th ể d ễ dàng t ạo các ứng d ụng Windows Forms. Ch ỉ c ần ch ọn các điều khi ển b ằng con tr ỏ c ủa b ạn và thêm chúng vào v ị trí b ạn mu ốn trên bi ểu m ẫu. Để thi ết k ế m ột windows application – bạn c ần: − Tạo m ột Windows Application trong Visual Studio.Net và thêm System.Windows.Forms và System.Drawing. − Tạo m ột l ớp m ới để bi ểu di ễn WinForm và d ẫn xu ất t ừ System.Windows.Forms.Form. Integrated Development Enviroment (IDE) KHOA CÔNG NGH Ệ THÔNG TIN 75
  79. Bài 4: Windows Forms − Visual studio.Net cung c ấp r ất nhi ều các công c ụ để tr ợ giúp cho vi ệc phát tri ển các ứng d ụng và gi ảm l ược các công vi ệc của ng ười l ập trình. − Visual studio.Net cung c ấp b ộ biên t ập mã chu ẩn cho t ất c ả các ứng d ụng .Net. IntelliSense and Hot Compiler − IntelliSense đư a ra kh ả n ăng cho trình so ạn th ảo nh ững tùy ch ọn khác nhau trong t ừng ng ữ c ảnh l ập trình. − Hot compiler đánh d ấu các l ỗi cú pháp c ủa ch ươ ng trình trong khi gõ code. 4.1.2. T ạo m ới giao di ện ứng d ụng Môi tr ường phát tri ển tích h ợp Visual Studio (IDE), b ạn s ẽ t ạo m ột ứng d ụng C # đơ n gi ản có giao di ện ng ười dùng (UI) d ựa trên Windows. Đầu tiên, b ạn s ẽ t ạo m ột d ự án ứng d ụng C # : Bước 1: M ở Visual Studio 2019 Bước 2: Ch ọn Create a new project Hình 4-1 Giao di ện t ạo m ới project Bước 3: Trên Project t ạo m ới, ch ọn Windows Forms App (.NET Framework) cho C # KHOA CÔNG NGH Ệ THÔNG TIN 76