Разработать программу, в которой будет организовано меню, выбор функций меню должно быть организовано по функциональной клавише. Вся информация должна храниться в массиве структур, с возможностью их записи в файл. Организовать сортировку данных различными методами (быстрая, Шелла, Пузырьковая), вывод результатов сортировки должен быть в табличной форме.
Функции программы:
- функция для ввода данных пользователем;
- функция для записи данных в файл;
- чтение данных из файла;
- вывод данных на экран;
- дополнение данных;
- удаление данных;
- поиск информации по атрибуту;
- сортировка различными методами;
Состав и структура исходных данных
Таблица «штатное расписание» с полями:
- «ФИО работника»
- «кол-во отработанных часов»
- «должность»
- «оплата за час работы»
- «присваиваемый id»
- вычисляемое поле «зарплата»
Примечание: зарплата = количество отработанных часов умножить на оплату за час работы.
Автор программы — Иван Погорелый.
#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;
}
Результат:
CppStudio.com
Выберите действие: 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
Комментарии
Lee Amstrong
#include <iostream> #include <string> #include <vector> #include "worker.hpp" #include "menu.hpp" #include "action-helloworld.hpp" #include "action-new-worker.hpp" #include "action-show-workers.hpp" #include "action-save.hpp" #include "action-load.hpp" int main(int argc, char const *argv[]) { std::vector<Worker> workers; Menu menu (workers); menu.regAction(new ActionNewWorker("N")); menu.regAction(new ActionShowWorkers("W")); //menu.regAction(new ActionHelloWorld("H")); menu.regAction(new ActionSave("S", "workers.csv")); menu.regAction(new ActionLoad("L", "workers.csv")); menu.start(); return 1; }Красивенько, не так ли? Есть класс menu, в котором мы можем регестрировать новые пункты меню.
Мне было лень реализовывать все что было сказано в задании, но это это делает очень легко, надо лишь написать класс, наследумый от класса MenuAction и зарегестировать. Крч, смотрите как у меня сделано.
Собстна, пример в решении это говнокод, не пишите так.
Может быть доработаю позже. Напишу тесты, запилю непрерывную интеграцию, документацию (точнее попробую это все сделать, ниразу не пробовал, но надо же с чего-то начинать)
А пока вот гитхабчек с проектом. <— тык
А, да, кто не поймет как это все дело компилируется — гуглите cmake.
Если будут какие вопросы по коду, пишите мне в вконтактик.
dotoOrC
dotoOrC
где «Следующие статьи помогут вам в решении данной задачи:»
dotoOrC