Khóa học lập trình C# căn bản

Serial tutorial hướng dẫn lập trình C# cơ bản

Struct trong lập trình C# căn bản Struct trong lập trình C# căn bản Struct trong lập trình C# căn bản Struct trong lập trình C# căn bản Struct trong lập trình C# căn bản 3/5 (279 reviews)

Struct trong lập trình C# căn bản

Đã đăng 2016-11-17 16:05:34 bởi Kteam
13 bình luận 21099 lượt xem
Struct trong lập trình C# căn bản 3 /5 stars (9 reviews)
 

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về STRING TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về Struct trong C#.


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:

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.

Chương trình tham khảo:

struct SinhVien
        {
            public int MaSo;
            public string HoTen;
            public double DiemToan;
            public double DiemLy;
            public double DiemVan;
        }

        static void NhapThongTinSinhVien(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 van: ");
            SV.DiemVan = Double.Parse(Console.ReadLine());
        }

        static void XuatThongTinSinhVien(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 van: " + SV.DiemVan);
        }

        static double DiemTBSinhVien(SinhVien SV)
        {
            return (SV.DiemToan + SV.DiemLy + SV.DiemVan) / 3;
        }

        static void Main(string[] args)
        {
            /*
             * Khai báo 1 kiểu dữ liệu SinhVien với các trường thông tin như đề bài.
             * Khai báo và khởi tạo 1 đối tượng SV1 kiểu SinhVien.
             */
            SinhVien SV1 = new SinhVien();
            Console.WriteLine(" Nhap thong tin sinh vien: ");
            /*
             * Đây là hàm hỗ trợ nhập thông tin sinh viên.
             * Sử dụng từ khoá out để có thể cập nhật giá trị nhập được ra biến SV1 bên ngoài 
             * khi kết thúc gọi hàm (có thể xem lại bài Hàm trong C#).
             */
            NhapThongTinSinhVien(out SV1);
            Console.WriteLine("*********");
            Console.WriteLine(" Thong tin sinh vien vua nhap la: ");
            XuatThongTinSinhVien(SV1);
            Console.WriteLine(" Diem TB cua sinh vien la: " + DiemTBSinhVien(SV1));

            Console.ReadLine();
        }

Kết quả khi chạy chương trình trên là:

kteam

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 “.”
  • 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#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.



Tài liệu 

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Struct trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé! 


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
Struct trong lập trình C# căn bản
lê vũ 2018-10-05 09:51:33

mình chưa hiểu chỗ "out" lắm. Tại sao trong: static void NhapThongTin(out SinhVien SV) có out mà trong: static void XuatThongTin(SinhVien SV) lại k dùng out. Mình chưa hiểu kỹ xin đừng cười, mong ad và mng giải thích giúp, thanks!

0 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
aebaobin 2018-10-23 12:00:33
bạn xem lại bài khóa ref và out sẽ hiểu thui, từ khóa out đặt trước tên biến truyền vào khi gọi hàm sử dụng(Sinhvien) còn hàm xuất thì ko cần.
0 bình chọn
Reply
Struct trong lập trình C# căn bản
palladium88 2018-09-25 17:18:07
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Xulichuoi
{
    class Program
    {
       struct SinhVien
        {
            public int Maso;
            public string HoTen;
            public double DiemToan;
            public double DiemVan;
            public double DiemAnh;
            public double DiemKhoaHoc;
        }
        static void Main(string[] args)
        {
            SinhVien SV1 = new SinhVien();
            Console.Write(" Nhap thong tin SV: \n");
            NhapThongTin(out SV1);
            Console.Write("******************\n");
            XuatThongTin(SV1);
            Console.Write(" Diem Trung Binh: " + DiemTrungBinh(SV1));
            Console.ReadKey();
        }
        static void NhapThongTin(out SinhVien SV)
        {
            Console.Write(" Ma so: ");
            SV.Maso = int.Parse(Console.ReadLine());
            Console.Write(" Ho va ten: ");
            SV.HoTen = Console.ReadLine();
            Console.Write(" Diem Toan: ");
            SV.DiemToan = double.Parse(Console.ReadLine());
            Console.Write(" Diem Anh: ");
            SV.DiemAnh = double.Parse(Console.ReadLine());
            Console.Write(" Diem Van: ");
            SV.DiemVan = double.Parse(Console.ReadLine());
            Console.Write(" Diem Khoa Hoc: ");
            SV.DiemKhoaHoc = double.Parse(Console.ReadLine());
        }
        static void XuatThongTin(SinhVien SV)
        {
            Console.WriteLine(" Ma so: " + SV.Maso);
            Console.WriteLine(" Ho ten: " + SV.HoTen);
            Console.WriteLine(" Diem Toan: " + SV.DiemToan);
            Console.WriteLine(" Diem Van: " + SV.DiemVan);
            Console.WriteLine(" Diem Anh: " + SV.DiemAnh);
            Console.WriteLine(" Diem Khoa hoc: " + SV.DiemKhoaHoc);
        }
        static double DiemTrungBinh(SinhVien SV)
        {
            return (SV.DiemAnh + SV.DiemKhoaHoc + SV.DiemToan + SV.DiemVan) / 4;
        }
    }
}

 

0 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
lê vũ 2018-10-05 09:53:01
chỗ hàm static void NhapThongTin(out SinhVien SV) lại dùng out, còn hàn static void XuatThongTin(SinhVien SV) thì k có, mong bạn giải thích mình hiểu,thanks bạn.
0 bình chọn
Reply
Struct trong lập trình C# căn bản
dungnnn8979 2018-06-18 20:49:32

sau một số bài học mong ad ra thêm bài tập để mọi người làm quen dễ hơn và nhớ kiến thức hơn

0 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
Kteam 2018-06-29 16:34:42
có khóa bài tập mà bạn! bạn tìm BÀI TẬP LẬP TRÌNH trên howkteam.com nhé
0 bình chọn
Reply
Struct trong lập trình C# căn bản
caovy2001 2017-06-25 23:25:28

Sao mình chưa thấy bài giảng về Class vậy Ad?

0 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
nhuquynhcv4994 2018-05-06 14:29:45
class của khóa hướng đối tượng mà http://www.howkteam.vn/course/lap-trinh-oop-voi-c/class-trong-lap-trinh-huong-doi-tuong-1370
0 bình chọn
Reply
Struct trong lập trình C# căn bản
Kỳ Quang 2017-05-31 02:58:30

Cho mình hỏi tại sao phải dùng struct khi có thể dùng class để lưu trữ các thông tin

0 bình chọn
Reply
Struct trong lập trình C# căn bản
vinhnq13595 2017-03-28 11:11:18
Tks Ad, Ad viết rất rõ ràng và dễ hiểu. Mong Ad nhanh chóng viết tiếp những bài khác!
0 bình chọn
Reply
Struct trong lập trình C# căn bản
boyqn676 2017-02-17 14:40:54
Tks Ad. Rất mong bài giảng về Class.
0 bình chọn
Reply
Struct trong lập trình C# căn bản
hamviec 2017-02-08 11:19:03
Bài tiếp theo khi nào mới có vậy bạn
0 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
Kteam 2017-02-09 00:58:23
CTV đang viết tiếp nha bạn, sẽ có trong thời gian sớm nhất
0 bình chọn
Reply
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education