Lập trình C# - Phần 2: Cơ bản (THPT Chuyên Lê Hồng Phong)

Chia sẻ: Lê Văn Vương | Ngày: | Loại File: PDF | Số trang:11

0
32
lượt xem
4
download

Lập trình C# - Phần 2: Cơ bản (THPT Chuyên Lê Hồng Phong)

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Vì sao bạn nên đọc phần này Nếu bạn đã biết những ngôn ngữ như C/C++ hay Java, thì phần này sẽ rất dễ dàng đối với bạn. Thậm chí, bạn có thể bỏ qua phần này. Sau tất cả, những điều cơ bản của phần lớn các ngôn ngữ lập trình đều khá giống ngôn ngữ họ C.

Chủ đề:
Lưu

Nội dung Text: Lập trình C# - Phần 2: Cơ bản (THPT Chuyên Lê Hồng Phong)

  1. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC Lập trình C# Dịch từ cuốn sách Beginning C Sharp Game Programming Phần 2: Cơ bản Vì sao bạn nên đọc phần này Nếu bạn đã biết những ngôn ngữ như C/C++ hay Java, thì phần này sẽ rất dễ dàng đối với bạn. Thậm chí, bạn có thể bỏ qua phần này. Sau tất cả, những điều cơ bản của phần lớn các ngôn ngữ lập trình đều khá giống ngôn ngữ họ C. Thật không may, mặc dù cú pháp của tất cả ngôn ngử gần như giống nhau, cách lập trình chúng lại khác nhau. C# có một số điểm khác biệt so với các ngôn ngữ khác, vì vậy tốt nhất hãy tiếp tục đọc phần này. Chương trình C# đầu tiên của bạn Bạn nên dùng Microsoft Visual Studio để có một giao diện lập trình tốt hơn, ở đây chỉ nhắc đến cú pháp. Truyền thống xa xưa trong ngành lập trình máy vi tính nói rằng chương trình đầu tiên của bạn nên là chương trình “Hello World”, một chương trình đơn giản in ra một thông điệp chào mừng trên máy vi tính. Cú pháp của chương trình đơn giản như sau: class HelloCSharp { static void Main( string[] args ) { System.Console.WriteLine( “Hello, C#!!” ); } } Lớp (Class) C# là một ngôn ngữ lập trình hướng đối tượng, điều này chẳng có nghĩa gì đối với bạn tại thời điềm này. Tôi sẽ nói về khái niệm này chi tiết hơn trong phần 3, “Giới thiệu về Lớp”, nhưng bây giờ, tất cả những gì cần biết là C# biểu diễn chương trình của nó như những đối tượng (object). Ý tưởng là chia chương trình của bạn thành danh từ và động từ, mà mỗi danh từ biển hiện cho một đối tượng. Ví dụ, nếu bạn làm một game mà có các tàu vũ trụ bay lượn xung quanh, thì tàu vũ trụ đó là đối tượng. Một lớp trong chương trình C# mô tả một danh từ; nó nói với máy vi tính đối tượng của bạn có những kiểu dữ liệu nào và những hành động nào có thể thực hiện bởi chúng. Một lớp tàu vũ trụ có thể nói với máy vi tính có bao nhiêu người ở trong nó, còn bao nhiêu nhiên liệu, và đi với tốc độ bao nhiêu. Trong C#, toàn bộ chương trình của bạn thật sự là một lớp. Trong chương trình trên, bạn có lớp HelloCSharp, đó là tên của chương trình. Lập trình C# - Phần 2: Cơ bản Trang 1
  2. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC Điểm xuất phát Tất cả chương trình đều có một điểm xuất phát, một nơi trong mã mà máy vi tính bắt đầu thực thi. Trong những ngôn ngữ cũ hơn như C hay C++, điểm xuất phát thường là một hàm toàn cục gọi là main, nhưng trong C# thì hơi khác một chút. C# không cho phép bạn có hàm toàn cục (global function), thay vào đó nó buộc bạn cho các hàm đó và các lớp, vì vậy chắc chắn là bạn không thể sử dụng chung phương pháp cho điểm xuất phát ở C#. C# giống Java trong điểm này; điểm xuất phát cho tất cả chương trình C# là một hàm tĩnh (static function) được gọi là Main trong một lớp, giống như bạn thấy ở trong chương trình trên. Tôi sẽ đề cập chi tiết hơn tới hàm và hàm tĩnh trong phần 3, vì vậy hiện nay hãy chấp nhận điều này. Mọi chương trình C# phải có một lớp có hàm tĩnh Main, nếu không có, thì máy vi tính sẽ không biết nơi nào bắt đầu chương trình. Hơn nữa, bạn chỉ có thể có một hàm Main được định nghĩa trong một chương trình; nếu có hơn một, thì máy vi tính sẽ không biết bắt đầu từ cái nào. Hello, C#! Phần của chương trình thực hiện việc in ra màn hình là dòng này: System.Console.WriteLine( “Hello, C#!!” ); Dòng này lấy System.Console – một lớp xây dựng sẵn trong .NET framework – và nói với nó là in ra màn hình “Hello, C#!!” bằng cách sử dụng hàm WriteLine của nó. Biên dịch và Chạy Phần này sẽ được đề cập tới trong tài liệu Lập trình C# trên Microsoft Visual Studio 2010. Cơ bản Gần như mọi ngôn ngữ lập trình đều có những thuộc tính chung. Điều thứ nhất, ngôn ngữ lập trình nói chung biết cách lưu trữ dữ liệu. Chúng còn có thể xử lý dữ liệu bằng cách di chuyển nó lòng vòng và thực hiện phép tính. Các kiểu dữ liệu cơ bản Như nhiều ngôn ngữ lập trình, C# có một số lượng lớn kiểu dữ liệu xây dựng sẵn, đa số biễu diễn số và nhiều định dạng khác. Những kiểu này được mô tả ở bảng 2.1. Ghi chú C# là một ngôn ngữ có thể mở rộng, có nghĩa là bạn có thể tạo những kiểu dữ liệu cho riêng bạn nếu bạn muốn. Tôi sẽ đề cập chi tiết hơn trong chương 3. Bảng 2.1 Kiểu dữ liệu xây dựng sẵn trong C# Kiểu Kích cỡ (byte) Giá trị bool 1 true (đúng) hay false (sai) byte 1 0 đến 255 sbyte 1 -128 đến 127 char 2 Ký tự chữ và số (trong Unicode) short 2 -32 768 đến 32 767 ushort 2 0 đến 65 535 int 4 -2 147 483 648 đến 2 147 483 647 uint 4 0 đến 4 294 967 295 *float 4 -3.402823x1038 to 3.402823x1038 Lập trình C# - Phần 2: Cơ bản Trang 2
  3. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC long 8 -9 223 372 036 854 775 808 đến 9 223 372 036 854 775 807 ulong 8 0 đến 18 446 744 073 709 551 615 *double 8 -1.79769313486232x10308 đến 1.79769313486232x10308 **decimal 16 -79 228 162 514 264 337 593 543 950 335 đến 79 228 162 514 264 337 593 543 950 335 * - Đây là những định dạng dấu phẩy động, nó biểu thị cho số thập phân không chính xác ** - Đây là định dạng dấu phẩy tĩnh, nó biểu thị chính xác số thập phân tới 28 chữ số Kiểu dữ liệu số nguyên (byte, short, int, long, …) chỉ có thể lưu trữ số nguyên như 0, 1, 2, …; chúng không thể lưu số thập phân như 1.5 hay 3.14159. Nếu muốn lưu số thập phân, bạn cần phải chuyển qua dùng những định dạng dấu phẩy động hay dấu phẩy tĩnh. Việc làm thế nào những loại số này có thể được lưu nằm ngoài cuốn sách này. Ghi chú Về cơ bản, số phẩy động không thể lưu trữ số một cách chính xác; chúng chỉ có thể lưu giá trị xấy xỉ với một sai số nào đó. Ví dụ, khi sử dụng float, bạn có thể biểu thị những số 1.0 và 1.00000012, nhưng bạn không thể biểu thị bất kì số nào giữa chúng. Vì vậy, nếu bạn đặt một float bằng 1.00000007, thì máy vi tính sẽ tự động làm tròn nó thành 1.00000012. Double cũng tương tự, nhưng chính xác hơn (tới 15 chữ số). Decimal được mã hóa theo một cách khác, kể cả khi tài liệu .NET nói nó là số phẩy tĩnh, về mặt kỹ thuật nó vẫn là số phẩy động, với độ chính xác lên tới 28 chữ số. Toán tử Toán tử là những ký hiệu xuất hiện trong ngôn ngữ máy tính; chúng nói cho máy vi tính thực hiện một số phép tính trên dữ liệu. Toán tử thường được sử dụng trong các phương trình toán, vì vậy tôi chắc chắn rằng phần này rất quen thuộc đối với bạn. Toán tử toán học C# có năm toán tử toán học cơ bản xây dựng sẵn trong ngôn ngữ, được mô tả ở bảng 2.2. Bảng 2.2 Toán tử toán học cơ bản trong C# Toán tử Ký hiệu Ví dụ Kết quả Cộng + 5 + 6 11 Trừ - 6 - 5 1 Nhân * 6 * 7 42 Chia / 8 / 4 2 Đồng dư % 9 % 3 0 Tăng thêm ++ 10++ 11 Giảm bớt -- 10-- 9 Bốn toán tử đầu tiên thì không cần phải đề cập đến. Toán tử thứ năm có thể mới với bạn nếu bạn chưa học lập trình trước đây. Phép đồng dư (Modulus) đôi khi được biết đến “phép lấy dư”. Về cơ bản, kết quả từ một phép đồng dư là số dư nếu bạn lấy số thứ nhất chia cho số thứ hai. Trong bảng 2.2, 9 chia hết cho 3, vì vậy số dư là 0. Nếu bạn lấy 10 % 3, kết quả sẽ là 1, và số dư của 10/3 là 1. Ghi chú Toán tử tăng và giảm thực ra có hai phiên bản khác nhau: phiên bản trước và sau. Ví dụ ++x là phiên bản tăng trước, và x++ là phiên bản tăng sau. Sự khác nhau là khi nào toán tử được thực hiện. Ví dụ, nếu x là 10 và bạn viết y = x++, thì máy vi tính sẽ cho giá trị x vào y đầu tiên, sau đó mới tăng x, để cho y có giá trị 10 và x là 11. Mặt khác, y = ++x sẽ thực hiện Lập trình C# - Phần 2: Cơ bản Trang 3
  4. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC phép tăng trước và thực hiện việc gán sau, cho x và y đều có giá trị 11. Đó là một sự thừa hưởng từ C, có thể gây khó khăn khi đọc mã, vì vậy tôi khuyên rằng đừng sử dụng quá nhiều toán tử này. Bạn nên ghi chú là tất cả các toán tử toán học đều có phiên bản rút gọn cho phép bạn hiệu chỉnh trực tiếp trên một biến (coi thêm về các biến trong mục sau của phần này). Ví dụ, nếu bạn muốn cộng 10 vào x, bạn có thể làm thế này: x = x + 10; Nhưng một số thứ rườm rà và dư thừa có thể bỏ đi. Bạn có thể viết như sau x += 10; Tất cả các toán tử khác đều có phiên bản tương tự: x *= 10; // Nhân cho 10 x /= 10; // Chia cho 10 x -= 10; // Trừ 10 x %= 10; // Đồng dư cho 10 x >>= 2; // Dịch xuống cho 2 x y tương tự với x / 2y Vì vậy 5 > 3 tương đương với 40 / 8, hay 5. Ghi chú Dịch bit nhanh hơn rất nhiều so với nhân hoặc chia trực tiếp, nhưng hiếm dùng ngày nay. Tốc độ tiết kiệm không quan trọng lắm, và nó làm cho chương trình của bạn khó đọc hơn. Lập trình C# - Phần 2: Cơ bản Trang 4
  5. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC Toán tử Logic Có một số điểm giống nhau giữa các toán tử logic là chúng thực hiện phép so sánh và trả lại giá trị Boolean true (đúng) hay false (sai). Bảng 2.4 liệt kê những toán tử logic. Bảng 2.4 Toán tử Logic trong C# Toán tử Ký hiệu Ví dụ Kết quả Bằng == 1 == 2 false Không bằng != 1 != 2 true Nhỏ hơn < 1 < 2 true Lớn hơn > 1 > 2 false Nhỏ hơn hoặc bằng = 2 false Logic And && true && false false Logic Or || true || false true Logic Not ! !true false Biến Trong C#, như trong gần như bất kỳ ngôn ngữ khác, bạn có thể tạo các trường cho các kiểu cơ bản, gọi là biến, và thực hiện phép toán lên chúng. Khai báo một mảnh dữ liệu của chương trình là một điều đơn giản. Tất cả các điều bạn cần làm là gọi tên của kiểu dữ liệu, sau đó là tên biến bạn muốn tạo và sau đó (nếu cần) khởi tạo dữ liệu đó với một giá trị. Đây là một ví dụ: int x = 10; float y = 3.14159; decimal z; Cảnh báo Ghi chú rằng nếu bạn mún sử dụng một biến trước khi khởi tạo cho nó (nếu bạn muốn sử dụng z trong đoạn mã ví dụ trước), thì bạn sẽ nhận được một lỗi biên dịch trong C#. Trong ngôn nhữ trước đó, như C và C++, sẽ cho phép bạn sử dụng biến mà không cần cho nó giá trị, điều đó có thể dẫn đến rất nhiều lỗi vì bạn không bao giờ biết được cái gì trong biến của bạn nếu bạn không đặt giá trị cho nó. Đây là một ví dụ sử dụng biến trong các biểu thức toán học: int x = 10 + 5; // 15 int y = 20 * x; // 300 int z = x / 8; // 1 float a = (float)x / 8.0; // 1.875 x = (int)a; // 1 Chú ý vào hai dòng cuối. Những dòng này chỉ cho bạn cách sử dụng ép kiểu trong chương trình của bạn. Một lời giải thích cho ép kiểu sẽ đến trong các mục sau. Hằng Bạn có thể khai báo các hằng, một biến ảo nhưng không thể thay đổi, trong mã của bạn. Đây là một cách an toàn xuất hiện trong ngôn ngữ máy tính trong những năm gần đây. Ví dụ: const float pi = 3.14159; Lập trình C# - Phần 2: Cơ bản Trang 5
  6. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC Bây giờ bạn có thể sử dụng pi trong những tính toán của bạn, nhưng bạn không thể thay đổi giá trị của nó (bởi vì thay đổi giá trị của pi thành 3.0 làm cho nó trở nên hoàn toàn vô nghĩa!). Điều này sẽ gây ra một lỗi biên dịch: pi = 3.0; // ERROR! Ép kiểu Hãy xem đoạn mã này: float a = 1.875; int x = (int)a; // 1 Hãy nhìn vào dòng cuối: giá trị của a là 1.875, một số hữu tỉ, và dòng cuối cố gắng cho giá trị của nó và x, một số nguyên. Rõ ràng là bạn không thể chuyển dữ liệu từ a sang x, vì vậy bạn cần mất đi một số độ chính xác. Các ngôn ngữ cũ hơn, như C/C++, điều này thực hiện một cách tự động, và cắt 1.875 xuống còn 1 để vừa với số nguyên. Tuy nhiên, nếu bạn cố gắng gõ dòng này vào C#, nó sẽ gây ra một lỗi biên dịch: x = a; // Lỗi, không thể chuyển đổi ngầm từ ‘float’ sang ‘int’ Đương nhiên, mã này hoạt động tốt trong những ngôn ngữ cũ hơn, vì vậy rất nhiều người sẽ tự động bỏ qua C# bởi vì “khó sử dụng”. Bạn có thể nghe họ nói: “Mi không thể tự động chuyển float sang int à, trình biên dịch ngu ngốc kia?”. Trình biên dịch không thật sự ngu ngốc; nó đang cố gắng tiết kiệm thời gian của bạn để gỡ lỗi. Bạn có thể không nhận ra điều đó, nhưng mà một nguồn lỗi chung của các chương trình là việc cắt xén không có chủ ý. Bạn có thể quên một kiểu là số nguyên và một số dữ liệu quan trọng có thể đánh mất trong khi cắt xén ở đâu đó. Vì vậy C# yêu cầu bạn nói một cách rõ ràng khi nào bạn muốn cắt xén dữ liệu. Bảng 2.5 liệt kê những chuyển đổi nào là ngầm (I – Implicit) và rõ ràng (E – Explicit). Bảng 2.5 Chuyển đổi ngầm/rõ ràng Từ byte sbyte short ushort int uint long ulong float double decimal byte I E I I I I I I I I I sbyte E I I E I E I E I I I short E E I E I E I E I I I ushort E E E I I I I I I I I int E E E E I E I E I I I uint E E E E E I I I I I I long E E E E E E I E I I I ulong E E E E E E E I I I I float E E E E E E E E I I I double E E E E E E E E E I E decimal E E E E E E E E E E I Biểu đồ có vẻ bối rối một chút, nhưng thực ra nó rất đơn giản. Ví dụ, nếu bạn muốn chuyển thì int sang double, nhìn vào bảng 2.5, tìm “int” ở bên trái và “double” ở trên. Vị trí đó là chữ I, tức là bạn có thể thực hiện một chuyển đổi ngầm: int a = 10; double b = a; // ok Lập trình C# - Phần 2: Cơ bản Trang 6
  7. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC Bây giờ bạn muốn chuyển đổi từ double sang int. Nhìn bảng 2.5, tìm “double” phía trái và “int” ở trên. Ở đó là chữ E, nghĩa là bạn cần thực hiện một chuyển đổi rõ ràng: double a = 10.0; // int b = a
  8. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC Hơn nữa, bạn có thể nối chuỗi câu lệnh else if ở cuối, để thực hiện nhiều yêu cầu: if( x < 10 ) { // Làm gì đó nếu x < 10 } else if( x < 20 ) { // Làm gì đó nếu 10
  9. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC break; // Nhảy khỏi switch case 2: // Làm gì đó break; // Nhảy khỏi switch default: // Làm gì đó break; // Ở đây tùy chọn } Vòng lặp Đặc điểm thứ ba của một ngôn ngữ máy tính là sự lặp lại, hay vòng lặp. Vòng lặp cho phép bạn thực hiện một công việc cụ thể một lần và nhiều lần nữa. C# có bốn cơ cấu xây dựng sẵn; ba cái sẽ được đề cập trong phần này là cơ cấu thừa kế từ ngôn ngữ C. Tôi sẽ không đề cập đến cái thứ tư cho đến Phần 4, “C# Nâng cao”. Vòng lặp while Cấu trúc vòng lặp đầu tiên và đơn giản nhất là vòng lặp while. Đây là ví dụ: while( x < 10 ) { // Làm gì đó } Bất cứ cái gì trong dấu ngoặc nhọn sẽ được thực thi lặp đi lặp lại khi giá trị x nhỏ hơn 10. Nếu x không bao giờ lớn hơn hoặc bằng 10, thì vòng lặp sẽ lặp vô hạn. Vòng lặp for Một vòng lặp phổ biến khác là vòng lặp for, là một cách khác để thực hiện một vòng lặp while. Cú pháp cơ bản cho vòng lặp for là: for( khởi tạo; điều kiện; hành động ) Phần khởi tạo là phần mã chỉ được thực thi một lần, khi bắt đầu vòng lặp for. Phần này cho phép bạn khởi tạo bất kỳ biến nào bạn cần sử dụng trong vòng lặp. Phần điều kiện được kiểm tra trước mỗi lần lặpl nếu nó trả về false, thì vòng lặp kết thúc. Phần hành động được thực thi ở cuối mỗi lần lặp. Nói chung, bạn sử dụng vòng lặp for để tạo một vòng lặp có số lần xác định (nhưng nó vẫn có thể bị lặp vô hạn). Ví dụ, nếu bạn muốn thực hiện 10 phép tính trên x, với x từ 0 đến 9, bạn có thể tạo vòng lặp như thế này: for( int x = 0; x < 10; x++ ) { // Làm gì đó } Trong lần thực thi đầu tiên của vòng lặp, x là 0, và lần sau là 1, và tiếp tục, cho đến khi nào nó đạt đến 9 (bằng 10 thì sẽ thoát khỏi vòng lặp). Bạn cũng có thể thực hiện nhiều việc trong khác for, như khởi tạo nhiều biến hay thực hiện nhiều hành động: Lập trình C# - Phần 2: Cơ bản Trang 9
  10. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC for( int x = 0, int y = 0; x < 10; x++, y += 2 ) Vòng lặp này tạo ra hai biến, x và y, với x lặp từ 0 đến 9, và y lặp từ 0 đến 18 vì bỏ qua các số lẻ. Vòng lặp do-while Đôi khi trong lập trình, một tình huống xuất hiện mà bạn muốn vòng lặp thực thi ít nhất một lần. Hãy quan sát đoạn mã: int x = 0; while( x > 0 ) { // Vòng lặp này sẽ chẳng bao giờ thực thi } Với vòng lặp for và while, điều kiện luôn luôn được xét tới trước. Nếu điều kiện là false, đoạn mã sẽ không bao giờ được thực thi. Thay vào đó, bạn có thể sử dụng vòng lặp do-while, nó sẽ thực thi mọi thứ và kiểm tra điều kiện sau khi vòng lặp được thực thi. Đây là một ví dụ: do { // Mã vòng lặp ở đây } while( Điều kiện ); Break và Continue break và continue là hai từ khóa hữu dụng mà bạn có thể sử dụng khi làm việc trong các vòng lặp để thay đổi hướng đi của nó. Break Từ khóa đầu tiên là break, mà bạn đã thấy khi sử dụng trong khối switch. Cơ bản, đưa break vào sẽ khiến chương trình kết thúc và nhảy ra khỏi vòng lặp. Đây là ví dụ: for( int x = 0; x < 10; x++ ) { if( x == 3 ) break; } Vòng lặp này sẽ làm x có các giá trị 0, 1, 2, và 3, và sau đó thoát khỏi vòng lặp khi x là 3. Continue Từ khóa khác để điều chỉnh vòng lặp là continue. Từ khóa này sẽ làm cho vòng lặp dừng thực thi và quay lại phía trên để bằt đầu lại. Đây là ví dụ: for( int x = 0; x < 10; x++ ) { FunctionA(); if( x == 3 ) continue; // Nhảy lên phía trên, bỏ qua mọi thứ ở dưới FunctionB(); } Giả sử như FunctionA và FunctionB có thật tại thời điểm đó. Vòng lặp này sẽ làm cho x đi từ 0 đến 9. Trong mỗi lần lặp, FunctionA sẽ được thực thi, nhưng khi x là 3, đoạn mã sẽ bỏ qua FunctionB và nhảy lên phía trên lại để lặp lần nữa. Lập trình C# - Phần 2: Cơ bản Trang 10
  11. Câu lạc bộ Khoa học - THPT Chuyên Lê Hồng Phong TPHCM LHPSC Phạm vi Phạm vi liên quan tới nơi trong chương trình mà một biến là hợp lệ. Ví dụ, hãy nói là bạn có đoạn mã này trong chương trình: class ScopeDemo { static void Main( string[] args ) { // ngoặc A int x = 10; } // ngoặc B static void blah() { // x = 20;
Đồng bộ tài khoản