Обработка массива данных предметной области «штатное расписание»
Разработать программу, в которой будет организовано меню, выбор функций меню должно быть организовано по функциональной клавише. Вся информация должна храниться в массиве структур, с возможностью их записи в файл. Организовать сортировку данных различными методами (быстрая, Шелла, Пузырьковая), вывод результатов сортировки должен быть в табличной форме.
Функции программы:
функция для ввода данных пользователем;
функция для записи данных в файл;
чтение данных из файла;
вывод данных на экран;
дополнение данных;
удаление данных;
поиск информации по атрибуту;
сортировка различными методами;
Состав и структура исходных данных
Таблица «штатное расписание» с полями:
«ФИО работника»
«кол-во отработанных часов»
«должность»
«оплата за час работы»
«присваиваемый id»
вычисляемое поле «зарплата»
Примечание: зарплата = количество отработанных часов умножить на оплату за час работы.
Выберите действие:
N New worker.
E Edit data.
F Find worker.
D Delete data.
S Save to file.
R Load from file.
V Show all workers.
C Sort data.
Q Quit.
n
Enter data:
id: 1
Surname: Hume
Name: Desmond
Patronymic: ---
Post: athlete
Hr. pay: 40
Hours: 4320
Выберите действие:
N New worker.
E Edit data.
F Find worker.
D Delete data.
S Save to file.
R Load from file.
V Show all workers.
C Sort data.
Q Quit.
n
Enter data:
id: 2
Surname: Shephard
Name: Jack
Patronymic: ---
Post: leader
Hr. pay: 100
Hours: 5235
Выберите действие:
N New worker.
E Edit data.
F Find worker.
D Delete data.
S Save to file.
R Load from file.
V Show all workers.
C Sort data.
Q Quit.
n
Enter data:
id: 3
Surname: Ford
Name: James
Patronymic: ---
Post: killer
Hr. pay: 43
Hours: 345
Выберите действие:
N New worker.
E Edit data.
F Find worker.
D Delete data.
S Save to file.
R Load from file.
V Show all workers.
C Sort data.
Q Quit.
v
Worker data
ID Surname Name Patronymic Post h/pay Hours Salary
-------------------------------------------------------------------
1 Hume Desmond --- athlete 40 4320 172800
2 Shephard Jack --- leader 100 5235 523500
3 Ford James --- killer 43 345 14835
Выберите действие:
N New worker.
E Edit data.
F Find worker.
D Delete data.
S Save to file.
R Load from file.
V Show all workers.
C Sort data.
Q Quit.
q
#include<iostream>
#include<iomanip>
#include<vector>
#include <locale>
#include <fstream>
using namespace std;
class worker
{
char surname[64];
char name[64];
char patron[64];
char post[128];
double salary;
double h_pay;
int hours;
int id;
public:
worker(){};
~worker(){};
void set_data()
{
cout<<"Enter data:"<<endl;
cout<<"id: "; cin>>id;
cout<<"Surname: "; cin>>surname;
cout<<"Name: "; cin>>name;
cout<<"Patronymic: "; cin>>patron;
cout<<"Post: "; cin>>post;
cout<<"Hr. pay: "; cin>>h_pay;
cout<<"Hours: "; cin>>hours;
}
void Salary()
{
salary= h_pay*hours;
}
void show()
{
cout<<setw(4)<<id<<setw(12)<<surname<<setw(8)<<name<<setw(12)<<patron<<setw(10)<<post<<setw(10)<<h_pay<<setw(6)<<hours<<setw(8)<<salary;
}
void edit()
{
char d[128];
int num;
double hpay;
char key;
while(1)
{
cout<<"that edit?"<<endl
<<"1. Post"<<endl
<<"2. h/pay"<<endl
<<"3. Hours"<<endl
<<"4. End edit"<<endl;
cin>>key;
switch(key)
{
case '1':
cout<<"Post: ";
cin>>d;
strcpy(post, d);
break;
case '2':
cout<<"Pay: ";
cin>>hpay;
h_pay=hpay;
break;
case '3':
cout<<"Hours: ";
cin>>num;
hours=num;
break;
case '4':
return;
break;
}
}//while
}//func
int get_id() const
{
return id;
}
};
// array for save data
class arr
{
vector <worker> w;
public:
void add(worker emp)
{
w.push_back(emp);
}
void show()
{
cout<<"Worker data"<<endl;
cout<<setw(4)<<"ID"<<setw(12)<<"Surname"<<setw(8)<<"Name"<<setw(12)<<"Patronymic"<<setw(10)<<"Post"<<setw(10)<<"h/pay"<<setw(6)<<"Hours"<<setw(8)<<"Salary"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
for(int i=0; i<w.size(); i++)
{
cout<<endl;
w[i].show();
}
}
void erase(int id_)
{
for(int i=0; i<w.size(); i++)
{
if(w[i].get_id()==id_)
{
w.erase(w.begin()+i);
return;
}
}
cout<<"No id"<<endl;
}
void search(int id_)
{
for(int i=0; i<w.size(); i++)
{
if(w[i].get_id()==id_)
{
w[i].show();
return;
}
}
cout<<"No ID"<<endl;
}
void find(int id_)
{
for(int i=0; i<w.size(); i++)
{
if(w[i].get_id()==id_)
{
w[i].edit();
w[i].Salary();
return;
}
}
cout<<"No ID"<<endl;
}
void to_file()
{
char file[64]="data.txt";
ofstream out(file, ios::binary);
for(int i=0; i<w.size(); i++)
{
out.write( (char*)&w[i],sizeof(w[i]) );
}
cout<<"Saved"<<endl;
}
void from_file()
{
char file[64]="data.txt";
char key;
worker emp;
ifstream in(file, ios::binary);
cout<<"Clear array? y/n ";
cin>>key;
if(key=='y')
{
w.clear();
}
while(!in.eof())
{
in.read( (char*)&emp, sizeof(emp) );
w.push_back(emp);
}
w.erase(w.end()-1);
cout<<"Loaded"<<endl;
}
void Sort()
{
char key;
cout<<"How sort?"<<endl
<<"1. bubble"<<endl;
cin>>key;
if(key=='1')
{
worker temp; // временная переменная для хранения элемента массива
bool exit = false; // болевая переменная для выхода из цикла, если массив отсортирован
while (!exit) // пока массив не отсортирован
{
exit = true;
for (int int_counter = 0; int_counter < (w.size()-1); int_counter++) // внутренний цикл
//сортировка пузырьком по возрастанию - знак >
//сортировка пузырьком по убыванию - знак <
if (w[int_counter].get_id() > w[int_counter + 1].get_id()) // сравниваем два соседних элемента
{
// выполняем перестановку элементов массива
swap(w[int_counter],w[int_counter+1]);
exit = false; // на очередной итерации была произведена перестановка элементов
}
}
}// if
}// Sort
};
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "rus");
char key;
arr mas;
worker emp;
int id_;
while(1)
{
cout<<endl
<<"Выберите действие:"
<<endl
<<"N New worker."<<endl
<<"E Edit data."<<endl
<<"F Find worker."<<endl
<<"D Delete data."<<endl
<<"S Save to file."<<endl
<<"R Load from file."<<endl
<<"V Show all workers."<<endl
<<"C Sort data."<<endl
<<"Q Quit."<<endl;
cin>>key;
switch(key)
{
case 'n':
emp.set_data();
emp.Salary();
mas.add(emp);
break;
case 'e':
cout<<endl<<"Enter id: ";
cin>>id_;
mas.find(id_);
break;
case 'f':
cout<<endl<<"Enter id: ";
cin>>id_;
mas.search(id_);
break;
case 'd':
cout<<endl<<"Enter id: ";
cin>>id_;
mas.erase(id_);
break;
case 's':
mas.to_file();
break;
case 'r':
mas.from_file();
break;
case 'v':
mas.show();
break;
case 'c':
mas.Sort();
break;
case 'q':
exit (1);
break;
}
}
system("pause");
return 0;
}
Комментарии:
Нету комментариев для вывода...