Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C++ by thinh0212_Uneti ( 5 years ago )
#include<iostream>
#include<iomanip>
#include<string.h>
#include<windows.h>
#pragma warning(disable: 4996)
using namespace std;
/* #define NULL 0 	*/
const int imsv = 8;				// số lượng ký tự tối đa của mã sinh viên
const int iname = 30;			// số lượng ký tự tối đa của họ và tên
int f = 0;	// số lượng sinh viên đã bị xoá. trong hàm xoa_sv() va hàm luu_Tru_Sinh_Vien_Da_Xoa()
struct Student
{
	char msv[imsv];
	char name[iname];
	float toan, ly, hoa;
	int phone;
};

void nhap_1_sv(Student &studentsI, Student *students, int i); 	// tiền khai báo hàm nhập một sinh viên
void nhap_ds(Student *&students, int n);						// tiền khai báo hàm nhập danh sách sinh viên
const char *xep_loai(float avg);								// tiền khai báo con trỏ xếp loại sinh viên
void title ();													// tiêu đề ( thead - table head)
inline void xuat_1_sv (Student studentsI);						// tiền khai báo hàm xuất một sinh viên
inline void xuat_ds(Student *students, int n);					// tiền khai báo hàm xuất danh sách sinh viên ( danh sách dạng nguyên thuỷ, chưa sắp xếp)
void tach_ten(char hoten[], char ten[]);						// tiền khai báo hàm tách tên khỏi họ tên
void xuat_Danh_Sach_Sap_Xep(Student *students, int n);			// tiền khai báo hàm xuất ra danh sách đã sắp xếp theo tên
void sua_diem(Student *&students, int n);						// tiền khai báo hàm sửa điểm sai
void xoa_sv(Student *&Recycle_Bin, Student *&students, int &n);	// tiền khai báo hàm xoá đi một sinh viên
void them_sv(Student *&students, int &n);						// tiền khai báo hàm thêm một sinh viên
void tim_1_sv(Student *students, int n);						// tiền khai báo hàm tìm một sinh viên
void menu();													// MENU
void menu_lap(Student *Recycle_Bin, Student students[], int n); // Tiền khai báo MENU lặp lại, bởi while
void xoa_Khoang_Trang_Chuoi(char hoten[]);						// tiền khai báo hàm xoá khoảng trắng trong chuỗi, cụ thể là họ tên
inline void xoa_Khoang_Trang_MSV(char msv[]);					// tiền khai báo hàm xoá khoảng trắng thừa trong mã sinh viên
void luu_Tru_Sinh_Vien_Da_Xoa(Student *&Recycle_Bin, Student *&students, int vi_Tri_Xoa);		// tiền khai báo hàm lưu trữ các sinh viên đã bị xoá

int main()
{
	// left từ C++ 11 trở đi mới chạy, căn lề qua trái. Keyword left in c++
	cout << left;
	cout << "\t\tStart" << endl;
	int n;
	// câu lệnh Goto, nếu gặp goto quayLai trong chương trình, chương trình sẽ quay lại chạy từ đây
	// https://freetuts.net/lenh-goto-trong-c++-1776.html
quayLai:
	cout << "Nhap so luong sinh vien: ";
	cin >> n;
	if(n <= 0) goto quayLai;
	// khai báo con trỏ students với kiểu dữ liệu là Student
	// struct cũng là một kiểu dữ liệu, như int/float, do người viết mã định nghĩa
	Student *students = new Student[n];
	cout << "\nNhap danh sach sinh vien: \n";
	nhap_ds(students, n);
	cout << "\n\nAn phim bat ki de tiep tuc menu" << endl;
	system("pause");
	system("cls");
	Student *Recycle_Bin = new Student[f];
	menu_lap(Recycle_Bin, students, n);
	// có khai báo con trỏ thì có delete nó, trả lại bộ nhớ cho CPU
	cout << endl;
	system("pause");
	delete []students;
	delete []Recycle_Bin;
	return 0;
}

// cài đặt hàm nhập 1 sinh viên, truyền địa chỉ vào hàm, truyền thêm con trỏ / * / mục đích để so sánh mã trùng nhau
void nhap_1_sv(Student &studentsI, Student *students, int i)
{
	bool tf;
	cin.ignore();
nhap_lai_msv:
	tf = false;
	cout << setw(26) << "\nNhap ma sinh vien: ";
	cin.getline(studentsI.msv, imsv);
	// sau khi nhập mã sinh viên, tiến hành xoá các khoảng trắng thừa trong mã sinh viên
	//	int y = strlen(studentsI.name);
	xoa_Khoang_Trang_MSV(studentsI.msv);
	// vòng lặp so sánh mã sinh viên đã tồn tại hay chưa
	for(int j = 0; j < i; ++j)
	{
		if(strcmpi(studentsI.msv, students[j].msv) == 0)
		{
			tf = true;
			break;
		}
	}
	if(tf)
	{
		cout << "\n\aPhat hien ma sinh vien da ton tai hoac ma khong hop le!!";
		goto nhap_lai_msv;	// nếu đã tồn tại thì / goto /, nó hơi giống while
	}
	cout << setw(25) << "Ten: ";
	cin.getline(studentsI.name, iname);
nhap_lai_toan:
	cout << setw(25) << "Nhap diem toan: ";
	cin >> studentsI.toan;
	if(studentsI.toan < 0 || studentsI.toan > 10)
	{
		cout << "Loi! Nhap lai!" << endl;
		goto nhap_lai_toan;
	}
nhap_lai_ly:
	cout << setw(25) << "Nhap diem Ly: ";
	cin >> studentsI.ly;
	if(studentsI.ly < 0 || studentsI.ly > 10)
	{
		cout << "Loi! Nhap lai!" << endl;
		goto nhap_lai_ly;
	}
nhap_lai_hoa:
	cout << setw(25) << "Nhap diem Hoa: ";
	cin >> studentsI.hoa;
	if(studentsI.hoa < 0 || studentsI.hoa > 10)
	{
		cout << "Loi! Nhap lai!" << endl;
		goto nhap_lai_hoa;
	}
	cout << setw(25) << "Nhap so dien thoai: ";
	cin >> studentsI.phone;
}	// dùng nhiều / goto / không tốt

// cài đặt hàm nhập danh sách sinh viên
void nhap_ds(Student *&students, int n)
{
	for(int i = 0; i < n; ++i)
	{
		cout << "\nStudents No*" << i+1;
		nhap_1_sv(students[i], students, i);
	}
}
// cài đặt hàm xếp loại sinh viên, kiểu trả về là char
inline const char *xep_loai(float avg)
{
	if(avg >= 0 && avg <3)	return "Yeu";
	else if(avg < 5) 		return "Trung binh";
	else if(avg < 7.5) 		return "Kha";
	else if(avg < 8.6)	 	return "Gioi";
	else 					return "Xuat Sac";
}
// tiêu đề dạng table khi xuất dữ liệu ra màn hình
void title ()
{
	cout << setw(30) << "Ten";
	cout << setw(18) << "Ma sinh vien";
	cout << setw(18) << "Diem toan";
	cout << setw(18) << "Diem ly";
	cout << setw(18) << "Diem hoa";
	cout << setw(18) << "Diem trung binh";
	cout << setw(18) << "Xep Loai";
	cout << setw(18) << "Phone number";
	cout << endl;
}
// cài đặt hàm xuất một sinh viên
inline void xuat_1_sv (Student studentsI)
{
	cout << setw(30) << studentsI.name;
	cout << setw(18) << studentsI.msv;
	cout << setw(18) << studentsI.toan;
	cout << setw(18) << studentsI.ly;
	cout << setw(18) << studentsI.hoa;
	// avg - điểm trung bình 3 môn Toán Lý Hoá kiểu / float /
	float avg = (studentsI.hoa + studentsI.ly + studentsI.toan)/3;
	cout << setw(18) << avg;
	cout << setw(18) << xep_loai(avg);
	cout << setw(3) << "+84" << studentsI.phone;
	cout << endl;
}
// cài đặt hàm xuất ra danh sách sinh viên
// do sử dụng nhiều nên dùng / inline /
// https://www.cplusplus.com/articles/2LywvCM9/
inline void xuat_ds(Student *students, int n)
{
	cout << setfill('=');
	cout << setw(140);
	cout << "\n\n\t\t\t\t\t" << endl;
	cout << setfill(' ');
	cout << "\t";
	title();
	for(int i = 0; i < n; ++i)
	{
		cout << endl;
		cout << "\t";
		xuat_1_sv(students[i]);
	}
	cout << "\n\n";
}

// cài đặt hàm tách tên khỏi họ tên
// thông thường khi ta sắp xếp theo tên
// chương trình luôn so sánh chữ cái đầu, kí tự đầu tiên trong chuỗi họ tên
// VD: Tran Van Thinh, khi sắp xếp chương trình chỉ lấy kí tự / T / trong / Tran / để so sánh
void tach_ten(char hoten[], char ten[])
{
	// duyệt từ kí tự cuối cùng về 0
	for(int i = strlen(hoten) - 1; i >= 0; --i)
	{
		if(hoten[i] == ' ')
		{
			// gặp khoảng trắng đầu tiên, copy vào biến tên / ten /
			// muốn hiểu tại sao lại / hoten+1+i / thì dùng excel và code lại một chuỗi nhỏ
			// bỏ / i / hoặc bỏ / 1 / là sẽ hiểu
			strcpy(ten, hoten+1+i);
			break; // copy xong thì / break /
		}
	}
}
// cài đặt hàm xuất danh sách theo tên giảm dần với định dạng abc...xyz
void xuat_Danh_Sach_Sap_Xep(Student *students, int n)
{
	// đầu tiên thì xoá các khoảng trắng thừa trong chuỗi, đặc biệt là khoảng trắng ở cuối chuỗi
	for(int i = 0; i < n; ++i)
		xoa_Khoang_Trang_Chuoi(students[i].name);
	for(int i = 0; i < n - 1; ++i)
	{
		for(int j = i + 1; j < n; ++j)
		{
			// tạo ra 2 biến tên với giá trị rỗng, vòng đời được xác định chỉ trong 1 lần for(j)
			char ten1[iname]= "";
			char ten2[iname] = "";
			// tách tên khỏi họ tên
			tach_ten(students[i].name, ten1);
			tach_ten(students[j].name, ten2);
			// so sánh 2 tên, nếu tên 1 lớn hơn tên 2 thì đổi chỗ, because đang sắp xếp tăng dần
			if(strcmpi(ten1, ten2) > 0)
			{
				Student hoan_doi = students[i];
				students[i] = students[j];
				students[j] = hoan_doi;
			}
			// nếu tên trung nhau thì so sánh / họ / trong / họ tên /
			// VD: Tran Van Thinh
			// VD: Pham Hong Thinh. 2 ten Thinh trùng nhau thì so sánh / Tran Van / và / Pham Hong /
			else if (strcmpi(ten1, ten2) == 0)
			{
				if(strcmpi(students[i].name, students[j].name) > 0)
				{
					Student hoan_doi = students[i];
					students[i] = students[j];
					students[j] = hoan_doi;
				}
			}
		}
	}
	// sắp xếp xong thì xuất ra danh sách đã giảm dần
	xuat_ds(students, n);
}
// hàm sửa điểm sinh viên bị lỗi, khi thay đổi giá trị thì truyền tham chiếu / & / vào trong hàm
void sua_diem(Student *&students, int n)
{

	// khai báo biến để nhập mã sinh viên cần tìm
	char tk_msv[imsv];
	int i;
	// xuất ra danh sách các mã sinh viên có trong chương trình kèm tên tương ứng
	for(int i = 0; i < n; ++i)
	{
		cout << "MSV:  "  << setw(20) << students[i].msv
		     << setw(20) << students[i].name << endl;
	}
	cout << "\nMa sinh vien can tim kiem: ";
	cin.ignore();
	cin.getline(tk_msv, imsv);
	for(int i = 0; i < n; ++i)
		xoa_Khoang_Trang_MSV(tk_msv);
	int x = 0;  // dùng để kiểm tra trong đoạn code tìm mã sinh viên, xem có mã hay chưa
	int t;		// dùng để lấy vị trí của sinh viên có mã trùng với mã cần tìm
	for(i = 0; i < n; ++i)
	{
		if(strcmpi(tk_msv, students[i].msv) == 0)
		{
			cout << "\nPhat hien ma sinh vien co ton tai" << endl;
			x++;
			// phát hiện sinh viên có mã trùng với mã cần tìm thì xuất ra sinh viên đó, x sẽ tăng lên
			// lay vi tri cua sinh vien thu i, / t = i /
			cout << setfill('=');
			cout << setw(140);
			cout << "\n\n\t\t\t\t\t" << endl;
			cout << setfill(' ');
			cout << "\t";
			title();
			cout << "\n\t";
			xuat_1_sv(students[i]);
			t = i;
			break; // tìm thấy rồi nhớ break, vì trong chương trình chỉ tồn tại duy nhất 1 mã sinh viên
		}
	}
	if(x != 0)		// x != 0 tức là đã có sinh viên đó rồi
	{
		cout << "\nSua diem: " << endl;
		do
		{
			// tác dụng của biến / t / là đây, sửa điểm của sinh viên tại vị trí / t /
			cout << setw(25) << "\nDiem toan: ";
			cin >> students[t].toan;
			if(students[t].toan < 0 || students[t].toan > 10)
			{
				cout << "\nLoi! Nhap lai!";
			}
		}
		while(students[t].toan < 0 || students[t].toan > 10);
		do
		{
			cout << setw(25) << "\nDiem ly: ";
			cin >> students[t].ly;
			if(students[t].ly < 0 || students[t].ly > 10)
			{
				cout << "\nLoi! Nhap lai!";
			}
		}
		while(students[t].ly < 0 || students[t].ly > 10);
		do
		{
			cout << setw(25) << "\nDiem Hoa ";
			cin >> students[t].hoa;
			if(students[t].hoa < 0 || students[t].hoa > 10)
			{
				cout << "\nLoi! Nhap lai!";
			}
		}
		while(students[t].hoa < 0 || students[t].hoa > 10);
		cout << "\nDanh sach moi la: \n";
		// sửa điểm xong xuất ra danh sách sinh viên, vi danh sách trước khi sửa đã sắp xếp rồi
		// và sửa điểm không làm thay đổi / name / , không cần gọi hàm sắp xếp theo tên, nặng chương trình
		xuat_ds(students, n);
	}
	else	// ngược lại không có sinh viên nào thì x không tăng, x == 0
	{
		// xuất ra danh sách sinh viên ban đầu
		cout << "Khong co ma sinh vien trung voi ma vua nhap:  " << tk_msv << endl;
		cout << "\nDanh sach ban dau:\n";
		xuat_Danh_Sach_Sap_Xep(students, n);
	}
}
// cài đặt hàm xoá đi một sinh viên, thay đổi danh sách nên truyền / & / , số lượng giảm đi nên truyền / & / cho n
// truyền cả tham chiếu cho thùng rác - / Recycle_Bin /, vì nó cũng bị thay đổi dữ liệu
void xoa_sv(Student *&Recycle_Bin, Student *&students, int &n)
{
	// chỗ này vẫn đoạn code tìm kiếm mã sinh viên, lười viết hàm riêng nên copy paste cho nhanh :v
	char tk_msv[imsv];
	int i;
	for(i = 0; i < n; ++i)
	{
		cout << "MSV:  " << students[i].msv
		     << "\t" << students[i].name << endl;
	}
	cout << "\nMa sinh vien can xoa: ";
	cin.ignore();
	cin.getline(tk_msv, imsv);
	for(int i = 0; i < n; ++i)
		xoa_Khoang_Trang_MSV(tk_msv);
	int x = 0, vi_Tri_Xoa = 0; // thay vì khởi tạo giá trị rác, nên để nó bằng 0 
	for(i = 0; i < n; ++i)
	{
		if(strcmpi(tk_msv, students[i].msv) == 0)
		{
			vi_Tri_Xoa = i;	// ví dụ tìm thấy sinh viên tại vị trí i = 3 thì lấy vị trí của nó
			++x;
			cout << "\nPhat hien ma sinh vien ton tai, xoa.\n";
			// xuất ra thông tin của thanh niên bị xoá
			cout << setfill('=');
			cout << setw(140);
			cout << "\n\n\t\t\t\t\t" << endl;
			cout << setfill(' ');
			cout << "\t";
			title();
			cout << "\n\t";
			xuat_1_sv(students[i]);
			// gọi hàm lưu trữ sinh viên vị xoá
			luu_Tru_Sinh_Vien_Da_Xoa(Recycle_Bin, students, vi_Tri_Xoa);
			break;
		}
	}
	if(x != 0)
	{
		// sử dụng for() để xoá sinh viên tại vị trí cần xoá
		// ví dụ sinh viên ở vị trí thứ 3 ( t = 3 ) trong mảng, duyệt từ j = 3 đến n, lấy / j = 4 / đè lên / j = 3 /
		for(int j = vi_Tri_Xoa; j < n; ++j)
		{
			students[j] = students[j + 1];
		}
		// sau khi copy các phần tử xong thì tạo một mảng động mới / HD / dùng làm mảng trung gian
		Student *HD = new Student[n];
		// copy các phần tử qua mảng mới
		for(int j = 0; j < n; ++j)
		{
			HD[j] = students[j];
		}
		// xoá đi mảng cũ
		delete []students;
		n--; 	// xoá đi sinh viên thì / n / sẽ giảm
		// tạo lại mảng students, nhưng giờ n đã giảm rồi
		students = new Student[n];
		// copy lại về mảng students
		for(int j = 0; j < n; ++j)
		{
			students[j] = HD[j];
		}
		delete []HD;	// xoá đi mảng trung gian, trả bộ nhớ cho CPU
		cout << "\nDanh sach sau khi xoa.\n";
		xuat_ds(students, n);
	}
	else
	{
		cout << "\aKhong co ma sinh vien trung voi ma vua nhap:  " << tk_msv << endl;
		cout << "\nDanh sach ban dau:\n";
		xuat_Danh_Sach_Sap_Xep(students, n);
	}
}
// cài đặt hàm thêm 1 sinh viên, truyền tham chiếu khi có gì đó thay đổi, / & /
void them_sv(Student *&students, int &n)
{
	cout << endl << "Cac ma sinh vien da co san trong chuong trinh. Luu y ma sinh vien khong duoc co khoang trang."
	     << endl;
	for(int i = 0; i < n; ++i)
	{
		cout << "MSV:  "  << setw(20) << students[i].msv
		     << setw(20) << students[i].name << endl;
	}
	// tạo 1 mảng trung gian mới, copy các phần tử của mảng cũ qua mảng mới
	Student *temp = new Student[n];
	for(int i = 0; i < n; ++i)
		temp[i] = students[i];
	// xoá đi mảng cũ
	delete []students;
	// tăng n lên 1 để tạo vị trí trống ở cuối, chứa thông tin của sinh viên cần thêm
	n++;
	students = new Student[n];
	// copy lại các phần tử từ mảng trung gian
	for(int i = 0; i < n - 1; ++i)
		students[i] = temp[i];
	// // xoá đi mảng trung gian, trả bộ nhớ cho CPU
	delete []temp;
	// bắt đầu nhập thông tin cho sinh viên mới
	// VD mảng có 3 sinh viên, n = 3, chương trình sẽ duyệt vị trí 0 1 2
	// khi thêm 1 sinh viên, n = 4, chương trình đánh dấu vị trí là 0 1 2 3
	// khi đó vị trí 3 trống, mang giá trị NULL/rác, nên thêm sinh viên vào vị trí số 3, tức là n -1 / 4 - 1 = 3
	nhap_1_sv(students[n-1], students, (n-1));
	cout << "\nDanh sach moi la: \n";
	xuat_Danh_Sach_Sap_Xep(students, n);
}
// cài đặt hàm tìm kiếm sinh viên rồi xuất ra
void tim_1_sv(Student *students, int n)
{
	for(int i = 0; i < n; ++i)
		xoa_Khoang_Trang_MSV(students[i].msv);
	// chỗ này vẫn copy lại đoạn code tìm sinh viên bên trên hàm xoa_sv()
	char tk_msv[imsv];
	for(int i = 0; i < n; ++i)
	{
		cout << "MSV:  "  << setw(20) << students[i].msv
		     << setw(20) << students[i].name << endl;
	}
	cout << "\nMa sinh vien can tim la: ";
	cin.ignore();
	cin.getline(tk_msv, imsv);
	xoa_Khoang_Trang_MSV(tk_msv);
	int x = 0, t;
	for(int i = 0; i < n; ++i)
	{
		if(strcmpi(tk_msv, students[i].msv) == 0)
		{
			x++;
			t = i;
			break;
		}
	}
	if(x == 0)
		cout << "\n\aKhong co ma sinh vien ton tai trong danh sach.\n";
	else
	{
		cout << "\n\aTim thay ma sinh vien vua nhap.\n";
		cout << setfill('=');
		cout << setw(140);
		cout << "\n\n\t\t\t\t\t" << endl;
		cout << setfill(' ');
		cout << "\t";
		title();
		cout << "\n\t";
		xuat_1_sv(students[t]);
	}
}
// cài đặt MENU lựa chọn sau khi nhập thông tin xong
void menu()
{
	cout << "\n\t\t\t\t\t\t\t\t=============================  MENU  ==========================\n\n";
	cout << setw(38) << "\t\t\t\t\t\t\t\t\t[1] Sua diem.";
	cout << "[2] Xoa sinh vien.\n" << endl;
	cout << setw(38) << "\t\t\t\t\t\t\t\t\t[3] Them sinh vien.";
	cout << "[4] Xuat danh sach.\n" << endl;
	cout << setw(38) << "\t\t\t\t\t\t\t\t\t[5] Tim kiem theo msv.";
	cout << "[6] Recycle Bin.\n" << endl;
	cout << setw(25) << "\t\t\t\t\t\t\t\t\t\t\t[0] Ket thuc chuong trinh.\n";
	cout << "\n\t\t\t\t\t\t\t\t=============================  END  ==========================\n\n";
}
// cài đặt các lựa chọn, cho MENU lặp liên tục đến khi gặp điều kiện dừng
void menu_lap(Student *Recycle_Bin, Student *students, int n)
{
	int x;
	while(true)
	{
		system("cls");
		menu();
		cout << "\t\t\t\t\t\t\t\t\tMoi lua chon: ";
		cin >> x;
		// x == 1, gọi hàm sửa điểm bị sai
		if(x == 1)
		{
			sua_diem(students, n);
			cout << endl;
			system("pause");
		}
		// x == 2, gọi hàm xoá đi một sinh viên
		else if(x == 2)
		{
			xoa_sv(Recycle_Bin, students, n);
			cout << endl;
			system("pause");
		}
		// x == 3, gọi hàm thêm 1 sinh viên
		else if(x == 3)
		{
			them_sv(students, n);
			cout << endl;
			system("pause");
		}
		// x == 4, xuất danh sách sinh viên hiện có
		else if(x == 4)
		{
			xuat_Danh_Sach_Sap_Xep(students, n);
			cout << endl;
			system("pause");
		}
		// x == 5, tìm kiếm sinh viên bằng mã sinh viên
		else if(x == 5)
		{
			tim_1_sv(students, n);
			cout << endl;
			system("pause");
		}
		// x == 6, xuất ra danh sách các sinh viên bị xoá
		else if(x == 6)
		{
			cout << "\nThung rac cua ta co gi?\n";
			if(f > 0)
			{
				// xuất ra danh sách đã sắp xếp theo tên, truyền vào thùng rác / Recycle_Bin / và số lượng sinh viên bị xoá
				// chứ không phải truyền vào / students / nữa
				cout << "\nCac sinh vien da bi xoa di la: " << endl;
				xuat_Danh_Sach_Sap_Xep(Recycle_Bin, f);
			}
			else cout << "\t\t\t\t\t\tWell, chang co gi ca!!\n";
			cout << endl;
			system("pause");
		}
		// x == 0, kết thúc chương trình
		// nếu nhập 1 kí tự không phải kiểu int, chương trình sẽ tự break
		else if(x == 0)
		{
			cout << "\nThanks, good bye!\n\a";
			break;
		}
		// ngược lại các lựa chọn trên, nếu người dùng nhập vào lựa chọn không tồn tại, VD 8 9 11... thì sẽ báo lỗi, vì không có lệnh
		else
		{
			cout << "\n\aError!! Re-enter";
			// Sleep dùng thư viện / windows.h /, thời gian nghỉ tính theo miligiay, tại đây là 2.5 giây
			Sleep(2500);
		}
	}
}

// cài đặt hàm xoá các khoảng trắng thừa trong chuỗi, cụ thể là xoá khoảng trắng thừa trong / name /
// không có khoảng trắng ở đầu và cuối chuỗi, mỗi từ trong chuỗi chỉ được cách nhau 1 khoảng trắng
void xoa_Khoang_Trang_Chuoi(char hoten[])
{
	// y bằng độ dài chuỗi cần định dạng
	int y = strlen(hoten);
	// xoá khoảng trắng đầu chuỗi
	// vòng lặp while, chỉ cần kí tự đầu là khoảng trắng, copy kí tự sau đè lên kí tự đầu rồi cho độ dài giảm 1, liên tục
	while(hoten[0] == ' ')
	{
		strcpy(&hoten[0], &hoten[1]);
		--y;
	}
	// xoá khoảng trắng giữa chuỗi, gặp 2 kí tự khoảng trắng liên tiếp thì xoá
	for(int i = 0; i < y; ++i)
	{
		if(hoten[i] == ' ' && hoten[i+1] == ' ')
		{
			strcpy(&hoten[i], &hoten[i+1]);
			--i;
			--y;
		}
	}
	// xoá khoảng trắng cuối chuỗi
	while(hoten[y-1] == ' ')
	{
		// copy giá trị rác vào cuối, sau đó giảm độ dài chuỗi đi 1 là được, 
		strcpy(&hoten[y-1], &hoten[y]);
		--y;
	}
}
// cài đặt hàm xoá đi khoảng trắng thừa trong mã sinh viên
inline void xoa_Khoang_Trang_MSV(char msv[])
{
	// y là độ dài chuỗi mã sinh viên
	int y = strlen(msv);
	// cứ gặp khoảng trắng trong mã sinh viên là xoá hết thôi
	for(int i = 0; i < y;)
	{
		if(msv[i] == ' ')
		{
			strcpy(&msv[i], &msv[i+1]);
			--y;
		}
		else ++i;
	}
}
// cài đặt hàm lưu các sinh viên bị xoá đi
// f: số lượng sinh viên bị xoá, biến toàn cục
void luu_Tru_Sinh_Vien_Da_Xoa(Student *&Recycle_Bin, Student *&students, int vi_Tri_Xoa)
{
 	 // tạo mảng trung gian, copy lại các phần từ mảng cũ
	Student *TG = new Student[f];
	for(int i = 0; i < f; ++i)
	{
		TG[i] = Recycle_Bin[i];
	}
	// xoá đi mảng cũ
	delete []Recycle_Bin;
	f++;
	// số lượng sinh viên bị xoá tăng, tạo mảng mới
	Recycle_Bin = new Student[f];
	for(int i = 0; i < f - 1; ++i)
	{
		Recycle_Bin[i] = TG[i];
	}
	// copy lại các giá trị của thùng rác cũ, xoá thùng rác trung gian, trả bộ nhớ cho CPU
	delete []TG;
	Recycle_Bin[f-1] = students[vi_Tri_Xoa];
	// sao chép thông tin của sinh viên bị xoá vào vị trí cuối cùng
}
// #pragma warning (disable: 4996) if run with visual studio ><


//thanks, have a good day!!!!
// TRAN VAN THINH DHTI14A6HN - UNETI

 

Revise this Paste

Your Name: Code Language: