01/10/2018, 15:46

Hỏi về bài tập: tìm giá trị nhỏ nhất của đối tượng trong lớp cụ thể

bài taapj của mình có 3 lớp: 1 lớp mẹ (NhanVien ) và 2 lớp con (CongNhan, CanBo)
sau khi sắp xếp lại theo thứ tự lương giảm dần. Mình muốn tìm Công nhân có lương thấp nhất thì làm thế nào???

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

class NV
{
	private:
		string ten, gt;
		int tuoi;
		static int dem;
	public:
		virtual void nhap()
		{
			cin.ignore();
			cout<<"
ten= ";
			getline(cin, ten);
			cout<<"tuoi= ";
			cin>>tuoi;
			cin.ignore();
			cout<<"gioi tinh= ";
			getline(cin, gt);
		}
		virtual void hienthi()
		{
			cout<<setw(10)<<dem++<<setw(20)<<ten<<setw(10)<<tuoi<<setw(10)<<gt;
		}
		virtual float luong()=0;
};
int NV::dem=0;
class CN:public NV
{
	private:
		int songay, luongngay;
	public:
		void nhap()
		{
			NV::nhap();
			cout<<"luong ngay= ";cin>>luongngay;
			cout<<"so ngay= ";cin>>songay;

		}
		void hienthi()
		{
			NV::hienthi();
			cout<<setw(10)<<luongngay<<setw(10)<<songay<<setw(30)<<luong()<<endl;
		}
		float luong()
		{
			return luongngay*songay;
		}
};
class CB:public NV
{
	float hsl, phucap;
		public:
			void nhap()
		{
			NV::nhap();
			cout<<"hsl= ";cin>>hsl;
			cout<<"phu cap= ";cin>>phucap;
		}
		void hienthi()
		{
			NV::hienthi();
			cout<<setw(30)<<hsl<<setw(10)<<phucap<<setw(10)<<luong()<<endl;
		}
		float luong()
		{
			return hsl*1150000+phucap;
		}
};
int main()
{
	NV *a[100];//mang con tro de -->tro den can bo or cong nhan
	int M,N;
	cout<<"M,N= ";cin>>M>>N;
	
	//nhap thong tin cho nhan vien
	cout<<"
1.nhap thong tin cho cong nhan:"<<endl;
	for (int i=0; i<M;i++)
	{
		a[i]= new CN();//vi la con tro nen khong co bo nho nen dung new de tao khong gian luu tru thong tin cho no
		a[i]->nhap();
	}
	cout<<"
2.nhap thong tin cho can bo:"<<endl;
	//nhap thong tin cho can bo
	for (int i=M; i<M+N;i++)
	{
		a[i]=new CB();//vi la con tro nen khong co bo nho nen dung new de tao khong gian bo nho cho no
		a[i]->nhap();
	}
	
	//xuat
	cout<<"==>DS vua nhap:"<<endl;
	cout<<setw(10)<<"STT"<<setw(20)<<"ten"<<setw(10)<<"tuoi"<<setw(10)<<"gt"<<setw(10)<<"luongngay"<<setw(10)<<"songay"
	<<setw(10)<<"hsl"<<setw(10)<<"phucap"<<setw(10)<<"luong"<<endl;
	for (int i=0; i<M+N;i++)
		a[i]->hienthi();
		
	
	for (int i=0; i<M+N-1;i++)
		for (int j=i+1;j<M+N;j++)
		if(a[i]->luong()<a[j]->luong())
		{
			NV* tg; 
			tg=a[i];
			a[i]=a[j];
			a[j]=tg;
		}
		cout<<"
==> Sap xep theo chieu giam dan:"<<endl;
		for (int i=0; i<M+N;i++)
		a[i]->hienthi();

	//vấn đề xuất hiện ở đây:
	cout<<"
==> cong nhan co luong thap nhat la:"<<endl;
	float min = a[0]->luong();
	for (int i=0; i<M; i++)
		if (a[i]->luong()<min) min=a[i]->luong();
	for (int i=0; i<M; i++)
		if (a[i]->luong()==min)
			a[i]->hienthi();
//vấn đề là cái mảng đã được sắp xếp lại nên từ a[0] -> a[m] không phải là thông tin riêng của công nhân nữa.
			
	return 1;
}
HK boy viết 17:59 ngày 01/10/2018

Mình muốn tìm Công nhân có lương thấp nhất thì làm thế nào

Đã sort giảm dần theo lương thì gọi nhân viên đầu tiên thôi.

Đoàn Trọng Hiếu viết 18:00 ngày 01/10/2018

sắp xếp lại theo thứ tự lương giảm dần

tìm Công nhân có lương thấp nhất

gọi nhân viên đầu tiên

Lương giảm dần, muốn tìm ông thấp nhất thì lấy ông cuối cùng chứ nhể

Thành Chung Nguyễn viết 17:52 ngày 01/10/2018

Kể cả mảng này sắp xếp theo chiều tăng dần (1 2 3 4…) thì:
Mảng này có cả công nhân và Cán bộ
nếu người có số lương thấp nhất là cán bộ mà không phải là Công nhân thì vị trí đầu tiên là sai.

Thành Chung Nguyễn viết 18:02 ngày 01/10/2018

Chắc bạn chưa đọc kỹ, ban đầu mình chia
Từ a[0] ->a[m-1]: chứa thông tin công nhân
Từ a[m] ->a[m+n]: chứa thông tin cán bộ
sau khi sắp xếp theo tăng dần của lương thì vị trí từ a[0] ->a[m+n] bị sắp xếp lại, công nhân và cán bộ trộn lẫn với nhau. Cái đề bài yêu cầu là tìm công nhân có lương thấp nhất chứ không phải là Nhân viên có lương thấp nhất.

Đoàn Trọng Hiếu viết 17:47 ngày 01/10/2018

sắp xếp lại theo thứ tự lương giảm dần

sau khi sắp xếp theo tăng dần của lương

Thế chốt lại bác sắp xếp theo chiều nào?
Nếu sắp xếp tăng dần thì duyệt từng phần tử từ đầu đến cuối, gặp ông công nhân đầu tiên thì ông đó là công nhân lương thấp nhất.
Nếu sắp xếp giảm dần thì ngược lại, duyệt từ cuối danh sách, gặp ông công nhân đầu tiên thì ông đó là công nhân lương thấp nhất.
Để nhận biết ông A có phải công nhân không thì dựa vào thuộc tính khác biệt của công nhân so với cán bộ.

Thành Chung Nguyễn viết 17:58 ngày 01/10/2018

ý tưởng đấy thì mình cũng có nhưng viết code như thế nào thì mình chưa biết làm. Mong được bạn chỉ giúp!

rogp10 viết 18:01 ngày 01/10/2018

Bạn thớt xem lại phần casting

Bài liên quan
0