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, tuynh
Trang 1Khoa 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#
Hng yên 07/2007
Trang 2§ Ò c ¬ n g c ¬ s ë k ü t h u Ë t l Ë p t r × n h
Ch¬ng 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ựcthi 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ấutrúc, thành phần component, lập trình hướng đối tượng Những tính chất đó hiệndiệ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ộcmạ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ộtvà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ếtcá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 gianthự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ì "inta[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 3+ Có thêm Properties, các phương pháp có thể gọi các Properties để truycậ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ônngữ Java Không dừng lại ở đó, Microsoft đưa ra một số mục đích khi xây dựngngô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ữ mạnh mẽ và mềm dẻo
- C# là ngôn ngữ có ít từ khóa
- C# là ngôn ngữ hướng module
- C# sẽ trở nên phổ biến
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 đầutiê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 tathâ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ựctiếp từ ngôn ngữ C và C++, nhưng nó đã được cải tiến để làm cho ngôn ngữ đơngiả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àonhững cú pháp thay đổi Ví dụ như, trong C++ có ba toán tử làm việc với cácthà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 4dễ 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ớtnhầ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ôngtin 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ứatấ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ảmthấy những đặc tính trên phức tạp và khó hiểu Tuy nhiên, cũng đừng lo lắngchúng ta sẽ dần dần được tìm hiểu những đặc tính qua các chương trong cuốnsá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ủaC++
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-orientedlanguage) 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ủaC# 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ínhbởi bản thân hay là trí tưởng tượng của chúng ta Ngôn ngữ này không đặtnhữ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à trongtrườ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 5đượ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ủangô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ữngphươ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ốnsách này được viết, nó không được biết như là một ngôn ngữ phổ biến Nhưngngôn ngữ này có một số lý do để trở thành một ngôn ngữ phổ biến Một trongnhững lý do chính là Microsoft và sự cam kết của NET Microsoft muốn ngônngữ 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ênphổ 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 Bobtrong công việc hằng ngày của họ Tuy nhên, với C# thì khác, nó được sử dụngbở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 6C# 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ạnhmẽ
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ưngngôn ngữ đó Và cũng tự hỏi tại sao lại chọn ngôn ngữ này để học mà khôngchọn một trong những ngôn ngữ kia Có rất nhiều lý do và chúng ta hãy xemmộ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 taphần nào trả lời được những thắc mắc Microsoft nói rằng C# mang đến sứcmạ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ếtnhiề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 đượcnhững lỗi mà thường gặp trong ngôn ngữ C++ Điều này có thể tiết kiệm đượchà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ơntrong 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 7Đ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ệnbằ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ườidù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, tuynhiên mô hình kế thừa đơn này được mở rộng bởi tính đa kế thừa nhiều giaodiệ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ânthủ 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ônngữ mới và viết những chương trình nhỏ thì không đòi hỏi khắt khe việc thựchiện theo quy trình Nhưng để giải quyết được những vấn đề thì chúng ta cũngcầ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ầngiả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ảiquyế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ảiquyết xong chưa Logic này thường được áp dụng trong nhiều lĩnh vực khácnhau, 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êntheo 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êuchí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ệuquả
Trang 8Bước thứ hai là quyết định đến phương phỏp để viết chương trỡnh Bướcnà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 đượcphươ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ỏcnhau để cài đặt, tuy nhiờn, ngụn ngữ phự hợp để giải quyết vấn đề một cỏch tốtnhấ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.3 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ộtchươ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
Trang 9đầ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ếtthúc Điều đó chứng tỏ hàm Main là hàm chính của chương trình C# Mộtchương trình C# muốn thực hiện được thì phải có một hàm Main và chỉ có duynhấ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áchà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:
static void Main( )
{
// Các câu lệnh}
Chú ý: - Hàm Main có thể có dạng thể hiện khác chúng ta sẽ tìm hiểu sau
- Nếu trong một chương trình C# mà không có hàm Main đặt trong mộtlớp nào đó thì chương trình C# này không thể thực hiện được
1.4 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ũngkhô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ụ 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ìnhbiên dịch gặp hai ký tự này thì sẽ bỏ qua dòng đó
Ngoài ra C# còn cho phép kiểu chú thích cho một hay nhiều dòng, và taphải khai báo “/*” ở phần đầu chú thích và kết thúc chú thích là ký tự “*/”
Ví dụ 1.4 : Minh họa dùng chú thích trên nhiều dòng.
/* Xuat ra man hinh chuoi ‘chao mung’
Su dung ham WriteLine cua lop System.Console
Trang 10Hellp World
-Ngoài hai kiểu chú thích trên giống trong C/C++ thì C# còn hỗ trợ thêmkiểu thứ ba cũng là kiểu cuối cùng, kiểu này chứa các định dạng XML nhằmxuất ra tập tin XML khi biên dịch để tạo sưu liệu cho mã nguồn
///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 ứngdụ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 ứngdụ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ìnhDOS chuỗi tham số đưa vào, cụ thể là chuỗi “Hello World”
Từ khóa using: Để làm cho chương trình gọn hơn, và không cần phải
viết từng namespace(ta tìm hiểu khai niệm này sau) cho từng đối tượng, C# cung
cấp từ khóa là using, sau từ khóa này là một namespace hay subnamespace với
mô tả đầy đủ trong cấu trúc phân cấp của nó
Ta có thể dùng dòng lệnh :
using System;
Ở đầu chương trình và khi đó trong chương trình nếu chúng ta có dùngđối tượng Console thì không cần phải viết đầy đủ : System.Console mà chỉ cầnviết Console thôi
Trang 11-Đ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ữngnamespace 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 sưu liệu về nó Còn đốivới namespace do các hãng thứ ba cung cấp thì chúng ta không nên dùng
từ khóa using.
Dấu chấm phẩy(;) : Trong C# quy ước kết thúc mỗi câu lệnh ta phải
dùng dấu chấm phẩy( ;)
Trang 121.5 Visual C# 2005 Express Edition
1.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 xongchương trình, chọn tiếp chức năng FileNew Project trong menu Chức năngnày sẽ gọi cửa sổ New Project (Hình 1.2.1 bên dưới) Nếu như chương trìnhVisual Studio NET được chạy lần đầu tiên, khi đó cửa sổ New Project sẽ xuấthiện tự động mà không cần phải kích hoạt
Để tạo ứng dụng, ta lựa chọn mục Visual C# Projects trong cửa sổ ProjectType bên trái Lúc này chúng ta có thể nhập tên cho ứng dụng và lựa chọn thưmục nơi lưu trữ các tập tin này
Cuối cùng, kích vào OK khi mọi chuyện khởi tạo đã chấm dứt và một cửa sổmới sẽ xuất hiện (Hình 1.2.1’ bên dưới), chúng ta có thể nhập mã nguồn vào đây.Lưu ý rằng Visual Studio NET tạo ra một namespace dựa trên tên củaproject mà ta vừa cung cấp (ChaoMung), 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
Hình 1.2.1: Tạo ứng dụng C# console trong Visual Studio NET.
Tr íc tªn chon môc
nµy
Trang 13Hỡnh 1.2.1’: Phần soạn thảo mó nguồn cho project.
Visual Studio NET tạo một lớp tờn là Class1, 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
đú (Class1.cs) Giả sử trong vớ dụ trờn chỳng ta đổi tờn của lớp thànhChaoMung, và đổi tờn tập tin Class1.cs (đổi tờn tập tin trong cửa sổ SolutionExplorer)
Chỳng ta sẽ xoỏ tất cả cac thư gi mà chương trỡnh tạo cho chung ta và tiếnhành viết bài theo ý muốn của chỳng ta
1.2.2 Lu một ứng dụng
Trong một ứng dụng ta cú thể tạo ra nhiều tệp tin *.cs Đờ lưu cất cỏc tệptin này ta cú thể lưu toàn bộ sự thay đổi của cac tệp tin lờn đĩa hay lưu sự thayđổi của tựng tập tin một, cụ thể như sau
1.2.3 Thêm một tập tin cs
Nhấn vào nút này thì
l u thông tin của tệp hiện hành lên
đĩa(hay có thể ấn
Ctrl +S)
Nhấn vào nút này thì l u thông tin của toàn
bộ các tệp lên
đĩa(hay
có thể ấn ( Ctrl+Shift
Trang 14Để tạo một tệp tin cs ta vào Project ( Add Class )
1.2.4 DÞch vµ ch¹y mét øng dông
§Ó dÞch vµ ch¹y mét øng dông ta cã thÓ
NhÊn F5 (Chay chương trình có Debug)
NhÊn Ctrl+F5 (Chạy chương trình không sử dụng Debug)
Nhấn F6 (Dich chương trình)
Trang 15Chơng 2: Các thành phần cơ bản trong ngôn ngữ C#
2.1 Bộ chữ viết
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ỡnhcỏc từ được liờn kết theo một quy tắc nào đú để tạo thành cỏc cõu lệnh Mộtchươ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àitoỏ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 ZCỏc chữ cỏi thường: a b c zCỏ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ỏchtab, dấu xuống dũng
Dấu gạch nối dưới: _
2.2 Từ khoá
- Là những từ 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ừ khoỏ viết đựng: struct
Vớ dụ từ khoỏ viết sai: Struct
2.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à địnhdanh(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
số cỏc ký hiệu như: ký tự gạch dưới nối cõu ’_’ , ký hiệu tiền tệ $ và khụng đượcbắt đầu bằng chữ số
Chỳ ý: C# phõn biệt chữ hoa và chữ thường, vớ dụ HUE và hue 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
Trang 16Ví dụ:
- Các định danh viết đúng: bai_1, hue,
- Các định danh viết sai: 24gio bai tap,
Để 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êntheo 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ànhphầ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ếthoa, ví dụ MyClass, HocSinh
+ Định danh cho biến, phương thức, đối tượng: chữ cái đầu của mỗi địnhdanh đề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
2.4 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ậptrì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áckiể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êndị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ệuchí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ácnhau khi lưu kiểu dữ liệu giá trị và kiểu dữ liệu tham chiếu trong bộ nhớ Đốivới một kiểu dữ liệu giá trị thì sẽ được lưu giữ kích thước thật trong bộ nhớ đãcấp phát là stack Trong khi đó thì địa chỉ của kiểu dữ liệu tham chiếu thì đượclư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ậptrung 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
Trang 17Ngoà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àinề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áckiể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ỗikiể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ểuInt32 trong NET
Sau đây chúng ta đi tìm hiểu chi tiết một sô kiểu dữ liệu dựng sẵn có trong C#:
2.4.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àotừng kiểu dữ liệu nguyên cụ thể Trong ngôn ngữ C# có một số kiểu dữ liệunguyê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
32767ushort 2 Uint16 Số nguyên không dấu 0 – 65.535
2.147.483.647uint 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 đến9.223.372.036.854.775.807
0xffffffffffffffff
Trang 18Thông thường để chọn một kiểu dữ liệu nguyên để sử dụng như short, inthay long thường dựa vào độ lớn của giá trị muốn sử dụng Ví dụ, một biếnushort 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 4.294.967.295, do đó tùy vào miền giá trị của phạm vi sử dụngbiế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ưucá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ôndươ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
2.4.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ừngkiể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+3,4E-38, với 7 chữ số có nghĩa.double 8 Double Kiểu dấu chấm động có độ chính xác gấp
đôi, giá trị xấp xỉ từ 1,7E-308 đến 1,7E+308,
với 15,16 chữ số có nghĩa
decimal 8 Decimal Có độ chính xác đến 28 con số và giá trị
thập phân, được dùng trong tính toán tài chính, kiểu này đòi hỏi phải có hậu tố “m” hay “M” theo sau giá trị
Kiểu float, double, và decimal đưa ra nhiều mức độ khác nhau về kíchthướ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ánmột số kiểu float thì số phải có ký tự f theo sau
float soFloat = 24f;
Trang 19Kiểu C# Số
2.4.5 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
2.4.6 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ônngữ 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ộtchuỗi chúng ta sử dụng từ khoá string tương tự như cách tạo một thể hiện củabấ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
2.5 BiÕn vµ h»ng
2.5.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ùngtrố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ácbiế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ó Quy tắc khai báo:
Khai báo biến không có giá trị khởi đầu
Trang 20char ch=’A’; hoặc char ch=’\u0041’
Chú ý: Trong C# trước khi chúng ta muốn sử dụng một biến ta phải khởi
gán cho nó một giá trị cụ thể, nếu không chương trình dịch sẽ báo lỗi
VÝ dô:
Trang 21
Đượ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ạpphân
Ví dụ: 34.2 -344.122
Trang 22Chú ý: Hằng ký tự biểu thị mã của ký tự đó trong bảng mã Unicode Do vậy một
hằng ký tự cũng có thể tham gia vào các phép toán
Ví dụ:
‘A’+10 có giá trị (65+10=75)Hằng ký tự còn có thể được viết theo cách: ‘\uc1c2c3c4’
trong đó c1c2c3c4 là một số hệ 16 mà giá trị của nó chính là mã Unicode của
ký tự cần biểu diễn
Ví dụ: ‘A’ hay ‘\u0041’
Một số ký tự đặc biệt:
Trang 23Mộ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
}
-Kết quả:
Do dong cua nuoc 0
Do soi cua nuoc 100
-2.6 C¸c phÐp to¸n
2.6.1 PhÐp to¸n sè häc
- §æi dÊu mét sè thùc hoÆc
Trang 25- PhÐp to¸n % tr¶ vÒ phÇn d cña phÐp chia
2.6.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ánhlớ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ênphả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
Trang 26Liên kết hai biểu thức logicPhép và (and) Giá trị bằng 1khi 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ểuthức bằng 1 khi một trong haitoán hạng bằng 1
(4>3)||(1>8) true
Bảng giá trị của các phép toán logic
false false false false true
2.6.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 (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 saukhi 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 27Cá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ếtquả 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éptoá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ệnhtrê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ếnvar1 có thể viết:
Trang 28Các phép toán được liệt kê cùng loại sẽ có thứ tự theo mục thứ thự củabả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ảithì 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êncao nhất và phép toán gán sẽ có độ ưu tiên thấp nhất trong các toán tử
2.7 BiÓu thøc
2.7.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
2.7.8 BiÓu thøc logic
Biểu thức logic đó là sự kết hợp giữa các toán hạng với các toán tử(toán tử
số học, toán tử quan hệ, toán tử logic) và kết quả cho ta là một giá trị logic Biểu thức logic được dùng làm điều kiện trong các cấu trúc điều khiển(if,
while, ) và một số trường hợp khác
Ví dụ: (1>=2)&&(5==4)
2.7.9 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 haitoán hạng như (+,-,*,/, ) Tuy nhiên, C# còn cung cấp thêm một toán tử có batoá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ềukiệ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ẽ đượcthự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
Ví dụ: Sử dụng toán tử bao ngôi.
-using System;
class Tester
Trang 29maxValue = value1 > value2 ? value1 : value2;
Console.WriteLine(“Gia tri thu nhat {0}, gia tri thu hai {1},gia tri lon nhat {2}”, value1, value2, maxValue);
2.7.10 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ánBiể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ĩarằ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 302.7.11 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 sangnhững đối tượng của một kiểu dữ liệu khác thông qua cơ chế chuyển đổi tườngminh 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 rakhi 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 quy tắc sau:
Ví dụ, chúng ta có thể gán ngầm định một số kiểu short (2 byte) vào một
số kiểu int (4 byte) một cách ngầm định Sau khi gán hoàn toàn không mất dữliệu vì bất cứ giá trị nào của short cũng thuộc về int:
short x = 10;
int y = x; // chuyển đổi ngầm định
Tuy nhiên, nếu chúng ta thực hiện chuyển đổi ngược lại, chắc chắn chúng ta sẽ
bị mất thông tin Nếu giá trị của số nguyên đó lớn hơn 32.767 thì nó sẽ bị cắt khichuyển đổ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 số kiểu short:
short x;
int y = 100;
x = y; // Không biên dịch, lỗi !!!
không bị lỗi chúng ta phải dùng lệnh gán tường minh, đoạn mã trên được viết lại
short x;
int y = 100;
x = (short) 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ínhtoá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
e
Trang 31y=(short)(4-y);/* Khi biên dịch sẽ không bị lỗi, vì 4-x cho ta kiểuint và sau đó được chuyển thành kiểu short*/
Vì vậy biểu thức ép kiểu tường minh là: (kiểu dữ liệu)Biểu thức
Chú ý: Khi ép kiểu thì bản thân biểu thức không bị thay đối kiểu mà chỉ có giá
trị của biểu thức ép kiểu mới thay đổi
2.8 Mét sè hµm thêng dïng
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ânSqrt(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
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
Trang 32Để đư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:
hoặc ta có thể viết như sau:
ở 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]);
Console.WriteLine(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
Trang 33Sự 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ònWriteLine( ) sau khi viết dữ liệu ra màn hình thì con trỏ đặt ở đầu dòng tiếp theo
-Để nhập dữ liệu vào từ bàn phím chúng ta dùng phương thức ReadLine cótrong lớp Console như sau:
Trang 34Console.Write("Nhap c="); c = double.Parse(Console.ReadLine()); max=(a>b?a:b)>c?(a>b?a:b):c;
- Hàm Console.ReadLine() yêu cầu chúng ta nhập vào từ bàn phím một dãy ký tự và kết thúc quá trình nhập bằng cách nhấn phím Enter()
- Để nhập một xâu ký tự chúng ta thực hiện các bước như sau:
string s;
………
s=Console.ReadLine();
Trang 35Ch¬ng 3: C¸c cÊu tróc ®iÒu khiÓn ch¬ng tr×nh
Khai 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ươngtrì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ôilệ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ệnhkhông thể đưa ra sử dụng ở bất kỳ chỗ nào bên ngoài khối lệnh đó
Ở bất kỳ chỗ nào bên ngoài một khối lệnh ta không thể can thiệp đến cácbiến và các mảng được khai báo bên trong khối lệnh
Trang 36Nếu có một biến đã được khai báo ở ngoài một khối lệnh và không trùngtên với các biến khai báo bên trong khối lệnh này thì biến đó cũng có thể sửdụng cả bên trong cũng như bên ngoài khối lệnh
* btđk là một biểu thức cho giá trị logic
* Công_việc có thể là một lệnh đơn, một khối lệnh hay mộtcấu trúc điều khiển nào đó
- Sơ đồ cú pháp
bt®
k True C«ng_viÖc;
False
Trang 37- Nguyờn tắc hoạt động: Đầu tiờn mỏy tớnh toỏn giỏ trị của btđk Nếu
btđk cú giỏ trị True thỡ mỏy tiến hành thực hiện Cụng_việc sau đú tiến hành thựchiện cỏc cõu lệnh tiếp theo sau cõu lệnh if Nếu btđk cú giỏ trị là False thỡ mỏy
bỏ qua việc thực hiện Cụng_việc trong cõu lệnh if mà tiến hành thực hiện ngaycỏc cõu lệnh sau cõu lệnh if
c/ Cấu trúc rẽ nhánh if dạng đầy đủ
- Cỳ phỏp cõu lệnh
if (btđk) cụng_việc1;
else cụng_việc2;
Trong đú:
* if, else là từ khoỏ
* btđk là một biểu thức cho giỏ trị logic
* Cụng_việc1,Cụng_việc2 cú thể là một lệnh đơn, một cấutrỳc điều khiển nào đú hay một khối lệnh
- Sơ đồ thực hiện
- Nguyờn tắc hoạt động: Đầu tiờn mỏy tớnh toỏn giỏ trị của btđk Nếu
btđk cú giỏ trị True thỡ mỏy tiến hành thực hiện Cụng_việc1 sau đú tiến hànhthực hiện cỏc cõu lệnh tiếp theo sau cõu lệnh if Nếu btđk cú giỏ trị là False thỡmỏy tiến hành thực hiện cụng_việc2 sau đú tiến hành thực hiện cỏc cõu lệnh tiếptheo sau cõu lệnh if
Vớ dụ: Lập chương trỡnh giải phương trỡnh bậc hai ax2+bx+c=0
Trang 393.2.2 CÊu tróc rÏ nh¸nh switch
case en: Khối_lệnh_n;[break;]
[default: Khối_lệnh_n+1; break;]
}Trong đó: + switch, case, default là các từ khoá
+ bieu_thuc: là một biểu thức cho giá trị nguyên hoặc là xâu
+ ei:là giá trị nguyên mà biểu thức có thể nhận được
+ Những phần đặt trong hai dấu [ và ] có thể có hoặc không
- Sự hoạt động của cấu trúc điều khiển switch phụ thuộc vào giá trị của
bieu_thuc
* Khi giá trị này bằng ei máy sẽ nhảy tới khối lệnh có nhãn case ei
và thực hiện Khối_lệnh_i Nếu Khối_lệnh_i là rỗng thì ta có thể đặt break sauKhối_lệnh_i hoặc không, với trường hợp không có break thì máy sẽ tiến hànhnhảy xuống thực hiện Khối_lệnh_(i+1) Nếu Khối_lệnh_i khác rỗng(tức là cócông việc phải thực hiện) thì sau Khối_lệnh_i ta phải đặt câu lệnh break Khimáy gặp câu lệnh break thì máy sẽ thoát khỏi cấu trúc switch và thực hiện cáccâu lệnh tiếp theo sau cấu trúc lệnh này
* Khi giá trị của bieu_thuc khác tất cả các giá trị ei thì cách làmviệc của máy lại phụ thuộc vào sự có mặt hay không có mặt của default Khi códefault máy nhảy tới câu lệnh có nhãn default Khi không có default máy tiếnhành thực hiện các câu lệnh sau cấu trúc này
- Ví dụ áp dụng: Nhập vào một tháng của một năm bất ký sau đó cho biết
tháng đó có bao nhiêu ngày:
Trang 40{
int month, year,sumday;
Console.Write("Nhap thang="); month = int.Parse(Console.ReadLine()); Console.Write("Nhap year="); year = int.Parse(Console.ReadLine()); switch (month)
case 11: sumday = 30; break;
case 2: if (year % 400==0 || (year % 4 == 0 && year % 100 != 0)) sumday = 29;
3.3.1 CÊu tróc lÆp while
- Cú pháp câu lệnh
while(btđk) Công_việc;