Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: jgplsl   (16.03.2017 в 12:55)
В файле содержатся данные о сотрудниках предприятия: должность,фамилия, дата
рождения (день, месяц, год), стаж работы, зарплата. Отсортируйте файл по должности с помощью пирамидальной сортировки. Помогите пожалуйста, теории на занятиях не было, а самостоятельно к сожалению не могу понять метод сортировки и применить его на данный шаблон.

#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;
}


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: