Главная страница
Навигация по странице:

  • Текст программы: // Array . h

  • //UserStructs.h

  • //UserStructs.cpp

  • //Interface.h

  • Скриншоты программы

  • Отчет по лабораторной работе 5 по дисциплине Программирование


    Скачать 184.32 Kb.
    НазваниеОтчет по лабораторной работе 5 по дисциплине Программирование
    Дата20.01.2019
    Размер184.32 Kb.
    Формат файлаdocx
    Имя файла5.docx
    ТипОтчет
    #64508


    ФГБОУ ВО

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

    Кафедра ТК


    ОТЧЕТ

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

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

    Вариант №21

    Тема работы: Проектирование класса, содержащего статический массив структур. Методы класса сортировки массива структур. Специальные методы класса.

    Задание: Дан исходный массив записей, содержащие сведения о датах рождения студентов группы. Каждая запись содержит фамилию и инициалы, дату рождения (число, месяц, год). Сформировать перечень сезонов студентов с указанием количества различных месяцев рождения в этом сезоне.

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

      1. По дню рождения в порядке убывания

      2. По дате рождения в порядке возрастания возраста.

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

      1. По фамилии и инициалам студента в алфавитном порядке.

    Сортировка перечня:

    1. По сезону рождения в порядке возрастания

    2. По количеству месяцев в порядке убывания


    Текст программы:

    //Array.h

    #pragma once
    template

    struct Array{

    size_t capasity,

    size;

    T *data;
    Array();

    Array(const Array &arr);

    Array(){

    if (data != nullptr)

    delete[] data;

    }

    Array operator = (const Array arr);
    T& operator[](const int id);

    int insert(T &node);

    int earase(const int id);

    void realloc(int newSize);

    void clear();

    };
    template

    Array::Array() {

    data = nullptr;

    capasity = 4;

    size = 0;

    this->realloc(capasity);

    }

    template

    Array::Array(const Array &arr){

    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 Array::operator=(Array arr){

    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::realloc(int newCapasity){

    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::operator[](const int id){

    return data[id - 1];

    }
    template

    int Array::insert(T &node) {

    T tmp = node;
    if (size == capasity)

    this->realloc(2 * size);
    if (size < capasity) {

    data[size] = tmp;

    size++;

    return 0;

    }

    return -1;

    }
    template

    int Array::earase(const int id){

    for (size_t i = id - 1; i < size - 1; i++)

    std::swap(data[i], data[i + 1]);

    --size;

    return 0;

    }

    template

    inline void Array::clear(){

    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 &arr);

    void printHeaderTable(ostream &out);
    void printHeaderTableList(ostream &out);

    void printTableList(Array &seasons, ostream & out = cout);
    void printTable(Array &arr, ostream & out = cout);

    void printTable(Student student, int id, ostream & out = cout);
    void writeToFile(Array &arr);

    void writeToFile(Array &seasons);

    void add(Array &arr);

    void del(Array &arr);

    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 &arr) {

    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 &seasons, ostream & out) {

    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 &arr, ostream & out) {

    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 & arr){

    string fileName;

    cout << "Введите имя файла: "; cin >> fileName;

    ofstream file(fileName);

    this->printTable(arr, file);

    cout << "Файл записан!" << endl;

    }
    void Interface::writeToFile(Array &seasons) {

    string fileName;

    cout << "Введите имя файла: "; cin >> fileName;

    ofstream file(fileName);

    this->printTableList(seasons, file);

    cout << "Файл записан!" << endl;

    }
    void Interface::add(Array & arr){

    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& arr){

    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 FindStudents(Array &students) {

    bool added[30] = { false };

    Array result;

    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 &Seasons, int season) {

    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 getBirtdaySeasons(Array &students) {

    bool added[13] = { false };

    int m = 0;

    Array result;

    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 inArr, outArr;

    Array seasons;

    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



    написать администратору сайта