Nội dung
Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:
- Cấu trúc cơ bản của một chương trình C# console application
- BIẾN và KIỂU DỮ LIỆU trong C#
- TOÁN TỬ TRONG C#
- CÂU ĐIỀU KIỆN TRONG C#
- CẤU TRÚC CƠ BẢN CỦA VÒNG LẶP
- CẤU TRÚC CƠ BẢN CỦA HÀM TRONG C#
- MẢNG 1 CHIỀU TRONG C#
Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:
- Struct là gì? Đặc điểm của struct.
- Khai báo và sử dụng struct.
Struct là gì? Đặc điểm của Struct
Struct là một kiểu dữ liệu có cấu trúc, được kết hợp từ các kiểu dữ liệu nguyên thuỷ do người lập trình định nghĩa để thuận tiện trong việc quản lý dữ liệu và lập trình.
Xét bài toán sau:
Ta cần lưu trữ thông tin của 10 sinh viên với mỗi sinh viên gồm có các thông tin như
- Mã số.
- Họ tên.
- Nơi sinh.
- CMND.
Khi đó, để lưu thông tin của 1 sinh viên ta cần 4 biến chứa 4 thông tin trên. Nếu muốn lưu thông tin 10 sinh viên thì cần 40 biến. Chắc không quá nhiều, nhưng nếu muốn lưu thông tin của 1000, 10000 sinh viên thì sao?
- Số lượng biến lúc này rất nhiều khiến cho code dài dòng khó thao tác, khó kiểm soát.
Từ đó người ta mới đưa ra khái niệm kiểu dữ liệu có cấu trúc để giải quyết vấn đề trên.
Ý tưởng là đóng gói các thông tin đó vào 1 đối tượng duy nhất. Như vậy thay vì phải khai báo 40 biến thì ta chỉ cần khai báo 1 mảng 10 phần tử mà mỗi phần tử có kiểu dữ liệu ta đã định nghĩa.
Đặc điểm của struct
- Là một kiểu dữ liệu tham trị (kiểu dữ liệu tham trị đã được trình bày trong bài KIỂU DỮ LIỆU )
- Dùng để đóng gói các trường dữ liệu khác nhau nhưng có liên quan đến nhau.
- Bên trong struct ngoài các biến có kiểu dữ liệu cơ bản còn có các phương thức, các struct khác.
- Muốn sử dụng phải khởi tạo cấp phát vùng nhớ cho đối tượng thông qua toán tử new.
- Struct không được phép kế thừa (khái niệm về kế thừa sẽ trình bày trong bài KẾ THỪA TRONG C# ).
Khai báo và sử dụng struct
Khai báo
Cú pháp:
struct <tên struct>
{
public <danh sách các biến>;
}
Trong đó:
- <tên struct> là tên kiểu dữ liệu do mình tự đặt và tuân thủ theo quy tắc đặt tên (đã trình bày trong bài BIẾN TRONG C#).
- <danh sách các biến> là danh sách các biến thành phần được khai báo như khai báo biến bình thường (đã trình bày trong bài BIẾN TRONG C#).
- Từ khoá public là từ khoá chỉ định phạm vi truy cập (sẽ trình bày trong bài TÍNH ĐÓNG GÓI). Trong ngữ cảnh hiện tại thì có thể hiểu từ khoá này giúp cho người khác có thể truy xuất được để sử dụng.
Ví dụ
struct SinhVien { public int MaSo; public string HoTen; public double DiemToan; public double DiemLy; public double DiemVan; }
- Với khai báo này ta đã có 1 kiểu dữ liệu mới tên là SinhVien. Và có thể khai báo biến, sử dụng nó như sử dụng các kiểu dữ liệu khác.
- Nếu như kiểu int có thể chứa số nguyên, kiểu double có thể chứa số thực thì kiểu SinhVien vừa khai báo có thể chứa 5 trường thông tin con là MaSo, HoTen, DiemToan, DiemLy, DiemVan.
Lưu ý: bên trong vẫn còn 2 khai báo chưa được nhắc đến đó là:
- Constructor (hàm khởi tạo).
- Các phương thức mà mình muốn cung cấp để hỗ trợ người dùng khi thao tác với dữ liệu bên trong struct.
Hai phần này sẽ được trình bày trong bài CLASS TRONG C#. Còn trong bài học này ta chỉ tìm hiểu cú pháp cơ bản của struct thôi.
Sử dụng
Ta có thể truy xuất đến từng thành phần dữ liệu của struct thông qua toán tử “.” Kèm theo tên thành phần muốn truy xuất.
Xét bài toán sau: Viết chương trình lưu trữ thông tin của sinh viên bao gồm: mã số, họ tên, điểm toán, điểm lý, điểm văn. Thực hiện nhập thông tin cho 1 sinh viên và tính điểm trung bình theo công thức (toán + lý + văn)/3
Code:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Bai_26_01 { class Program { struct SinhVien { public int MaSo; public string HoTen; public double DiemToan; public double DiemLy; public double DiemHoa; } static void NhapThongTinSV(out SinhVien SV) { Console.Write(" Ma so : "); SV.MaSo = int.Parse(Console.ReadLine()); Console.Write(" Ho Ten : "); SV.HoTen = Console.ReadLine(); Console.Write(" Diem Toan : "); SV.DiemToan = double.Parse(Console.ReadLine()); Console.Write(" Diem Ly : "); SV.DiemLy = double.Parse(Console.ReadLine()); Console.Write(" Diem Hoa : "); SV.DiemHoa = double.Parse(Console.ReadLine()); } static void XuatThongTinSV(SinhVien SV) { Console.WriteLine(" Ma So :" + SV.MaSo); Console.WriteLine(" Ho Ten : " + SV.HoTen); Console.WriteLine(" Diem Toan : " + SV.DiemToan); Console.WriteLine(" Diem Ly : " + SV.DiemLy); Console.WriteLine(" Diem Hoa : " + SV.DiemHoa); } static double DiemTBSV(SinhVien SV) { return (SV.DiemToan + SV.DiemLy + SV.DiemHoa) / 3; } static void Main(string[] args) { //Khai bao kieu du lieu SinhVien SinhVien SV1 = new SinhVien(); Console.WriteLine(" Nhap thong tin sinh vien : "); NhapThongTinSV(out SV1); Console.WriteLine("**********"); Console.WriteLine(" Thong tin sinh vien vua nhap : "); XuatThongTinSV(SV1); Console.WriteLine(" Diem TB cua SV la :" + DiemTBSV(SV1)); Console.ReadLine(); } } }
Trong chương trình trên ta có thể thấy:
- Kiểu dữ liệu SinhVien có thể dùng làm kiểu dữ liệu cho biến, parametter cho phương thức. Ngoài ra còn có thể làm kiểu trả về cho phương thức (các bạn có thể khám phá thử, có thể tham khảo bài HÀM TRONG C#).
- Các thành phần dữ liệu bên trong được truy xuất thông qua dấu “.”
- Vì struct là kiểu tham trị nên khi truyền vào các phương thức thì giá trị của nó sau khi kết thúc phương thức sẽ không thay đổi. Do đó cần sử dụng từ khoá out để có thể cập nhật giá trị thay đổi khi kết thúc phương thức.
Kết luận
Nội dung bài này giúp các bạn nắm được:
- Struct là gì? Đặc điểm của struct.
- Khai báo và sử dụng struct.
Bài sau chúng ta sẽ tìm hiểu về ENUM TRONG C#.