Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / Лабораторная работа №5

.docx
Скачиваний:
1
Добавлен:
16.05.2023
Размер:
34.68 Кб
Скачать

ФГБОУ ВО

«Уфимский государственный авиационный технический университет»

Кафедра ТК

ОТЧЕТ

по лабораторной работе № 5

по дисциплине «Программирование»

Вариант № 18

Выполнил: студент гр. ИВТ-127Б

Проверил: доцент каф. ТК

Фёдорова Н. И.

Уфа 2022

Тема работы: Динамические массивы структур. Бинарные файлы.

Цель работы: Целью работы является получение студентами навыков работы с динамическими массивами, и реализацией сохранения и вывода массивов структур в бинарные файлы на языке С++.

Задачи работы:

  • составить схему алгоритма работы программы;

  • написание программы на языке С++ с использованием структур;

  • тестирование работоспособности программы для различных исходных данных.

Вариант № 18.

Задание:

Дан массив записей, содержащий сведения о студентах группы: фамилия и инициалы студента; дата рождения (число, месяц, год). Найти и вывести на экран самого молодого студента, родившегося k-го числа.

  1. Сортировка исходного массива структур:

1) по дню рождения в порядке возрастания;

2) по фамилии студента в алфавитном порядке.

  1. Сортировка выходного массива структур:

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";

}

Вывод: В ходе выполнения работы были получены навыки работы с динамическими массивами, и реализацией сохранения и вывода массивов структур в бинарные файлы на языке С++.