Приветствую вас! Вы находитесь на сайте Fance.Ru. Наш сайт посвящен тематике Система uCoz, PhotoShop, Counter-Strike 1.6, Counter-Strike: Source, а также Игры для PC. Вы можете скачать обсолютно любой файл, который вам понравиться. На нашем сайте вы можете найти все что нужно для создания сайта, его дизайна и не только. На нашем сайте установлен оригинальный дизайн и расположение блоков и модулей где вы без труда найдете что искали. И не забываем про активный форум где вам всегда помогут если у вас возникнут вопросы. В мини чате только краткое общение, обсуждение и помощь идет на форуме, где созданы для этого разделы. Дерзайте ;)
18.12.2024, 13:31
kuz0n
kuz0n (Пользователи)
  • Репутация: 2
  • Файлы: 53
viva-dom
viva-dom (Пользователи)
  • Репутация: 0
  • Файлы: 0
olimp-stoy
olimp-stoy (Пользователи)
  • Репутация: 0
  • Файлы: 0
Главная » Статьи » Программирование » С++

База данных сотрудников предприятия: описание проекта
Эту статью я подготовил для всех, кто интересуется, как я написал эту программу:
Скорее всего, это будет интересовать (но, возможно, я ошибаюсь) только моих одногрупников, получивших такое же задание. Многие из них относительно слабо знакомы с языком программирования С++. Однако, не смотря на этот факт, мои объяснения будут лишь поверхностными. Тем более, они, скорее всего, будут никому не нужны, поскольку открытый код программы я опубликовал в этой же статье.
 
Написание программы я начал непосредственно с того, что создал три файла. Первый файл "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"
#include "functions.h"

int main()
{
 const int size = 4;
 Employer sotrudnik[size];

 hello();
 main_menu(sotrudnik, size);
 good_bye();

 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.
 
Наверное, это все, что я хотел сказать.
Файлы с кодом можно скачать в виде архива по этой ссылке:
Скомпилированую программу можно скачать отсюда:
По вопросам, которые могут у вас возникнуть, обращайтесь на форум:
 
Все! Я пошел спать!!!!!!!
Категория: С++ | Добавил: kuz0n (23.10.2007) | Автор: A.Kuznetsov E W
Просмотров: 2853 | Комментарии: 2 | Рейтинг: 0.0/0
Всего комментариев: 1
23.08.2008 в 06:55 написал:
#1
Prosto super, Molodec!!!!
Перейти к новости
class="overflow">
Мини-чат
Наши партнеры

Статистика
Онлайн всего: 3
Гостей: 3
Пользователей: 0
Всего: 53 +0 новых
Никого нету
Посетители за сегодня ()