Giáo trình hướng dẫn cách truy cập vào các mảng đa chiều trên diện rộng có các kích thước khác nhau phần 2 doc

40 293 0
Giáo trình hướng dẫn cách truy cập vào các mảng đa chiều trên diện rộng có các kích thước khác nhau phần 2 doc

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

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

Thông tin tài liệu

Ngơn Ngữ Lập Trình C# long ulong Int64 Kiểu số nguyên có dấu có giá trị khoảng : -9.223.370.036.854.775.808 đến 9.223.372.036.854.775.807 Số nguyên không dấu từ đến 0xffffffffffffffff Bảng 3.1 : Mô tả kiểu liệu xây dựng sẵn Uint64 Ghi chú: Kiểu giá trị logic nhận giá trị true hay false mà Một giá trị nguyên gán vào biến kiểu logic C# chuyển đổi ngầm định Điều khác với C/C++, cho phép biến logic gán giá trị nguyên, giá trị nguyên false giá trị lại true Chọn kiểu liệu Thông thường để chọn kiểu liệu nguyên để sử dụng short, int hay long thường dựa vào độ lớn giá trị muốn sử dụng Ví dụ, biến ushort lưu giữ giá trị từ đến 65.535, biến ulong lưu giữ giá trị từ đến 4.294.967.295, tùy vào miền giá trị phạm vi sử dụng biến mà chọn kiểu liệu thích hợp Kiểu liệu int thường sử dụng nhiều lập trình với kích thước byte đủ để lưu giá trị nguyên cần thiết Kiểu số nguyên có dấu thường lựa chọn sử dụng nhiều kiểu số trừ có lý đáng để sử dụng kiểu liệu không dấu Stack Heap 41 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# cấu trúc liệu lưu trữ thông tin dạng xếp chồng tức vào sau trước (Last In First Out : LIFO), điều giống có chồng đĩa, ta xếp đĩa vào chồng lấy đĩa nằm lập trước, tức đĩa vào sau lấy trước Trong C#, kiểu giá trị kiểu số nguyên cấp phát stack, vùng nhớ thiết lập để lưu giá trị, vùng nhớ tham chiếu tên biến Kiểu tham chiếu đối tượng cấp phát heap Khi đối tượng cấp phát heap địa trả về, địa gán đến tham chiếu Thỉnh thoảng chế thu gom hũy đối tượng stack sau vùng stack đánh dấu kết thúc Thông thường vùng stack định nghĩa hàm Do đó, khai báo biến cục hàm đối tượng đối tượng đánh dấu để hũy kết thúc hàm Những đối tượng heap thu gom sau tham chiếu cuối đến đối tượng gọi Stack Cách tốt sử dụng biến không dấu giá trị biến luôn dương, biến thường thể thuộc tính có miền giá trị dương Ví dụ cần khai báo biến lưu giữ tuổi người ta dùng kiểu byte (số nguyên từ 0-255) tuổi người âm Kiểu float, double, decimal đưa nhiều mức độ khác kích thước độ xác.Với thao tác phân số nhỏ kiểu float thích hợp Tuy nhiên lưu ý trình biên dịch ln ln hiểu số thực số kiểu double trừ khai báo rõ ràng Để gán số kiểu float số phải có ký tự f theo sau float soFloat = 24f; Kiểu liệu ký tự thể ký tự Unicode, bao gồm ký tự đơn giản, ký tự theo mã Unicode ký tự thoát khác bao dấu nháy đơn Ví dụ, A ký tự đơn giản \u0041 ký tự Unicode Ký tự thoát ký tự đặc biệt bao gồm hai ký tự liên tiếp ký tự dầu tiên dấu chéo ‘\’ Ví dụ, \t dấu tab Bảng 3.2 trình bày ký tự đặc biệt Ký tự \’ \” Ý nghĩa Dấu nháy đơn Dấu nháy kép \0 Dấu chéo Ký tự null \a Alert \\ 42 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# \b Backspace \f Sang trang form feed Dòng \n Đầu dòng Tab ngang \r \t \v Tab dọc Bảng 3.2 : Các kiểu ký tự đặc biệt Chuyển đổi kiểu liệu Những đối tượng kiểu liệu chuyển sang đối tượng kiểu liệu khác thông qua chế chuyển đổi tường minh hay ngầm định Chuyển đổi nhầm định thực cách tự động, trình biên dịch thực cơng việc Cịn chuyển đổi tường minh diễn gán ép giá trị cho kiểu liệu khác Việc chuyển đổi giá trị ngầm định thực cách tự động đảm bảo khơng thơng tin Ví dụ, gán ngầm định số kiểu short (2 byte) vào số kiểu int (4 byte) cách ngầm định Sau gán hồn tồn khơng liệu giá trị short thuộc int: short x = 10; int y = x; // chuyển đổi ngầm định Tuy nhiên, thực chuyển đổi ngược lại, chắn bị thông tin Nếu giá trị số ngun lớn 32.767 bị cắt chuyển đổi Trình biên dịch khơng thực 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 phải dùng lệnh gán tường minh, đoạn mã viết lại sau: short x; int y = 500; x = (short) y; // Ép kiểu tường minh, trình biên dịch khơng báo lỗi Biến Một biến vùng lưu trữ với kiểu liệu Trong ví dụ trước x, y điều biến Biến gán giá trị thay đổi giá trị thực lệnh chương trình Để tạo biến phải khai báo kiểu biến gán cho biến tên Biến khởi tạo giá trị khai báo, hay gán giá trị vào lúc chương trình Ví dụ 3.1 sau minh họa sử dụng biến  Ví dụ 3.1: Khởi tạo gán giá trị đến biến 43 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# class MinhHoaC3 { static void Main() { int bien1 = 9; System.Console.WriteLine(“Sau khoi tao: bien1 ={0}”, bien1); bien1 = 15; System.Console.WriteLine(“Sau gan: bien1 ={0}”, bien1); } }  Kết quả: Sau khoi tao: bien1 = Sau gan: bien1 = 15 Ngay khai báo biến ta gán giá trị cho biến, xuất biến biến có giá trị Thực phép gán biến cho giá trị 15 biến có giá trị 15 xuất kết 15 Gán giá trị xác định cho biến C# đòi hỏi biến phải khởi tạo trước sử dụng Để kiểm tra luật thay đổi dòng lệnh khởi tạo biến bien1 ví dụ 3.1 sau: int bien1; giữ nguyên phần cịn lại ta ví dụ 3.2:  Ví dụ 3.2: Sử dụng biến không khởi tạo class MinhHoaC3 { static void Main() { int bien1; System.Console.WriteLine(“Sau khoi tao: bien1 ={0}”, bien1); bien1 = 15; System.Console.WriteLine(“Sau gan: bien1 ={0}”, bien1); } } Khi biên dịch đoạn chương trình trình biên dịch C# thơng báo lỗi sau: error CS0165: Use of unassigned local variable ‘bien1’ 44 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# Việc sử dụng biến chưa khởi tạo không hợp lệ C# Ví dụ 3.2 khơng hợp lệ Tuy nhiên không thiết lúc phải khởi tạo biến Nhưng để dùng bắt buộc phải gán cho chúng giá trị trước có lệnh tham chiếu đến biến Điều gọi gán giá trị xác định cho biến C# bắt buộc phải thực điều Ví dụ 3.3 minh họa chương trình  Ví dụ 3.3: Biến khơng tạo sau gán giá trị class MinhHoaC3 { static void Main() { int bien1; bien1 = 9; System.Console.WriteLine(“Sau khoi tao: bien1 ={0}”, bien1); bien1 = 15; System.Console.WriteLine(“Sau gan: bien1 ={0}”, bien1); } } - Hằng Hằng biến giá trị không thay đổi Biến công cụ mạnh, nhiên làm việc với giá trị định nghĩa không thay đổi, ta phải đảm bảo giá trị khơng thay đổi suốt chương trình Ví dụ, lập chương trình thí nghiệm hóa học liên quan đến nhiệt độ sơi, hay nhiệt độ đơng nước, chương trình cần khai báo hai biến DoSoi DoDong, không cho phép giá trị hai biến 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 phân thành ba loại: giá trị (literal), biểu tượng (symbolic constants), kiểu liệu kê (enumerations) Giá trị hằng: ta có câu lệnh gán sau: x = 100; Giá trị 100 giá trị Giá trị 100 100 Ta gán giá trị khác cho 100 Biểu tượng hằng: gán tên cho giá trị hằng, để tạo biểu tượng dùng từ khóa const cú pháp sau: = ; 45 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# Một biểu tượng phải khởi tạo khai báo, khởi tạo lần suốt chương trình khơng thay đổi Ví dụ: const int DoSoi = 100; Trong khai báo trên, 32 số DoSoi biểu tượng có kiểu ngun Ví dụ 3.4 minh họa việc sử dụng biểu tượng  Vi dụ 3.4: Sử dụng biểu tượng class MinhHoaC3 { 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ả: Do dong cua nuoc Do soi cua nuoc 100 Ví dụ 3.4 tạo hai biểu tượng chứa giá trị nguyên: DoSoi DoDong, theo qui tắc đặt tên tên thường đặt theo cú pháp Pascal, điều khơng địi hỏi ngơn ngữ nên ta đặt tùy ý Việc dùng biểu thức làm cho chương trình viết tăng thêm phần ý nghĩa với dễ hiểu Thật dùng số 100 thay cho hai biểu tượng trên, chương trình không dễ hiểu không tự nhiên Trình biên dịch khơng chấp nhận lệnh gán giá trị cho biểu tượng Ví dụ 3.4 viết lại sau class MinhHoaC3 { static void Main() { const int DoSoi = 100; // Độ C const int DoDong = 0; // Độ C System.Console.WriteLine( “Do dong cua nuoc {0}”, DoDong ); 46 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# System.Console.WriteLine( “Do soi cua nuoc {0}”, DoSoi ); DoSoi = 200; } } Khi trình biên dịch phát sinh lỗi sau: error CS0131: The left-hand side of an assignment must be a variable, property or indexer Kiểu liệt kê Kiểu liệt kê đơn giản tập hợp tên có giá trị khơng thay đổi (thường gọi danh sách liệt kê) Trong ví dụ 3.4, có hai biểu tượng có quan hệ với nhau: const int DoDong = 0; const int DoSoi = 100; Do mục đích mở rộng ta mong muốn thêm số số khác vào danh sách trên, sau: const int DoNong = 60; const int DoAm = 40; const int DoNguoi = 20; Các biểu tượng điều có ý nghĩa quan hệ với nhau, nói nhiệt độ nước, khai báo cồng kềnh không liên kết chặt chẽ cho Thay vào C# cung cấp kiểu liệt kê để giải vấn đề trên: enum NhietDoNuoc { DoDong = 0, DoNguoi = 20, DoAm = 40, DoNong = 60, DoSoi = 100, } Mỗi kiểu liệt kê có kiểu liệu sở, kiểu liệu kiểu liệu nguyên int, short, long nhiên kiểu lịêu liệt kê không chấp nhận kiểu ký tự Để khai báo kiểu liệt kê ta thực theo cú pháp sau: [thuộc tính] [bổ sung] enum [:kiểu sở] {danh sách thành phần liệt kê}; Thành phần thuộc tính bổ sung tự chọn trình bày phần sau sách Trong phần tập trung vào phần lại khai báo Một kiểu liệt kê bắt đầu với từ khóa enum, tiếp sau định danh cho kiểu liệt kê: 47 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# enum NhietDoNuoc Thành phần kiểu sở kiểu khai báo cho mục kiểu liệt kê Nếu bỏ qua thành phần trình biên dịch gán giá trị mặc định kiểu nguyên int, nhiên sử dụng kiểu nguyên ushort hay long, ngoại trừ kiểu ký tự Đoạn ví dụ sau khai báo kiểu liệt kê sử dụng kiểu sở số nguyên không dấu uint: enum KichThuoc :uint { Nho = 1, Vua = 2, Lon = 3, } Lưu ý khai báo kiểu liệt kê phải kết thúc danh sách liệt kê, danh sách liệt kê phải có gán, thành phần phải phân cách dấu phẩy Ta viết lại ví dụ minh họa 3-4 sau  Ví dụ 3.5: Sử dụng kiểu liệt kê để đơn giản chương trình class MinhHoaC3 { // Khai báo kiểu liệt kê enum NhietDoNuoc { DoDong = 0, DoNguoi = 20, DoAm = 40, DoNong = 60, DoSoi = 100, } static void Main() { System.Console.WriteLine( “Nhiet dong: {0}”, NhietDoNuoc.DoDong); System.Console.WriteLine( “Nhiet nguoi: {0}”, NhietDoNuoc.DoNguoi); System.Console.WriteLine( “Nhiet am: {0}”, NhietDoNuoc.DoAm); System.Console.WriteLine( “Nhiet nong: {0}”, NhietDoNuoc.DoNong); System.Console.WriteLine( “Nhiet soi: {0}”, NhietDoNuoc.DoSoi); } }  Kết quả: 48 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# Nhiet dong: Nhiet nguoi: 20 Nhiet am: 40 Nhiet nong: 60 Nhiet soi: 100 Mỗi thành phần kiểu liệt kê tương ứng với giá trị số, trường hợp số nguyên Nếu khơng khởi tạo cho thành phần chúng nhận giá trị với thành phần Ta xem thử khai báo sau: enum Thutu { ThuNhat, ThuHai, ThuBa = 10, ThuTu } Khi giá trị ThuNhat 0, giá trị ThuHai 1, giá trị ThuBa 10 giá trị ThuTu 11 Kiểu liệt kê kiểu hình thức bắt buộc phải thực phép chuyển đổi tường minh với kiêu giá trị nguyên: int x = (int) ThuTu.ThuNhat; Kiểu chuỗi ký tự Kiểu liệu chuỗi thân thiện với người lập trình ngơn ngữ lập trình nào, kiểu liệu chuỗi lưu giữ mảng ký tự Để khai báo chuỗi sử dụng từ khoá string tương tự cách tạo thể đối tượng nào: string chuoi; Một chuỗi tạo cách đặt chuỗi dấu nháy đôi: “Xin chao” Đây cách chung để khởi tạo chuỗi ký tự với giá trị hằng: string chuoi = “Xin chao” Kiểu chuỗi đề cập sâu chương 10 Định danh Định danh tên mà người lập trình định cho kiểu liệu, phương thức, biến, hằng, hay đối tượng Một định danh phải bắt đầu với ký tự chữ hay dấu gạch dưới, ký tự lại phải ký tự chữ cái, chữ số, dấu gạch 49 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# Theo qui ước đặt tên Microsoft đề nghị sử dụng cú pháp lạc đà (camel notation) bắt đầu ký tự thường để đặt tên cho biến cú pháp Pascal (Pascal notation) với ký tự hoa cho cách đặt tên hàm hầu hết định danh lại Hầu Microsoft khơng cịn dùng cú pháp Hungary iSoNguyen hay dấu gạch Bien_Nguyen để đặt định danh Các định danh khơng trùng với từ khố mà C# đưa ra, khơng thể tạo biến có tên class hay int Ngoài ra, C# phân biệt ký tự thường ký tự hoa C# xem hai biến bienNguyen bienguyen hoàn toàn khác Biểu thức Những câu lệnh mà thực việc đánh giá giá trị gọi biểu thức Một phép gán giá trị cho biến biểu thức: var1 = 24; Trong câu lệnh phép đánh giá hay định lượng phép gán có giá trị 24 cho biến var1 Lưu ý toán tử gán (‘=’) khơng phải tốn tử so sánh Do sử dụng tốn tử biến bên trái nhận giá trị phần bên phải Các tốn tử ngơn ngữ C# phép so sánh hay phép gán trình bày chi tiết mục toán tử chương Do var1 = 24 biểu thức định giá trị 24 nên biểu thức xem phần bên phải biểu thức gán khác: var2 = var1 = 24; Lệnh thực từ bên phải sang biến var1 nhận giá trị 24 tiếp sau var2 nhận giá trị 24 Do hai biến nhận giá trị 24 Có thể dùng lệnh để khởi tạo nhiều biến có giá trị như: a = b = c = d = 24; Khoảng trắng (whitespace) Trong ngôn ngữ C#, khoảng trắng, khoảng tab dòng xem khoảng trắng (whitespace), giống tên gọi xuất khoảng trắng để đại diện cho ký tự C# bỏ qua tất khoảng trắng đó, viết sau: var1 = 24; hay var1 = 24 ; trình biên dịch C# xem hai câu lệnh hoàn toàn giống Tuy nhiên lưu ý khoảng trắng chuỗi không bỏ qua Nếu viết: System.WriteLine(“Xin chao!”); khoảng trắng hai chữ “Xin” “chao” đối xử bình thường ký tự khác chuỗi 50 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# }  Kết quả: 10  Câu lệnh nhảy break continue Khi thực lệnh vòng lặp, có u cầu sau: khơng thực lệnh cịn lại mà khỏi vịng lặp, hay khơng thực cơng việc cịn lại vịng lặp mà nhảy qua vòng lặp Để đáp ứng yêu cầu C# cung cấp hai lệnh nhảy break continue để khỏi vịng lặp Break sử dụng đưa chương trình khỏi vòng lặp tiếp tục thực lệnh tiếp sau vòng lặp Continue ngừng thực cơng việc cịn lại vịng lặp thời quay đầu vòng lặp để thực bước lặp Hai lệnh break continue tạo nhiều điểm làm cho chương trình khó hiểu khó trì Do phải cẩn trọng sử dụng lệnh nhảy Ví dụ 3.16 trình bày bên minh họa cách sử dụng lệnh continue break Đoạn chương trình mơ hệ thống xử lý tín hiệu giao thơng đơn giản Tín hiệu mơ ký tự chữ hoa hay số nhập vào từ bàn phím, sử dụng hàm ReadLine lớp Console để đọc chuỗi ký tự từ bàn phím Thuật tốn chương trình đơn giản: Khi nhận tín hiệu ‘0’ có nghĩa việc bình thường, khơng cần phải làm cơng việc cả, kể việc ghi lại kiện Trong chương trình đơn giản nên tín hiệu nhập từ bàn phím, cịn ứng dụng thật tín hiệu phát sinh theo mẫu tin thời gian sở liệu Khi nhận tín hiệu (mơ ký tự ‘T’) ghi lại tình trạng kết thúc xử lý Cuối cùng, tín hiệu khác phát thơng báo, thông báo đến nhân viên cảnh sát chẳng hạn Trường hợp tín hiệu ‘X’ phát thơng báo sau vịng lặp xử lý kết thúc  Ví dụ 3.16: Sử dụng break continue using System; public class TrafficSignal { public static int Main() { string signal = “0”; // Khởi tạo tín hiệu // bắt đầu chu trình xử lý tín hiệu while ( signal != “X”) 66 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# { //nhập tín hiệu Console.Write(“Nhap vao mot tin hieu: ”); signal = Console.ReadLine(); // xuất tín hiệu thời Console.WriteLine(“Tin hieu nhan duoc: {0}”, signal); // phần xử lý tín hiệu if (signal == “T”) { // Tín hiệu gởi // lưu lại kiện thoát Console.WriteLine(“Ngung xu ly! Thoat\n”); break; } if ( signal == “0”) { // Tín hiệu nhận bình thường // Lưu lại kiện tiếp tục Console.WriteLine(“Tat ca dieu tot!\n”); continue; } // Thực số hành động // tiếp tục Console.WriteLine(“ -bip bip bip\n”); } return 0; } }  Kết quả: sau nhập tín hiệu : “0”, “B”, “T” Nhap vao mot tin hieu: Tin hieu nhan duoc: Tat ca dieu tot! Nhap vao mot tin hieu: B Tin hieu nhan duoc: B -bip bip bip 67 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# Nhap vao mot tin hieu: T Tin hieu nhan duoc: T Ngung xu ly! Thoat Điểm yếu đoạn chương trình nhập vào tín hiệu “T” sau thực số hành động cần thiết chương trình khỏi vịng lặp không xuất câu thông báo bip bip bip Ngược lại nhận tín hiệu sau xuất thơng báo chương trình quay đầu vịng lặp để thực tiếp tục không xuất câu thơng báo bip bip bip Tốn tử Tốn tử kí hiệu biểu tượng dùng để thực hành động Các kiểu liệu C# kiểu nguyên hỗ trợ nhiều toán tử toán tử gán, toán tử toán học, logic Toán tử gán Đến lúc toán tử gán quen thuộc với chúng ta, hầu hết chương trình minh họa từ đầu sách sử dụng phép gán Toán tử gán hay phép gán làm cho toán hạng bên trái thay đổi giá trị với giá trị toán hạng bên phải Toán tử gán tốn tử hai ngơi Đây tốn tử đơn giản thông dụng dễ sử dụng Tốn tử tốn học Ngơn ngữ C# cung cấp năm toán tử toán học, bao gồm bốn toán tử đầu phép toán Toán tử cuối toán tử chia nguyên lấy phần dư Chúng ta tìm hiểu chi tiết phép tốn phần tiếp sau  Các phép toán số học (+,-,*,/) Các phép tốn khơng thể thiếu ngơn ngữ lập trình nào, C# khơng ngoại lệ, phép tốn số học đơn giản cần thiết bao gồm: phép cộng (+), phép trừ (-), phép nhân (*), phép chia (/) nguyên khơng ngun Khi chia hai số ngun, C# bỏ phần phân số, hay bỏ phần dư, tức ta chia 8/3 kết bỏ phần dư 2, để lấy phần dư C# cung cấp thêm tốn tử lấy dư trình bày phần Tuy nhiên, chia cho số thực có kiểu float, double, hay decimal kết chia trả số thực  Phép tốn chia lấy dư Để tìm phần dư phép chia nguyên, sử dụng toán tử chia lấy dư (%) Ví dụ, câu lệnh sau 8%3 kết trả (đây phần dư lại phép chia nguyên) Thật phép toán chia lấy dư hữu dụng cho người lập trình Khi thực phép chia dư n cho số khác, số bội số n kết phép chia dư Ví dụ 20 % = 20 bội số Điều cho phép ứng dụng 68 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# vịng lặp, muốn thực cơng việc cách khoảng n lần, ta cần kiểm tra phép chia dư n, kết thực cơng việc Cách sử dụng áp dụng ví dụ minh họa sử dụng vịng lặp for bên Ví dụ 3.17 sau minh họa sử dụng phép toán chia số nguyên, thực  Ví dụ 3.17: Phép chia phép chia lấy dư using System; class Tester { public static void Main() { int i1, i2; float f1, f2; double d1, d2; decimal dec1, dec2; i1 = 17; i2 = 4; f1 = 17f; f2 = 4f; d1 = 17; d2 = 4; dec1 = 17; dec2 = 4; Console.WriteLine(“Integer: \t{0}”, i1/i2); Console.WriteLine(“Float: \t{0}”, f1/f2); Console.WriteLine(“Double: \t{0}”, d1/d2); Console.WriteLine(“Decimal: \t{0}”, dec1/dec2); Console.WriteLine(“\nModulus: : \t{0}”, i1%i2); } }  Kết quả: Integer: float: 4.25 double: 4.25 decimal: 4.25 69 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# Modulus: - Toán tử tăng giảm Khi sử dụng biến số ta thường có thao tác cộng giá trị vào biến, trừ giá trị từ biến đó, hay thực tính tốn thay đổi giá trị biến sau gán giá trị vừa tính tốn cho biến  Tính tốn gán trở lại Giả sử có biến tên Luong lưu giá trị lương người, biến Luong có giá trị thời 1.500.000, sau để tăng thêm 200.000 ta viết sau: Luong = Luong + 200.000; Trong câu lệnh phép cộng thực trước, kết vế phải 1.700.000 kết gán lại cho biến Luong, cuối Luong có giá trị 1.700.000 Chúng ta thực việc thay đổi giá trị gán lại cho biến với phép toán số học nào: Luong = Luong * 2; Luong = Luong – 100.000; Do việc tăng hay giảm giá trị biến thường xảy tính tốn nên C# cung cấp phép toán tự gán (self- assignment) Bảng sau liệt kê phép toán tự gán Toán tử += -= *= /= %= Ý nghĩa Cộng thêm giá trị toán hạng bên phải vào giá trị toán hạng bên trái Toán hạng bên trái trừ bớt lượng giá trị toán hạng bên phải Toán hạng bên trái nhân với lượng giá trị toán hạng bên phải Toán hạng bên trái chia với lượng giá trị toán hạng bên phải Toán hạng bên trái chia lấy dư với lượng giá trị toán hạng bên phải Bảng 3.4: Mơ tả phép tốn tự gán Dựa phép toán tự gán bảng ta thay lệnh tăng giảm lương sau: 70 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# Luong += 200.000; Luong *= 2; Luong -= 100.000; Kết lệnh thứ giá trị Luong tăng thêm 200.000, lệnh thứ hai làm cho giá trị Luong nhân đôi tức tăng gấp lần, lệnh cuối trừ bớt 100.000 Luong Do việc tăng hay giảm phổ biến lập trình nên C# cung cấp hai toán tử đặc biệt tăng (++) hay giảm ( ) Khi muốn tăng giá trị biến đếm vòng lặp ta viết sau: bienDem++; Tốn tử tăng giảm tiền tố tăng giảm hậu tố Giả sử muốn kết hợp phép toán gia tăng giá trị biến gán giá trị biến cho biến thứ hai, ta viết sau:  var1 = var2++; Câu hỏi đặt gán giá trị trước cộng hay gán giá trị sau cộng Hay nói cách khác giá trị ban đầu biến var2 10, sau thực ta muốn giá trị var1 10, var2 11, hay var1 11, var2 11? Để giải yêu cầu C# cung cấp thứ tự thực phép toán tăng/giảm với phép toán gán, thứ tự gọi tiền tố (prefix) hay hậu tố (postfix) Do ta viết: var1 = var2++; // Hậu tố Khi lệnh thực phép gán thực trước tiên, sau đến phép toán tăng Kết var1 = 10 var2 = 11 Còn trường hợp tiền tố: var1 = ++var2; Khi phép tăng thực trước tức giá trị biến var2 11 cuối phép gán thực Kết hai biến var1 var2 điều có giá trị 11 Để hiểu rõ hai phép tốn xem ví dụ minh họa 3.18 sau  Ví dụ 3.18: Minh hoạ sử dụng toán tử tăng trước tăng sau gán using System; class Tester { static int Main() { int valueOne = 10; int valueTwo; valueTwo = valueOne++; Console.WriteLine(“Thuc hien tang sau: {0}, {1}”, valueOne, valueTwo); valueOne = 20; 71 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# valueTwo = ++valueOne; Console.WriteLine(“Thuc hien tang truoc: {0}, {1}”, valueOne, valueTwo); return 0; } }  Kết quả: Thuc hien tang sau: 11, 10 Thuc hien tang truoc: 21, 21 - Toán tử quan hệ Những toán tử quan hệ dùng để so sánh hai giá trị, sau trả kết giá trị logic kiểu bool (true hay false) Ví dụ tốn tử so sánh lớn (>) trả giá trị true giá trị bên trái toán tử lớn giá trị bên phải toán tử Do > trả giá trị true, > trả giá trị false Các toán tử quan hệ ngơn ngữ C# trình bày bảng 3.4 bên Các toán tử bảng minh họa với hai biến value1 value2, value1 có giá trị 100 value2 có giá trị 50 Tên tốn tử So sánh Kí hiệu Kết so sánh >= < value2 != 100 false true value1 > value2 true false value2 >= 50 true value1 < value2 false value2 < value1 Lớn hay Nhỏ > false value2 > value1 Lớn true value2 != 90 != value1 == 100 value1 == 50 Không == Biểu thức so sánh true Nhỏ hay = is Trái + - ! ~ ++x –x (T)x Trái Trái 74 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# So sánh Phép AND Phép XOR Phải == != toán logic & Trái toán logic ^ Trái 10 11 Phép toán logic OR Điều kiện AND | 12 13 Điều kiện OR Điều kiện || 14 Phép gán = *= /= %= += -= = Trái Trái && Trái Phải ?: &= Phải ^= |= Bảng 3.6: Thứ tự ưu tiên toán tử Các phép tốn liệt kê loại có thứ tự theo mục thứ thự bảng: thứ tự trái tức độ ưu tiên phép toán từ bên trái sang, thứ tự phải phép tốn có độ ưu tiên từ bên phải qua trái Các toán tử khác loại có độ ưu tiên từ xuống dưới, toán tử loại có độ ưu tiên cao phép tốn gán có độ ưu tiên thấp tốn tử Tốn tử ba ngơi Hầu hết tốn tử địi hỏi có tốn hạng tốn tử (++, ) hay hai toán hạng (+,-,*,/, ) Tuy nhiên, C# cịn cung cấp thêm tốn tử có ba tốn hạng (?:) Tốn tử có cú pháp sử dụng sau: ? : Toán tử xác định giá trị biểu thức điều kiện, biểu thức điều kiện phải trả giá trị kiểu bool Khi điều kiện thực hiện, cịn ngược lại điều kiện sai thực Có thể diễn giải theo ngơn ngữ tự nhiên tốn tử có ý nghĩa : “Nếu điều kiện làm cơng việc thứ nhất, cịn ngược lại điều kiện sai làm cơng việc thứ hai” Cách sử dụng tốn tử ba ngơi minh họa ví dụ 3.19 sau  Ví dụ 3.19: Sử dụng tốn tử bao using System; class Tester { public static int Main() { int value1; 75 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# int value2; int maxValue; value1 = 10; value2 = 20; maxValue = value1 > value2 ? value1 : value2; Console.WriteLine(“Gia tri thu nhat {0}, gia tri thu hai {1}, gia tri lon nhat {2}”, value1, value2, maxValue); return 0; } }  Kết quả: Gia tri thu nhat 10, gia tri thu hai 20, gia tri lon nhat 20 Trong ví dụ minh họa tốn tử ba ngơi sử dụng để kiểm tra xem giá trị value1 có lớn giá trị value2, trả giá trị value1, tức gán giá trị value1 cho biến maxValue, cịn ngược lại gán giá trị value2 cho biến maxValue Namespace Chương thảo luận việc sử dụng đặc tính namespace ngơn ngữ C#, nhằm tránh xung đột việc sử dụng thư viện khác từ nhà cung cấp Ngoài ra, namespace xem tập hợp lớp đối tượng, cung cấp định danh cho kiểu liệu đặt cấu trúc phân cấp Việc sử dụng namespace lập trình thói quen tốt, cơng việc cách lưu mã nguồn để sử dụng sau Ngoài thư viện namespace MS.NET hãng thứ ba cung cấp, ta tạo riêng cho namespace C# đưa từ khóa using đề khai báo sử dụng namespace chương trình: using < Tên namespace > Để tạo namespace dùng cú pháp sau: namespace { < Định nghĩa lớp A> < Định nghĩa lớp B > } Đoạn ví dụ 3.20 minh họa việc tạo namespace  Ví dụ 3.20: Tạo namespace 76 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# namespace MyLib { using System; public class Tester { public static int Main() { for (int i =0; i < 10; i++) { Console.WriteLine( “i: {0}”, i); } return 0; } } } Ví dụ tạo namespace có tên MyLib, bên namespace chứa lớp có tên Tester C# cho phép namespace tạo namespace khác lồng bên không giới hạn mức độ phân cấp này, việc phân cấp minh họa ví dụ 3.21  Ví dụ 3.21: Tạo namespace lồng namespace MyLib { namespace Demo { using System; public class Tester { public static int Main() { for (int i =0; i < 10; i++) { Console.WriteLine( “i: {0}”, i); } return 0; } } 77 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# } } Lớp Tester ví dụ 3.21 đặt namespace Demo tạo lớp Tester khác bên ngồi namespace Demo hay bên ngồi namespace MyLib mà khơng có tranh cấp hay xung đột Để truy cập lớp Tester dùng cú pháp sau: MyLib.Demo.Tester Trong namespace lớp gọi lớp khác thuộc cấp namespace khác nhau, ví dụ tiếp sau minh họa việc gọi hàm thuộc lớp namespace khác  Ví dụ 3.22: Gọi namespace thành viên using System; namespace MyLib { namespace Demo1 { class Example1 { public static void Show1() { Console.WriteLine(“Lop Example1”); } } } namespace Demo2 { public class Tester { public static int Main() { Demo1.Example1.Show1(); Demo1.Example2.Show2(); return 0; } } } } // Lớp Example2 có namespace MyLib.Demo1 với 78 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# //lớp Example1 hai khai báo không khối namespace MyLib.Demo1 { class Example2 { public static void Show2() { Console.WriteLine(“Lop Example2”); } } }  Kết quả: Lop Exemple1 Lop Exemple2 Ví dụ 3.22 có hai điểm cần lưu ý cách gọi namespace thành viên cách khai báo namspace Như thấy namespace MyLib có hai namespace cấp Demo1 Demo2, hàm Main Demo2 chương trình thực hiện, hàm Main có gọi hai hàm thành viên tĩnh hai lớp Example1 Example2 namespace Demo1 Ví dụ đưa cách khai báo khác lớp namespace Hai lớp Example1 Example2 điều thuộc namespace MyLib.Demo1, nhiên Example2 khai báo khối riêng lẻ cách sử dụng khai báo: namespace MyLib.Demo1 { class Example2 { } } Việc khai báo riêng lẻ cho phép nhiều tập tin nguồn khác nhau, đảm bảo khai báo tên namspace chúng thuộc namespace Các dẫn biên dịch Đối với ví dụ minh họa phần trước, biên dịch tồn chương trình biên dịch Tuy nhiên, có yêu cầu thực tế muốn phần 79 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# chương trình biên dịch độc lập, ví dụ debug chương trình xây dựng ứng dụng Trước mã nguồn biên dịch, chương trình khác gọi chương trình tiền xử lý thực trước chuẩn bị đoạn mã nguồn để biên dịch Chương trình tiền xử lý tìm mã nguồn kí hiệu dẫn biên dịch đặc biệt, tất dẫn biên dịch bắt đầu với dấu rào (#) Các dẫn cho phép định nghĩa định danh kiểm tra tồn định danh Định nghĩa định danh Câu lệnh tiền xử lý sau: #define DEBUG Lệnh định nghĩa định danh tiền xử lý có tên DEBUG Mặc dù thị tiền xử lý khác đặt đâu chương trình, với thị định nghĩa định danh phải đặt trước tất lệnh khác, bao gồm câu lệnh using Để kiểm tra định danh định nghĩa ta dùng cú pháp #if Do ta viết sau: #define DEBUG // Các đoạn mã nguồn bình thường, khơng bị tác động trình tiền xử lý #if DEBUG // Các đoạn mã nguồn khối if debug biên dịch #else // Các đoạn mã nguồn không định nghĩa debug không biên dịch #endif // Các đoạn mã nguồn bình thường, khơng bị tác động trình tiền xử lý Khi chương trình tiền xử lý thực hiện, chúng tìm thấy câu lệnh #define DEBUG lưu lại định danh DEBUG Tiếp theo trình tiền xử lý bỏ qua tất đoạn mã bình thường khác C# tìm khối #if, #else, #endif Câu lệnh #if kiểm tra định danh DEBUG, định danh định nghĩa, nên đoạn mã nguồn khối #if đến #else biên dịch vào chương trình Cịn đoạn mã nguồn #else #endif không biên dịch Tức đoạn mã nguồn không thực hay xuất bên mã hợp ngữ chương trình Trường hợp câu lệnh #if sai tức khơng có định nghĩa định danh DEBUG chương trình, đoạn mã nguồn khối #if #else khơng đưa vào chương trình để biên dịch mà ngược lại đoạn mã nguồn khối #else #endif biên dịch Lưu ý: Tất đoạn mã nguồn bên ngồi #if #endif khơng bị tác động trình tiền xử lý tất mã đưa vào để biên dịch 80 Nền Tảng Ngôn Ngữ C# ... 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Trong đoạn chương trình có sử dụng tốn tử chia lấy dư modulo, toán tử đề cập đến phần sau Ý nghĩa lệnh i%10... Exemple2 Ví dụ 3 .22 có hai điểm cần lưu ý cách gọi namespace thành viên cách khai báo namspace Như thấy namespace MyLib có hai namespace cấp Demo1 Demo2, hàm... Main() { int i1, i2; float f1, f2; double d1, d2; decimal dec1, dec2; i1 = 17; i2 = 4; f1 = 17f; f2 = 4f; d1 = 17; d2 = 4; dec1 = 17; dec2 = 4; Console.WriteLine(“Integer: \t{0}”, i1/i2); Console.WriteLine(“Float:

Ngày đăng: 25/07/2014, 07:21

Từ khóa liên quan

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

Tài liệu liên quan