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;
}
Bài liên quan
Đã sort giảm dần theo lương thì gọi nhân viên đầu tiên thôi.
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ể
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.
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.
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ộ.
ý 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!
Bạn thớt xem lại phần casting