Untitled
unknown
c_cpp
3 years ago
7.9 kB
11
Indexable
#include <bits/stdc++.h>
//#include <iostream>
//#include <string>
//#include "preheader.h"
bool stop = false;`
using namespace std;
class StudentNode {
public:
string MSSV;
string TEN;
float DTB;
StudentNode* next;
StudentNode* prev;
};
void swapNodes(StudentNode*& head, StudentNode* x, StudentNode* y) {
if (x == y) return;
if (x->prev) x->prev->next = y;
else head = y;
if (y->next) y->next->prev = x;
x->next->prev = y;
y->prev->next = x;
swap(x->prev, y->prev);
swap(x->next, y->next);
}
void displayStudents(StudentNode* head) {
if (head == nullptr) {
cout << "Danh sach khong co sinh vien.\n";
return;
}
cout << "Danh sach sinh vien:\n";
for (StudentNode* p = head; p != nullptr; p = p->next) {
cout << "Ten sinh vien: " << p->TEN << " - MSSV: " << p->MSSV << " - DTB: " << p->DTB << endl;
}
}
void addStudent(StudentNode* &head) {
while (true) {
StudentNode* newNode = new StudentNode;
cout << "Nhap ten sinh vien (nhap khoang trang de ket thuc): ";
getline(cin, newNode->TEN);
if (newNode->TEN.empty()) {
delete newNode;
break;
}
cout << "Nhap MSSV: ";
getline(cin, newNode->MSSV);
//StudentNode* currNode = head;
cout << "Nhap diem trung binh: ";
cin >> newNode->DTB;
cin.ignore();
newNode->next = head;
newNode->prev = NULL;
if (head != NULL) {
head->prev = newNode;
}
head = newNode;
cout << "Da them sinh vien " << newNode->TEN << " vao danh sach.\n";
}
}
void searchStudent(StudentNode* head) {
string name;
cout << "Nhap ten sinh vien can tim: ";
getline(cin, name);
StudentNode* currNode = head;
while (currNode != NULL) {
if (currNode->TEN == name) {
cout << "Sinh vien " << currNode->TEN << " co MSSV la " << currNode->MSSV << " va diem TB la " << currNode->DTB << endl;
return;
}
currNode = currNode->next;
}
cout << "Khong tim thay sinh vien co ten la " << name << endl;
}
void removeStudent(StudentNode* &head) {
string mssv;
cout << "Nhap MSSV cua sinh vien can xoa: ";
getline(cin, mssv);
StudentNode* currNode = head;
while (currNode != NULL) {
if (currNode->MSSV == mssv) {
cout << "Da xoa sinh vien " << currNode->TEN << " khoi danh sach.\n";
if (currNode->prev != NULL) {
currNode->prev->next = currNode->next;
}
else {
head = currNode->next;
}
if (currNode->next != NULL) {
currNode->next->prev = currNode->prev;
}
delete currNode;
return;
}
currNode = currNode->next;
}
cout << "Khong tim thay sinh vien co MSSV " << mssv << " trong danh sach.\n";
}
void listStudents(StudentNode* head) {
cout << "Danh sach sinh vien co diem TB >= 5.0:\n";
StudentNode* currNode = head;
while (currNode != NULL) {
if (currNode->DTB >= 5.0) {
cout << " " << currNode->TEN << " (MSSV: " << currNode->MSSV << ", diem TB: " << currNode->DTB << ")\n";
}
currNode = currNode->next;
}
}
void ratingStudents(StudentNode* head) {
cout << "Xep loai sinh vien:\n";
StudentNode* current = head;
while (current != nullptr) {
string rating;
if (current->DTB >= 9.0) {
rating = "Xuat sac";
}
else if (current->DTB >= 8.0) {
rating = "Gioi";
}
else if (current->DTB >= 7.0) {
rating = "Kha";
}
else if (current->DTB >= 6.5) {
rating = "Trung binh kha";
}
else if (current->DTB >= 5.0) {
rating = "Trung binh";
}
else {
rating = "Yeu";
}
cout << " " << current->TEN << " (MSSV: " << current->MSSV << ", xep loai: " << rating << ")\n";
current = current->next;
}
}
void sortStudents(StudentNode*& head) {
if (!head || !head->next) {
cout << "Danh sach sinh vien da duoc sap xep theo diem TB tang dan.\n";
return;
}
StudentNode* i = head->next;
while (i) {
float key = i->DTB;
string keyMSSV = i->MSSV;
string keyTEN = i->TEN;
StudentNode* j = i->prev;
while (j && j->DTB > key) {
j->next->prev = j->prev;
if (j->prev) {
j->prev->next = j->next;
} else {
head = j->next;
}
j->prev = j->next;
j->next = j->next->next;
j->prev->next = j;
if (j->next) {
j->next->prev = j;
}
j = j->prev;
}
i->DTB = key;
i->MSSV = keyMSSV;
i->TEN = keyTEN;
i = i->next;
}
cout << "Danh sach sinh vien da duoc sap xep theo diem TB tang dan.\n";
}
void insertStudent(StudentNode*& head) {
StudentNode* newNode = new StudentNode();
cout << "Nhap ten sinh vien: ";
getline(cin, newNode->TEN);
cout << "Nhap MSSV: ";
getline(cin, newNode->MSSV);
cout << "Nhap diem trung binh: ";
cin >> newNode->DTB;
cin.ignore();
if (head == nullptr || head->DTB >= newNode->DTB) {
newNode->next = head;
newNode->prev = nullptr;
if (head != nullptr) {
head->prev = newNode;
}
head = newNode;
}
else {
StudentNode* current = head;
while (current->next != nullptr && current->next->DTB < newNode->DTB) {
current = current->next;
}
newNode->next = current->next;
newNode->prev = current;
if (current->next != nullptr) {
current->next->prev = newNode;
}
current->next = newNode;
}
sortStudents(head);
cout << "Da chen sinh vien " << newNode->TEN << " vao danh sach.\n";
}
int main() {
StudentNode* head = nullptr;
int choice;
do {
cout << "-------MENU-------\n";
cout << "1. Hien thi danh sach sinh vien\n";
cout << "2. Nhap danh sach sinh vien\n";
cout << "3. Tim sinh vien trong danh sach\n";
cout << "4. Xoa sinh vien khoi danh sach\n";
cout << "5. Liet ke sinh vien co diem TB >= 5.0\n";
cout << "6. Xep loai va in ra thong tin cua tung sinh vien\n";
cout << "7. Sap xep danh sach sinh vien theo diem TB tang dan\n";
cout << "8. Chen sinh vien vao danh sach theo diem TB tang dan\n";
cout << "9. Thoat chuong trinh\n";
cout << "Chon mot chuc nang (1-9): ";
cin >> choice;
cin.ignore();
switch (choice) {
case 1:
displayStudents(head);
break;
case 2:
addStudent(head);
break;
case 3:
searchStudent(head);
break;
case 4:
removeStudent(head);
break;
case 5:
listStudents(head);
break;
case 6:
ratingStudents(head);
break;
case 7:
sortStudents(head);
break;
case 8:
insertStudent(head);
break;
case 9:
cout << "Chuong trinh da thoat.\n";
break;
default:
cout << "Khong co chuc nang tuong ung.\n";
break;
}
cout << endl;
} while (choice != 9);
return 0;
}
Editor is loading...