Разработать программу, в которой будет организовано меню, выбор функций меню должно быть организовано по функциональной клавише. Вся информация должна храниться в массиве структур, с возможностью их записи в файл. Организовать сортировку данных различными методами (быстрая, Шелла, Пузырьковая), вывод результатов сортировки должен быть в табличной форме.
Функции программы:
- функция для ввода данных пользователем;
- функция для записи данных в файл;
- чтение данных из файла;
- вывод данных на экран;
- дополнение данных;
- удаление данных;
- поиск информации по атрибуту;
- сортировка различными методами;
Состав и структура исходных данных
Таблица «штатное расписание» с полями:
- «ФИО работника»
- «кол-во отработанных часов»
- «должность»
- «оплата за час работы»
- «присваиваемый 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
Красивенько, не так ли? Есть класс menu, в котором мы можем регестрировать новые пункты меню.
Мне было лень реализовывать все что было сказано в задании, но это это делает очень легко, надо лишь написать класс, наследумый от класса MenuAction и зарегестировать. Крч, смотрите как у меня сделано.
Собстна, пример в решении это говнокод, не пишите так.
Может быть доработаю позже. Напишу тесты, запилю непрерывную интеграцию, документацию (точнее попробую это все сделать, ниразу не пробовал, но надо же с чего-то начинать)
А пока вот гитхабчек с проектом. <— тык
А, да, кто не поймет как это все дело компилируется — гуглите cmake.
Если будут какие вопросы по коду, пишите мне в вконтактик.
dotoOrC
dotoOrC
где «Следующие статьи помогут вам в решении данной задачи:»
dotoOrC