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