Mảng Struct và ví dụ ứng dụng

2
15559

Trong thực tế, các bài toán liên quan đến mảng struct khá nhiều khi các kiểu dữ liệu của ngôn ngữ bạn đang sử dụng không đáp ứng được nhu cầu hay đáp ứng được lại quá phức tạp và tốn nhiều dữ liệu khi sử dụng.

Nên để giải quyết các bài toán như thế chúng ta đã có cách đó là sử dụng dữ liệu kiểu cấu trúc STRUCT (Nếu bạn nào chưa biết STRUCT là gì các bạn có thể xem tại đây), nhưng để làm sao để sử dụng một cách có hiệu quả và không làm phức tạp hóa vấn đề thì hôm nay chúng ta sẽ tìm hiểu về MẢNG CẤU TRÚC. Cũng giống như số nguyên thì cấu trúc cũng là một kiểu dữ liệu nên chúng ta vẫn có thể sử dụng mảng. Chúng ta bắt đầu tiềm hiểu với một số ví dụ nhé.

Bài toán đặt ra: Một sinh viên có các thông tin bao gồm: Tên sinh viên, mã số sinh viên, năm sinh, điểm trung bình và số ngày nghỉ. Nhà trường cần nhập thông tin của tất cả các sinh viên đang theo học tại trường và lập ra danh sách các học sinh có thành tích tốt trong học tập ( điểm trung bình lớn hơn 7.0) để khen thưởng và danh sách các học sinh có số ngày nghỉ lớn hơn 3 để ra nhắc nhở sinh viên đó.

Giải quyết bài toán: Do trong ngôn ngữ C/C++ không có kiểu dữ liệu SinhVien nên chúng ta cần tạo ra một Struct chứa tất cả các kiểu dữ liệu thõa mãn đề bài. Ngoài ra để xử lí được yêu cầu của bài toán chúng ta cần phải tại thêm một mảng 1 chiều cho kiểu dữ liệu SinhVien.

Trình tự thực hiện

Khai báo Struct SinhVien cho chương trình và xuất ra tất cả các sinh viên.

Code C/C++

struct SinhVien
{
	char ten[20];
	char ma[10];
	int namsinh;
	float dtb;
	int songaynghi;
};

Viết các khái báo nguyên mẫu hàm cho chương trình cần sử dụng

void NhapMang(SinhVien a[], int &n);
void XuatMang(SinhVien a[], int n);
void XuatSV(SinhVien a[], int  n);

Các hàm định nghĩa:

+ Hàm nhập mảng:

void NhapMang(SinhVien a[], int &n)
{
	do{
		printf("Cho biet so Sinh vien: ");
		scanf("%d", &n);
	} while (n <= 0);
	for (int i = 1; i <= n; i++)
	{
		printf("Thong tin Sinh vien thu %d la: \n", i);
		printf("Ten: \n");
		fflush(stdin);
		gets(a[i].ten);
		printf("Ma so: \n");
		fflush(stdin);
		gets(a[i].ma);
		printf("Nam sinh :\n");
		scanf("%d", &a[i].namsinh);
		printf("Diem Trung Binh: \n");
		scanf("%f", &a[i].dtb);
		printf("So ngay nghi: \n");
		scanf("%d", &a[i].songaynghi);
	}
}

+ Hàm xuất mảng:

void XuatMang(SinhVien a[], int n)
{
	printf("Ten\t\t   Ma\t\t NamSinh\t DTB\t \tSoNgayNghi");
	for (int i = 1; i <= n; i++)
	{
		printf("\n%s  %s \t %d \t\t %f \t%d\n", a[i].ten,a[i].ma,a[i].namsinh,
a[i].dtb, a[i].songaynghi);
	}
}

+ Hàm main

void main()
{
	SinhVien A[100];
	int N;
	NhapMang(A, N);
	XuatMang(A, N);
	getch();
}

Kết quả

Cho biet so Sinh vien: 2

Thong tin Sinh vien thu 1 la:

Ten:

Nguyen Thanh Tuan

Ma so:

2001140442

Nam sinh :

1996

Diem Trung Binh:

7.2

So ngay nghi:

1

Thong tin Sinh vien thu 2 la:

Ten:

Le Thi Thanh Huyen

Ma so:

2001140443

Nam sinh :

1997

Diem Trung Binh:

6.3

So ngay nghi:

0

Ten                              Ma                  NamSinh         DTB              SoNgayNghi

Nguyen Thanh Tuan   2001140442    1996                7.200000       1

Le Thi Thanh Huyen   2001140443   1997                 6.300000       0

Ngoài ra bài toán còn yêu cầu xuất ra danh sách các sinh viên có thanh tích tốt để khen thưởng. Để thực hiện yêu cầu trên chúng ta cần viết một hàm gọi là hàm xuất các sinh viên có thành tích tốt với điều kiện như yêu cầu là điểm trung bình lớn hơn 7.0.

Code C/C++

void SVTot(SinhVien a[], int n)
{
	printf("Danh sach cac sinh vien dat thanh tich TOT\n");
	printf("Ten\t\t   Ma\t\t NamSinh\t DTB\t \tSoNgayNghi");
	for (int i = 1; i <= n; i++)
	{
		if (a[i].dtb >= 7.0)
			printf("\n%s  %s \t %d \t\t %f \t%d\n", a[i].ten, a[i].ma, 
a[i].namsinh, a[i].dtb, a[i].songaynghi);
	}
}

Kết quả:

Cho biet so Sinh vien: 2

Thong tin Sinh vien thu 1 la:

Ten:

Nguyen Thanh Tuan

Ma so:

2001140442

Nam sinh :

1996

Diem Trung Binh:

7.2

So ngay nghi:

1

Thong tin Sinh vien thu 2 la:

Ten:

Le Thi Thanh Huyen

Ma so:

2001140443

Nam sinh :

1997

Diem Trung Binh:

6.3

So ngay nghi:

0

Ten                              Ma                  NamSinh         DTB              SoNgayNghi

Nguyen Thanh Tuan   2001140442    1996                7.200000       1

Le Thi Thanh Huyen   2001140443   1997                 6.300000       0

Danh sach cac sinh vien co thanh tich TOT

Ten                              Ma                  NamSinh         DTB              SoNgayNghi

Nguyen Thanh Tuan   2001140442    1996                7.200000       1

Tương tự như trên ta cũng có hàm điều kiện của các sinh viên có số ngày nghỉ lớn hơn 3 như sau:

Code C/C++

void SVNhacNho(SinhVien a[], int n)
{
	printf("Danh sach cac sinh vien bi NHAC NHO\n");
	printf("Ten\t\t   Ma\t\t NamSinh\t DTB\t \tSoNgayNghi");
	for (int i = 1; i <= n; i++)
	{
		if (a[i].songaynghi >= 3)
			printf("\n%s  %s \t %d \t\t %f \t%d\n", a[i].ten, a[i].ma, 
a[i].namsinh, a[i].dtb, a[i].songaynghi);
	}
}

Kết quả:

Cho biet so Sinh vien: 2

Thong tin Sinh vien thu 1 la:

Ten:

Nguyen Van A

Ma so:

11111

Nam sinh :

1996

Diem Trung Binh:

7.0

So ngay nghi:

4

Thong tin Sinh vien thu 2 la:

Ten:

Tran Van B

Ma so:

22222

Nam sinh :

1998

Diem Trung Binh:

8.4

So ngay nghi:

2

Ten                    Ma           NamSinh         DTB            SoNgayNghi

Nguyen Van A  11111      1996                 7.000000       4

Tran Van B      22222        1998                 8.400000       2

Danh sach cac sinh vien dat thanh tich TOT

Ten                     Ma            NamSinh         DTB            SoNgayNghi

Nguyen Van A  11111        1996                7.000000       4

Tran Van B        22222       1998                 8.400000       2

Danh sach cac sinh vien bi NHAC NHO

Ten                    Ma            NamSinh         DTB            SoNgayNghi

Nguyen Van A  11111       1996                7.000000       4

Trên đây là một bài toán cơ bản về mảng Struct. Các bạn có thể tham khảo và phát triển thêm các ví dụ khác tương tự bài toán trên. Chúc các bạn thành công.

 

2 COMMENTS

  1. void xuatTT(SinhVien sv[],int n){
    printf(“THONG TIN SINH VIEN LA ! \n”);
    for(int i=0;i<n;i++){
    printf("Ma So Sinh Vien thu %d la : %d",i,sv[i].MSSV);
    }
    }

    int main(){
    int n;
    struct SinhVien sv[n];
    nhapTT(sv,n);
    xuatTT(sv,n);
    //getch();
    return 0;
    }
    Cho em hỏi với là sao vòng for trong ham xuat cua em không chạy ạ

This site uses Akismet to reduce spam. Learn how your comment data is processed.