Отчет по лабораторной работе 5 по дисциплине Программирование
Скачать 184.32 Kb.
|
Array(){ФГБОУ ВО «Уфимский государственный авиационный технический университет» Кафедра ТК Сортировка исходного массива структур:
Сортировка выходного массива структур:
По сезону рождения в порядке возрастания По количеству месяцев в порядке убывания struct Array{ size_t capasity, size; T *data; Array(); Array(const Array if (data != nullptr) delete[] data; } Array operator = (const Array T& operator[](const int id); int insert(T &node); int earase(const int id); void realloc(int newSize); void clear(); }; template Array data = nullptr; capasity = 4; size = 0; this->realloc(capasity); } template Array this->data = new T[arr.size]; this->size = arr.size; for (size_t i = 0; i < size; i++) this->data[i] = arr.data[i]; } template Array this->realloc(arr.size); this->size = arr.size; for (size_t i = 0; i < size; i++) this->data[i] = arr.data[i]; return *this; } template void Array T *newArray = new T[newCapasity]; for (int i = 0; i < min(this->size, newCapasity); i++) newArray[i] = this->data[i]; if(this->data != nullptr) delete[] this->data; this->capasity = newCapasity; this->data = newArray; }; template T& Array return data[id - 1]; } template int Array T tmp = node; if (size == capasity) this->realloc(2 * size); if (size < capasity) { data[size] = tmp; size++; return 0; } return -1; } template int Array for (size_t i = id - 1; i < size - 1; i++) std::swap(data[i], data[i + 1]); --size; return 0; } template inline void Array size = 0; } //UserStructs.h #pragma once #include #include #define eqYear 0xFFFF0000 #define eqMounth 0x0000FF00 #define eqDay 0x000000FF struct Date { int day, mounth, year; bool isEqual(Date date, size_t mask = 0xFFFFFFFF) { return (getHash() & mask) == (date.getHash() & mask); }; int getHash(size_t mask = 0xFFFFFFFF) { return (day | (mounth << 8) | (year << 16) & mask); }; friend std::istream& operator>>(std::istream &in, Date &date); friend std::ostream& operator<<(std::ostream &out, Date &date); }; struct Student { std::string name, group; Date birthday; friend std::istream& operator>>(std::istream &in, Student &student); friend std::ostream& operator<<(std::ostream &out, Student &student); }; struct BirthdaySeason{ int season; int count; BirthdaySeason(int season) :season(season) { this->count = 0; }; BirthdaySeason() { season = -1; count = 0; } }; //UserStructs.cpp #include #include #include"UserStructs.h" std::istream& operator>>(std::istream &in, Date &date) { char p; in >> date.day >> p >> date.mounth >> p >> date.year; return in; }; std::ostream & operator<<(std::ostream & out, Date & date) { out << std::setw(3) << date.day << " |" << std::setw(3) << date.mounth << " |" << std::setw(5) << date.year << " |"; return out; } std::istream& operator>>(std::istream &in, Student &student) { std::string inic; in >> student.name >> inic >> student.group >> student.birthday; student.name += " " + inic; return in; }; std::ostream & operator<<(std::ostream & out, Student & student) { out << std::setw(35) << student.name << " |" << std::setw(11) << student.group << " |" << student.birthday << std::endl; return out; } //Interface.h #pragma once #include #include #include #include #include "Array.h" #include "UserStructs.h" const int headerTableLen = 5; const int maxStrLen = 100; const int maxTextMenuLen = 25; const int headerTableListLen = 4; using namespace std; struct Interface{ char headerTable[headerTableLen][maxStrLen], textMenu[maxTextMenuLen][maxStrLen], headerTableList[headerTableListLen][maxStrLen]; int lenMenu; Interface(); void loadFromFile(Array void printHeaderTable(ostream &out); void printHeaderTableList(ostream &out); void printTableList(Array void printTable(Array void printTable(Student student, int id, ostream & out = cout); void writeToFile(Array void writeToFile(Array void add(Array void del(Array int menu(); }; Interface::Interface(){ ifstream fHeader("header.txt"); ifstream fHeaderList("headerList.txt"); ifstream fMenu("textmenu.txt"); for (size_t i = 0; i fHeaderList.getline(headerTableList[i], maxStrLen); } for (size_t i = 0;i fHeader.getline(headerTable[i], maxStrLen); } for (lenMenu = 0; !fMenu.eof() && lenMenu < maxTextMenuLen; lenMenu++){ fMenu.getline(textMenu[lenMenu], maxStrLen); } }; inline int Interface::menu(){ int res; for (size_t i = 3; i < lenMenu; i++) { cout << textMenu[i] << endl; } cout << textMenu[0]; cin >> res; return res; } void Interface::loadFromFile(Array string fileName; cout << "Введите имя файла: "; cin >> fileName; //C++11 ifstream file(fileName); if (!file.is_open()) cout << "\n"; Student tmp; while (!file.eof()) { file >> tmp; if (arr.insert(tmp) == -1) { cout << "Ошибка при загрузке записей из файла. Их слишком много?"; return; } }; cout << "Записи добавлены!" << endl; }; void Interface::printHeaderTable(ostream & out){ for (size_t i = 0; i<5; i++) { out << headerTable[i] << endl; } }; void Interface::printHeaderTableList(ostream &out) { for (size_t i = 0; i<4; i++) { out << headerTableList[i] << endl; } } void Interface::printTableList(Array printHeaderTableList(out); std::string nameSeasons[] = { "Зима","Весна", "Лето", "Осень" }; for (size_t i = 1; i <= seasons.size; i++) { out << "|" << setw(10) << nameSeasons[seasons[i].season] << " |" < } out << headerTableList[0] << endl; } void Interface::printTable(Array printHeaderTable(out); for (size_t i = 1; i <= arr.size; i++){ out << "|" << setw(3) << i << " |" << arr[i]; } out << headerTable[4]< } void Interface::printTable(Student student, int id, ostream & out){ printHeaderTable(out); out << "|" << setw(3) << id << " |" << student; out << headerTable[4] << endl; } void Interface::writeToFile(Array string fileName; cout << "Введите имя файла: "; cin >> fileName; ofstream file(fileName); this->printTable(arr, file); cout << "Файл записан!" << endl; } void Interface::writeToFile(Array string fileName; cout << "Введите имя файла: "; cin >> fileName; ofstream file(fileName); this->printTableList(seasons, file); cout << "Файл записан!" << endl; } void Interface::add(Array Student node; std::string inic; cout << "Введите фамилю и инициалы студента: "; cin >> node.name >> inic; node.name += " " + inic; cout << "Введите группу студента: "; cin>>node.group; cout << "Введите дату рождения студента в формате дд.мм.гггг: "; cin >> node.birthday; if (arr.insert(node) == 0) cout << "Запись добавлена." << endl; else cout << "Ошибка при добавлении записи!" << endl; } void Interface::del(Array printTable(arr); char ans; int id; cout << "Укажите номер записи для удаления: "; cin >> id; printTable(arr[id],id); cout << "Вы уверены, что нужно удалить запись? (д/н): "; cin >> ans; if (ans == 'д') arr.earase(id); }; //Algo.h #pragma once #include "Array.h" #include "UserStructs.h" //Сортировка пузырьком на шаблонах. template void sort(T &arr, Compare cmp) { for (int i = arr.size; i > 0; i--) for (int j = 1; j < i; j++) if (cmp(arr[j], arr[j + 1])) swap(arr[j], arr[j + 1]); std::cout << "Записи отсортированы!" << std::endl; }; Array bool added[30] = { false }; Array for (size_t i = 1; i < students.size; i++) { if (added[i]) continue; for (size_t j = i + 1; j < students.size; j++) { if (!students[i].birthday.isEqual(students[j].birthday, eqMounth | eqYear)) continue; if (!added[i]) { result.insert(students[i]); added[i] = true; } if (!added[j]) { result.insert(students[j]); added[j] = true; } }; }; return result; } int getIdSeason(Array for (size_t i = 1; i <= Seasons.size; i++) if (Seasons[i].season == season) return i; BirthdaySeason tmp(season); Seasons.insert(tmp); return Seasons.size; } Array bool added[13] = { false }; int m = 0; Array for (size_t i = 1; i < students.size; i++) { m = students[i].birthday.mounth; if (!added[m]) { int id = getIdSeason(result, (m / 3) % 4); result[id].count++; added[m] = true; } } return result; } //Main.cpp #include #include #include #include "Interface.h" #include "algo.h" using namespace std; bool ByDay(Student &a, Student &b) { return a.birthday.day < b.birthday.day; } struct ByBirthday{ bool operator() (Student &a, Student &b) { return a.birthday.getHash() > b.birthday.getHash(); }; }byBirthday; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); Interface UI; Array Array while (true){ system("cls"); int key = UI.menu(); switch (key){ case 1: UI.loadFromFile(inArr); break; case 2: UI.printTable(inArr); break; case 3: UI.add(inArr); break; case 4: UI.del(inArr); break; case 5: sort(inArr, ByDay); //В качестве компаратора указатель на функцию break; case 6: sort(inArr, byBirthday); break; // структура с перегруженным оператором () case 7: UI.writeToFile(inArr); break; case 8: outArr = FindStudents(inArr); break; case 9: UI.printTable(outArr); break; case 10: sort(outArr, [](Student &a, Student &b) { //Лямба-функция return a.birthday.year > b.birthday.year ? true : a.birthday.year == b.birthday.year && a.birthday.mounth > b.birthday.mounth ? true : a.birthday.mounth == b.birthday.mounth && a.name > b.name ? true : false; }); break; case 11: UI.writeToFile(outArr); break; case 12: seasons = getBirtdaySeasons(inArr); break; case 13: UI.printTableList(seasons); break; case 14: sort(seasons, [](BirthdaySeason &a, BirthdaySeason &b) { return a.season > b.season; }); break; case 15: sort(seasons, [](BirthdaySeason &a, BirthdaySeason &b) { return a.count < b.count; }); break; case 16: UI.writeToFile(seasons); break; case 17: exit(0); default: cout << "Такого пункта не существует. Попробуйте еще раз." << endl; } system("pause"); } return 0; }; Скриншоты программы: Рис. . Меню Рис. . Сформированный перечень. Рис. . Сортированный перечень по сезону рождения в порядке возрастания Рис. . Сортированный перечень по количеству месяцев в порядке убывания Рис. . Результат вывода перечня в файл ВЫВОД: в результате проведенной лабораторной работы был спроектирован класс, содержащий статический массив структур. Реализованы специальные методы сортировки массива структур, специальные методы класса. Выполнили: студент гр. ИВТ-217 Корнилов И. А. Проверил: доцент каф. ТК Хасанов А. Ю. Уфа 2018 |