Обработка массива данных предметной области «штатное расписание»

Уровень сложности:

Разработать программу, в которой будет организовано меню, выбор функций меню должно быть организовано по функциональной клавише. Вся информация должна храниться в массиве структур, с возможностью их записи в файл. Организовать сортировку данных различными методами (быстрая, Шелла, Пузырьковая), вывод результатов сортировки должен быть в табличной форме.

Функции программы:

Состав и структура исходных данных

Таблица «штатное расписание» с полями:

  • «ФИО работника»
  • «кол-во отработанных часов»
  • «должность»
  • «оплата за час работы»
  • «присваиваемый 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
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. 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.
    Если будут какие вопросы по коду, пишите мне в вконтактик.

     

  2. dotoOrC

    где «Следующие статьи помогут вам в решении данной задачи:»

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.