You are on page 1of 14

Міністерство освіти і науки України

Харківський національний університет радіоелектроніки

Кафедра системотехніки

Дисципліна: «Алгоритмізація та програмування»

ЛАБОРАТОРНА РОБОТА № 4

«ВИВЧЕННЯ МОЖЛИВОСТЕЙ МОВИ С++


З ОРГАНІЗАЦІЇ ОБРОБКИ РЯДКІВ ТА СИМВОЛІВ»

Виконав: Прийняла: к.т.н., доц. каф. СТ


ст. гр. ІТУ-21-3 Білова Тетяна Георгіївна
Снітко Анна
з оцінкою «____________»
«____»_______________2021р.

Харків, 2021
Завдання 1
Варіант 21. Кожний елемент вхідного файлу має таку структуру:
прізвище_та_ініціали,посада,кількість_відпрацьованих_годин_в_робочі_дні,
кількість_відпрацьованих_годин_в_вихідні,ставка_з_п_за_годину_у_робочій_день,проц
ент_доплати_за_роботу_у_вихідний;
Наприклад: Іванов А.І.,слюсар,23,2,15667.33,33;
При цьому прізвище_та_ініціали – не більше 20 символів, посада - не більше 15
символів, тільки літери, кількість_відпрацьованих_годин_в_робочі_дні,
кількість_відпрацьованих_годин_в_вихідні - ціле число від 0 до 40 та від 0 до 16
відповідно, ставка_з_п_за_годину_у_робочій_день - дійсне число з точністю 2 знаки
після коми, процент_доплати_за_роботу_у_вихідний - ціле число в діапазоні від 0 до
100. Дані по робітниках відокремлюються знаком «;». Необхідно виводити
наступну інформацію:
а) загальну суму, що була виплачена всім робітникам заданної посади в поточному
місяці;
б) інформацію про робітника, що отримав найбільшу сумарну заробітну плату в
поточному місяці;
в) інформацію про суми, які було виплачено робітникам кожної посади в
поточному місяці, відсортовані за зростанням, у форматі:
Посада Виплачено
слюсар 45289,45
секретар 56732,10
експедитор 123467,51

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <iomanip>
#include <ctime>
#include <windows.h>
using namespace std;

void menu(const char*);//меню


int checkNumber();//проверка правильности выбора комманды
пользователем

void showFile(const char*);//выводит данные из файла

void addDataInFile(const char*);//добавляет инфу в файл

char* writeSurname();//считываем фамилию


int writeWorkingHours();//считываем рабочие часы
double writeSalaryHour();//считываем зарплату почасовую
int writePercentage();//процентная доплата за работу в выходные
int writeHoursHoliday();//рабочие часы по выходным

double summarySalaryForOneSpecialization(const char*);//задание пункта А

void findMaxSalary(const char*);//задание пункта В


void sortData(const char*);//пункт С

void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
const char* nameFile = "Data.txt";
menu(nameFile);
}

void addDataInFile(const char* nameFile)


{
ofstream file(nameFile, ios::app);
if (!file) {
cout << "Ошибка\n";
return;
}
char specialization[15];
cout << "Введите ФИО: \n";
file << writeSurname() << ",";
cout << "Введите должность: \n";
cin.getline(specialization, 15);
file << specialization << ",";
cout << "Введите количество отработанных часов в рабочие дни: \n";
file << writeWorkingHours() << ",";

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


file << writeHoursHoliday() << ",";

cout << "Введите ставку зарплаты за час: \n";


file << writeSalaryHour() << ",";

cout << "Введите процент доплаты в выходные за час: \n";


file << writePercentage() << ";";
file.close();
}

void showFile(const char* nameFile)


{
ifstream file(nameFile);
if (!file) {
cout << "Ошибка\n";
return;
}
char buffer1[50];
int size;
cout << setw(25) << left << "ФИО" << setw(15) << "Должность" << setw(20)
<< "Часов в рабочие дни"
<< setw(20) << "Часов в выходные" << setw(20) << "Зарплата в час" <<
setw(20) << "Процент доплаты в выходные" << endl;

while (file.getline(buffer1, 50, ';')) {


cout << setw(25) << left << strtok(buffer1, ",");
cout << setw(15) << left << strtok(NULL, ",");
cout << setw(20) << left << strtok(NULL, ",");
cout << setw(20) << left << strtok(NULL, ",");
cout << setw(20) << left << strtok(NULL, ",");
cout << setw(20) << left << strtok(NULL, ";") << endl;
}
file.close();
}

int writePercentage()
{
//- целое число в диапазоне от 0 до 100.
int Percentage;
while (1) {
cin >> Percentage;
if (Percentage >= 0 && Percentage <= 100) {
return Percentage;
}
else {
cout << "Введите количество отработанных часов в выходные дни от
0 до 100" << endl;
continue;
}
}
}
double writeSalaryHour()
{
//ставка_з_п_за_годину_у_робочій_день,
double salaryHour;
cin >> salaryHour;
return salaryHour;
}
int writeHoursHoliday()
{

int workingHoursHoliday;

while (1) {
cin >> workingHoursHoliday;
if (workingHoursHoliday >= 0 && workingHoursHoliday <= 16) {
return workingHoursHoliday;
}
else {
cout << "Введите количество отработанных часов в выходные дни от
0 до 16" << endl;
continue;
}
}
}
int writeWorkingHours()
{
int workingHours;
while (1) {
cin >> workingHours;
if (workingHours >= 0 && workingHours <= 40) {
return workingHours;
}
else {
cout << "Введите количество отработанных часов в робочие дни от 0
до 40" << endl;
continue;
}
}
}
char* writeSurname()
{
char* surname = new char[20]{};
int size;
cin.ignore();
while (1) {
cin.getline(surname, 20);
size = strlen(surname);
if (size < 2 || size>19) {
cout << "Размер ФИО должен быть от 2 до 19 символов! Повторите
ввод " << endl;
continue;
}
if (!(surname[0] >= 'А' && surname[0] <= 'Я' || surname[0] >= 'A' &&
surname[0] <= 'Z')) {
cout << "Фамилия должна начинатсья с большой буквы! Повторите
ввод " << endl;
continue;
}
return surname;
}

}
double summarySalaryForOneSpecialization(const char* nameFile) {
bool Specialization = false;
double sum = 0;
char* buffer1 = new char[15]{};

cout << "Введите за какую должность нужно узнать выплаты за месяц: ";
cin.ignore();
cin.getline(buffer1, 15);

ifstream file(nameFile);
if (!file) {
cout << "Ошибка с файлом\n";
}
else {
char buffer2[50];
int size2;
// cout << "Чтения с файла " << endl;
while (file.getline(buffer2, 50, ';')) {
strtok(buffer2, ",");

char* temp = new char[15]{};


temp = strtok(NULL, ",");
strcat(temp,"\0");

// cout << temp << endl;


bool flag = true;
for (int i = 0; i < 15; i++) {
char a = temp[i];
char b = buffer1[i];

if (!(a == b)) {
flag = false;
break;
}
if (a == '\0' && b == '\0') break;
}
if (flag) {
temp = strtok(NULL, ",");
int workingHours = atoi(temp);

temp = strtok(NULL, ",");


int workingHoursHoliday = atoi(temp);

temp = strtok(NULL, ",");


double salaryPerHour = atof(temp);

temp = strtok(NULL, ",");


double percent = atoi(temp);
Specialization = true;
sum += ((workingHours * salaryPerHour) + (workingHoursHoliday *
salaryPerHour * (percent / 100 + 1)));
}
//strcspn - Не записывает в буфер ничего, только ищет количество
символов к ","
// strncpy(temp, buff, size); копіювати рядок buff в temp, не більше size
символів:
// strcpy(buff1, buff1 + size + 1); копировать buff1 + size + 1 в buff1
}

if (Specialization) {
cout << "Общая сумма выплаченая всем работникам должности \""
<< buffer1 << "\" равняется " << sum << endl;
}
else {
cout << "Такой должности нет" << endl;
}

file.close();
return sum;
}
}
void findMaxSalary(const char* nameFile) {
char* surname1 = new char[20]{};
char* specelization1 = new char[15]{};
int workingHours1;
int workingHoursHoliday1;
double salaryPerHour1;
double surchargePercentage1;
double salary1=-1;
cout << "Информация про работника, который получил найбольшую
суммарную зарплату в текущем месяце" << endl;
//Пошук максимальної плати
ifstream file(nameFile);
if (!file) {
cout << "Ошибка с файлом\n";
return;
}
char buffer1[50];
char* temp = new char[15]{};
int size2;
// cout << "Чтения с файла " << endl;
while (file.getline(buffer1, 50, ';')) {
char* surname2 = new char[20]{};
char* specelization2 = new char[15]{};
int workingHours2;
int workingHoursHoliday2;
double salaryPerHour2;
double surchargePercentage2;
double salary2;

surname2 = strtok(buffer1,",");

specelization2 = strtok(NULL, ",");

temp = strtok(NULL, ",");


workingHours2 = atoi(temp);

temp = strtok(NULL, ",");


workingHoursHoliday2 = atoi(temp);

temp = strtok(NULL, ",");


salaryPerHour2 = atof(temp);

temp = strtok(NULL, ",");


surchargePercentage2 = atoi(temp);

salary2 = ((workingHours2 * salaryPerHour2) + (workingHoursHoliday2 *


salaryPerHour2 * (surchargePercentage2 / 100 + 1)));

if (salary2 > salary1) {


strcpy(surname1, surname2);
strcpy(specelization1, specelization2);
workingHours1 = workingHours2;
workingHoursHoliday1 = workingHoursHoliday2;
salaryPerHour1 = salaryPerHour2;
surchargePercentage1 = surchargePercentage2;
salary1 = salary2;
}
}
file.close();

cout << setw(25) << left << "ФИО" << setw(15) << "Должность" << setw(20)
<< "Часов в рабочие дни"
<< setw(20) << "Часов в выходные" << setw(20) << "Зарплата в час" <<
setw(20) << "Процент доплаты в выходные" << endl;
cout << setw(25) << left << surname1 << setw(15) << specelization1 <<
setw(20) << workingHours1
<< setw(20) << workingHoursHoliday1 << setw(20) << salaryPerHour1 <<
setw(20) << surchargePercentage1 << setw(20) << salary1 << endl;

}
void sortData(const char* nameFile) {
char** specialization = new char* [50];
for (int i = 0; i < 50; i++) {
specialization[i] = new char[15];
}
int n = 0;
ifstream file(nameFile);
if (!file) {
cout << "Ошибка с файлом\n";
}
else {
char buff1[50];
int size2;
while (file.getline(buff1, 50, ';')) {
strtok(buff1, ",");

char* temp = new char[15]{};


temp = strtok(NULL, ",");

strcpy(specialization[n], temp);
n++;
}
for (int i = 0; i < n;i++) {
cout << specialization[i] << endl;
}
cout << endl;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (strcmp(specialization[i], specialization[j]) == 0) {
for (int k = j; k < n - 1; k++) {
strcpy(specialization[k], specialization[k + 1]);
}
specialization[n - 1] = nullptr;
n--;
j--;
}
}
}
for (int i = 0; i < n; i++) {
cout << specialization[i] << endl;
}
double* summarySalary = new double[n] {};
file.close();
for (int i = 0; i < n; i++) {
double sum = 0;
char buffer2[50];
file.open(nameFile);
while (file.getline(buffer2, 50, ';')) {
strtok(buffer2, ",");

char* temp = new char[15]{};


temp = strtok(NULL, ",");
strcat(temp, "\0");
bool flag = true;
for (int j = 0; j < 15; j++) {
char a = temp[j];
char b = specialization[i][j];

if (!(a == b)) {
flag = false;
break;
}
if (a == '\0' && b == '\0') break;
}
if (flag) {
temp = strtok(NULL, ",");
int workingHours = atoi(temp);

temp = strtok(NULL, ",");


int workingHoursHoliday = atoi(temp);

temp = strtok(NULL, ",");


double salaryPerHour = atof(temp);

temp = strtok(NULL, ",");


double percent = atoi(temp);

summarySalary[i] += ((workingHours * salaryPerHour) +


(workingHoursHoliday * salaryPerHour * (percent / 100 + 1)));
}
}
file.close();
}

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


for (int j = i + 1; j < n; j++) {
if (summarySalary[i] > summarySalary[j]) {
double temp = summarySalary[i];
summarySalary[i] = summarySalary[j];
summarySalary[j] = temp;

char* tempc = new char[15]{};


tempc = specialization[i];
specialization[i] = specialization[j];
specialization[j] = tempc;
}
}
}

cout << setw(15) << left << "Должность" << setw(10) << left << "Выплаты"
<< endl;
for (int i = 0; i < n; i++) {
cout << setw(15) << left << specialization[i] << setw(10) << left <<
summarySalary[i] << endl;
}
}
void menu(const char* nameFile) {
while (1) {
cout << "1 - Просмотреть записи файла " << nameFile << endl;
cout << "2 - Добавить в файл новую запись о работнике " << endl;
cout << "3 - Найти сумму которая была выплачена всем работника
заданной должности " << endl;
cout << "4 - Вывести информацию о работнике, который одержал
найбольше денег" << endl;
cout << "5 - Вывести информацию об общих выплатах по должностях
" << endl;
cout << "6 - Закрыть программу" << endl;
int a = checkNumber();
switch (a) {
case 1:
showFile(nameFile);
break;
case 2:
addDataInFile(nameFile);
break;
case 3:
summarySalaryForOneSpecialization(nameFile);
break;
case 4:
findMaxSalary(nameFile);
break;
case 5:
sortData(nameFile);
break;
case 6:
return;
}
system("pause");
system("cls");
}
}
int checkNumber()
{
cout << "Введите число: ";
while (true)
{
int choice{};
cin >> choice;
if (cin.fail())
{
cin.clear();
cin.ignore(20, '\n');
}
if (choice >= 1 && choice <= 6)
{
return choice;
}
else {
cout << "Введите число от 1 к 6: ";
}
}

}
Висновок:
Отже, при виконанні лабораторної роботи використовували раніше набуті навички.
Виконали розробку алгоритму вирішення задачі та підготовили текст програми щодо
реалізації розробленого алгоритму, підготовили відповідні розділи звіту та вивчили
відповідний теоретичний матеріал. Вивчили роботу файлів і строк, функцій, запис в
файл, зчитування даних з файлу, узгодження типів даних, преобразування типу double в
int, функції та методи форматування потоків, перевірка досягнення кінця файлу, роботу
з даними файлу, оновлювання змісту даних через додавання інформації з консолі. До
задачі написали план-опис, написали код і протестували його для всіх можливих
варіантів.

You might also like