Tài liệu này dành cho sinh viên, giáo viên khối ngành công nghệ thông tin tham khảo và có những bài học bổ ích hơn, bổ trợ cho việc tìm kiếm tài liệu, giáo án, giáo trình, bài giảng các môn học khối ngành công nghệ thông tin
Trang 1trường đại học sư phạm kỹ thuật hưng yên
Khoa công nghệ thông tin
đề cương bài giảng
Môn: Cơ sở kỹ thuật lập trình với C#
Trang 2Contents
Bài 1: Tổng quan về ngôn ngữ lập trình C# 5
1.1 Tổng quan về ngôn ngữ lập trình C# 5
1.2 Cấu trúc một chương trình C# đơn giản 11
BàI 2: CáC KHáI NIệM CƠ BảN Và MÔI TRƯờNG PHáT TRIểN 12
2.1 Một số khái niệm cơ bản 12
2.2 Visual C# 2005 Express Edition 17
2.2.1 Tạo một ứng dụng Console 17
2.2.2 Lưu một ứng dụng C# 18
2.2.3 Thờm một tệp tin cs 18
BàI 3: CáC THàNH PHầN CƠ BảN TRONG NGễN NGữ C# 20
3.1 Các phần tử cơ bản của một ngôn ngữ lập trình 20
3.1.1 Bảng chữ cỏi 20
3.1.2 Từ khúa 20
3.1.3 Tờn (ủịnh danh) 20
3.2 Các kiểu dữ liệu cơ bản 21
3.2.1 Kiểu nguyờn 22
3.2.2 Kiểu thực 23
3.2.3 Kiểu ký tự 24
3.2.4 Kiểu logic 24
3.2.5 Kiểu xõu(chuỗi) 25
3.3 Biến, hằng và cách khai báo 25
3.3.1 Biến 25
3.3.2 Hằng 26
3.4 Các phép toán 29
3.4.1 Phộp toỏn số học 29
3.4.2 Phộp toỏn quan hệ 30
3.4.3 Phộp toỏn logic 30
3.4.4 Phộp toỏn tăng giảm 31
3.4.5 Thứ tự ưu tiờn cỏc phộp toỏn 31
3.5 Biểu thức 33
3.5.1 Biểu thức số học 33
3.5.2 Biểu thức logic 33
3.5.3 Biểu thức ủiều kiện 33
3.5.4 Biểu thức gỏn 34
3.5.5 Biểu thức ộp kiểu 35
BàI 4 : MộT Số HàM CHứC NĂNG THƯờNG DùNG TRONG CHƯƠNG 36
Trang 34.2 Nhập/xuất dữ liệu 37
4.2.1 ðưa dữ liệu ra màn hỡnh 37
4.2.2 Nhập dữ liệu vào từ bàn phớm 38
BàI 5: BàI THựC HàNH Về CáC THàNH PHầN CƠ BảN 40
BàI 6: CấU TRúC Rẽ NHáNH 40
6.1 Khối lệnh 40
6.2 Các cấu trúc rẽ nhánh 41
6.2.1 Cấu trỳc rẽ nhỏnh if 41
6.2.2 Cấu trỳc rẽ nhỏnh switch 45
Bài 7: BàI THựC HàNH Về CấU TRúC Rẽ NHáNH 48
BàI 8: CấU TRúC LặP WHILE, DO…WHILE 48
8.1 Cấu trúc lặp while 48
8.2 Cấu trúc lặp do while 49
BàI 9: CấU TRúC LặP FOR Và MộT Số LệNH ĐIềU KHIểN KHáC 52
9.1 Cấu trúc lặp for 52
9.2 Toán tử break và continue 56
9.2.1 Cõu lệnh break 56
9.2.2 Cõu lệnh continue 57
BàI 11: CHƯƠNG TRìNH CON 59
11.1 Đặt vấn đề 59
11.2 Ví dụ một chương trình có sử dụng hàm 59
11.3 Phạm vi hoạt động của biến 60
11.4 Cấu trúc một hàm 65
4.6 Nguyên tắc hoạt động của hàm và cách truyền tham số cho hàm 66
4.7 Định nghĩa chồng hàm 69
4.8 Cách gọi hàm 70
BàI 14: KHáI NIệM Về MảNG, MảNG MộT CHIềU 72
14.1 Kiểu dữ liệu giá trị và kiểu dữ liệu tham chiếu 72
14.2 Khái niệm 73
14.3 Mảng một chiều 73
14.3.1 Khai bỏo và tạo mảng 73
14.3.2 Truy nhập vào cỏc phần tử của mảng: 77
14.3.3 Cỏc thao tỏc trờn mảng 77
14.3.4 Vớ dụ ỏp dụng 77
BàI 16: MảNG ĐA CHIềU 88
16.1 Mảng đa chiều cùng kích thước 88
16.1.1 Khai bỏo và tạo mảng 88
16.1.2 Cỏch truy xuất cỏc phần tử mảng 89
16.1.3 Cỏc thao tỏc trờn mảng 89
16.1.4 Vớ dụ ỏp dụng 91
Trang 416.2 M¶ng ®a chiÒu kh«ng cïng kÝch th−íc 97
BµI 19 : KIÓU D÷ LIÖU X¢U Cã NéI DUNG Cè §ÞNH (STRING) 100
19.1 Khai b¸o vµ sö dông 101
19.2 C¸c bµi to¸n xö lý trªn String 105
BµI 20 : KIÓU D÷ LIÖU X¢U VíI NéI DUNG THAY §æI §¦îC 116
20.1 Khai b¸o vµ sö dông 116
20.2 C¸c bµi to¸n xö lý trªn StringBuilder 117
BµI 22: KIÓU D÷ LIÖU Cã CÊU TRóC 122
22.1 Kh¸i niÖm vÒ cÊu tróc 122
22.2 Khai b¸o cÊu tróc 122
22.3 C¸c truy xuÊt c¸c thµnh phÇn cña cÊu tróc 123
22.4 VÝ dô ¸p dông 123
BµI 23: KIÓU D÷ LIÖU LIÖT K£ & TËP HîP 127
23.1 TËp hîp vµ danh s¸ch liªn kÕt 127
BµI 25: HÖ THèNG NHËP XUÊT TH¦êNG DïNG TRONG C# 128
25.1 Giíi thiÖu vÒ hÖ thèng nhËp xuÊt cña C# 128
25.2 C¸c líp nhËp xuÊt tËp tin 129
BµI 26: NHËP XUÊT VíI TÖP TIN V¡N B¶N 130
26.1 Sö dông c¸c líp nhËp xuÊt tÖp tin v¨n b¶n 130
Trang 5§Ò c−¬ng c¬ së kü thuËt lËp tr×nh
Bµi 1: Tæng quan vÒ ng«n ng÷ lËp tr×nh C#
1.1 Tæng quan vÒ ng«n ng÷ lËp tr×nh C#
Ngôn ngữ C# khá ñơn giản, chỉ khoảng 80 từ khóa và hơn mười mấy kiểu
dữ liệu ñược xây dựng sẵn Tuy nhiên, ngôn ngữ C# có ý nghĩa cao khi nó thực thi những khái niệm lập trình hiện ñại C# bao gồm tất cả những hỗ trợ cho cấu trúc, thành phần component, lập trình hướng ñối tượng Những tính chất ñó hiện diện trong một ngôn ngữ lập trình hiện ñại và ñược phát triển bởi Microsoft, là phần khởi ñầu cho kế hoạch NET của họ Tên của ngôn ngữ bao gồm ký tự thăng theo Microsoft nhưng theo ECMA là C#, chỉ bao gồm dấu số thường Microsoft phát triển C# dựa trên C++ và Java C# ñược miêu tả là ngôn ngữ có ñược sự cân bằng giữa C++, Visual Basic, Delphi và Java
C# theo một hướng nào ñó là ngôn ngữ lập trình phản ánh trực tiếp nhất ñến NET Framework mà tất cả các chương trình NET chạy, và nó phụ thuộc mạnh mẽ vào Framework này Các loại dữ liệu cơ sở là những ñối tượng, hay ñược gọi là garbage-collected, và nhiều kiểu trừu tượng khác chẳng hạn như class, delegate, interface, exception, v.v, phản ánh rõ ràng những ñặc trưng của NET runtime
So sánh với C và C++, ngôn ngữ này bị giới hạn và ñược nâng cao ở một vài ñặc ñiểm nào ñó, nhưng không bao gồm các giới hạn sau ñây:
Các con trỏ chỉ có thể ñược sử dụng trong chế ñộ không an toàn Hầu hết các ñối tượng ñược tham chiếu an toàn, và các phép tính ñều ñược kiểm tra tràn
bộ ñệm Các con trỏ chỉ ñược sử dụng ñể gọi các loại kiểu giá trị; còn những ñối tượng thuộc bộ thu rác (garbage-collector) thì chỉ ñược gọi bằng cách tham chiếu
+ Các ñối tượng không thể ñược giải phóng tường minh
+ Chỉ có ñơn kế thừa, nhưng có thể cài ñặt nhiều interface trừu tượng (abstract interfaces) Chức năng này làm ñơn giản hóa sự thực thi của thời gian thực thi
+ C# thì an-toàn-kiểu (typesafe) hơn C++
+ Cú pháp khai báo mảng khác nhau("int[] a = new int[5]" thay vì "int a[5]")
+ Kiểu thứ tự ñược thay thế bằng tên miền không gian (namespace) + C# không có tiêu bản
Trang 6+ Có thêm Properties, các phương pháp có thể gọi các Properties ñể truy cập dữ liệu
+ Có reflection
Tại sao phải sử dụng ngôn ngữ C#
Nhiều người tin rằng không cần thiết có một ngôn ngữ lập trình mới Java, C++, Perl, Microsoft Visual Basic, và những ngôn ngữ khác ñược nghĩ rằng ñã cung cấp tất cả những chức năng cần thiết
Ngôn ngữ C# là một ngôn ngữ ñược dẫn xuất từ C và C++, nhưng nó ñược tạo từ nền tảng phát triển hơn Microsoft bắt ñầu với công việc trong C và C++ và thêm vào những ñặc tính mới ñể làm cho ngôn ngữ này dễ sử dụng hơn Nhiều trong số những ñặc tính này khá giống với những ñặc tính có trong ngôn ngữ Java Không dừng lại ở ñó, Microsoft ñưa ra một số mục ñích khi xây dựng ngôn ngữ này Những mục ñích này ñược ñược tóm tắt như sau:
- C# là ngôn ngữ ñơn giản
- C# là ngôn ngữ hiện ñại
- C# là ngôn ngữ hướng ñối tượng
C# là ngôn ngữ ñơn giản
C# loại bỏ một vài sự phức tạp và rối rắm của những ngôn ngữ như Java
và C++, bao gồm việc loại bỏ những macro, những template, ña kế thừa, và lớp
cơ sở ảo (virtual base class)
Chúng là những nguyên nhân gây ra sự nhầm lẫn hay dẫn ñến những vấn
ñề cho các người phát triển C++ Nếu chúng ta là người học ngôn ngữ này ñầu tiên thì chắc chắn là ta sẽ không trải qua những thời gian ñể học nó! Nhưng khi
ñó ta sẽ không biết ñược hiệu quả của ngôn ngữ C# khi loại bỏ những vấn ñề trên
Ngôn ngữ C# ñơn giản vì nó dựa trên nền tảng C và C++ 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 Ví dụ như, trong C++ có ba toán tử làm việc với các thành viên là ::, , và -> ðể biết khi nào dùng ba toán tử này cũng phức tạp và
Trang 7dễ nhầm lẫn Trong C#, chúng ñược thay thế với một toán tử duy nhất gọi là (dot) ðối với người mới học thì ñiều này và những việc cải tiến khác làm bớt nhầm lẫn và ñơn giản hơn
Ghi chú: Nếu chúng ta ñã sử dụng Java và tin rằng nó ñơn giản, thì chúng ta cũng sẽ tìm thấy rằng C# cũng ñơn giản Hầu hết mọi người ñều không tin rằng Java là ngôn ngữ ñơn giản Tuy nhiên, C# thì dễ hơn là Java và C++
C# là ngôn ngữ hiện ñại
ðiều gì làm cho một ngôn ngữ hiện ñại? Những ñặc tính như là xử lý ngoại lệ, thu gom bộ nhớ tự ñộng, những kiểu dữ liệu mở rộng, và bảo mật mã nguồn là những ñặc tính ñược mong ñợi trong một ngôn ngữ hiện ñại C# chứa tất cả những ñặc tính trên Nếu là người mới học lập trình có thể chúng ta sẽ cảm thấy những ñặc tính trên phức tạp và khó hiểu Tuy nhiên, cũng ñừng lo lắng chúng ta sẽ dần dần ñược tìm hiểu những ñặc tính qua các chương trong cuốn sách này
Ghi chú: Con trỏ ñược tích hợp vào ngôn ngữ C++ Chúng cũng là nguyên nhân gây ra những rắc rối của ngôn ngữ này C# loại bỏ những phức tạp
và rắc rối phát sinh bởi con trỏ Trong C#, bộ thu gom bộ nhớ tự ñộng và kiểu
dữ liệu an toàn ñược tích hợp vào ngôn ngữ, sẽ loại bỏ những vấn ñề rắc rối của C++
C# là ngôn ngữ hướng ñối tượng
Những ñặc ñiểm chính của ngôn ngữ hướng ñối tượng (Object-oriented language) là sự ñóng gói (encapsulation), sự kế thừa (inheritance), và ña hình (polymorphism) C# hỗ trợ tất cả những ñặc tính trên Phần hướng ñối tượng của C# sẽ ñược trình bày chi tiết trong một chương riêng ở phần sau
C# là ngôn ngữ mạnh mẽ và cũng mềm dẻo
Như ñã ñề cập trước, với ngôn ngữ C# chúng ta chỉ bị giới hạn ở chính bởi bản thân hay là trí tưởng tượng của chúng ta Ngôn ngữ này không ñặt những ràng buộc lên những việc có thể làm C# ñược sử dụng cho nhiều các dự
án khác nhau như là tạo ra ứng dụng xử lý văn bản, ứng dụng ñồ họa, bản tính, hay thậm chí những trình biên dịch cho các ngôn ngữ khác
C# là ngôn ngữ ít từ khóa
C# là ngôn ngữ sử dụng giới hạn những từ khóa Phần lớn các từ khóa ñược sử dụng ñể mô tả thông tin Chúng ta có thể nghĩ rằng một ngôn ngữ có nhiều từ khóa thì sẽ mạnh hơn ðiều này không phải sự thật, ít nhất là trong trường hợp ngôn ngữ C#, chúng ta có thể tìm thấy rằng ngôn ngữ này có thể
Trang 8ñược sử dụng ñể làm bất cứ nhiệm vụ nào Bảng sau liệt kê các từ khóa của ngôn ngữ C#
C# là ngôn ngữ hướng module
Mã nguồn C# có thể ñược viết trong những phần ñược gọi là những lớp, những lớp này chứa các phương thức thành viên của nó Những lớp và những phương thức có thể ñược sử dụng lại trong ứng dụng hay các chương trình khác Bằng cách truyền các mẫu thông tin ñến những lớp hay phương thức chúng ta có thể tạo ra những mã nguồn dùng lại có hiệu quả
C# sẽ là một ngôn ngữ phổ biến
C# là một trong những ngôn ngữ lập trình mới nhất Vào thời ñiểm cuốn sách này ñược viết, nó không ñược biết như là một ngôn ngữ phổ biến Nhưng ngôn ngữ này có một số lý do ñể trở thành một ngôn ngữ phổ biến Một trong những lý do chính là Microsoft và sự cam kết của NET Microsoft muốn ngôn ngữ C# trở nên phổ biến Mặc dù một công ty không thể làm một sản phẩm trở nên phổ biến, nhưng nó có thể hỗ trợ Cách ñây không lâu, Microsoft ñã gặp sự thất bại về hệ ñiều hành Microsoft Bob Mặc dù Microsoft muốn Bob trở nên phổ biến nhưng thất bại C# thay thế tốt hơn ñể ñem ñến thành công sơ với Bob Thật sự là không biết khi nào mọi người trong công ty Microsoft sử dụng Bob trong công việc hằng ngày của họ Tuy nhên, với C# thì khác, nó ñược sử dụng bởi Microsoft Nhiều sản phẩm của công ty này ñã chuyển ñổi và viết lại bằng
Trang 9C# Bằng cách sử dụng ngôn ngữ này Microsoft ñã xác nhận khả năng của C# cần thiết cho những người lập trình
Micorosoft NET là một lý do khác ñể ñem ñến sự thành công của C# .NET là một sự thay ñổi trong cách tạo và thực thi những ứng dụng Ngoài hai lý
do trên ngôn ngữ C# cũng sẽ trở nên phổ biến do những ñặc tính của ngôn
ngữ này ñược ñề cập trong mục trước như: ñơn giản, hướng ñối tượng, mạnh mẽ
Ngôn ngữ C# và những ngôn ngữ khác
Chúng ta ñã từng nghe ñến những ngôn ngữ khác như Visual Basic, C++
và Java Có lẽ chúng ta cũng tự hỏi sự khác nhau giữa ngôn ngữ C# và nhưng ngôn ngữ ñó Và cũng tự hỏi tại sao lại chọn ngôn ngữ này ñể học mà không chọn một trong những ngôn ngữ kia Có rất nhiều lý do và chúng ta hãy xem một số sự so sánh giữa ngôn ngữ C# với những ngôn ngữ khác giúp chúng ta phần nào trả lời ñược những thắc mắc Microsoft nói rằng C# mang ñến sức mạnh của ngôn ngữ C++ với sự dễ dàng của ngôn ngữ Visual Basic Có thể nó không dễ như Visual Basic, nhưng với phiên bản Visual Basic.NET (Version 7) thì ngang nhau Bởi vì chúng ñược viết lại từ một nền tảng Chúng ta có thể viết nhiều chương trình với ít mã nguồn hơn nếu dùng C#
Mặc dù C# loại bỏ một vài các ñặc tính của C++, nhưng bù lại nó tránh ñược những lỗi mà thường gặp trong ngôn ngữ C++ ðiều này có thể tiết kiệm ñược hàng giờ hay thậm chí hàng ngày trong việc hoàn tất một chương trình Chúng ta
sẽ hiểu nhiều về ñiều này trong các chương của giáo trình
Một ñiều quan trọng khác với C++ là mã nguồn C# không ñòi hỏi phải có tập tin header Tất cả mã nguồn ñược viết trong khai báo một lớp
Như ñã nói ở bên trên NET runtime trong C# thực hiện việc thu gom bộ nhớ tự ñộng Do ñiều này nên việc sử dụng con trỏ trong C# ít quan trọng hơn trong C++ Những con trỏ cũng có thể ñược sử dụng trong C#, khi ñó những ñoạn mã nguồn này sẽ ñược ñánh dấu là không an toàn (unsafe code)
C# cũng từ bỏ ý tưởng ña kế thừa như trong C++ Và sự khác nhau khác
là C# ñưa thêm thuộc tính vào trong một lớp giống như trong Visual Basic Và những thành viên của lớp ñược gọi duy nhất bằng toán tử “.” khác với C++ có nhiều cách gọi trong các tình huống khác nhau
Một ngôn ngữ khác rất mạnh và phổ biến là Java, giống như C++ và C# ñược phát triển dựa trên C Nếu chúng ta quyết ñịnh sẽ học Java sau này, chúng
ta sẽ tìm ñược nhiều cái mà học từ C# có thể ñược áp dụng
Trang 10ðiểm giống nhau C# và Java là cả hai cùng biên dịch ra mã trung gian: C# biên dịch ra MSIL còn Java biên dịch ra bytecode Sau ñó chúng ñược thực hiện bằng cách thông dịch hoặc biên dịch just-in-time trong từng máy ảo tương ứng
Tuy nhiên, trong ngôn ngữ C# nhiều hỗ trợ ñược ñưa ra ñể biên dịch mã ngôn ngữ trung gian sang mã máy C# chứa nhiều kiểu dữ liệu cơ bản hơn Java
và cũng cho phép nhiều sự mở rộng với kiểu dữ liệu giá trị Ví dụ, ngôn ngữ C#
hỗ trợ kiểu liệt kệ (enumerator), kiểu này ñược giới hạn ñến một tập hằng ñược ñịnh nghĩa trước, và kiểu dữ liệu cấu trúc ñây là kiểu dữ liệu giá trị do người dùng ñịnh nghĩa Chúng ta sẽ ñược tìm hiểu kỹ hơn về kiểu dữ liệu tham chiếu
và kiểu dữ liệu giá trị sẽ ñược trình bày trong phần sau
Tương tự như Java, C# cũng từ bỏ tính ña kế thừa trong một lớp, tuy nhiên mô hình kế thừa ñơn này ñược mở rộng bởi tính ña kế thừa nhiều giao diện
Các bước chuẩn bị cho chương trình
Thông thường, trong việc phát triển phần mềm, người phát triển phải tuân thủ theo quy trình phát triển phần mềm một cách nghiêm ngặt và quy trình này
ñã ñược chuẩn hóa Tuy nhiên trong phạm vi của chúng ta là tìm hiểu một ngôn ngữ mới và viết những chương trình nhỏ thì không ñòi hỏi khắt khe việc thực hiện theo quy trình Nhưng ñể giải quyết ñược những vấn ñề thì chúng ta cũng cần phải thực hiện ñúng theo các bước sau ðầu tiên là phải xác ñịnh vấn ñề cần giải quyết Nếu không biết rõ vấn ñề thì ta không thể tìm ñược phương pháp giải quyết Sau khi xác ñịnh ñược vấn ñề, thì chúng ta có thể nghĩ ra các kế hoạch ñể thực hiện Sau khi có một kế hoạch, thì có thể thực thi kế hoạch này Sau khi kế hoạch ñược thực thi, chúng ta phải kiểm tra lại kết quả ñể xem vấn ñề ñược giải quyết xong chưa Logic này thường ñược áp dụng trong nhiều lĩnh vực khác nhau, trong ñó có lập trình
Khi tạo một chương trình trong C# hay bất cứ ngôn ngữ nào, chúng ta nên theo những bước tuần tự sau:
- Xác ñịnh mục tiêu của chương trình
- Xác ñịnh những phương pháp giải quyết vấn ñề
- Tạo một chương trình ñể giải quyết vấn ñề
- Thực thi chương trình ñể xem kết quả
Ví dụ mục tiêu ñể viết chương trình xử lý văn bản ñơn giản, mục tiêu chính là xây dựng chương trình cho phép soạn thảo và lưu trữ những chuỗi ký tự hay văn bản Nếu không có mục tiêu thì không thể viết ñược chương trình hiệu quả
Trang 11Bước thứ hai là quyết ủịnh ủến phương phỏp ủể viết chương trỡnh Bước này xỏc ủịnhn những thụng tin nào cần thiết ủược sử dụng trong chương trỡnh, cỏc hỡnh thức nào ủược sử dụng Từ những thụng tin này chỳng ta rỳt ra ủược phương phỏp ủể giải quyết vấn ủề
Bước thứ ba là bước cài ủặt, ở bước này cú thể dựng cỏc ngụn ngữ khỏc nhau ủể cài ủặt, tuy nhiờn, ngụn ngữ phự hợp ủể giải quyết vấn ủề một cỏch tốt nhất sẽ ủược chọn Trong phạm vi của sỏch này chỳng ta mặc ủịnh là dựng C#, ủơn giản là chỳng ta ủang tỡm hiểu nú!
Và bước cuối cựng là phần thực thi chương trỡnh ủể xem kết quả
1.2 Cấu trúc một chương trình C# đơn giản
Từ vớ dụ trờn ta nhận thấy rằng một chương trỡnh C# ủơn giản cú ớt nhất
là một lớp Mỗi lớp ủược bắt ủầu bằng từ khoỏ class kế ủú là tờn lớp( tờn lớp do chỳng ta ủặt và phải tuõn thủ theo nguyờn tắc ủặt tờn, bờn trong một lớp ta cú thể khai bỏo cỏc biến(thành phần dữ liệu) và cỏc hàm(phương thức)) Trong số cỏc hàm bờn trong lớp cú một hàm tờn là Main, hàm này cú ủặc ủiểm khi một chương trỡnh C# ủược gọi ra thực hiện thỡ mỏy sẽ tiến hành thực hiện từ cõu lệnh ủầu tiờn của hàm Main và khi màn Main kết thỳc thỡ chương trỡnh C# cũng kết thỳc ðiều ủú chứng tỏ hàm Main là hàm chớnh của chương trỡnh C# Một chương trỡnh C# muốn thực hiện ủược thỡ phải cú một hàm Main và chỉ cú duy nhất một hàm Main trong toàn bộ hệ thống chương trỡnh và hàm này sẽ gọi cỏc hàm khỏc ra ủể thực hiện yờu cầu bài toỏn Hàm Main ủược khai bỏo như sau: Dạng 1: (Khụng cú tham số)
static void Main( )
{
// Cỏc cõu lệnh }
Dạng 2: (Cú tham số)
static void Main(string[] tờn_biến)
{
// Cỏc cõu lệnh }
Trang 12BµI 2: C¸C KH¸I NIÖM C¥ B¶N Vµ M¤I TR¦êNG PH¸T TRIÓN 2.1 Mét sè kh¸i niÖm c¬ b¶n
Ghi chú: 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
Trong ví dụ ở mục 1.2 có một dòng chú thích :
// Xuat ra man hinh
Một chuỗi chú thích trên một dòng thì bắt ñầu bằng ký tự “//” Khi trình biên dịch gặp hai ký tự này thì sẽ bỏ qua dòng ñó
Trang 13Ngoài ra C# còn cho phép kiểu chú thích cho một hay nhiều dòng, và ta phải khai báo “/*” ở phần ñầu chú thích và kết thúc chú thích là ký tự “*/”
Ví dụ 1 : Minh họa dùng chú thích trên nhiều dòng
class ChaoMung
{
static void Main()
{
/* Xuat ra man hinh chuoi ‘Hello World’
Su dung ham WriteLine cua lop System.Console
///XML Chú thích tài liệu 1 dòng ñịnh dạng theo XML
/**XML Chú thích nhiều dòng ñịnh dạng theo XML**/
Ứng dụng Console: Là cách xây dựng ứng dụng giao tiếp với người dù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 ứng dụ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 hai ứ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 World”
Trang 14namespase: Không gian tên giúp sắp xếp các lớp và hạn chế xung ñột tên, trong một namespase có thể chứa các subnamespase và các lớp
Cách khai báo:
using ten_NameSpace.SubNameSpace… SubNameSpace;
Trang 15- Ta có thể khai báo sử dụng namespase System như sau:
Trang 16Kết quả:
ðoạn chương trình trên khi biên dịch sẽ ñược thông báo một lỗi như sau:
error CS0138: A using namespace directive can only be applied to namespace;
‘System.Console’ is a class not a namespace
-
Cách biểu diễn namespace có thể làm giảm nhiều thao tác gõ bàn phím, nhưng
nó có thể sẽ không ñem lại lợi ích nào bởi vì nó có thể làm xáo trộn những namespace có tên không khác nhau Giải pháp chung là chúng ta sử dụng từ khóa using với các namespace ñã ñược xây dựng sẵn, các namespace do chúng
ta tạo ra, những namespace này chúng ta ñã nắm chắc các thành phần về nó Còn ñối với namespace do các hãng thứ ba cung cấp thì chúng ta không nên dùng
// Thay vi sử dụng System.Console ta sử dụng Viet
Viet.WriteLine("Nhap vao so can tinh n!!");
Trang 172.2 Visual C# 2005 Express Edition
2.2.1 Tạo một ứng dụng Console
ðể tạo chương trình chào mừng trong IDE, lựa chọn mục Visual Studio NET trong menu Start hoặc icon của nó trên desktop, sau khi khởi ñộng xong chương trình, chọn tiếp Menu FileNew Project Chức năng này sẽ gọi cửa
sổ New Project (Hình 1.5.1-1 bên dưới) Nếu như chương trình Visual Studio NET ñược chạy lần ñầu tiên, khi ñó cửa sổ New Project sẽ xuất hiện tự ñộng mà không cần phải kích hoạt
Lưu ý rằng Visual Studio NET tạo ra một namespace dựa trên tên của project mà ta vừa cung cấp (DauTay), và thêm vào chỉ dẫn sử dụng namespace System bằng lệnh using, bởi hầu như mọi chương trình mà chúng ta viết ñều cần
sử dụng các kiểu dữ liệu chứa trong namespace System
4 ðặt tên cho ứng dụng
5 Hoàn thành tạo ứng dụng
Hình 2.2 - 1: Tạo ứng dụng kiểu Console
Trang 18Visual Studio NET tạo một lớp tên là Program, lớp này chúng ta có thể tùy
ý ñổi tên của chúng Khi ñổi tên của lớp, tốt nhất là ñổi tên luôn tập tin chứa lớp
ñó (Program.cs) Giả sử trong ví dụ trên chúng ta ñổi tên của lớp thành LopChay, và ñổi tên tập tin Program.cs (ñổi tên tập tin trong cửa sổ Solution Explorer, nhấn chuột phải nên tệp tin cần ñổi tên và chọn Rename)
Chúng ta có thể xóa tất cả các câu lệnh mà chương trình tạo cho chúng ta và viết code của ứng dụng theo ý muốn (miễn là ñúng cấu trúc)
+ Nhấn F5 : Chạy chương trình có Debug
Hình 2.2 -2: Cửa sổ soạn thảo code
Nhấn vào nút này lưu
thông tin của tệp hiện
hành lên ñĩa (Ctrl + S)
Nhấn vào nút này ñể lưu thông tin của tất
cả các tệp lên ñĩa (Ctrl + Shift + S)
Trang 19+ Nhấn F6: Dịch chương trình
Trang 20BµI 3: C¸C THµNH PHÇN C¥ B¶N TRONG NGÔN NG÷ C# 3.1 C¸c phÇn tö c¬ b¶n cña mét ng«n ng÷ lËp tr×nh
3.1.1 Bảng chữ cái
Mỗi ngôn ngữ lập trình ñều ñược xây dựng từ một bộ ký tự nào ñó Các
ký tự ñược nhóm lại theo nhiều cách khác nhau ñể lập lên các từ ðến lượt mình các từ ñược liên kết theo một chính quy nào ñó ñể tạo thành các câu lệnh Một chương trình bao gồm nhiều câu lệnh và diễn ñạt một thuật toán ñể giải một bài toán nào ñó
Ngôn ngữ C# ñược xây dựng trên bộ ký tự sau:
Các chữ cái hoa: A B C Z Các chữ cái thường: a b c z Các chữ số: 0 1 2 9
Các kí hiệu toán học: + - * / = < >
Các dấu ngoặc: [ ] { } ( ) Các ký hiệu ñặc biệt khác: , ; : / ? @ # $ % ^ & ‘ “
Các dấu ngăn cách không nhìn thấy như dấu cách, dấu nhảy cách tab, dấu xuống dòng
Dấu gạch nối dưới: _
3.1.2 Từ khóa
Là những từ ñược ngôn ngữ lập trình sử dụng vào một mục ñích nào ñó
nó có một ý nghĩa hoàn toàn xác ñịnh trong chương trình:
Ví dụ: void, struct, class, while,
+ Không ñược dùng từ khoá ñể ñặt tên cho các hằng, biến, mảng, hàm + Từ khoá phải viết bằng chữ thường
Ví dụ:
+ Từ khóa viết ñúng: void
+ Từ khóa viết sai: Void
3.1.3 Tên (ñịnh danh)
Tên gọi của các thành phần trong chương trình ñược gọi là ñịnh danh(Identifier) ðịnh danh ñược sử dụng ñể xác ñịnh các thành phần như biến , kiểu, phương thức(method) hay còn ñược gọi là hàm, ñối tượng, lớp
Trong C# ñịnh danh là một dãy các ký tự gồm các chữ cái, chữ số và một
Trang 21Khi ñặt tên phải tuân thủ theo chính quy:
+ Không chứa dấu cách
+ Không bắt ñầu bằng số
+ Không chứa các ký tự ñặc biệt (như: % ? / + =,…)
+ Không trùng với từ khóa, kiểu dữ liệu
Chú ý: C# phân biệt chữ hoa và chữ thường, ví dụ TONG và tong là hai ñịnh danh khác nhau ðộ dài(số ký tự) của ñịnh danh trong C# về mặt lý thuyết là không giới hạn
Ví dụ:
+ Các ñịnh danh viết ñúng: tong_le, b1
+ Các ñịnh danh viết sai: 1b, tong le, void, tong*,
ðể trở thành một nhà lập trình chuyên nghiệp, chúng ta nên sử dụng cách ñặt tên theo một chuẩn nhất ñịnh ñể dễ phân biệt ñược các loại khác nhau của các thành phần sử dụng Chúng ta qui ước cách ñặt tên thống nhất như sau:
+ ðịnh danh cho các lớp: chữ cái ñầu của mỗi từ trong ñịnh danh ñều viết hoa, ví dụ MyClass, HocSinh
+ ðịnh danh cho biến, phương thức, ñối tượng: chữ cái ñầu của mỗi ñịnh danh ñều ñược viết hoa trừ từ ñầu tiên, ví dụ bienTong, tinhTong,
+ ðịnh danh cho hằng ta viết hoa, ví dụ: MAX, PI
3.2 C¸c kiÓu d÷ liÖu c¬ b¶n
C# là ngôn ngữ lập trình mạnh về kiểu dữ liệu, một ngôn ngữ mạnh về kiểu dữ liệu là phải khai báo kiểu của mỗi ñối tượng khi tạo (kiểu số nguyên, số thực, kiểu chuỗi, kiểu ñiều khiển ) và trình biên dịch sẽ giúp cho người lập trình không bị lỗi khi chỉ cho phép một loại kiểu dữ liệu có thể ñược gán cho các kiểu dữ liệu khác Kiểu dữ liệu của một ñối tượng là một tín hiệu ñể trình biên dịch nhận biết kích thước của một ñối tượng (kiểu int có kích thước là 4 byte) và khả năng của nó (như một ñối tượng button có thể vẽ, phản ứng khi nhấn, )
Tương tự như C++ hay Java, C# chia thành hai tập hợp kiểu dữ liệu chính: Kiểu xây dựng sẵn (built-in) mà ngôn ngữ cung cấp cho người lập trình
và kiểu ñược người dùng ñịnh nghĩa (user-defined) do người lập trình tạo ra
C# phân tập hợp kiểu dữ liệu này thành hai loại: Kiểu dữ liệu giá trị (value) và kiểu dữ liệu tham chiếu (reference) Việc phân chi này do sự khác nhau khi lưu kiểu dữ liệu giá trị và kiểu dữ liệu tham chiếu trong bộ nhớ ðối với một kiểu dữ liệu giá trị thì sẽ ñược lưu giữ kích thước thật trong bộ nhớ ñã
Trang 22cấp phát là stack Trong khi ñó thì ñịa chỉ của kiểu dữ liệu tham chiếu thì ñược lưu trong stack nhưng ñối tượng thật sự thì lưu trong bộ nhớ heap
Nếu chúng ta có một ñối tượng có kích thước rất lớn thì việc lưu giữ chúng trên bộ nhớ heap rất có ích, trong chương 4 sẽ trình bày những lợi ích và bất lợi khi làm việc với kiểu dữ liệu tham chiếu, còn trong chương này chỉ tập trung kiểu dữ kiểu cơ bản hay kiểu xây dựng sẵn
Ghi chú: Tất cả các kiểu dữ liệu xây dựng sẵn là kiểu dữ liệu giá trị ngoại trừ các ñối tượng và chuỗi Và tất cả các kiểu do người dùng ñịnh nghĩa ngoại trừ kiểu cấu trúc ñều là kiểu dữ liệu tham chiếu
Ngoài ra C# cũng hỗ trợ một kiểu con trỏ C++, nhưng hiếm khi ñược sử dụng, và chỉ khi nào làm việc với những ñoạn mã lệnh không ñược quản lý (unmanaged code) Mã lệnh không ñược quản lý là các lệnh ñược viết bên ngoài nền MS.NET, như là các ñối tượng COM
Kiểu dữ liệu xây dựng sẵn: Ngôn ngữ C# ñưa ra các kiểu dữ liệu xây dựng sẵn rất hữu dụng, phù hợp với một ngôn ngữ lập trình hiện ñại, mỗi kiểu dữ liệu ñược ánh xạ ñến một kiểu dữ liệu ñược hỗ trợ bởi hệ thống xác nhận ngôn ngữ chung (Common Language Specification: CLS) trong MS.NET Việc ánh xạ các kiểu dữ liệu nguyên thuỷ của C# ñến các kiểu dữ liệu của NET sẽ ñảm bảo các ñối tượng ñược tạo ra trong C# có thể ñược sử dụng ñồng thời với các ñối tượng ñược tạo bởi bất cứ ngôn ngữ khác ñược biên dịch bởi NET, như VB.NET Mỗi kiểu dữ liệu có một sự xác nhận và kích thước không thay ñổi, không giống như C++, int trong C# luôn có kích thước là 4 byte bởi vì nó ñược ánh xạ từ kiểu Int32 trong NET
Sau ñây chúng ta ñi tìm hiểu chi tiết một sô kiểu dữ liệu dựng sẵn có trong C#:
3.2.1 Kiểu nguyên
Dùng ñể lưu trữ các giá trị nguyên trong giới hạn cho phép tuỳ thuộc vào từng kiểu dữ liệu nguyên cụ thể Trong ngôn ngữ C# có một số kiểu dữ liệu nguyên sau:
Kiểu C# Số
sbyte 1 Sbyte Số nguyên có dấu ( từ -128 ñến 127)
short 2 Int16 Số nguyên có dấu giá trị từ -32768 ñến
Trang 2332767 ushort 2 Uint16 Số nguyên không dấu 0 – 65.535
2.147.483.647 uint 4 Uint32 Số nguyên không dấu 0 – 4.294.967.295
long 8 Int64 Kiểu số nguyên có dấu có giá trị trong
khoảng : -9.223.370.036.854.775.808 ñến 9.223.372.036.854.775.807
ulong 8 Uint64 Số nguyên không dấu từ 0 ñến
18,446,744,073,709,551,615 Thông thường ñể chọn một kiểu dữ liệu nguyên ñể sử dụng như short, int hay long thường dựa vào ñộ lớn của giá trị muốn sử dụng Ví dụ, một biến ushort có thể lưu giữ giá trị từ 0 ñến 65.535, trong khi biến ulong có thể lưu giữ giá trị từ 0 ñến 18,446,744,073,709,551,615, do ñó tùy vào miền giá trị của phạm vi sử dụng biến mà chọn các kiểu dữ liệu thích hợp nhất Kiểu dữ liệu int thường ñược sử dụng nhiều nhất trong lập trình vì với kích thước 4 byte của nó cũng ñủ ñể lưu các giá trị nguyên cần thiết
Kiểu số nguyên có dấu thường ñược lựa chọn sử dụng nhiều nhất trong kiểu số trừ khi có lý do chính ñáng ñể sử dụng kiểu dữ liệu không dấu
Cách tốt nhất khi sử dụng biến không dấu là giá trị của biến luôn luôn dương, biến này thường thể hiện một thuộc tính nào ñó có miền giá trị dương
Ví dụ khi cần khai báo một biến lưu giữ tuổi của một người thì ta dùng kiểu byte (số nguyên từ 0-255) vì tuổi của người không thể nào âm ñược
3.2.2 Kiểu thực
Dùng ñể lưu trữ các giá trị thực trong giới hạn cho phép tuỳ thuộc vào từng kiểu dữ liệu thực cụ thể Trong ngôn ngữ C# có một số kiểu dữ liệu thực sau:
Kiểu C# Số
float 4 Single Kiểu dấu chấm ñộng, giá trị xấp xỉ từ
3,4E-38 ñến 3,4E+38, với 7 chữ số có nghĩa
double 8 Double Kiểu dấu chấm ñộng có ñộ chính xác gấp
ñôi, giá trị xấp xỉ từ 1,7E-308 ñến
Trang 241,7E+308, với 15,16 chữ số có nghĩa
decimal 8 Decimal Có ñộ chính xác ñến 28 con số và giá trị
thập phân, ñược dùng trong tính toán tài chính, kiểu này ñòi hỏi phải có hậu tố “m” hay “M” theo sau giá trị
Kiểu float, double, và decimal ñưa ra nhiều mức ñộ khác nhau về kích thước cũng như ñộ chính xác.Với thao tác trên các phân số nhỏ thì kiểu float là thích hợp nhất Tuy nhiên lưu ý rằng trình biên dịch luôn luôn hiểu bất cứ một
số thực nào cũng là một số kiểu double trừ khi chúng ta khai báo rõ ràng ðể gán một số kiểu float thì số phải có ký tự f theo sau
Một hằng ký tự ñược bao trong dấu nháy ñơn
char k=’c’;
Kiểu C# Số
3.2.4 Kiểu logic
Dùng ñể biểu diễn các giá trị logic và chỉ chứa một trong hai giá trị true và false
Kiểu C# Số
bool 1 Boolean Giá trị logic true/ false
Trang 25
3.2.5 Kiểu xâu(chuỗi)
Kiểu dữ liệu chuỗi khá thân thiện với người lập trình trong bất cứ ngôn ngữ lập trình nào, kiểu dữ liệu chuỗi lưu giữ một dãy các ký tự ðể khai báo một chuỗi chúng ta sử dụng từ khoá string tương tự như cách tạo một thể hiện của bất cứ ñối tượng nào:
string tenchuoi;
Một hằng chuỗi ñược tạo bằng cách ñặt các chuỗi trong dấu nháy ñôi:
“Xin chao”
ðây là cách chung ñể khởi tạo một chuỗi ký tự với giá trị hằng:
string chuoi = “Xin chao”;
Kiểu chuỗi sẽ ñược ñề cập sâu trong phần sau
3.3 BiÕn, h»ng vµ c¸ch khai b¸o
3.3.1 Biến
Biến là yếu tố cơ bản của bất kỳ ngôn ngữ máy tính nào Biến là vùng trống trong bộ nhớ máy tính dành cho một kiểu dữ liệu nào ñó và có ñặt tên Các biến trong bộ nhớ ở các thời ñiểm khác nhau có thể cất giữ các giá trị khác nhau Trước khi sử dụng một biến nào ñó phải khai báo nó Chính quy khai báo:
Kiểu 1: Khai báo biến không có giá trị khởi ñầu
Trang 27liên quan ñến nhiệt ñộ sôi, hay nhiệt ñộ ñông của nước, chương trình cần khai báo hai biến là DoSoi và DoDong, nhưng không cho phép giá trị của hai biến này bị thay ñổi hay bị gán ðể ngăn ngừa việc gán giá trị khác, ta phải sử dụng biến kiểu hằng
ðược viết theo hai cách sau:
- Dạng thập phân gồm: Phần nguyên, dấu chấm thập phân, phần thập phân
Là một ký hiệu trong bảng mã Unicode ñược ñặt trong hai dấu nháy ñơn Giá trị của hằng kí tự chính là mã Unicode của kí hiệu
Ví dụ: ‘A’ hay ‘\u0041’
Ký tự ‘A’ có giá trị 65 trong bảng Unicode, ñổi giá trị 65 hệ thập phân sang hệ thập lục phân ta ñược giá trị là 41
Trang 28Một số ký tự ñặc biệt:
const kieu_du_kieu ten_hang = gia_tri_hang;
Một hằng phải ñược khởi tạo khi khai báo, và chỉ khởi tạo duy nhất một lần trong suốt chương trình và không ñược thay ñổi
Ví dụ: const int DOSOI = 100;
Trong khai báo trên, 100 là một hằng số và DOSOI là tên hằng có kiểu nguyên
Ví dụ: minh họa việc sử dụng những biểu tượng hằng
class HangSo
{
static void Main()
{
const int DOSOI = 100; // ðộ C
const int DODONG = 0; // ðộ C
System.Console.WriteLine( “Do dong cua nuoc {0}”, DODONG );
System.Console.WriteLine( “Do soi cua nuoc {0}”, DOSOI );
}
}
-
Kết quả:
Trang 29Do dong cua nuoc 0
Do soi cua nuoc 100
- Phép toán % trả về phần dư của phép chia
Trang 303.4.2 Phép toán quan hệ
Những toán tử quan hệ ñược dùng ñể so sánh giữa hai giá trị, và sau ñó trả
về kết quả là một giá trị logic kiểu bool (true hay false) Ví dụ toán tử so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn hơn giá trị bên phải của toán tử Do vậy 5 > 2 trả về một giá trị là true, trong khi 2 > 5 trả về giá trị false
Các toán tử quan hệ trong ngôn ngữ C# ñược trình bày ở bảng bên dưới
! Phép phủ ñịnh một ngôi (not) !(3>1) false
&&
Liên kết hai biểu thức logic Phép và (and) Giá trị bằng 1 khi cả 2 toán hạng có giá trị 1
(2>1)&&(5=2) false
||
Liên kết hai biểu thức logic
Phép hoặc (or) Giá trị biểu thức bằng 1 khi một trong hai toán hạng bằng 1
(4>3)||(1>8) true
Bảng giá trị của các phép toán logic
Trang 31true true true true false
3.4.4 Phép toán tăng giảm
Trong ngôn ngữ lập trình C# ñưa ra hai phép toán một ngôi ñể tăng và giảm các biến kiểu (nguyên và thực) Toán tử tăng ++ sẽ thêm 1 vào toán hạng của nó, toán tử giảm – sẽ trừ ñi 1
Dấu phép toán ++ và có thể ñứng trước hoặc ñứng sau toán hạng Như vậy ta có thể viết: ++n, n++, n, n
Sự khác nhau của ++n và n++ ở chỗ: Trong phép toán n++ thì n tăng sau khi giá trị của nó ñược sử dụng, còn trong ++n thì giá trị của n tăng trước khi giá trị của nó ñược sử dụng Tương tự ñối với n và n
Ví dụ: giả sử trước mỗi phép tính int i=3, j=15;
Trang 32Trình biên dịch phải xác ñịnh thứ tự thực hiện các toán tử trong trường hợp một biểu thức có nhiều phép toán, giả sử, có biểu thức sau:
var1 = 5+7*3;
Biểu thức trên có ba phép toán ñể thực hiện bao gồm (=, +,*) Ta thử xét các phép toán theo thứ tự từ trái sang phải, ñầu tiên là gán giá trị 5 cho biến var1, sau ñó cộng 7 vào 5 là 12 cuối cùng là nhân với 3, kết quả trả về là 36, ñiều này thật sự có vấn ñề, không ñúng với mục ñích yêu cầu của chúng ta Do vậy việc xây dựng một trình tự xử lý các toán tử là hết sức cần thiết
Các luật về ñộ ưu tiên xử lý sẽ bảo trình biên dịch biết ñược toán tử nào ñược thực hiện trước trong biểu thức.Tương tự như trong phép toán ñại số thì phép nhân có ñộ ưu tiên thực hiện trước phép toán cộng, do vậy 5+7*3 cho kết quả là 26 ñúng hơn kết quả 36 Và cả hai phép toán cộng và phép toán nhân ñiều
có ñộ ưu tiên cao hơn phép gán Như vậy trình biên dịch sẽ thực hiện các phép toán rồi sau ñó thực hiện phép gán ở bước cuối cùng Kết quả ñúng của câu lệnh trên là biến var1 sẽ nhận giá trị là 26
Trong ngôn ngữ C#, dấu ngoặc ñược sử dụng ñể thay ñổi thứ tự xử lý, ñiều này cũng giống trong tính toán ñại số Khi ñó muốn kết quả 36 cho biến var1 có thể viết:
Trang 33Các phép toán ñược liệt kê cùng loại sẽ có thứ tự theo mục thứ thự của bảng: thứ tự trái tức là ñộ ưu tiên của các phép toán từ bên trái sang, thứ tự phải thì các phép toán có ñộ ưu tiên từ bên phải qua trái Các toán tử khác loại thì có
ñộ ưu tiên từ trên xuống dưới, do vậy các toán tử loại cơ bản sẽ có ñộ ưu tiên cao nhất và phép toán gán sẽ có ñộ ưu tiên thấp nhất trong các toán tử
3.5 BiÓu thøc
3.5.1 Biểu thức số học
Biểu thức số học ñó là sự kết hợp giữa các toán hạng với các toán tử số học
và cho ta kết quả là một số(số thực hoặc số nguyên)
Ví dụ: (3+5)*6/4-2.4
3.5.2 Biểu thức logic
Biểu thức logic ñó là sự kết hợp giữa các toán hạng với các toán tử(toán tử
số học, toán tử quan hệ, toán tử logic) v à kết quả cho ta là một giá trị logic Biểu thức logic ñược dùng làm ñiều kiện trong các cấu trúc ñiều khiển(if,
while, ) và một số trường hợp khác
Ví dụ: (1>=2)&&(5==4)
3.5.3 Biểu thức ñiều kiện
Hầu hết các toán tử ñòi hỏi có một toán hạng như toán tử (++, ) hay hai toán hạng như (+,-,*,/, ) Tuy nhiên, C# còn cung cấp thêm một toán tử có ba toán hạng (?:) Toán tử này có cú pháp sử dụng như sau:
<Biểu thức ñiều kiện > ? <Biểu thức thứ 1> : <Biểu thức thứ 2>
Toán tử này sẽ xác ñịnh giá trị của một biểu thức ñiều kiện, và biểu thức ñiều kiện này phải trả về một giá trị kiểu bool Khi ñiều kiện ñúng thì <biểu thức thứ 1> sẽ ñược thực hiện, còn ngược lại ñiều kiện sai thì <biểu thức thứ 2> sẽ ñược thực hiện Có thể diễn giải theo ngôn ngữ tự nhiên thì toán tử này có ý nghĩa :
“Nếu ñiều kiện ñúng thì làm công việc thứ nhất, còn ngược lại ñiều kiện sai thì làm công việc thứ hai” Cách sử dụng toán tử ba ngôi này ñược
minh họa trong ví dụ sau
-
using System;
Trang 343.5.4 Biểu thức gán
Trong C# dùng dấu “=” làm dấu phép gán Biểu thức gán có thể ñược thể hiện dưới các dạng như sau:
Biến = Biểu_thức Biến op = Biểu_thức
Cá ch viết dưới tương ñương Biến = (biến) op (Biểu_thức) trong ñó op là một toán tử nào ñó Giá trị của Biểu_thức sẽ ñược gán cho biến sau câu lệnh này
Ví dụ: x + = y tương ñương với x = x+y
Nếu ta thêm dấu ; vào sau biểu thức gán sẽ thu ñược một câu lệnh gán Biểu thức gán có thể ñược sử dụng trong các phép toán và các câu lệnh như các biểu thức thông thường Chẳng hạn khi viết: a=b=5; thì ñiều ñó có nghĩa rằng gán giá trị của biểu thức b=5 cho biến a Kết quả là b=5 và a=5 Tương tự sau câu lệnh: x = (a=5) * (b=10); sẽ gán 5 cho a, 10 cho b và sau ñó gán tiếp 50 cho x
Trang 353.5.5 Biểu thức ép kiểu
Những ñối tượng của một kiểu dữ liệu này có thể ñược chuyển sang những ñối tượng của một kiểu dữ liệu khác thông qua cơ chế chuyển ñổi tường minh hay ngầm ñịnh Chuyển ñổi nhầm ñịnh ñược thực hiện một cách tự ñộng, trình biên dịch sẽ thực hiện công việc này Còn chuyển ñổi tường minh diễn ra khi chúng ta gán ép một giá trị cho kiểu dữ liệu khác
Việc chuyển ñổi giá trị ngầm ñịnh ñược thực hiện một cách tự ñộng và ñảm bảo là không mất thông tin và tuân theo chính quy sau:
Ví dụ: Chúng ta có thể gán một biến kiểu char cho một biến kiểu int, trình biên dịch sẽ chuyển ñổi kiểu một cách ngầm ñịnh từ kiểu char sang kiểu int
char x = ‘A’;
int y = x; // chuyển ñổi ngầm ñịnh (y sẽ có giá trị 65)
Tuy nhiên, nếu chúng ta thực hiện chuyển ñổi ngược lại thì trình biên dịch sẽ báo lỗi Trình biên dịch sẽ không thực hiện việc chuyển ñổi ngầm ñịnh từ số kiểu int sang kiểu char
int y =65;
char x = y// Trình biên dịch không chuyển ñổi ngầm ñịnh
Khi biên dịch trình biên dịch trả về thông báo lỗi:
char x = (char)y ; // Ép kiểu tường minh, trình biên dịch không báo lỗi
Trong một biểu thức mà có nhiều kiểu dữ liệu khác nhau, trước khi tính toán máy sẽ chuyển từ kiểu thấp hơn lên kiểu cao hơn theo sơ ñồ như ở trên
Trang 36y=4-x; /*Khi biên dịch sẽ bị lỗi, vì 4-x sẽ cho kiểu int và không thể gán cho biến kiểu short*/
Các hàm toán học: ðể sử dụng ñược các hàm toán học dưới ñây thì trước mỗi hàm ta phải ñưa thêm Math trước mỗi tên hàm cần sử dụng:
Abs(x) Trả về giá trị tuyệt ñối của một số thực, nguyên,
Cos(x) Trả về giá trị của Cos(x)
Sin(x) Trả về giá trị của Sin(x)
Exp(x) Trả về giá trị của ex
Log(x) Trả về giá trị của Ln(x)
Log10(x) Trả về giá trị của log10(x)
Pow(x,y) Trả về giá trị của xy
Round(x,n) Làm tròn số thực x với ñộ chính xác là n chữ số
phập phân Sqrt(x) Trả về căn bậc hai của x
Floor(x) Trả về gía trị lớn nhất hay bằng giá trị ñưa ra
Trang 37
Các hàm chuyển ñổi: ðể sử dụng ñược các hàm chuyển ñổi dưới ñây thì
trước mỗi hàm ta phải ñưa thêm Convert trước mỗi tên hàm cần sử dụng:
ToDouble(x) Chuyển ñối tượng x thành kiểu thực double
ToInt32(x) Chuyển ñối tươợng x thành kiểu int
ToString(x) Chuyển ñối tượng x thành xâu
ðể ñưa dữ liệu ra màn hình chúng ta dùng phương thức Write( ) hoặc
WriteLine( ) trong lớp Console
- Ta có thể ñưa ra màn hình một số nguyên, thực, ký tự, xâu ký tự, logic trực tiếp như sau:
Trang 38ở cách thứ hai này ta có thể phát biểu một cách tổng quát như sau:
Console.Write(dòng diều khiển[, danh sách ñối]);
Trong ñó:
dòng diều khiển: là một hằng xâu ký tự ñặt trong hai dấu “ ”, nó bao gồm các loại ñối tượng sau: Các ký tự thông thường, các ký tự ñặc biệt và các ñặc tả có dạng: {i,-j:dt } có thể ñặt bất kỳ ở vị trí nào trong xâu với: i là thứ tự của một ñối mà ta cần ñưa giá trị của chúng ra tại vị trí ñặt ñặc tả(các ñối có thứ
tự bắt ñầu từ không), j là ñộ rộng dành cho ñối cần ñưa ra(nếu j mà lớn hơn ñộ dài của dữ liệu cần ñưa ra thì giá trị ñó ñược căn phải, nếu muốn căn trái thì ta thêm dấu trừ phía trước, còn nếu j mà nhỏ hơn ñộ dài thực tế của dữ liệu cần ñưa ra thì không có gì thay ñổi), d là ñịnh dạng dữ liệu ñưa ra, ví dụ ñịnh dạng
là C ñịnh dạng theo kiểu tiền tệ, N ñịnh dạng kiểu số, G ñịnh dạng chuẩn , t là
số chữ số thập phân(chỉ áp dụng cho số thực)
danh sách các ñối: các ñối có thể là hằng, biến, biểu thức và ñặt cách nhau một dấu phẩy
Sự khác nhau giữa Write( ) và WriteLine( ) là:
Write( ) sau khi viết dữ liệu ra màn hình thì con trỏ ñặt ở cuối dòng còn WriteLine( ) sau khi viết dữ liệu ra màn hình thì con trỏ ñặt ở ñầu dòng tiếp theo
Trang 40Khai báo ở ñầu khối lệnh :
Trong C# việc khai báo các biến và mảng có thể ở bất cứ chỗ nào chương trình và phải bên trong một lớp miễn là trước khi sử dụng phải khai báo chúng Nhưng một thói quen lập trình tốt là chúng ta nên khai báo chúng ở ñầu các khối lệnh, ñầu các hàm
+ Giá trị của một biến hay một mảng khai báo bên trong một khối lệnh không thể ñưa ra sử dụng ở bất kỳ chỗ nào bên ngoài khối lệnh ñó