Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: Kiểu Union và Kiểu liệt kê Enum trong lập trình C/C++

  1. #1
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Mặc định Kiểu Union và Kiểu liệt kê Enum trong lập trình C/C++

    Thấy trên diễn đàn ít đề cập về mấy vụ này , mà đọc sách thì cũng thấy lướt sơ sơ không có ai nói gì nhiều cả > anh em nào sành thì post lên đôi điều coi !

  2. #2
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Mặc định KIỂU UNION trong lập trình C/C++

    BÀN VỀ KIỂU UNION
    Kiểu union là một dạng cấu trúc dữ liệu đặc biệt của ngôn ngữ C. Nó rất giống với kiểu struct. Chỉ khác một điều, trong kiểu union, các trường được phép dùng chung một vùng nhớ. Hay nói cách khác, cùng một vùng nhớ ta có thể truy xuất dưới các dạng khác nhau.
    Khai báo tổng quát của kiểu union như sau:
    C Code:
    1. typedef union <tên kiểu union>
    2. {
    3.      <kiểu dữ liệu> <tên trường>;
    4.      <kiểu dữ liệu> <tên trường>;
    5.      ……… // còn nhiều trường nữa
    6. } [<Name>];
    Ví dụ, ta có thể định nghĩa kiểu số sau:
    C Code:
    1. typedef union tagNumber
    2. {
    3.     int i;
    4.     long l;
    5. }  Number;
    Ồ, sao mà giống kiểu struct vậy ta, 2 thằng này là một sao? Hi, không phải vậy đâu, sự việc là như thế này: việc truy xuất đến một trường trong union được thực hiện hoàn toàn giống như trong struct. Giả sử có biến n kiểu Number. Khi đó, n.i cho ta một số kiểu int còn n.l cho ta một số kiểu long, nhưng cả hai đều dùng chung một vùng nhớ. Vì vậy, khi ta gán
    n.l = 3000;
    thì giá trị của n.i cũng bị thay đổi (n.i sẽ bằng 3000);
    Việc dùng kiểu union rất có lợi khi cần khai báo các CTDL mà nội dung của nó thay đổi tùy trạng thái. Ví dụ để mô tả các thông tin về một con người ta có thể khai báo một kiểu dữ liệu như sau:
    C Code:
    1. struct tagNguoi
    2. {
    3.   char HoTen[35];
    4.   int NamSinh;
    5.   char NoiSinh[40];
    6.   char GioiTinh; //0: Nữ, 1: Nam
    7.   char DiaChi[50];
    8.   char Ttgd; //0:Không có gia đình, 1: Có gia đình
    9.   union
    10.   {
    11.       char tenVo[35];
    12.       char tenChong[35];
    13.   }
    14. } Nguoi;

    Tùy theo người mà ta đang xét là nam hay nữ ta sẽ truy xuất thông tin qua trường có tên tenVo hoặc tenChong.

  3. #3
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Mặc định ENUM - Kiểu liệt kê trong lập trình C/C++

    BÀN VỀ ENUM (kiểu liệt kê)
    Kiểu dữ liệu liệt kê dùng để tạo ra các kiểu dữ liệu chứa một cái gì đó hơi đặc biệt một chút, không phải kiểu số hay kiểu kí tự hoặc các hằng true và false. Dạng thức của nó như sau:
    Syntax Code:
    1. <enum> <tên enum>
    2. {
    3.      giá trị 1 = giá trị gì đó,
    4.      giá trị 2 = giá trị gì đó,
    5.      giá trị 3 = giá trị gì đó,
    6.      ...
    7. }
    Lưu ý: giữa các giá trị trong enum được cách bằng dấu phẩy (,) chứ không phải là dấu chấm phải ( đâu nhé. Không cẩn thận là chẳng biết đâu mà debug đâu
    Để minh họa mình cho 1 ví dụ minh họa, thông thường ví dụ cổ điển là tạo kiểu enum chứa các giá trị các ngày trong tuần
    C Code:
    1. enum NgayTrongTuan
    2. {
    3.      ThuHai = 2;
    4.      ThuBa = 3;
    5.      ThuTu = 4;
    6.      ThuNam = 5;
    7.      ThuSau = 6;
    8.      ThuBay = 7;
    9.      ChuNhat = 8;
    10. }
    Bây giờ tôi muốn sử dụng nó thì sao nhỉ, còn chờ gì nữa, hãy làm tương tự như kiểu struct và union như thế này này:
    C Code:
    1. // tạo 3 biến HomQua, HomNay,NgayMai kiểu enum NgayTrongTuan
    2. NgayTrongTuan HomQua,HomNay,NgayMai;
    Nãy giờ xem ví dụ, các bạn có để ý điều gì không nhỉ,à, thấy rồi, kiểu enum đơn giản là 1 tập hợp các const (hằng số),nó sẽ thay thế những hằng số vô hồn (2,3,..,8) bằng những chữ cái dễ nhớ.
    Thay vì ta ghi:
    C Code:
    1. #define ThuHai 2
    2. #define ThuBa 3
    3. ...
    thì ta có thể dùng kiểu enum như trên.
    Để hiểu hơn, chúng ta chơi thêm 1 ví dụ nữa nhé:
    C Code:
    1. enum color
    2. {
    3.     black,
    4.     blue,
    5.     green,
    6.     cyan,
    7.     red,
    8.     purple,
    9.     yellow,
    10.     white,
    11. }
    12. color myColor;
    13. myColor = blue;
    14. if (myColor == green) myColor=red;
    Chú ý rằng chúng ta không sử dụng bất kì một kiểu dữ liệu cơ bản nào trong phần khai báo. Chúng ta đã tạo ra một kiểu dữ liệu mới mà không dựa trên bất kì kiểu dữ liệu nào có sẵn: kiểu color, những giá trị có thể của kiểu color được viết trong cặp ngoặc nhọn {}
    Trên thực tế kiểu dữ liệu liệt kê được dịch là một số nguyên và các giá trị của nó là các hằng số nguyên được chỉ định. Nếu điều này không đựoc chỉ định, giá trị nguyên tương đương với phần tử đầu tiên là 0 và các giá trị tiếp theo cứ thế tăng lên 1, Vì vậy, trong kiểu dữ liệu color mà chúng ta định nghĩa ở trên, white tương đương với 0, blue tương đương với 1, green tương đương với 2 và cứ tiếp tục như thế.
    Nếu chúng ta chỉ định một giá trị nguyên cho một giá trị nào đó của kiểu dữ liệu liệt kê thì các giá trị tiếp theo sẽ là các giá trị nguyên tiếp theo.

  4. #4
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Neverland quá năng động he he Tui không có gì để giải thích thêm ! .

    Tóm lại kiểu union và kiểu float có nét tương đồng với nhau về mặt hình thức khai báo , chúng chỉ khác nhau ở điểm struct khai báo bi nhiêu biến có thể dùng bấy nhiêu biên , union khai báo bi nhiêu biến được quyền dùng 1 biến trong bi nhiêu biến ấy , kích cỡ của union thì bằng kích cỡ của kiểu dữ liệu lớn nhất . uhm còn 1 điều nữa là giữa union và struct có thể ***g nhau ok ?

    Về kiểu enum , có thể xem nó giống như thằng #define mà chúng ta quen thuộc kết hợp với các chỉ số của mảng . Có điều nó không thông dụng lắm , trong các bài tập của anh em mình .

  5. #5
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Trích dẫn Nguyên bản được gửi bởi kidkid Xem bài viết
    Về kiểu enum , có thể xem nó giống như thằng #define mà chúng ta quen thuộc kết hợp với các chỉ số của mảng . Có điều nó không thông dụng lắm , trong các bài tập của anh em mình .
    Thật ra trong C/C++ mọi người ít khi sử dụng enum, nhưng trong C#, enum lại rất phổ biến, hầu như đều có mặt trong mọi chương trình lớn.

  6. #6
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Mặc định Kiểu Union và Kiểu liệt kê Enum trong lập trình C/C++

    dùng enum khiến chương trình cô đọng và trong sáng. Nếu thay vì dùng enum lại sử dụng cách khác sẽ thấy chương trình rất luộm thuộm

    Thật ra trong C/C++ mọi người ít khi sử dụng enum, nhưng trong C#, enum lại rất phổ biến,
    Trong C++ cũng rất hay dùng enum

    Nhưng nó có 1 điểm yếu (theo cách nhìn của mình), không biết mọi người có biết không?

  7. #7
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Trích dẫn Nguyên bản được gửi bởi nguyentuan2 Xem bài viết
    dùng enum khiến chương trình cô đọng và trong sáng. Nếu thay vì dùng enum lại sử dụng cách khác sẽ thấy chương trình rất luộm thuộm


    Trong C++ cũng rất hay dùng enum

    Nhưng nó có 1 điểm yếu (theo cách nhìn của mình), không biết mọi người có biết không?
    He, để mình đoán thử nhé, enum là 1 kiểu tập hợp, nghĩa là những gì có liên quan với nhau như (thời tiết, ngày tháng,...) thì mình sẽ dùng nó, nhưng có những cái chẳng liên quan với nhau mà dùng nó thì khó mà dùng. Ví dụ cho vui vui 1 tí nhé
    C++ Code:
    1. enum CungDinh   //là Cung Đình đó
    2. {
    3.     NgocHoang=100, // ngọc hoàng thượng đế
    4.     VuongMau = 99, // vương mẫu nương nương
    5.     NhiLangThan = 98, //nhị lang thần
    6.     //...
    7.     [b]DiemVuong = -1[/b] //hix, sao lại có diêm vương ở trên cung đình
    8.     [b]MaQuy = -9[/b] //hix, ma quỷ ở dưới đất chứ làm gì có trên cung đình pa
    9. }
    Bây giờ mình sử dụng CungDinh nhé, khổ nỗi mình chỉ biết NgocHoang,VuongMau,NhiLangThan ở trên cung đình, chứ ai mà ngờ ông DiemVuong và ma quỷ cũng mon men lên cung đình chơi. Biết chết liền!!!
    Đó là enum do mình tạo ra đó nha, chứ giả sử do người khác tạo ra chắc mình cũng phải tự hỏi "người ta đã làm điều đó....để làm gì?"

  8. #8
    Ngày gia nhập
    07 2006
    Bài viết
    121

    C Code:
    1. #include<stdio.h>
    2. enum FontStyle{ FS_PAIN=0,FS_BOLD=1,FS_ITALIC=2};
    3. int main()
    4. {
    5.     int fontstyle=3;
    6.     if(fontstyle&FS_BOLD==FS_BOLD)printf("\n font nay in dam");
    7.     if(fontstyle&FS_ITALIC==FS_ITALIC)printf("\n font nay nghieng");
    8.  
    9.     return 0;
    10. }
    Đây là cơ chế rất hay sử dụng của Enum
    Đã được chỉnh sửa lần cuối bởi shinichi_haha : 12-04-2007 lúc 07:28 PM.

    OoShinHaoO

  9. #9
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    à,
    Enum thực là định nghĩa các số tự nhiên, bản chất của nó đúng là số tự nhiên
    enum có thể tự động chuyển thành số tự nhiên, nhưng số tự nhiên không thể tự chuyển thành enum (phải ép kiểu), cái này thì đương nhiên đúng và dễ hiểu

    Vì thế có lúc bạn sẽ gặp lỗi khi thực hiện các toán tử logic ví dụ | & trên enum

    Như trong ct của bạn shinichi_haha, nếu viết thêm

    FontStyle fs_all = FS_PAIN | FS_BOLD | FS_ITALIC;

    thì sẽ bị lỗi

    => toàn bộ ý mình muốn nói là enum là số tự nhiên nhưng lại không thể áp dụng được các tác vụ của số tự nhiên lên nó

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi neverland87 Xem bài viết
    BÀN VỀ KIỂU UNION
    Kiểu union là một dạng cấu trúc dữ liệu đặc biệt của ngôn ngữ C. Nó rất giống với kiểu struct. Chỉ khác một điều, trong kiểu union, các trường được phép dùng chung một vùng nhớ. Hay nói cách khác, cùng một vùng nhớ ta có thể truy xuất dưới các dạng khác nhau.
    Khai báo tổng quát của kiểu union như sau:
    C Code:
    1. typedef union <tên kiểu union>
    2. {
    3.      <kiểu dữ liệu> <tên trường>;
    4.      <kiểu dữ liệu> <tên trường>;
    5.      ……… // còn nhiều trường nữa
    6. } [<Name>];
    Ví dụ, ta có thể định nghĩa kiểu số sau:
    C Code:
    1. typedef union tagNumber
    2. {
    3.     int i;
    4.     long l;
    5. }  Number;
    Ồ, sao mà giống kiểu struct vậy ta, 2 thằng này là một sao? Hi, không phải vậy đâu, sự việc là như thế này: việc truy xuất đến một trường trong union được thực hiện hoàn toàn giống như trong struct. Giả sử có biến n kiểu Number. Khi đó, n.i cho ta một số kiểu int còn n.l cho ta một số kiểu long, nhưng cả hai đều dùng chung một vùng nhớ. Vì vậy, khi ta gán
    n.l = 3000;
    thì giá trị của n.i cũng bị thay đổi (n.i sẽ bằng 3000);
    Việc dùng kiểu union rất có lợi khi cần khai báo các CTDL mà nội dung của nó thay đổi tùy trạng thái. Ví dụ để mô tả các thông tin về một con người ta có thể khai báo một kiểu dữ liệu như sau:
    C Code:
    1. struct tagNguoi
    2. {
    3.   char HoTen[35];
    4.   int NamSinh;
    5.   char NoiSinh[40];
    6.   char GioiTinh; //0: Nữ, 1: Nam
    7.   char DiaChi[50];
    8.   char Ttgd; //0:Không có gia đình, 1: Có gia đình
    9.   union
    10.   {
    11.       char tenVo[35];
    12.       char tenChong[35];
    13.   }
    14. } Nguoi;

    Tùy theo người mà ta đang xét là nam hay nữ ta sẽ truy xuất thông tin qua trường có tên tenVo hoặc tenChong.
    Xin lỗi, mình "đào mộ" chút
    nhưng bây giờ mình đọc đén union, và đã đọc bài của bạn những vẫn chưa hiểu thực sự union có tác dụng như thế nào. Bạn có thể viết nốt phần chương trình còn lại để mình họa tác dụng của kiểu tagNguoi ở trên được không.
    Mình vẫn chưa hiểu Tùy theo người mà ta đang xét là nam hay nữ ta sẽ truy xuất thông tin qua trường có tên tenVo hoặc tenChong là sao, làm sao để xét đâu là nam đâu là nữ.
    Thanks!

Các đề tài tương tự

  1. Bài tập C++ Tổng giá trị của các trường trong một union
    Gửi bởi kissl0ve13 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 23-10-2011, 07:06 PM
  2. Trả lời: 5
    Bài viết cuối: 17-09-2011, 11:57 PM
  3. Lập trình C++ 1 lỗi union khó hiểu trong lập trình C++??
    Gửi bởi narutokage trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 21-08-2011, 11:02 PM
  4. Sử dụng Order by khi có Union trong SQL
    Gửi bởi iamonlining trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 6
    Bài viết cuối: 16-12-2009, 05:32 PM
  5. Cho mình hỏi về Union sử dụng trong bài này
    Gửi bởi genius2080 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 21-05-2007, 12:30 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn