Главная » Статьи » Программирование » С++ |
База данных сотрудников предприятия: описание проекта
Эту статью я подготовил для всех, кто интересуется, как я написал эту программу:
Скорее всего, это будет интересовать (но, возможно, я ошибаюсь) только моих одногрупников, получивших такое же задание. Многие из них относительно слабо знакомы с языком программирования С++. Однако, не смотря на этот факт, мои объяснения будут лишь поверхностными. Тем более, они, скорее всего, будут никому не нужны, поскольку открытый код программы я опубликовал в этой же статье.
Написание программы я начал непосредственно с того, что создал три файла. Первый файл "dbase.cpp" содержал основную функцию main() и создан был только потому, что без него программа вообще не запустится. В ней я определил массив типа Employer, о которой я скажу позже, и константу int size = 4, которая являлась значением размера массива.
В ее тело я поместил три функции(которые я написал еще позже и разместил еще в двух файлах):
1. void hello() - простая функция-приветствие
2. void main_menu(sotrudnik, size) - фактически основная функция программы. (Почему я для этих целей не использовал main()? Потому, что мне так удобнее. Я люблю разбивать программу на много-много маленьких, но очень простых частей. Если я нахожу в программе два и более одинаковых кода, я обязательно постараюсь свести их к одной функции.) В эту функцию передается массив sotrudnik[] типа Employer, а также его размер.
3. void good_bye() - Функция-прощание, завершающая программу.
Вот, как это все выглядит
// dbase.cpp
// Программа управления базой данных сотрудников
// предприятия #include "empl.h" int main() hello(); return 0; Остальные два файла назывались: "empl.h" и "empl.cpp". Это были файлы, в которых находились соответсрвенно определение и раелизация класса Employment. Этот класс является описанием сотрудника(его должность, оклад и ставка). Я не перегружал класс ненужными функциями (деструктор я поместил только на всякий случай), а написал только те, которые используются в программе, и написал их так, чтобы удобно было использовать именно в этой программе.
Вот содержание этих двух файлов:
// empl.h
// Библиотека содержит класс Employer
#pragma once #include <iostream>
#include <string> #include <cctype> #include <cstdlib> using namespace std;
class Employer
{ public: Employer(); // Конструктор по умолчанию ~Employer(){};
// Деструктор bool find_prof(const string& prof);
// Сравнивает название переменных prof и Job, элемента // клaссa Employer. При совпадении возвращает true, // в обратном случае - false. void new_oklad(const double& newoklad);
// Функция меняющая значение Oklad в классе Employer friend istream& operator >> (istream& ins, Employer& human); // Перегруженный оператор вывода для класса Employer friend ostream& operator << (ostream& outs, const Employer& human);
// Перегруженная функция вывода для класса Employer private:
string Surname; // Фамилия string Name; // Имя string Job; // Профессия double Oklad; // Оклад double Stavka; // Ставка }; // empl.cpp
#include "empl.h"
Employer::Employer()
{ Surname = " "; Name = " "; Job = " "; Oklad = 0.0; Stavka = 0.0; } bool Employer::find_prof(const string& prof)
{ if(prof == Job) return true; else return false; } void Employer::new_oklad(const double& newoklad)
{ Oklad = newoklad; } istream& operator >> (istream& ins, Employer& human)
{ cout << endl << " Введите фамилию сотрудника: "; ins >> human.Surname; cout << " Введите имя сотрудника: "; ins >> human.Name; cout << "Введите профессию сотрудника: "; ins >> human.Job; cout << " Введите оклад сотрудника: "; ins >> human.Oklad; cout << " Введите ставку сотрудника: "; ins >> human.Stavka; return ins;
} ostream& operator << (ostream& outs, const Employer& human)
{ outs << human.Surname << ' ' << human.Name << ' ' << human.Job << " Оклад: " << human.Oklad << " Ставка: " << human.Stavka; return outs; } Ну, говорить тут особенно не о чем. Кто поймет, тот поймет, а для кого это темный лес - тому объяснять бесполезно. Скажу лишь кратко: в первом файле я определил класс и включил в него библиотеки, необходимые для оганизации этого класса. Внутри я также объявил Конструктор, деструктов, функцию-сравнение (для поиска совпадений в профессии), функцию определения нового оклада и указал перегруженные друзья-операторы для ввода и вывода. Во втором файле я все это определил. Код простой, если хотябы чуть-чуть разбираешься в языке, и если есть мозги в голове, то обязательно разберешь.
Важное замечание:
Программу я писал в среде Visual Studio 2005, а она в свою очередь использует последние стандарты ANSI, которые старый турбо С++, установленный в нашем университете, естественно, не поддерживает. Вместо массивов, состоящих из 15 элементов типа char, я использовал переменные, типа string. Это удобнее, проще и быстрее. По этому, при составлении программы на старом компиляторе, необходимо будет еще написать функцию сравнение для функции поиска людей по профессии.
В последние два файла "functions.h" и "functions.cpp" я поместил все остальные, не относящиеся к классу, функции (соответственно определения и реализации). Это самые массивные файлы программы, поскольку в них определены все основные операции программы. Вот они:
// functions.h
#pragma once
#include <iostream>
#include <conio.h> #include "empl.h"
using namespace std;
bool proverka(const int& counter);
// Проверка списка сотрудников на наличие хотябы одного // сотрудника. При отстуствии таковых выводит на экран // соответствующее уведомление и возвращает false. char get_ans();
// Функция, возвращающая значение либо 'y'(ДА), // либо 'n'(НЕТ). void change_oklad(Employer sotrudnik[], const int& counter);
// Функция, отвечающая за ввод нового значения оклада // сотрудника предприятия void good_bye();
// Функция-прощание void hello();
// Функция-приветствие void insert(Employer sotrudnik[], const int& size,
int& counter); // Функция, отвечающая за последовательный ввод // некоторого колличкства сотрудников. // Колличество сотрудников не должно превышать size. void main_menu(Employer sotrudnik[], const int& size);
// Функция, отвечающая за вывод главного меню. void poisk_po_prof(Employer sotrudnik[], const int& counter);
// Находит и выводит сотрудников предприятия, у которых // название профессии соответствует с выбранным. void vivod_vseh(Employer sotrudnik[], const int& limit);
// Функция, которая выводит всех сотрудников в виде таблицы // functions.cpp
#include "functions.h"
bool proverka(const int& counter)
{ if(counter > 0) return true; else { cout << "\nНа предприятии не зарегистрировано ни одного сотрудника!\n"; return false; } } char get_ans()
{ char ans; cout << endl << "Вы хотите повторить операцию?(y/n): ";
cin >> ans; while(ans != 'y' && ans != 'Y' && ans != 'n' && ans != 'N') { cout << endl << "ОШИБКА!" << endl << "Вы ввели несуществующий вариант ответа!" << endl << "Вы должны ввести либо \'n\' (НЕТ) либо \'y\' (ДА)" << endl << endl << "Попробуйте еще раз: "; cin >> ans; } return ans;
} void change_oklad(Employer sotrudnik[], const int& counter)
{ if(proverka(counter)) { char ans; do
{ int number; double newoklad; vivod_vseh(sotrudnik, counter);
cout << endl << "Введите порядковый номер сотрудника: ";
cin >> number; while((number > (counter)) || number <= 0) { cout << endl << "Ошибка!" << endl << "На предприятии нет такого колличества сотрудников!" << endl << "Введите еще раз: "; cin >> number; } cout << "Введите новый размер оклада сотрудника: ";
cin >> newoklad; while(newoklad < 0) { cout << endl << "Ошибка!" << endl << "Оклад сотрудника не может составлять сумму, ниже нуля" << endl << "Введите еще раз: "; cin >> newoklad; } sotrudnik[number - 1].new_oklad(newoklad);
cout << endl << sotrudnik[number - 1] << endl; ans = get_ans();
}while(ans != 'n' && ans != 'N'); } } void good_bye()
{ cout << endl << " Программу составил:" << endl << " студент третьего курса" << endl << " группы ЭК-33" << endl << " факультета экономики и менеджмента" << endl << " К У З Н Е Ц О В А Н Т О Н" << endl << "________________________________________" << endl << " ЮЖНЫЙ ФИЛИАЛ " << endl << "КРЫМСКИЙ АГРОТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ" << endl << " НАЦИОНАЛЬНОГО АГРАРНОГО УНИВЕРСИТЕТА " << endl << " Симферополь 2007 " << endl; getch(); } void hello()
{ cout << endl << "Здравствуйте!" << endl << "Вас приветствует программа по управлению" << endl << "базой данных сотрудников придприятия" << endl; } void insert(Employer sotrudnik[], const int& size,
int& counter) { if (counter < size) { char ans; do
{ cout << endl << "Сотрудник " << (counter + 1) << ": "; cin >> sotrudnik[counter]; counter++; if (counter >= size)
{ cout << endl << "Это был последний элемент списка" << endl; break; } else { ans = get_ans(); } }while(ans != 'n' && ans != 'N'); } else { cout << endl << "Простите, но список сотрудников уже переполнен!\n"; } } void main_menu(Employer sotrudnik[], const int& size)
{ char ans; int counter = 0; cout.setf(ios::fixed);
cout.setf(ios::showpoint); cout.precision(2); do
{ cout << endl << "Нажмите любую клавишу" << endl; getch(); cout << endl << "Главное меню:" << endl << "1 - Ввод нового сотрудника" << endl << "2 - Список сотрудников" << endl << "3 - Поиск сотрудников по профессии" << endl << "4 - Поменять оклад" << endl << "0 - ВЫХОД" << endl; cout << endl << "Введите нужный вам пункт меню: "; cin >> ans; switch (ans)
{ case '1': insert(sotrudnik, size, counter); break; case '2': vivod_vseh(sotrudnik, counter); break; case '3': poisk_po_prof(sotrudnik, counter); break; case '4': change_oklad(sotrudnik, counter); break; case '0': break; default: cout << endl << "Ошибка!\nTакого пункта не существует!" << endl; } }while(ans != '0'); } void poisk_po_prof(Employer sotrudnik[], const int& counter)
{ if(proverka(counter)) { char ans; do
{ string prof; int found; cout << endl << "Введите название профессии: ";
cin >> prof; found = 0;
cout << endl << "Результат поиска по профессии " << prof << ":\n"; for(int i = 0; i < counter; i++)
{ if(sotrudnik[i].find_prof(prof)) { found++; cout << found << ". " << sotrudnik[i] << endl; } } if(found == 0)
{ cout << "Сотрудников с данной профессией не обнаружено!" << endl << "Возможно при вводе вы совершили ошибку," << endl << "либо сотрудников с такой профессией нет на предприятии" << endl; } ans = get_ans();
}while(ans != 'n' && ans != 'N'); } } void vivod_vseh(Employer sotrudnik[], const int& limit)
{ if(proverka(limit)) { cout << endl << "Список сотрудников предприятия:"; for(int i = 0; i < limit; i++)
cout << endl << (i + 1) << ". " << sotrudnik[i]; cout << endl; } } Как это объяснить человеку, который абсолютно не знает языка С++, я не знаю.
Если честно, то мне становится немного жутковато (как я все это смог написать за один день?).
Если я начну углубляться в описание кода, то это будет очень долго и оооооооочень нудно. По этому я кратенько опишу принцип работы всех функций.
Все функции в этой программе можно разделить на главные и вспомогательные.
К главным функциям относятся:
1. insert
2. vivod_vseh
3. poisk_po_prof
4. change_oklad
К главным они относятся, поскольку их можно запустить из функции main_menu (ее я не упомянул, но она САМАЯ ГЛАВНАЯ).
Остальные функции - вспомогательные. Они просто помогают работе основных функций. Их я писал, чтобы заменить ими повторяющиеся участки кода. Если код повторяется в разных функциях, то его можно заменить одной. Это ускоряет работу программы, делает ее более простой и др.
Краткое описание всех этих функций можно прочитать в заголовочном файле, по этому не считаю необходимым париться по поводу их описания. Скажу только одно: в большинстве главных функций происходит проверка на наличие хотя-бы одного элемента в массиве, а также все они позволяют производить одну и ту же операцию многократно, благодаря циклу do-while.
Наверное, это все, что я хотел сказать.
Файлы с кодом можно скачать в виде архива по этой ссылке:
Скомпилированую программу можно скачать отсюда:
По вопросам, которые могут у вас возникнуть, обращайтесь на форум:
Все! Я пошел спать!!!!!!!
| |
Просмотров: 2853 | Комментарии: 2 | |
Всего комментариев: 1 | |
| |