Материал: 3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение высшего образования Национальный исследовательский университет «мэи»

Институт ИнЭИ

Кафедра БИТ

Практическая работа №4

по дисциплине

«Объектно-ориентированный анализ и программирование»

Тема

«Подпрограммы и файлы»

Студентка

Газизова Юлия

_______________________

Группа

ИЭс-161-19

_______________________

Лектор

_______________________

Руководитель

Овсянникова М.Р.

_______________________

Работа защищена

_______________________

оценка

_______________________

дата

Москва

2020

1. Условие задачи

Разработать программу для решения следующей задачи.

Требуется создать базу данных, содержащую сведения о сотрудниках института (файл, содержащий сведения о сотрудниках института).

Пусть это будет типизированный файл.

Сведения о сотрудниках института следующие:

- Фамилия,

- Год рождения,

- Стаж работы,

- Должность,

- Оклад.

2. Состав данных

В таблице 1 показаны данные используемые в программе.

Таблица 1

с

char

Переменная, в которой хранится введенный символ

number

int

Переменная, в которой хранится введенное число

name

string

Переменная, которая используется для хранения фамилий (Используется в структуре)

_stateMenu

int

Переменная, в которой хранится значение для выбора меню

n

int

Переменная, в которой хранится размер массива

Employee

struct

Одномерный массив, который использует объединение разных данных (структуру)

birthday

int

Переменная хранит в себе год рождения сотрудника (Используется в структуре)

experience

int

Переменная хранит в себе стаж работы сотрудника (Используется в структуре)

position

string

Переменная хранит в себе должность сотрудника (Используется в структуре)

month_salary

int

Переменная хранит в себе оклад сотрудников (Используется в структуре)

avg_exp

double

Переменная, в которую записывается вычисление среднего стажа работы сотрудника (используется в функции average_exp)

surname

string

Переменная, в которую записывается новая фамилия сотрудника (используется в функции change_surname)

num

int

Переменная, в которой хранится выбор номера сотрудника, которому будет менять фамилию (используется в функции change_surname)

3. Набор тестовых данных. Ожидаемые результаты

Сведения о сотрудниках института следующие:

- Фамилия,

- Год рождения,

- Стаж работы,

- Должность,

- Оклад.

Предположительные результаты программы:

Сведения о сотрудниках института следующие:

(всего на фирме работает 3 сотрудника)

предположительные результаты о сотруднике под №1

- Фамилия : Семин

- Год рождения: 1955

- Стаж работы: 30

- Должность: Инженер

- Оклад: 55000

Содержание меню:

Вывод фамилии и стажа работы [1]

Вычислить средний стаж работы [2]

Вывод фамилий инженеров [3]

Вывод фамилий, начинающихся с заданной буквы [4]

Вывод фамилий, у которых оклад больше заданного [5]

Поменять фамилию у одного из сотрудников [6]

Вывести на экран список всех сотрудников [7]

Выход [8]

4. Метод решения задачи, основные формулы

В данной разработке используется формула для расчета среднего стажа работы:

avg_exp += employees[i].experience;

5. Текст программы

#include "Func.h"

// Функция вывода меню

void Menu()

{

cout << "Меню: " << endl << endl;

cout << "Вывод фамилий и стажа работы [1]" << endl;

cout << "Вычислить средний стаж работы [2]" << endl;

cout << "Вывод фамилий инженеров [3]" << endl;

cout << "Вывод фамилий, начинающихся с заданной буквы [4]" << endl;

cout << "Вывод фамилий, у которых оклад больше заданного [5]" << endl;

cout << "Поменять фамилию у одного из сотрудников [6]" << endl;

cout << "Вывести на экран список всех сотрудников [7]" << endl;

cout << "Выход [8]" << endl << endl;

cout << "Какое действие вы хотите совершить?: " << endl;

}

int main()

{

// Руссификатор для всего проекта

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

char c; // переменная для символа

int number; // переменная для числа

string name; // переменная для фамилии

int _stateMenu = -1; // переменная для меню

int n; // Размер массива

cout << "Введите количество работников: ";

cin >> n;

cout << endl;

while (cin.fail() || n <= 0)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Некорректный ввод\nВведите количество работников: ";

cin >> n;

}

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

Employee* employees = new Employee[n]; // Объявление одномерного динамического массива

ofstream file("Employees.txt"); // Создание файла и запись в него

for (int i = 0; i < n; i++)

{

cout << "\nВвод информации о сотруднике " << i + 1 << endl;

cout << endl;

employees[i].DataEntry();

employees[i].AddData(file);

}

cout << "\nДанные записаны!" << endl << endl;

file.close(); // Закрываем файл

read(employees, n); // Функция чтения данных из файла

while (_stateMenu != 0)

{

Menu(); // Функция вызова меню

cin >> _stateMenu;

cout << endl;

if (_stateMenu == 8) // Выход из программы

{

return 0;

}

while (cin.fail() || _stateMenu < 0 || _stateMenu > 7)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Некорректный ввод\nНомер команды меню: ";

cin >> _stateMenu;

}

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

switch (_stateMenu)

{

case 1:

print_experience(employees, n); // Функция вывода фамилий и стажа работы для всех работников института

break;

case 2:

average_exp(employees, n); // Функция которая вычисляет средний стаж работы в институте

break;

case 3:

engineers(employees, n); // Функция вывода на экран фамилий работников, работающих в должности инженера

break;

case 4:

cout << "Введите букву: ";

cin >> c;

cout << "Фамилии начинающиеся с буквы \"" << c << "\": " << endl;

worker_letter(employees, n, c); // Функция вывод на экран фамилий работников, начинающихся с заданной пользователем буквы

cout << endl;

break;

case 5:

cout << "Введите оклад: ";

cin >> number;

cout << "Фамилии сотрудников с окладом > " << number << ": " << endl;

best_salary(employees, n, number); // Функция вывода на экран фамилий работников, у которых оклад > заданного пользователем числа

cout << endl;

break;

case 6:

change_surname(employees, n); // Функция которая производит замену фамилии у одного из сотрудников

write(employees, n); // Функция записи новой фамилии

cout << endl;

break;

case 7:

read(employees, n); // Функция чтения файла

print_all(employees, n); // Функция вывода всех сотрудников

break;

default:

break;

}

}

delete[] employees; // очистка массива

return 0;

}

5.1 Текст программы (функции)

#pragma once

#include <iostream>

#include <fstream>

#include <string>

#include <Windows.h>

#include <windows.h>

#include <iomanip>

#include <sstream>

using namespace std;

// Описание структуры для представления работника института

struct Employee

{

string name; // фамилия

int birthday; // год рождения

int experience; // стаж работы

string position; // должность

int month_salary; // оклад

// Конструктор заполнения сотрудника

Employee()

{

name = "Севрюков";

position = "Инженер";

birthday = 1983;

month_salary = 60000;

experience = 10;

}

// Функция ввода из файла

void DataEntry(istream& in)

{

getline(in, this->name);

getline(in, this->position);

string s;

getline(in, s);

this->birthday = atoi(s.c_str());

getline(in, s);

this->experience = atoi(s.c_str());

getline(in, s);

this->month_salary = atoi(s.c_str());

}

// Функция ввода с клавиатуры

void DataEntry()

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Фамилия: ";

getline(cin, this->name);

while (cin.fail())

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Некорректный ввод\nФамилия: ";

getline(cin, this->name);

}

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Год рождения: ";

cin >> this->birthday;

while (cin.fail() || this->birthday < 1900 || this->birthday > 2000)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Некорректный ввод\nГод рождения: ";

cin >> this->birthday;

}

cout << "Стаж работы: ";

cin >> this->experience;

while (cin.fail() || this->experience < 0 || this->experience >(2020 - this->birthday - 14))

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Некорректный ввод\nСтаж работы: ";

cin >> this->experience;

}

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Должность: ";

getline(cin, this->position);

while (cin.fail())

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Некорректный ввод\nДолжность: ";

getline(cin, this->position);