C++ quản lý bán vé tàu hỏa

đề bài (bỏ qua vào ra file):
ĐỀ SỐ 14: QUẢN LÝ BÁN VÉ TÀU HỎA

Khai báo lớp Người (Họ tên, Địa chỉ, Số ĐT)
Khai báo lớp Người mua vé kế thừa từ lớp Người bổ sung các thuộc tính (Mã người mua, Loại người mua) – trong đó nhóm người mua có thể là: mua lẻ, mua tập thể, mua qua mạng, mã người mua là một số nguyên có 5 chữ số, tự động tăng.
Khai báo lớp Vé tàu (mã vé, loại ghế, đơn giá), mã vé là một số nguyên có 5 chữ số, tự động tăng.
Khai báo lớp Hóa đơn là bạn của lớp Người mua vé và lớp Vé tàu, trong đó một người mua có thể một mua một hoặc nhiều vé.
Viết chương trình trong ngôn ngữ C++ thực hiện các yêu cầu sau:

  1. Nhập thêm người mua vé vào file NGUOIMUA.DAT. In ra danh sách người mua đã có trong file.
  2. Nhập thêm loại vé vào file VE.DAT. In ra danh sách các loại vé đã có trong file.
  3. Nhập danh sách hóa đơn mua vé cho mỗi người mua đã có trong file NGUOIMUA.DAT; (giả sử mỗi người mua có thể mua một hoặc nhiều loại vé nhưng không quá 4 loại, mỗi loại có một số lượng xác định nhưng không quá 20). Lưu vào file HOADON.DAT và in danh sách ra màn hình.
  4. Sắp xếp danh sách hóa đơn đã lưu trong HOADON.DAT
    a. Theo Họ tên người mua
    b. Theo Số lượng vé mua (giảm dần)
  5. Lập bảng kê số tiền phải tra cho mỗi người mua

Mình hiểu ý 4b của bài này nó yêu cầu là in ra số lượng vé mua theo thứ tự giảm dần + thông tin khách hàng cùng với loại vé đó. Mình đã làm theo kiểu sắp xếp mảng 2 chiều, số lượng vé mua mình đặt là biến sl[50][50], nhưng làm như thế thì thông tin người mua sẽ bị sai mất vì số lượng vé mua không hề có liên kết gì với người mua. vậy ai có hướng giải quyết cho ý 4b giúp mình với, bài này thì mình không thể hỏi gg, và bần cùng lắm mới dám lên đây xin ý kiến mn chứ không phải là động bài khó không biết làm là post bài hỏi mà không chịu suy nghĩ gì. Dưới đây là code của mình:

#include<iostream>
#include<iomanip>
using namespace std;
int pc=10000,cc=10000;
class Nguoi{
	protected:
	string hoten, dc, sdt;
	public:
	Nguoi(){
		hoten="", dc="", sdt="";
	}
};
class Nguoimua: public Nguoi{
	private:
	string loai;
	int ID;
	public:
	Nguoimua(){
		int temp;
		cout<< "nhap ten nguoi mua: ";getline(cin,hoten);
		cout<< "dia chi: ";getline(cin,dc);
		cout<< "sdt: ";getline(cin,sdt);
		cout<< "loai nguoi mua: \n1.mua le\n2.mua tap the\n3.mua qua mang\n  ";cin>>temp;cin.ignore();
		if(temp==1) loai="mua le";
		if(temp==2) loai="mua tap the";
		if(temp==3) loai="mua qua mang";
		ID=pc;
		pc++;
	}
	void INTT(){
		cout<<endl<<left<<setw(10)<<"ID"<<setw(20)<<"hoten"<<setw(20)<<"dia chi"<<setw(20)<<"sdt"<<setw(20)<<"loai nguoi mua";
		cout<<endl<<left<<setw(10)<<ID<<setw(20)<<hoten<<setw(20)<<dc<<setw(20)<<sdt<<setw(20)<<loai<<endl;
	}
	string gethoten(){
		return hoten;
	}
	friend class HoaDon;
};
class Vetau{
	int ID,dongia;
	string loaighe;
	public:
		Vetau(){
			int temp;
			cout<< "nhap loai ghe: ";getline(cin,loaighe);
			cout<< "don gia: ";cin>>dongia;cin.ignore();
			ID=cc;
			cc++;
		}
		void INTT(){
			cout<<endl<<left<<setw(10)<<"ma ve"<<setw(20)<<"loai ghe"<<setw(20)<<"don gia";
			cout<<endl<<left<<setw(10)<<ID<<setw(20)<<loaighe<<setw(20)<<dongia<<endl;	
		}
		int getmv(){
			return ID;
		}
		friend class HoaDon;
};
class HoaDon{
	public: 
	Nguoimua *nm;
	Vetau **vt;
	void setnm(Nguoimua *nm){
		this->nm=nm;
	}
	Nguoimua getnm(){
		return *this->nm;
	}
	void setsl(int sl){
		vt= new Vetau *[sl];
	}
	void setvt(int i, Vetau *VT){
		this->vt[i]=VT;
	}
	Vetau getvt(int i){
		return *this->vt[i];
	}
};
Nguoimua *nm;
Vetau *vt;
HoaDon *hd;
int m,n,sloai[50],sl[50][50];
void menu(){
	cout<<"\n_________MENU_________"
	<< "\n1.nhap va xuat tt nguoi mua"
	<< "\n2.nhap va xuat tt ve tau"
	<< "\n3.nhap tt hoa don"
	<< "\n4.xuat tt hoa don"
	<< "\n5.sap xep danh sach hoa don"
	<< "\n6.lap bang ke so tien phai tra"
	<<"\n.nhap lua chon(nhap 0 de thoat): ";
}
void nv1(){	
	cout<< "\nNhap thong tin nguoi mua: ";
	cout<< "\nnhap so nguoi mua: ";cin>>m;cin.ignore();
	nm= new Nguoimua[m];
	cout<< "\nThong tin nguoi mua: ";
	for(int i=0;i<m;i++){
		nm[i].INTT();
	}	
}
void nv2(){
	cout<< "\nNhap thong tin ve tau: ";
	cout<< "\nnhap so luong ve tau: ";cin>>n;cin.ignore();
	vt= new Vetau[n];
	cout<< "\nThong tin ve tau: ";
	for(int i=0;i<n;i++){
		vt[i].INTT();
	}
}
void nv3(){
	int mv;
	cout<< "\nNhap thong tin hoa don: ";
	hd= new HoaDon[m];
	for(int i=0;i<m;i++){
		hd[i].setnm(nm+i);
		hd[i].getnm().INTT();
		do{
			cout<< "nhap so loai ve can mua(<=4): ";cin>>sloai[i];
		}while(sloai[i]>4);
		hd[i].setsl(sloai[i]);
		for(int j=0;j<sloai[i];j++){
			do{
				cout<< "nhap ma ve(100**): "; cin>>mv;
			}while(mv<vt[0].getmv()|| mv>vt[n-1].getmv());
			for(int k=0;k<n;k++){
				if(mv==vt[k].getmv())
					hd[i].setvt(j,vt+k);
			}
			do{
				cout<< "nhap so luong ve(<=20): ";cin>>sl[i][j];
			}while(sl[i][j]>20);
		}
	}
}
void nv4(){
	for(int i=0;i<m;i++){
		cout<<endl;
		cout<< "Thong tin khach hang: ";hd[i].getnm().INTT();
		cout<< "Thong tin hoa don: ";
		for(int j=0;j<sloai[i];j++){
			hd[i].getvt(j).INTT();
			cout<<" so luong ve tau: "<<sl[i][j];
		}
		cout<<endl;
	}
}
void ad_swap(HoaDon &hd1, HoaDon &hd2){
	HoaDon temp=hd1;
	hd1=hd2;
	hd2=temp;
}
void sx1(){
	for(int i=0;i<m;i++){
		for(int j=i+1;j<m;j++){
			if(hd[i].getnm().gethoten()>=hd[j].getnm().gethoten()){
				cout<<hd[i].getnm().gethoten()<<" > "<<hd[j].getnm().gethoten();
				ad_swap(hd[i],hd[j]);
			}
		}
	}
	nv4();
}
void sx2(){
	int total=0,k;
	for(int i=0;i<m;i++){
		total+=sloai[i];
	}	
	for(int i=0;i<total;i++){
		k=sloai[i];
		for(int j=0;j<total;j++){
			if(sl[i/k][i%k] > sl[j/k][j%k]){
				swap(sl[i/k][i%k],sl[j/k][j%k]);
			}
		}
	}
	for(int i=0;i<m;i++){
		for(int j=0;j<sloai[i];j++){
			cout<< "so luong ve: "<<sl[i][j];
			cout<<endl;
		}
	}
}
void nv5(){
	int lc;
	cout<< "Lua chon cach sap xep ds: "
	<< "\n1.theo ho ten\n2.theo so luong ve mua(giam dan) ";cin>>lc;
	if(lc==1) sx1();
	else sx2();
}
int main(){
	int lc;
	do{
		menu();
		cin>>lc;cin.ignore();
		switch(lc){
			case 1:nv1();break;
			case 2:nv2();break;
			case 3:nv3();break;
			case 4:nv4();break;
			case 5:nv5();break;
			//case 6:mv6();break;
			default: break;
		}
	}while(lc!=0);
}

Các mod nên remove hết những bài như thế này, vài dòng notice khuyến khích không hỏi bài tập không hề có tác dụng bởi member vẫn thấy các bài hỏi thì họ sẽ quyết định đăng. Những post viết nguyên đề bài lên không hề có chút suy nghĩ nào như này không nên xuất hiện. Nếu forum có chế độ duyệt bài với những thành viên mới thì hãy set một số lượng bài nhất định phải được duyệt cho thành viên vừa đăng ký. @drgnz

3 Likes

vậy theo bạn phải post như nào thì mới hợp lý, mình đang định hỏi cái ý mà m đang k biết làm, chứ có phải hỏi cả bài đâu

rõ ràng bạn đang nhờ người khác nghĩ hộ cho một bài tập của bạn
nếu như là hỏi về một vấn đề cụ thể về lập trình, ví dụ tôi có một mảng X chứa data Y thì sort như thế nào, hoặc code của tôi có một đoạn như này (5-10 dòng, dài quá thì cũng là bạn lười suy nghĩ và phân tích để thu hẹp vấn đề), tôi muốn A nhưng có lỗi B, suy đoán của tôi là C và một số người trên google bảo D vì tôi đã có trách nhiệm với bài của mình và search kỹ càng chứ tôi không phải là một người đưa vấn đề của mình lên mạng rồi chờ đợi

2 Likes

được rồi. mình sẽ post lại

1 Like

“một hoặc nhiều vé” thì phải lưu số lượng trong hóa đơn.

3 Likes

ý nó là 1 người có thể mua nhiều looại vé, mỗi loại vé thì có thể mua được nhiều vé. Nên mình khai báo biến sloai[50] để lưu số loại vé, còn sl[50][50] để lưu số lượng vé.

Thêm cái array HoaDon trong NguoiMua là được, soluong để trong HoaDon. -.-

1 Like

mình lm k đc, thêm array HoaDon trong NguoiMua là ntn bạn

NguoiMua không thêm được, cứ xem như 1 người chỉ có 1 hóa đơn vậy :slight_smile:

“loại vé” với “Loại ghế” có phải là một? @Gia_Cat_Luong

1 Like

B biết cái bảng tổng tính huy chương của mấy kì thể thao đồ không, mình nghĩ đây cũng tương tự.
In ra tổng số vé mua từ cao đến thấp + thông tin người mua, sau đó là cụ thể mua bao nhiêu vé các loại
Mình thấy b có nói[quote=“Gia_Cat_Luong, post:1, topic:61112”]
số lượng vé mua không hề có liên kết gì với người mua
[/quote]

thế [quote=“Gia_Cat_Luong, post:1, topic:61112”]
HOADON.DAT
[/quote]

có thể giải quyết được vấn đề của b không?
Sr mình đang dùng đt nên nhác coi code, có gì bỏ qua nhé

1 Like

đúng rồi, b cứ coi “loại vé” với " loại ghế" là một đi vì thực sự đầu bài nó viết cũng chả rõ @rogp10

đề bài không yêu cầu vào ra file nhé @minh99

Số lượng vé mua - Đây có phải là câu hỏi thiếu không vậy anh?
Số lượng vé đã mua theo em hiểu là có 2 loại:

  • Số lượng vé mà mỗi loại người đã mua.
  • Số lượng vé của mỗi loại ghế đã được mua.
1 Like

nghĩa là mỗi người có thể mua nhiều loại vé, mỗi 1 loại vé có thể có nhiều vé. Còn “loại vé” với “loại ghế” thì a không rõ lắm, nhưng cứ coi nó là một cũng được

em hiểu đề bài thế này:
Sắp xếp Loại vé đã được mua theo thứ tự giảm dần số lượng của loại vé đó.
Có đúng không à anh?

Cái đề này yêu cầu phải tương tác với file cơ mà, nếu đề không yêu cầu thì cứ làm, còn nếu đề bảo không được làm này kia mới phải nghĩ cách khác chứ

1 Like

đúng rồi đấy e ơi, nhưng phải xuất cả tt người mua cùng loại vé nữa

thì bây giờ mình cứ thử nghĩ xem có cách nào khác không, nếu không được thì mới chuyển sang vào ra file, chứ tội gì mà vào ra file, đề yêu cầu làm trong 60’ thôi nên mình muốn tối ưu hóa các tác vụ k cần thiết, mà nhất là khi đề bài k yêu cầu vào ra file thì tốt nhất là bỏ qua (đề yc nhưng gv không yc)

mình phân tích thế này có được không (phân tích theo hướng OOP thôi )

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?