#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 Patient { int id; string name; int age; string diagnosis; };
Patient* findPatient(Patient* ds,int n,int id){
for(int i=0;i<n;++i)if(ds[i].id==id)return &ds[i];
return nullptr;
}
void input(Patient* ds,int n){
for(int i=0;i<n;++i){
cout<<"\nBenh nhan "<<i+1<<":\n";
while(true){if(!readInt("ID: ",ds[i].id))return;
if(findPatient(ds,i,ds[i].id)==nullptr)break;
cout<<"ID trung!\n";}
ds[i].name=readLine("Ho ten: ");
do {if(!readInt("Tuoi: ",ds[i].age))return;
if(ds[i].age<0||ds[i].age>150)cout<<"Tuoi khong hop le!\n";
}while(ds[i].age<0||ds[i].age>150);
ds[i].diagnosis=readLine("Chan doan: ");
}
}
void findAndShow(Patient* ds,int n,bool isDoctor){
int id;if(!readInt("ID can tim: ",id))return;
Patient* p=findPatient(ds,n,id);
if(p==nullptr){cout<<"Khong tim thay!\n";return;}
cout<<"ID: "<<p->id<<" | Ten: "<<p->name<<" | Tuoi: "<<p->age<<'\n';
if(isDoctor)cout<<"Diagnosis: "<<p->diagnosis<<'\n';
}
void updateDiagnosis(Patient* ds,int n,bool isDoctor){
if(!isDoctor){cout<<"Chi doctor duoc sua diagnosis!\n";return;}
int id;if(!readInt("ID can sua: ",id))return;
Patient* p=findPatient(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
p->diagnosis=readLine("Diagnosis moi: ");
cout<<"Da cap nhat!\n";
}
bool login(bool& isDoctor){
int role;if(!readInt("1.Doctor 2.User: ",role))return false;
if(role==2){isDoctor=false;return true;}
if(role==1){string pass=readLine("Mat khau doctor: ");
if(pass=="D123"){isDoctor=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;
Patient* ds=new Patient[n];input(ds,n);
int mainChoice=-1;
do{
if(!readInt("\n1.Dang nhap 0.Thoat: ",mainChoice))break;
if(mainChoice==1){bool isDoctor=false;
if(!login(isDoctor))continue;
int choice=-1;
do{
if(!readInt("\n1.Tim/xem benh nhan 2.Cap nhat diagnosis 0.Dang xuat: ",choice))break;
switch(choice){
case 1:findAndShow(ds,n,isDoctor);break;
case 2:updateDiagnosis(ds,n,isDoctor);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;
}