#include <iostream>
#include <cstring>
using namespace std;
#define MAX 100 // Giới hạn số học sinh tối đa
struct HocSinh {
char hoTen[50];
char gioiTinh[10];
int namSinh;
double diemTongKet;
};
// Hàm nhập danh sách học sinh
void nhapDanhSach(HocSinh ds[], int &n) {
cout << "Nhập số lượng học sinh: ";
cin >> n;
cin.ignore(); // Xóa bộ đệm để nhập chuỗi
for (int i = 0; i < n; i++) {
cout << "Nhập thông tin học sinh thứ " << i + 1 << ":\n";
cout << "Họ và tên: ";
cin.getline(ds[i].hoTen, 50);
cout << "Giới tính: ";
cin.getline(ds[i].gioiTinh, 10);
cout << "Năm sinh: ";
cin >> ds[i].namSinh;
cout << "Điểm tổng kết: ";
cin >> ds[i].diemTongKet;
cin.ignore(); // Xóa bộ đệm để nhập chuỗi tiếp theo
}
}
// Hàm sắp xếp danh sách theo điểm giảm dần (Dùng thuật toán sắp xếp chèn - Insertion Sort)
void sapXepDiemGiamDan(HocSinh ds[], int n) {
for (int i = 1; i < n; i++) {
HocSinh key = ds[i];
int j = i - 1;
while (j >= 0 && ds[j].diemTongKet < key.diemTongKet) {
ds[j + 1] = ds[j];
j--;
}
ds[j + 1] = key;
}
}
// Hàm tìm kiếm tuần tự theo tên
void timKiemTuanTuTen(HocSinh ds[], int n, char ten[]) {
bool found = false;
for (int i = 0; i < n; i++) {
if (strcmp(ds[i].hoTen, ten) == 0) {
cout << "Tìm thấy: " << ds[i].hoTen << " - " << ds[i].diemTongKet << endl;
found = true;
}
}
if (!found) cout << "Không tìm thấy học sinh có tên: " << ten << endl;
}
// Hàm tìm kiếm tuần tự theo điểm
void timKiemTuanTuDiem(HocSinh ds[], int n, double diem) {
bool found = false;
for (int i = 0; i < n; i++) {
if (ds[i].diemTongKet == diem) {
cout << "Tìm thấy: " << ds[i].hoTen << " - " << ds[i].diemTongKet << endl;
found = true;
}
}
if (!found) cout << "Không tìm thấy học sinh có điểm: " << diem << endl;
}
// Hàm tìm kiếm nhị phân theo điểm tổng kết (Cần danh sách đã sắp xếp)
void timKiemNhiPhanDiem(HocSinh ds[], int n, double diem) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (ds[mid].diemTongKet == diem) {
cout << "Tìm thấy: " << ds[mid].hoTen << " - " << ds[mid].diemTongKet << endl;
return;
} else if (ds[mid].diemTongKet < diem) {
right = mid - 1; // Vì danh sách giảm dần nên cần giảm right
} else {
left = mid + 1;
}
}
cout << "Không tìm thấy học sinh có điểm: " << diem << endl;
}
// Hàm hiển thị danh sách học sinh
void hienThiDanhSach(HocSinh ds[], int n) {
cout << "\nDanh sách học sinh:\n";
for (int i = 0; i < n; i++) {
cout << ds[i].hoTen << " - " << ds[i].gioiTinh << " - "
<< ds[i].namSinh << " - " << ds[i].diemTongKet << endl;
}
}
// Chương trình chính
int main() {
HocSinh ds[MAX];
int n;
nhapDanhSach(ds, n);
// Sắp xếp danh sách giảm dần theo điểm
sapXepDiemGiamDan(ds, n);
// Hiển thị danh sách sau khi sắp xếp
hienThiDanhSach(ds, n);
// Tìm kiếm tuần tự theo tên
char ten[50];
cout << "\nNhập tên học sinh cần tìm (tìm kiếm tuần tự): ";
cin.getline(ten, 50);
timKiemTuanTuTen(ds, n, ten);
// Tìm kiếm tuần tự theo điểm
double diem;
cout << "\nNhập điểm cần tìm (tìm kiếm tuần tự): ";
cin >> diem;
timKiemTuanTuDiem(ds, n, diem);
// Tìm kiếm nhị phân theo điểm
cout << "\nNhập điểm cần tìm (tìm kiếm nhị phân): ";
cin >> diem;
timKiemNhiPhanDiem(ds, n, diem);
return 0;
}