Laba_7
.docxФГБОУ ВО
Уфимский государственный авиационный технический университет
Кафедра ТК
ОТЧЕТ
по лабораторной работе № 6
по дисциплине «Программирование»
Вариант № 18
Выполнил: студент гр. ИВТ-114
Балыбердин Н. А.
Проверил: доцент каф. ТК
Федорова Н. И.
Уфа 2017
Тема работы: Сортировка массивов структур. Форматированный вывод.
Цель работы: Навыки работы со структурами, структурными данными и массивами структур в С++
Задачи работы:
написание программы на языке С++ с использованием структурных данных и массивов структур.
тестирование работоспособности программы для различных исходных данных.
Вариант № 18
Задание: На основе лабораторной №6 сделать: Вывод результата в бинарный файл, Вывод исх.массива в бинарный файл и Ввод бинарного файла.
Схема алгоритма работы программы:
t=3;
sort(a,k,t)
t=2;
sort(a,k,t)
t=1;
sort(a,k,t)
vesna(a,k)
Vivodfail
(a, k ,kk)
Vivnaikr
(a, k, kk)
sort(a,k,t)
Вывод
x[0].dr.d Вывод
x[0].dr.m Вывод
x[0].dr.y
Текст программы:
#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>
#include <iomanip>
#include <fstream>
using namespace std;
const int L = 31, M = 11;
struct date
{
int d, m, y;
};
struct student
{
char name[L];
char group[M];
date dr;
};
void inputMasStudFile(student *&x, int &n)
{
char inic[5], filename[L];
ifstream fin;
cout << "Введите имя входного файла: ";
cin >> filename;
fin.open(filename);
if (fin.fail())
{
cout << "\n_______________________________________________\nОшибка\n Файл " << filename << " не может быть открыт\nНажмите любую клавишу, чтобы выйти в меню\n_______________________________________________\n";
_getch();
return;
}
n = 0;
while (fin.peek() != EOF)
{
string s;
getline(fin, s);
n++;
}
fin.close();
x = new student[n];
fin.open(filename);
fin.seekg(0, ios_base::beg);
for (int i = 0; i<n; i++)
{
fin >> x[i].name >> inic >> x[i].group >> x[i].dr.d >> x[i].dr.m >> x[i].dr.y;
strcat_s(x[i].name, " ");
strcat_s(x[i].name, inic);
}
fin.close();
cout << "\nМассив из файла успешно считан\n";
system("pause");
}
void outputMasStud(student *x, int n)
{
int i;
cout << " __________________________________________________________________\n | № | Фамилия и инициалы | Группа | Дата рождения |\n |____|______________________________|____________|_______________|" << endl;
for (i = 0; i < n; i++)
{
cout << " | " << setfill('0') << right << setw(2) << i + 1 << setfill(' ') << left << " | " << setw(29) << x[i].name << "|" << setw(12) << x[i].group << "| " << setfill('0') << right << setw(2) << x[i].dr.d << "." << setw(2) << x[i].dr.m << "." << left << setw(8) << setfill(' ') << x[i].dr.y << "|" << endl;
}
cout << " -----------------------------------------------------------------\n";
system("pause");
}
void find(student *x, int n, student *&y, int &m)
{
int i;
m = 0;
for (i = 0; i < n; i++)
{
if (x[i].dr.m >= 3 && x[i].dr.m <= 5) m++;
}
y = new student[m];
m = 0;
for (i = 0; i < n; i++)
{
if (x[i].dr.m >= 3 && x[i].dr.m <= 5)
{
y[m] = x[i];
m++;
}
}
cout << "Студенты найдены\n";
system("pause");
}
void findmol(student *x, int n, student *&y, int &m)
{int fl, i;
student t;
do {
fl = 0;
n--;
for (i = 0; i < n; i++)
if (x[i].dr.y < x[i + 1].dr.y)
{
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
fl = 1;
}
} while (fl == 1);
m=1;
y = new student[m];
y[0]=x[0];
cout << "Студент найден\n";
system("pause");
}
void outputMasStudFile(student *x, int n)
{
char file[L];
int i;
ofstream fout;
cout << "\nВведите имя выходного файла для Массива студентов: ";
cin >> file;
fout.open(file);
if (fout.fail())
{
cout << "\n_______________________________________________\nОшибка\n Файл " << file << " не может быть открыт\nНажмите любую клавишу, чтобы выйти из программы\n_______________________________________________\n";
_getch();
return;
}
fout << " __________________________________________________________________\n | № | Фамилия и инициалы | Группа | Дата рождения |\n |____|______________________________|____________|_______________|" << endl;
for (i = 0; i < n; i++)
{
fout << " | " << setfill('0') << right << setw(2) << i + 1 << setfill(' ') << left << " | " << setw(29) << x[i].name << "|" << setw(12) << x[i].group << "| " << setfill('0') << right << setw(2) << x[i].dr.d << "." << setw(2) << x[i].dr.m << "." << left << setw(8) << setfill(' ') << x[i].dr.y << "|" << endl;
}
fout << " -----------------------------------------------------------------\n";
fout.close();
cout << "Массив успешно записан в файл\n";
system("pause");
}
void sortA1(student *&x, int n)
{
int fl, i;
student t;
do {
fl = 0;
n--;
for (i = 0; i < n; i++)
if (x[i].dr.y < x[i + 1].dr.y)
{
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
fl = 1;
}
} while (fl == 1);
cout << "Массив отсортирован\n";
system("pause");
}
int datcmp(date v, date u)
{
if (v.y > u.y) return 1;
if (v.y < u.y) return -1;
if (v.m > u.m) return 1;
if (v.m < u.m) return -1;
if (v.d > u.d) return 1;
if (v.d < u.d) return -1;
else return 0;
}
int namecmp(student u, student v)
{
if (strcmp(u.name, v.name) > 0) return 1;
if (strcmp(u.name, v.name) < 0) return 0;
return 0;
}
void sortA2(student *&x, int n)
{
student t;
int fl;
do
{
fl = 0;
n--;
for (int i = 0; i<n; i++)
if (namecmp(x[i], x[i + 1]) == 1)
{
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
fl = 1;
}
} while (fl == 1);
cout << "Массив отсортирован\n";
system("pause");
}
void sortB1(student *x, int n)
{
int fl, i;
student t;
do {
fl = 0;
n--;
for (i = 0; i < n; i++)
if (datcmp(x[i].dr, x[i + 1].dr) > 0)
{
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
fl = 1;
}
} while (fl == 1);
cout << "Массив отсортирован\n";
system("pause");
}
void outputRezBinFile(student *&x, int m)
{
//setlocale(LC_ALL, "Russian");
char file[L];
ofstream fout;
cout << "имя выходного бинарного файла - "; cin >> file;
fout.open(file, ios::binary);
if (fout.fail())
{
cout << "файл не открылся";
return;
}
fout.write((char*)x, m * sizeof(student));
fout.close();
cout << "Результат записан в бин.файл\n";
system("pause");
}
void inputRezBinFile(student *&x, int &n)
{
//setlocale(LC_ALL, "Russian");
char file[L]; int i;
ifstream fin;
cout << "имя бинарного файла - "; cin >> file;
fin.open(file, ios::binary);
if (fin.fail())
{
cout << "файл не открывается";
return;
}
fin.seekg(0, ios::end);
n = fin.tellg() / sizeof(student);
x = new student[n];
fin.seekg(0, ios::beg);
fin.read((char*)x, n * sizeof(student));
fin.close();
cout << "Бинарный файл введен\n";
system("pause");
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
student *x = 0, *y = 0, *rezbin1 = 0;
int n, m, j, m1, n1;
while (1)
{
system("cls");
setlocale(LC_ALL, "Russian");
cout << "Сортировки\n";
cout << "\nМеню\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";
cout << "11. Сортировка исх.массива по фамилии и инициалам студента в алфавитном порядке\n";
cout << "12. Сортировка результата по дате рождения в порядке убывания возраста\n";
cout << "13. Вывод результата в бинарный файл\n";
cout << "14. Вывод исх.массива в бинарный файл\n";
cout << "15. Ввод бинарного файла\n";
cout << "16. Выход из программы\n\n";
cout << "Выбор (1-16): "; cin >> j;
switch (j)
{
case 1: inputMasStudFile(x, n); break;
case 2: outputMasStud(x, n); break;
case 3: find(x, n, y, m); break;
case 4: cout << "Студенты, родившиеся весной:\n"; outputMasStud(y, m); break;
case 5: outputMasStudFile(y, m); break;
case 6: findmol(x, n, y, m); break;
case 7: cout << "Самый молодой студент:\n"; outputMasStud(y, m); break;
case 8: outputMasStudFile(y, m); break;
case 9: outputMasStudFile(x, n); break;
case 10: sortA1(x, n); break;
case 11: sortA2(x, n); break;
case 12: sortB1(y, m); break;
case 13: outputRezBinFile(x, n); break;
case 14: outputRezBinFile(y, m); break;
case 15: inputRezBinFile(rezbin1, m1); outputMasStud(rezbin1, m1); break;
case 16: cout << "Конец работы\n"; system("pause");if (x != NULL) delete[]x;if (y != NULL) delete[]y;if (rezbin1 != NULL) delete[]rezbin1; return 0;
default: cout << "Ошибка: неверный пункт меню\n"; system("pause"); break;
}
}
}
Тестовый пример:
Входные данные: file1
Выходные данные: file
Вывод: В ходе выполнения работы получены навыки работы со структурами, структурными данными и массивами структур в С++.