Mục tiêu: struct
Bài tập 1: Viết chương trình tạo struct cong_nhan gồm các trường : ten, nam_sinh và gio_lam.
Câu a: Nhập 1 số n, tạo và nhập một mảng n công nhân.
Câu b: Liệt kê tên các công nhân nhận thưởng biết rằng công nhân nhận thưởng là các công nhân có giờ làm > 40 giờ.
Câu c: Sắp xếp mảng công nhân đó theo giờ làm giảm dần.
B1: Khởi động Borland C 3.1 (như Assignment1)
B2: Vào menu File chọn New. Một file tên NONAME.CPP được tạo ra. Vào File chọn Save as và lưu file tên d:\bai3_1.cpp
B3: Đánh các dòng sau để khai báo thư viện cho chương trình và hàm main.
	#include   // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch
		void  main()
		{
		}
	
B4: Chèn lệnh khai báo cấu trúc dưới các lệnh khai báo thư viện và trên hàm main
	#include // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch
	/* Khai bao cau truc */
	struct cong_nhan {
		char ten[20]; // Ten cong nhan
		int nam_sinh; // Nam sinh cua cong nhan
		int gio_lam; // Gio lam cua cong nhan
	};
	void main()
	{

	}
B5: Chèn lệnh khai báo prototype dưới các lệnh khai báo cấu trúc và trên hàm main
	#include  // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch

	/* Khai bao cau truc */
	struct cong_nhan {
		char ten[20]; // Ten cong nhan
		int nam_sinh; // Nam sinh cua cong nhan
		int gio_lam; // Gio lam cua cong nhan
	};

	/* Khai bao prototype */
	void nhap_mang(cong_nhan *cn, int n);
	void main()
	{
	
	}
B6: Thực thi hàm nhap_mang
	#include // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch

	/* Khai bao cau truc */
	struct cong_nhan {
		char ten[20]; // Ten cong nhan
		int nam_sinh; // Nam sinh cua cong nhan
		int gio_lam; // Gio lam cua cong nhan
	};

	/* Khai bao prototype */
	void nhap_mang(cong_nhan *cn, int n);
	void main()
	{
	
	}
	void nhap_mang(cong_nhan *cn, int n)
	{
	for (int i=0; i> cn[i].ten;
		cout << "Nam sinh: ";
		cin >> cn[i].nam_sinh;
		cout << "Gio lam: ";
		cin >> cn[i].gio_lam;
	}
	return;
	}
B7: Thực thi code cho hàm main va gọi hàm nhap_mang
	#include  // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch

	/* Khai bao cau truc */
	struct cong_nhan {
		char ten[20]; // Ten cong nhan
		int nam_sinh; // Nam sinh cua cong nhan
		int gio_lam; // Gio lam cua cong nhan
	};

	/* Khai bao prototype */
	void nhap_mang(cong_nhan *cn, int n);

	void main()
	{
	clrscr();
	int n = 0; // Khai bao va khoi tao so cong nhan
	cout << "Nhap so cong nhan: ";
	cin >> n;
	cong_nhan *cn; // Khai bao mot mang dong cac cau truc
	cn = new cong_nhan[n]; // cap phat bo nho cho mang dong
	nhap_mang(cn,n); // Khoi tao danh sach cong nhan

	 // Ten cac cong nhan duoc thuong
	cout << "Liet ke ten cac cong nhan duoc thuong:";
	for (int i=0; i 40)
		{
			cout << cn[i].ten<<", ";
		}
	}
	getch();

	// Giai phong vung nho
	delete [] cn;
	return;
	}

	void nhap_mang(cong_nhan *cn, int n)
	{
	for (int i=0; i> cn[i].ten;
		cout << "Nam sinh: ";
		cin >> cn[i].nam_sinh;
		cout << "Gio lam: ";
		cin >> cn[i].gio_lam;
	}
	return;
	}
B8: Nhấn F2 để lưu lại chương trình đã đánh. Nhấn F9 để biên dịch chương trình xem có lỗi hay không, nếu có thì cần phải sửa tất cả.
B9: Nhấn Ctrl+F9 để chạy chương trình. Với n=4, kết quả như hình dưới.
Hướng dẫn câu c:
B1: Thực thi lệnh như câu b.
B2: Thêm lệnh khai báo prototype cho hàm sap_xep.
	#include // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch

	/* Khai bao cau truc */
	struct cong_nhan {
	char ten[20]; // Ten cong nhan
	int nam_sinh; // Nam sinh cua cong nhan
	int gio_lam; // Gio lam cua cong nhan
	};

	/* Khai bao prototype */
	void nhap_mang(cong_nhan *cn, int n);
	void sap_xep (cong_nhan *cn, int n);

	void main()
	{
	... // như câu b
	}

	void nhap_mang(cong_nhan *cn, int n)
	{
	... //như câu b
	}
B3: Thực thi hàm sap_xep
	#include  // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch

	/* Khai bao cau truc */
	struct cong_nhan {
	char ten[20]; // Ten cong nhan
	int nam_sinh; // Nam sinh cua cong nhan
	int gio_lam; // Gio lam cua cong nhan
	};

	/* Khai bao prototype */
	void nhap_mang(cong_nhan *cn, int n);
	void sap_xep (cong_nhan *cn, int n);

	void main()
	{
	... //như câu b
	}

	void nhap_mang(cong_nhan *cn, int n)
	{
	... //như câu b
	}

	void sap_xep (cong_nhan *cn, int n)
	{
	cong_nhan cn_tam;
	for (int i=0 ; i < n-1 ; i++) // cho i chay tu dau den ap cuoi mang
 		for (int j=i+1 ; j < n ; j++) // cho j chay tu sau i den cuoi mang
			{
			if (cn[i].gio_lam< cn[j].gio_lam)
				{
				// Hoan doi 2 phan tu mang
				cn_tam = cn[i];
				cn[i] = cn[j];
				cn[j] = cn_tam; 				
				}
			}
	return;
	}
B4: Thực thi code cho hàm main va gọi hàm sap_xep
	#include  // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch

	/* Khai bao cau truc */
	struct cong_nhan {
	char ten[20]; // Ten cong nhan
	int nam_sinh; // Nam sinh cua cong nhan
	int gio_lam; // Gio lam cua cong nhan
	};

	/* Khai bao prototype */
	void nhap_mang(cong_nhan *cn, int n);
	void sap_xep (cong_nhan *cn, int n);

	void main()
	{
	clrscr();
	int n = 0; // Khai bao va khoi tao so cong nhan
	cout << "Nhap so cong nhan: ";
	cin >> n;
	cong_nhan *cn; // Khai bao mot mang dong cac cau truc
	cn = new cong_nhan[n]; // cap phat bo nho cho mang dong
	nhap_mang(cn,n); // Khoi tao danh sach cong nhan

	// Ten cac cong nhan duoc thuong
	cout << "Liet ke ten cac cong nhan duoc thuong: ";
	for(int i=0; i 40)
		{
			cout << cn[i].ten<<", ";
		}
	}
	
	//Sap xep mang cong nhan theo gio lam giam dan
	sap_xep (cn, n);
	cout<<"\nMang cong nhan sau khi sap xep:\n ";
	for(int j=0; j> cn[i].ten;
		cout << "Nam sinh: ";
		cin >> cn[i].nam_sinh;
		cout << "Gio lam: ";
		cin >> cn[i].gio_lam;
	}
	return;
	}

	void sap_xep (cong_nhan *cn, int n)
	{
	cong_nhan cn_tam;
	for (int i=0 ; i < n-1 ; i++) // cho i chay tu dau den ap cuoi mang
 		for (int j=i+1 ; j < n ; j++) // cho j chay tu sau i den cuoi mang
			{
			if (cn[i].gio_lam< cn[j].gio_lam)
				{
				// Hoan doi 2 phan tu mang
				cn_tam = cn[i];
				cn[i] = cn[j];
				cn[j] = cn_tam; 				
				}
			}
	return;
	}
B5: Nhấn F2 để lưu lại chương trình đã đánh. Nhấn F9 để biên dịch chương trình xem có lỗi hay không, nếu có thì cần phải sửa tất cả.
B6: Nhấn Ctrl+F9 để chạy chương trình. Với n=4, kết quả như hình dưới.
Bài tập 2: Viết chương trình tạo 2 struct: struct thí sinh gồm : tên, năm sinh và điểm. Trong đó điểm là là một struct gồm 3 trường: toán, lý, hóa.
Câu a: Nhập 1 số n, tạo và nhập một mảng n thí sinh.
Câu b: Liệt kê tên các thí sinh trúng tuyển biết rằng thí sinh trúng tuyển là các thí sinh có tổng các điểm toán, lý, hóa lớn hơn hoặc bằng 15 điểm và không có điểm 0.
Câu c: Sắp xếp mảng đó theo tổng điểm giảm dần.
Câu d: Xóa tất cả các thí sinh có điểm 0 ở bất kỳ môn nào.
Kết quả câu a, b: Kết quả câu c: Kết quả câu d:
Bài tập 3: Tạo struct phần tử chứa 2 thành phần: số nguyên và con trỏ trỏ đến chính struct đó.
Câu a: Nhập 1 số n và tạo ra một dãy gồm n phần tử đó.
Câu b: Sắp xếp dãy đó theo thứ tự tăng dần.
Câu c: Nhập 1 số nguyên và thêm vào dãy đó sao cho dãy vẫn còn tăng.
Câu d: Nhập 1 số nguyên và xóa phần tử đó ra khỏi dãy (nếu có).
Yêu cầu : Thực thi dãy đó trên mảng và trên danh sách liên kết. Từ đó rút ra kết luận.
Kết quả câu a, b: Kết quả câu c: Kết quả câu d:
Kết luận: Như vậy, mặc dù cùng là cấu trúc dữ liệu bao gồm 1 tập các phần tử, nhưng giữa danh sách liên kết và mảng có 1 số điểm khác biệt sau:
- Mảng có thể được truy cập ngẫu nhiên thông qua chỉ số, còn danh sách chỉ có thể truy cập tuần tự. Trong danh sách liên kết, muốn truy cập tới 1 phần từ phải bắt đầu từ đầu danh sách sau đó lần lượt qua các phần tử kế tiếp cho tới khi đến phần tử cần truy cập.
- Việc bố trí, sắp đặt lại các phần tử trong 1 danh sách liên kết đơn giản hơn nhiều so với mảng. Bởi vì đối với danh sách liên kết, để thay đổi vị trí của 1 phần tử, ta chỉ cần thay đổi các liên kết của một số phần tử có liên quan, còn trong mảng, ta thường phải thay đổi vị trí của rất nhiều phần tử.
- Do bản chất động của danh sách liên kết, kích thước của danh sách liên kết có thể linh hoạt hơn nhiều so với mảng. Kích thước của danh sách không cần phải khai báo trước, bất kỳ lúc nào có thể tạo mới 1 phần tử và thêm vào vị trí bất kỳ trong danh sách. Nói cách khác, mảng là 1 tập có số lượng cố định các phần tử, còn danh sách liên kết là 1 tập có số lượng phần tử không cố định.