|
 733 байт |
|
| В файле содержатся данные о сотрудниках предприятия: должность,фамилия, дата
рождения (день, месяц, год), стаж работы, зарплата. Отсортируйте файл по должности с помощью пирамидальной сортировки. Помогите пожалуйста, теории на занятиях не было, а самостоятельно к сожалению не могу понять метод сортировки и применить его на данный шаблон.
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<iomanip>
#include<cmath>
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
struct date{//объявляем тип - структуру с датой
int dd, mm, yy;
};
struct people{//объявляем тип - структуру с данными о человеке
string Dol;//Должность
string Surname; //фамилия
date DateOfBirth; //дата рождения
int Salary, Stag; //зарплата, стаж
};
date Str_to_Date(string str){//из строки в дату
date x;
string temp = str.substr(0, 2);//в temp записываем часть строки с днем из даты рождения (ДР)
x.dd = atoi(temp.c_str());//переводим строку temp в число-день
temp = str.substr(3, 2);//в temp записываем часть строки с месяцем из даты рождения (ДР)
x.mm = atoi(temp.c_str());//переводим строку temp в число-месяц
temp = str.substr(6, 4);//в temp записываем часть строки с годом из даты рождения (ДР)
x.yy = atoi(temp.c_str()); //переводим строку temp в число-год
return x;
}
vector<people> inFile(){//функция считывает из файла данные о людях и возвращает вектор из people в качестве результата
vector<people> x;
people temp;
while(in.peek() != EOF){
in >> temp.Dol;
in >> temp.Surname;//считывается фамилия
string tmp;//объявляем строку для считывания даты рождения
in >> tmp;//считываем строку с датой рождения (ДР)
temp.DateOfBirth = Str_to_Date(tmp); // переводим строку с ДР в структуру ДР
in >> temp.Stag;//считываем стаж
in >> temp.Salary;//считываем зарплату
x.push_back(temp); //добавляем человека temp в вектор x
}
return x; // возвращаем вектор из людей как результат функции
}
void print(people x){//функция выводит данные о человеке х в файл
out << setw(15) << left << x.Dol;
out << setw(10) << left << x.Surname;// setw(10)- 10 позиций для фамилии, left - выравнивание по левому краю
if (x.DateOfBirth.dd < 10) out << left << '0' << x.DateOfBirth.dd << '.';//если день в ДР <10, то добавляем 0, например, 02
else out << left << x.DateOfBirth.dd << '.';
if (x.DateOfBirth.mm < 10) out << '0' << x.DateOfBirth.mm << '.';//если месяц в ДР <10, то добавляем 0, например, 02
else out << x.DateOfBirth.mm << '.';
out << left << setw(6) << x.DateOfBirth.yy;//на год отводится 6 позиций, выравнивание по левому краю
out << left << setw(4) << x.Stag ;
out << left << setw(10) << x.Salary << endl;//на запрлату отводится 10 позиций, выравнивание по левому краю
}
bool operator < (people a, people b){//переопределяем оператор < для сравнения двух людей a и b в соотвествии с условием
if (a.Surname < b.Surname) return true;
if (a.Surname == b.Surname && a.DateOfBirth.yy < b.DateOfBirth.yy) return true;
if (a.Surname == b.Surname && a.DateOfBirth.yy == b.DateOfBirth.yy && a.Salary < b .Salary) return true;
return false;
}
void Heap_sort(vector<people> &x)
???????????????????????????
???????????????????????
?????????????????????????
???????????????????????????
int main(){
vector<people> x;
x = inFile();
Heap_sort(x);
for(int i = 0; i < x.size(); i++)
print(x[i]);
return 0;
} |
| |
|
|
|
|
|
|
|
для: jgplsl
(16.03.2017 в 12:55)
| | Благодарю за скрипт! Немного доработали, реализовали функционал здесь, заказчик остался доволен.
Если еще интересуетесь, могу поделиться доработанной версией. | |
|
|
|