#include <iostream>
#include <string>
#include <limits>
using namespace std;
bool readInt(const string& msg, int& x) {
while (true) {
cout << msg;
if (cin >> x) return true;
if (cin.eof()) return false;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Phai nhap so nguyen!\n";
}
}
bool readDouble(const string& msg, double& x) {
while (true) {
cout << msg;
if (cin >> x) return true;
if (cin.eof()) return false;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Phai nhap so!\n";
}
}
string readLine(const string& msg) {
cout << msg;
string s;
getline(cin >> ws, s);
return s;
}
struct Course { int id; string name; int maxStudents,registered; };
Course* findCourse(Course* ds,int n,int id){
for(int i=0;i<n;++i)if(ds[i].id==id)return &ds[i];
return nullptr;
}
void input(Course* ds,int n){
for(int i=0;i<n;++i){
cout<<"\nKhoa hoc "<<i+1<<":\n";
while(true){if(!readInt("ID: ",ds[i].id))return;
if(findCourse(ds,i,ds[i].id)==nullptr)break;
cout<<"ID trung!\n";}
ds[i].name=readLine("Ten khoa hoc: ");
do{if(!readInt("Suc chua: ",ds[i].maxStudents))return;
if(ds[i].maxStudents<0)cout<<"Khong duoc am!\n";
}while(ds[i].maxStudents<0);
do{if(!readInt("Da dang ky: ",ds[i].registered))return;
if(ds[i].registered<0||ds[i].registered>ds[i].maxStudents)
cout<<"Can 0 <= registered <= maxStudents!\n";
}while(ds[i].registered<0||ds[i].registered>ds[i].maxStudents);
}
}
void show(Course* ds,int n){
for(int i=0;i<n;++i)cout<<ds[i].id<<" | "<<ds[i].name
<<" | "<<ds[i].registered<<"/"<<ds[i].maxStudents<<'\n';
}
void search(Course* ds,int n){
int id;if(!readInt("ID can tim: ",id))return;
Course* p=findCourse(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
cout<<p->id<<" | "<<p->name<<" | "<<p->registered<<"/"<<p->maxStudents<<'\n';
}
void registerCourse(Course* ds,int n){
int id;if(!readInt("ID dang ky: ",id))return;
Course* p=findCourse(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
if(p->registered>=p->maxStudents){cout<<"Da day!\n";return;}
++p->registered;cout<<"Dang ky thanh cong!\n";
}
void cancelCourse(Course* ds,int n){
int id;if(!readInt("ID huy dang ky: ",id))return;
Course* p=findCourse(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
if(p->registered<=0){cout<<"Chua co dang ky de huy!\n";return;}
--p->registered;cout<<"Huy thanh cong!\n";
}
void changeCapacity(Course* ds,int n,bool isTeacher){
if(!isTeacher){cout<<"Student khong duoc sua maxStudents!\n";return;}
int id;if(!readInt("ID khoa hoc: ",id))return;
Course* p=findCourse(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
int capacity;if(!readInt("Suc chua moi: ",capacity))return;
if(capacity<p->registered){cout<<"Khong duoc nho hon so da dang ky!\n";return;}
p->maxStudents=capacity;cout<<"Da cap nhat!\n";
}
bool login(bool& isTeacher){
int role;if(!readInt("1.Teacher 2.Student: ",role))return false;
if(role==2){isTeacher=false;return true;}
if(role==1){string pass=readLine("Mat khau teacher: ");
if(pass=="T123"){isTeacher=true;return true;}}
cout<<"Dang nhap that bai!\n";return false;
}
int main(){
int n;if(!readInt("Nhap n (1..1000): ",n)||n<1||n>1000)return 0;
Course* ds=new Course[n];input(ds,n);
int mainChoice=-1;
do{
if(!readInt("\n1.Dang nhap 0.Thoat: ",mainChoice))break;
if(mainChoice==1){bool isTeacher=false;
if(!login(isTeacher))continue;
int choice=-1;
do{
if(!readInt("\n1.Hien thi 2.Tim 3.Dang ky 4.Huy dang ky 5.Sua suc chua 0.Dang xuat: ",choice))break;
switch(choice){
case 1:show(ds,n);break;
case 2:search(ds,n);break;
case 3:registerCourse(ds,n);break;
case 4:cancelCourse(ds,n);break;
case 5:changeCapacity(ds,n,isTeacher);break;
case 0:break;
default:cout<<"Lua chon sai!\n";
}
}while(choice!=0&&!cin.eof());
}else if(mainChoice!=0)cout<<"Lua chon sai!\n";
}while(mainChoice!=0&&!cin.eof());
delete[] ds;ds=nullptr;return 0;
}