Вывести идентификатор работника, имя и среднемесячную зарплату для всех элементов списка - C#
Формулировка задачи:
Доброго времени суток!
Есть такая задача:
Построить три класса (базовый и 2 наследника), которые описывают некоторых работников с почасовой оплатой (один из наследников) и фиксированной оплатой (второй наследник). Описать в базовом классе абстрактный метод для расчёта среднемесячной зарплаты работников. Для почасовой оплаты формула такая: 20.8*8*почасовую ставку, для работников с фиксированной зарплатой, среднемесячная зарплата равна фиксированной месячной оплате.
1) Упорядочить вся последовательность работников по уменьшению среднемесячного заработка. При совпадении зарплаты - упорядочить данные по имени в алфавитном порядке. Вывести идентификатор работника, имя и среднемесячную зарплату для всех элементов списка.
2) Вывести первые 5 имен из полученного выше списка (задача А).
3) Вывести последние 3 идентификатора работника из полученного выше списка (задача А).
4) Организовать запись и чтение коллекции в/из файла.
5) Организовать обработку некорректного формата входного файла.
Очень хотелось бы услышать мнение уже имеющих опыт в программировании, как правильнее было бы решить данную задачу.
Вот, что делал бы я:
Создать три класса - это понятно. Формула вычисления зарплаты реализуется в двух классах и потом работает через ссылку на базовый класс.
Далее в базовом классе должна быть коллекция объектов работников. В каждом объекте будет id работника, имя, зарплата.
Не совсем понятно, как проводить сортировку коллекции, если в ней содержатся объекты, а тем более по двум критериям (зарплата и (если она совпадает) имя по алфавиту).
Пункт 3 вытекает из предыдущего.
Запись и чтение коллекции планирую производить с помощью классов BinaryWriter и BinaryReader.
Что имеется в виду под некорректным форматом входного файла не совсем понимаю. Если имеется в виду, к примеру, что данные были записаны не в том порядке, в котором проходит чтение, то просто должно вылететь исключение и нужно его обработать. Так ли это?
Заранее благодарю за советы!
Решение задачи: «Вывести идентификатор работника, имя и среднемесячную зарплату для всех элементов списка»
textual
Листинг программы
#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;
class Worker
{
protected:
string name;
double salary;
int ident;
public:
Worker(){};
~Worker(){};
string getname() {return name;}
double getsalary() {return salary;}
virtual void calc() {}
void out()
{
cout << name << " " << salary << " " << ident << endl;
}
void out_in_file()
{
ofstream write("E://write.txt", ios_base::app);
write << name << " " << salary << " " << ident << endl;
}
void in()
{
cout << "Enter name" << endl;
getline(cin, name);
cout << "Enter salary" << endl;
cin >> this->salary;
cout << "Enter identification number" << endl;
cin >> this->ident;
cin.ignore();
}
};
class salPerHour : public Worker
{
public:
salPerHour(){};
~salPerHour(){};
void calc()
{
this->salary = salary * 20.8 * 8;
}
};
class salaryFixed : public Worker
{
public:
salaryFixed(){};
~salaryFixed(){};
void calc()
{
this->salary = salary * 1;
}
};
bool compare(Worker *w1, Worker *w2)
{
if (w1->getsalary() == w2->getsalary())
return w1->getname() < w2->getname();
return w1->getsalary() > w2->getsalary();
}
void main()
{
Worker *salaryPerHour[5];
Worker *fixedSalary[5];
Worker obj;
int a, b;
cout << "Enter data about workers with salary per hour " << endl;
cout << "Enter number of workers : ";
cin >> a;
cin.ignore();
for(int i = 0; i < a; i++)
{
salaryPerHour[i] = new salPerHour;
salaryPerHour[i]->in();
salaryPerHour[i]->calc();
}
cout << "Enter data about workers with fixed salary " << endl;
cout << "Enter number of workers : ";
cin >> b;
cin.ignore();
for(int i = 0; i < b; i++)
{
fixedSalary[i] = new salaryFixed;
fixedSalary[i]->in();
fixedSalary[i]->calc();
}
sort(salaryPerHour, salaryPerHour + a, compare);
sort(fixedSalary, fixedSalary + b, compare);
for(int i = 0; i < a; i++)
{
salaryPerHour[i]->out();
salaryPerHour[i]->out_in_file();
}
for(int i = 0; i < b; i++)
{
fixedSalary[i]->out();
fixedSalary[i]->out_in_file();
}
cin.get();
cin.get();
}