2 семестр / Лабораторная работа №5
.docxФГБОУ ВО
«Уфимский государственный авиационный технический университет»
Кафедра ТК
ОТЧЕТ
по лабораторной работе № 5
по дисциплине «Программирование»
Вариант № 18
Выполнил: студент гр. ИВТ-127Б
Проверил: доцент каф. ТК
Фёдорова Н. И.
Уфа 2022
Тема работы: Динамические массивы структур. Бинарные файлы.
Цель работы: Целью работы является получение студентами навыков работы с динамическими массивами, и реализацией сохранения и вывода массивов структур в бинарные файлы на языке С++.
Задачи работы:
составить схему алгоритма работы программы;
написание программы на языке С++ с использованием структур;
тестирование работоспособности программы для различных исходных данных.
Вариант № 18.
Задание:
Дан массив записей, содержащий сведения о студентах группы: фамилия и инициалы студента; дата рождения (число, месяц, год). Найти и вывести на экран самого молодого студента, родившегося k-го числа.
Сортировка исходного массива структур:
1) по дню рождения в порядке возрастания;
2) по фамилии студента в алфавитном порядке.
Сортировка выходного массива структур:
1) по дате рождения в порядке убывания возраста
Решение задачи: Необходимо задать массив структур, содержащий информацию о студентах, причем вход данных осуществляется с файла. Далее пользователь вводит число k (дату рождения), программа сортирует массив по дате рождения (по возрастанию), и выводит на экран и в файл/ бинарный файл самого молодого студента, родившегося в k день. По мимо этого выводит на экран и в файл/бинарный файл сортированный исходный/выходной массив по заданным условиям.
Тестовый пример:
Исходные данные:
Мустафина К. И. 03.06.1999
Алгушаева А. Т. 28.02.1999
Каримова З. И. 28.09.2004
k=28
Сортировка по дате рождения (по возрастанию):
Каримова З. И. 28.09.2004
Мустафина К. И. 03.06.1999
Алгушаева А. Т. 28.02.1999
Проход по дате рождения, кто первый в массиве с датой рождения k, тот и является самым молодым.
Вывод программы: Каримова З. И. 28.09.2004
Сортировка по дню рождения (по возрастанию):
Алгушаева А. Т. 28.02.1999
Мустафина К. И. 03.06.1999
Каримова З. И. 28.09.2004
Сортировка по фамилии студента в алфавитном порядке:
Алгушаева А. Т. 28.02.1999
Каримова З. И. 28.09.2004
Мустафина К. И. 03.06.1999
Сортировка выходного массива по дате рождения в порядке убывания:
Алгушаева А. Т. 28.02.1999
Каримова З. И. 28.09.2004
Текст программы:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <chrono>
#include <locale.h>
#include <complex>
#include <math.h>
#include <iostream>
#include <cstring>
#include <conio.h>
#include <iomanip>
#include <Windows.h>
#include <fstream>
using namespace std;
struct date
{
int d, m, y;
};
struct fio
{
string name;
string iniz;
};
struct students
{
date birth;
fio fam;
};
void inputMasStudFile(students*& px, int& n);
void outputMasStud(students x[], int n);
void outputMasStudFile(students x[], ofstream& output, int n);
void sortVoz(students x[], int n);
void sortUb(students x[], int n);
void sortDateVoz(students x[], int n);
void FindStudent(students x[], int n, students*& py, int k, int& kol, int& cln,int& kolex);
void sortName(students y[], int n);
void outputMasStudFileBinary(students x[], ofstream& outputBinary, int n);
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int m(0), l(0), j, kol(-1),kolex(1), u = 1, k,cln(0);
students* pa = NULL;
students* pb = NULL;
ofstream output;
ofstream outputBinary;
output.open("output.txt");
outputBinary.open("outputBinary.bin", ios_base::binary);
cout << "Программа осуществляет поиск и вывод на экран самого молодого студента, родившегося k - го числа." << endl;
cout << "Сортировку исходного массива:\n1)по дню рождения в порядке возрастания.\n2)по фамилии студента в алфавитном порядке.\n" << endl;
cout << "Сортировку выходного массива:\n1)по дате рождения в порядке убывания возраста.\n" << endl;
system("pause");
while (1)
{
system("cls");
cout << "\tМеню\n";
cout << "1. Ввод исходного массива из файла.\n";
cout << "2. Вывод исходного массива на экран.\n";
cout << "3. Вывод исходного массива в файл.\n";
cout << "4. Поиск самого молодого студента.\n";
cout << "5. Вывод результатов поиска на экран.\n";
cout << "6. Вывод результатов поиска в текстовый файл.\n";
cout << "7. Сортировка исходного массива структур по фамилии в алфавитном порядке.\n";
cout << "8. Сортировка исходного массива структур по дню рождения в порядке возрастания.\n";
cout << "9. Сортировка выходного массива структур по дате рождения в порядке убывания возраста.\n";
cout << "10.Выход из программы.\n\n";
cout << "Ваш выбор (1-10):";
cin >> j;
switch (j)
{
case 1: inputMasStudFile(pa, m); break;
case 2: outputMasStud(pa, m); break;
case 3: outputMasStudFile(pa, output, m);
outputMasStudFileBinary(pa,outputBinary, m); break;
case 4:
sortVoz(pa, m);
cout << endl << "Введите число k." << endl;
cout << "k = ";
cin >> k;
FindStudent(pa, m, pb,k, kol,cln,kolex); break;
case 5:outputMasStud(pb, kolex); break;
case 6: outputMasStudFile(pb, output, kolex);
outputMasStudFileBinary(pb, outputBinary, kolex); break;
case 7:sortName(pa, m);
outputMasStud(pa, m);
outputMasStudFile(pa, output, m);
outputMasStudFileBinary(pa, outputBinary, m);
break;
case 8: sortDateVoz(pa, m);
outputMasStud(pa, m);
outputMasStudFile(pa, output, m);
outputMasStudFileBinary(pa, outputBinary, m);
break;
case 9:sortUb(pb, kol + 1);
outputMasStud(pb, kol + 1);
outputMasStudFile(pb, output, kol + 1);
outputMasStudFileBinary(pb, outputBinary, kol+1);
break;
case 10:
cout << "\nЗавершение программы\n\n";
system("pause");
return(1);
default: cout << "\nНет такого пункта в меню\n";;
}
}
output.close();
outputBinary.close();
}
void inputMasStudFile(students*& px, int& n) {
ifstream fin;
string file;
string iniz;
students t;
cout << "\nИмя входного файла:";
cin >> file;
fin.open(file.c_str());
cout << "\nФайл открыт.";
if (fin.fail()) {
cout << file << " не открывается\n";
system("pause");
return;
}
n = 0;
while (1)
{
fin >> t.fam.name >> iniz >> t.birth.d >> t.birth.m >> t.birth.y;
if (fin.fail()) break; n++;
}
fin.close();
if (px != NULL)delete[]px;
px = new students[n];
if (px == NULL)
{
cout << "Нет памяти\n";
system("pause"); n = 0; return;
}
fin.open(file.c_str());
if (fin.fail()) {
cout << file << "повторно не открывается\n";
delete[]px;
px = NULL; n = 0;
return;
}
for (int i = 0; i < n; i++)
{
fin >> px[i].fam.name >> iniz >> px[i].birth.d >> px[i].birth.m >> px[i].birth.y;
px[i].fam.name = px[i].fam.name + " " + iniz;
}fin.close();
cout << "\nФайл введен.\n" << endl;
system("pause");
}
void outputMasStud(students x[], int n)
{
cout << " |---------------------------------------------------------|\n";
cout << " | | | Дата рождения |\n";
cout << " | № | Фамилия И.О |--------------------|\n";
cout << " | | | День | Месяц | Год |\n";
cout << " |---------------------------------------------------------|\n";
for (int i = 1; i <= n; i++)
{
cout << " | " << left << setw(3) << i << "|" << setw(30) << x[i - 1].fam.name << " | " << setw(2) << x[i - 1].birth.d << " | " << setw(2) << x[i - 1].birth.m << " |" << setw(4) << x[i - 1].birth.y << " |\n";
}
cout << " |---------------------------------------------------------|\n";
system("pause");
}
void outputMasStudFile(students x[], ofstream& output,int n)
{
output << " \n\n";
output << " |---------------------------------------------------------|\n";
output << " | | | Дата рождения |\n";
output << " | № | Фамилия И.О |--------------------|\n";
output << " | | | День | Месяц | Год |\n";
output << " |---------------------------------------------------------|\n";
for (int i = 1; i <= n; i++)
{
output << " | " << left << setw(3) << i << "|" << setw(30) << x[i - 1].fam.name << " | " << setw(2) << x[i - 1].birth.d << " | " << setw(2) << x[i - 1].birth.m << " |" << setw(4) << x[i - 1].birth.y << " |\n";
}
output << " |---------------------------------------------------------|\n";
output.close();
cout << "\nМассив структур сохранен в файле под названием output.txt \n\n";
system("pause");
}
void outputMasStudFileBinary(students x[],ofstream& outputBinary,int n)
{
cout << "\nМассив структур сохранен в бинарном файле под названием outputBinary.txt \n\n";
students t;
string temp;
cout << "\nРезультат сохранения в бинарном файле: \n\n";
for (int i = 1; i <= n; i++)
{ temp = x[i - 1].fam.name + " " + to_string(x[i - 1].birth.d) + " " + to_string(x[i - 1].birth.m) + " " + to_string( x[i - 1].birth.y )+ "\n";
outputBinary.write((char*)&temp, sizeof(temp));
outputBinary.write("\n", sizeof("\n"));
cout << temp;
}
cout << "\n";
system("pause");
}
void FindStudent(students x[], int n, students*& py, int k, int& kol,int& cln, int& kolex) {
students* p;
p = new students[n];
if (p == NULL)
{
cout << "Нет памяти в функции.\n";
system("pause"); return;
}
if (py != NULL) delete[]py;
for (int i = 0; i < n; i++) {
if (x[i].birth.d == k) {
cln++;
}
}
py = new students[cln];
if (py == NULL)
{
cout << "Нет памяти в функции\n";
system("pause");
delete[]p;
cln = 0;
return;
}
for (int i = 0; i < n; i++) {
if (x[i].birth.d == k) {
kol++;
py[kol] = x[i];
}
}
for (int i = 1; i < kol; i++) {
if ((py[i - 1].birth.m == py[i].birth.m) and (py[i - 1].birth.y == py[i].birth.y)) {
kolex++;
}
}
if (kol == -1) cout << "\nВ базе данных нет такого студента, родившегося " << k << "-го числа.";
cout << "\nПоиск самого(-ых) молодного(-ых) студента(-ов), родившегося(-ихся) " << k << "-го числа, завершен.\n";
delete[]p;
system("pause");
}
void sortName(students y[], int n) {
int i, p;
students t;
for (p = 1; p < n; p++)
for (i = 0; i < n - 1; i++)
if (y[i].fam.name > y[i + 1].fam.name)
{
t = y[i];
y[i] = y[i + 1];
y[i + 1] = t;
}
cout << "\nСортировка выполнена.\n\n";
}
int datcmpVoz(date v, date w)
{
if (v.y < w.y) return 1;
if ((v.y == w.y) && (v.m < w.m)) return 1;
if ((v.y == w.y) && (v.m == w.m) && (v.d < w.d)) return 1;
if ((v.y == w.y) && (v.m == w.m) && (v.d == w.d)) return 0;
return -1;
}
void sortVoz(students x[], int n) {
int i, fl;
students t;
do
{
fl = 0; n--;
for (i = 0; i < n; i++) {
if (datcmpVoz(x[i].birth, x[i + 1].birth) > 0)
{
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
fl = 1;
}
}
} while (fl == 1);
cout << "\nСортировка выполнена.\n";
}
int datcmpUb(date v, date w)
{
if (v.y > w.y) return 1;
if ((v.y == w.y) && (v.m > w.m)) return 1;
if ((v.y == w.y) && (v.m == w.m) && (v.d > w.d)) return 1;
if ((v.y == w.y) && (v.m == w.m) && (v.d == w.d)) return 0;
return -1;
}
void sortUb(students x[], int n) {
int i, fl;
students t;
do
{
fl = 0; n--;
for (i = 0; i < n; i++) {
if (datcmpUb(x[i].birth, x[i + 1].birth) > 0)
{
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
fl = 1;
}
}
} while (fl == 1);
cout << "\nСортировка выполнена.\n";
}
int datcmpDateVoz(date v, date w)
{
if (v.m > w.m) return 1;
if ((v.m == w.m) && (v.d > w.d)) return 1;
if ((v.m == w.m) && (v.d == w.d)) return 0;
return -1;
}
void sortDateVoz(students x[], int n) {
int i, fl;
students t;
do
{
fl = 0; n--;
for (i = 0; i < n; i++) {
if (datcmpDateVoz(x[i].birth, x[i + 1].birth) > 0)
{
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
fl = 1;
}
}
} while (fl == 1);
cout << "\nСортировка выполнена.\n";
}
Вывод: В ходе выполнения работы были получены навыки работы с динамическими массивами, и реализацией сохранения и вывода массивов структур в бинарные файлы на языке С++.