Trang

Saturday, June 7, 2014

Kiểu dữ liệu enum trong C++

C++ cho phép lập trình viên tự tạo loại dữ liệu của riêng họ. Có lẽ một trong những cách đơn giản nhât để làm việc đó là sử dụng loại enumerated. Một enum là một kiểu dữ liệu đặc biệt thường dùng để định nghĩa một quan hệ thứ tự cho một tập hợp hữu hạn các tên (Trong thực tế thì enum có kiểu int). Loại enumerated được khai báo qua từ khóa enum.Chúng ta xem xét qua ví dụ dưới đây :
enum Color

{

     // Dinh nghia mot enum

     // Dinh nghia tat ca gia tri co the ma color co the nam giữ

     COLOR_BLACK,

     COLOR_RED,

     COLOR_BLUE,

     COLOR_GREEN,

     COLOR_WHITE,

     COLOR_CYAN,

     COLOR_YELLOW,

     COLOR_MAGENTA

};

// khai báo một biến thuộc loại enumerated Color
Coler eColor = COLOR_WHITE ;
Định nghĩa một loại enumerated sẻ không được cấp phát bộ nhớ . Khi một biến của thuộc loại enumerated được khai báo (như eColor ở trên), thì biến đó sẻ được cấp phát bộ nhớ tại thời điểm khai báo.
Biến kiểu enum thì có kích thước giống như một biến kiểu int. Nguyên nhân là vì mỗi phần tử enumerated được tự động gán một giá trị kiểu int dựa vào vị trí của phần tử đó trong enum. Mặc định, phần tử đầu tiên trong enumerated sẻ được gán giá trị bằng 0 và sau đó mỗi phần tử liền sau được tăng lên 1 so với phần tử đứng trước nó.
enum Color

{

     COLOR_BLACK, // mặc định gán bằng 0

     COLOR_RED, // mặc định gán bằng 1

     COLOR_BLUE, // mặc định gán bằng 2

     COLOR_GREEN, // mặc định gán bằng 3

     COLOR_WHITE, // mặc định gán bằng 4

     COLOR_CYAN, // mặc định gán bằng 5

     COLOR_YELLOW, // mặc định gán bằng 6

     COLOR_MAGENTA // mặc định gán bằng 7

};

Color eColor = COLOR_WHITE;

cout << eColor;
Khi thực thi câu lệnh ở trên, giá trị in ra màn hình sẻ là 4
Bạn cũng có thể chỉ rõ giá trị của mỗi phần tử của enum khi khái báo. Giá trị có thể là nguyên âm, nguyên dương và có thể không duy nhất(các phần tử trong enum có thể có giá trị như nhau). Bất cứ giá trị nào không được chỉ rõ giá trị khi định nghĩa thì nó sẻ có giá trị bằng phần tử đứng trước nó cộng thêm 1. Chúng ta xem xét ví dụ dưới đây :
enum Animal

{

     ANIMAL_CAT = -3,

     ANIMAL_DOG, // giá trị mặc định tăng lên 1 so với giá trị trước nên nó là -2

     ANIMAL_PIG, // giá trị mặc định tăng lên 1 so với giá trị trước nên nó là -1

     ANIMAL_HORSE = 5,

     ANIMAL_GIRAFFE = 5,

     ANIMAL_CHICKEN // giá trị mặc định tăng lên 1 so với giá trị trước nên nó là 6

};
Bởi vì giá trị của mỗi phần tử trong enumerated có kiểu integer, chúng ta có thể gán phần tử của enum cho một biến kiểu integer :
int nValue = ANIMAL_PIG ;
Tuy nhiên, trình biên dịch không cho phép bạn gán một số nguyên cho một phần tử của enum. Câu lệnh dưới đây sẻ gây ra lỗi khi biên dịch :
Animal eAninal = 5 ; // sẻ báo lỗi
Mỗi loại enumerated tách biệt với những enum khác. Do đó, nếu bạn cố gắng gán một phần tử của enum này cho một phần tử của enum khác thì sẻ gây ra lỗi:
Animal eAnimal = COLOR BLUE ; // câu lệnh bị lỗi
Loại enumerated thường đặc biệt có ích khi bạn cần mô tả code của bạn dể hiểu.
Ví dụ , những hàm thường trả về một giá trị số nguyên nào đó khi lời gọi hàm đó sai. Bình thường một số nguyên âm thường dùng để miêu tả lỗi. Ví dụ :
int ParseFile()

{

     if (!OpenFile()) 

         return -1;

     if (!ReadFile())

         return -2;

     if (!Parsefile())

         return -3;



     return 0; // thành công

}
Tuy nhiên sử dụng số nguyên âm như trên thường không miêu tả được lỗi. Bạn có thể sử dụng loại enum để thay thế cho các số nguyên ở trên :
enum ParseResult

{

     SUCCESS = 0,

     ERROR_OPENING_FILE = -1,

     ERROR_READING_FILE = -2,

     ERROR_PARSING_FILE = -3,

};

ParseResult ParseFile()

{

     if (!OpenFile())

         return ERROR_OPENING_FILE;

     if (!ReadFile())

         return ERROR_READING_FILE;

     if (!Parsefile())

         return ERROR_PARSING_FILE;



     return SUCCESS;

}


Kiểu dữ liệu Enum C#


Enum là kiểu dữ liệu liệt kê. Giúp bạn tổ chức dữ liệu khoa học hơn, code được trong sáng dễ hiểu hơn.
Đầu tiên cùng xét một ví dụ đơn gián:
PHP Code:
class EnumTest1{

    
//đầu tiên bạn tạo ra một enum, với giá trị khởi đầu là ‘none’

    
enum StackTag

    
{

        
None,         // giá trị mặc định là 0.

        
BoldTag,      // 1

        
ItalicsTag,   // 2

        
HyperlinkTag// và 3.

    
};

   
// cách sử dụng kiểu enum

    
public EnumTest1()

    {

        
// một đối tượng generic sử dụng một enum

         
Stack<StackTagstack = new Stack<StackTag>();

 

      
stack.Push(StackTag.BoldTag);    // thêm một phần tử vào stack

      
stack.Push(StackTag.ItalicsTag); // Phần tử thứ 2

      
StackTag thisTag stack.Pop();  // Phần tử cuối

    
}

}  
Bạn có thể lấy tên tùy ý cho enum miễn là phải có từ khóa enum, Chúng ta không gán một số cho một phần tử của enum, nó sẽ mặc định là bắt đầu từ 0 và tự động tăng.
Chúng ta có thể sử dụng Generic collections với enum. Hoặc List <StackTag> cũng có thể được thay thế. Đây là một kĩ thuật hiệu quả.
Enum là một kiểu giá trị tùy chỉnh được lưu trong stack và được khởi tạo từ 0.
In ra tên của enum.

Trong C#, bạn có một số tên cho enums. Có thể là "None", "Hidden", và "Visible". Nó được nhớ bởi C# và không được sửa lại như một số biến khác. Do vậy chúng ta có thể dùng code in chúng ra
PHP Code:
// Enum này có giá trị mặc địnhenum VisibleType{

    
None 0,    // Nên là 0

    
Hidden 2,  // có thể là một số bất kì

    
Visible 4  };enum BugEnum{

    
Cat 1,

    
Dog 2};// in ra tên của enumpublic void Example_ToString()

{

    
BugEnum bugEnum BugEnum.Dog;

    
VisibleType visEnum VisibleType.Hidden;

 

    
// chúng ta có 2 enum và muốn in ra tên của chúng

    
Console.WriteLine(bugEnum.ToString() + ", " visEnum.ToString());

    
// Kết quả "Dog, Hidden".}  
Chuyển kiểu string về enum

Bạn phải sử dụng phương thức Enum.Parse. Toán tử typeof dùng để truyền tham số cho hàm Parse – xác định enum nào?

PHP Code:
public void Example_Parse()

{

    
// Chúng ta có một string có tên trùng với tên một enum.

    
string dogString "Dog";

 

    
// Chuyển nó về kiểu enum dùng Parse

    
BugEnum bugEnum = (BugEnum)Enum.Parse(typeof(BugEnum), dogString);

 

    if (
bugEnum == BugEnum.Dog)

    {

        
// xâu đã được chuyển đổi và chúng ta có 2 giá trị là dog

        
Console.WriteLine("Both are dog values.");

    }

}  
Sử dụng câu lệnh Switch với Enums.

Bạn sử dụng switch trong trường hợp một enum là một tập con của một dải enum.
PHP Code:
public enum StackTag{

    
None,

    
BoldTag,

    
ItalicsTag,

    
HyperlinkTag};

 

public static 
bool IsFormatTag(StackTag tag)

{

    switch (
tag)

    {

        case 
StackTag.BoldTag:

        case 
StackTag.ItalicsTag:

            return 
true;

        default:

            return 
false;

    }

}  
Hi vọng bài viết nhỏ này giúp bạn một phần nào đó.

Thân.

1 comment:

  1. hay lắm..thanks ad nhiều nhé !!
    tai game pvtk mới nhất tại http://www.thienduongmobi.net/2016/02/tai-game-phong-van-truyen-ky.html

    ReplyDelete