Untitled

 avatar
unknown
plain_text
2 years ago
15 kB
5
Indexable
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <chrono>
#include <ctime>
#include <string.h>
using namespace std;
const int N = 100;

struct date {
    int dd, mm, yy; // День, месяц, год
    void setDate(int dd0, int mm0, int yy0) {    // встроенная функция установки даты
        dd = dd0; mm = mm0; yy = yy0;
    }
    void getDate() {                                       // встроенная функция чтения даты
        printf("\nday:"); scanf_s("%d", &dd);
        printf("month:"); scanf_s("%d", &mm);
        printf("year:"); scanf_s("%d", &yy);
    }
    int cmpDate(date& T) {                            // встроенная функция сравнения дат
        if (yy != T.yy) return yy - T.yy;
        if (mm != T.mm) return mm - T.mm;
        return dd - T.dd;
    }
    void loadDate(FILE* fd) { fscanf(fd, "%d %d %d\n", &dd, &mm, &yy); } // Загрузка даты с файла
    void saveDate(FILE* fd) { fprintf(fd, "%d %d %d\n", dd, mm, yy); } // Сохранение даты в файл
    void showDate() { printf("%02d.%02d.%04d\n", dd, mm, yy); } // Вывод даты
};

struct user
{
    char line_change_text[1000]; // Строка
    int page_number, row_number;  // Номер страницы, номер строки
    date date_of_change; // Дата изменения
    void setString(char lct[], int pn, int rn, date b0) { // Установка страницы
        strcpy(line_change_text, lct); page_number = pn; row_number = rn; date_of_change = b0;
    }
    void showString() {                        // Вывод страницы
        printf("%-20s %-20d %-10d    ", line_change_text, page_number, row_number);
        date_of_change.showDate();         // вызов встроенной функции для поля date_of_change
    }
    void saveString(FILE* fd) { // Сохранение данных строки в файл
        fprintf(fd, "%s\n%d\n%d\n", line_change_text, page_number, row_number);
        date_of_change.saveDate(fd); // вызов встроенной функции для поля date_of_change
    }
    void loadString(FILE* fd) {              // Загрузка данных строки из файла
        fscanf(fd, "%s\n%d\n%d\n", &line_change_text, &page_number, &row_number);
        date_of_change.loadDate(fd);        // вызов встроенной функции для поля date_of_change     
    }
    int cmpString(user& T, int mode) { // встроенная функция сравнения записей
        switch (mode) {
        case 1: return strcmp(line_change_text, T.line_change_text);      // сравнение по строке
        case 2: return page_number - T.page_number;       // сравнение по номеру страницы
        case 3: return row_number - T.row_number;     // сравнение по номеру строки
        case 4: return date_of_change.cmpDate(T.date_of_change); // сравнение по дате изменения
        }
    }
};

struct table {
    user TBL[N];                              // массив структурированных переменных
    int  nn = 0;                                      // текущая размерность массива
    void addString(char lct[], int pn, int rn, date b0) { // Добавление строки в таблицу
        if (nn != N) { TBL[nn].setString(lct, pn, rn, b0); nn++; }
    }
    void loadTable(char lct[]) {           // встроенная функция загрузки из файла
        FILE* fd = fopen(lct, "r");
        if (fd == NULL) return;
        fscanf(fd, "%d\n", &nn);
        if (nn >= N) return;
        for (int i = 0; i < nn; i++) TBL[i].loadString(fd); // вызов встроенной функции для поля TBL[i]
        fclose(fd);
    }
    void showTable() { // Вывод таблицы
        for (int i = 0; i < nn; ++i) {
            TBL[i].showString();
        }
    }
    void saveTable(char lct[]) { // встроенная функция сохранения в файл
        FILE* fd = fopen(lct, "w");
        if (fd == NULL) return;
        fprintf(fd, "%d\n", nn);
        for (int i = 0; i < nn; i++) TBL[i].saveString(fd);
        fclose(fd);
    }
    void sortTable(int mode) { // встроенная функция сортировки выбором
        int i, j, k;
        for (i = 0; i < nn; i++) {
            for (j = k = i; j < nn; j++)
                if (TBL[j].cmpString(TBL[k], mode) < 0) k = j; // вызов встроенной функции сравнения записей
            user cc = TBL[i]; TBL[i] = TBL[k]; TBL[k] = cc;
        }
    }
    int tr_dat(int y, int m, int d) // Функция суммирования дней в дате, для сравнений дат
    {
        int qd; int sum = 0;
        for (m; m > 0; m--)
        {
            if ((m < 8) && (m != 2))
                if (m % 2 == 0) qd = 30;
                else qd = 31;
            if ((m >= 8) && (m % 2 == 0)) qd = 31;
            else qd = 30;
            if (m == 2) qd = 28;
            sum += qd;
        }
        int dat = y * 365 + sum + d;
        return dat;
    }
    void search(int a) { // поиск в таблице элемента с заданным значением поля или с наиболее близким к нему по значению
        //(наиболее близкое считает только для даты, номер строки и номер страницы!!!!!!!!!!!!)
        setlocale(LC_ALL, "Russian");
        int b, i, d, min, I = 0, qd, dd, mm, yy;
        char s[256];
        switch (a)
        {
        case 1:
        {
            cout << "Введите номер страницы:" << endl;
            cin >> b;
            for (i = 0; i < nn; i++) {
                min = abs(b - TBL[0].page_number);
                for (i = 1; i < nn; i++) {
                    if (min > abs(b - TBL[i].page_number)) {
                        min = abs(b - TBL[i].page_number);
                        I = i;
                    }
                }
            }
            TBL[I].showString();
            cout << endl;
            break;
        }
        case 2:
        {
            cout << "Введите номер строки:" << endl;
            cin >> b;
            for (i = 0; i < nn; i++) {
                min = abs(b - TBL[0].row_number);
                for (i = 1; i < nn; i++) {
                    if (min > abs(b - TBL[i].row_number)) {
                        min = abs(b - TBL[i].row_number);
                        I = i;
                    }
                }
            }
            TBL[I].showString();
            cout << endl;
            break;
        }
        case 3:
        {
            cout << "Введите дату изменения в формате DD.MM.YYYY: ";
            scanf_s("%d.%d.%d", &dd, &mm, &yy);
            d = tr_dat(yy, mm, dd);
            int f = 0;
            for (i = 0; i < nn; i++) {
                int dat = tr_dat(TBL[i].date_of_change.yy, TBL[i].date_of_change.mm, TBL[i].date_of_change.dd);
                min = abs(d - tr_dat(TBL[0].date_of_change.yy, TBL[0].date_of_change.mm, TBL[0].date_of_change.dd));
                if (min > abs(d - dat)) {
                    min = abs(d - dat);
                    I = i;
                }
                if (0 == abs(d - dat))
                {
                    f = 1;
                    TBL[i].showString();
                }
            }
            if (f == 0) {
                TBL[I].showString();
            }
            cout << endl;
            break;
        }
        default:
            cout << "Такого поля нет." << endl;
        }
    }
    // удаление записи
    void delet(int a)
    {
        int i, j;
        int k;
        char s[30];
        for (i = 0; i < nn; i++)
        {
            if (a == TBL[i].row_number)
            {
                for (j = i; j < nn - 1; j++)
                {
                    TBL[j] = TBL[j + 1];
                }
                nn--;
            }
        }
    }

};

int main()
{
    table TT;
    date today;
    setlocale(LC_ALL, "Russian");
    int a = 0, rn = 0, m = 0, n = 0,pn = 0;
    char lct[1000] = "", s[] = "";
    date d{ 0, 0, 0 };
    int run = -1;
    while (run != 0) {
        printf("1 - Добавить запись\n2 - Удалить запись\n3 - Показать таблицу\n4 - Сортировать таблтцу");
        printf("\n5 - Сохранить таблицу в файл\n6 - Загрузить таблицу из файла\n7 - Поиск по таблице");
        printf("\n8 - Редактировать запись\n9 - Показать запись\n0 - Выход\n10 - \nВведите номер комнды: ");
        cin >> a;
        switch (a) {
        case 1:
            printf("Введите строку: ");
            gets_s(lct, 1000);
            gets_s(lct, 1000);
            printf("Введие номер страницы: ");
            scanf_s("%d", &pn);
            printf("Введие номер строки: ");
            scanf_s("%d", &rn);
            printf("Введите дату в формате DD.MM.YYYY: ");
            scanf_s("%d.%d.%d", &d.dd, &d.mm, &d.yy);
            TT.addString(lct, pn, rn, d);
            printf("\n");
            break;
        case 2:
            printf("Введите номер строки, который надо удалить: ");
            scanf_s("%d", &rn);
            TT.delet(rn);
            printf("\n");
            break;
        case 3:
            TT.showTable();
            printf("\n");
            break;
        case 4:
            printf("1.Строке\n2. номеру страницы\n3. По номеру строки\n4. По дате\nСортировать по: ");
            scanf_s("%d", &m);
            TT.sortTable(m);
            printf("\n");
            break;
        case 5:
            printf("Введите название файла в формате Name.txt, куда вы хотите сохранить таблицу: ");
            gets_s(s, 1000);
            gets_s(s, 1000);
            TT.saveTable(s);
            printf("\n");
            break;
        case 6:
            printf("Введите название файла в формате Name.txt, откуда вы хотите загрузить таблицу: ");
            gets_s(s, 1000);
            gets_s(s, 1000);
            TT.loadTable(s);
            printf("\n");
            break;
        case 7:
            cout << "Выбирете поле, по которому будет производиться поиск (в ответе укажите номер поля):"
                << endl << "1.Номер страницы" << endl << "2.Номер строки" << endl << "3.Дата изменения" << endl;
            cin >> rn;
            TT.search(rn);
            printf("\n");
            break;
        case 8:
            printf("Введите номер записи в таблице: "); // На каком месте она в записях (по номру nn)
            scanf_s("%d", &m);
            if (m <= TT.nn + 1)
            {
                printf("Текущие данные строки: ");
                TT.TBL[m - 1].showString();
                printf("\nЧто вы хотите редактировать?\n");
                printf("1. Строку\n2.Номер страницы\n3. Номер строки\n4. Дату изменения\n5. Всё\n Изменить:");
                scanf_s("%d", &n);
                switch (n)
                {
                case 1:
                    printf("Введите строку: ");
                    gets_s(lct, 1000);
                    gets_s(lct, 1000);
                    TT.TBL[m - 1].setString(lct, TT.TBL[m - 1].page_number, TT.TBL[m - 1].row_number, TT.TBL[m - 1].date_of_change);
                    break;
                case 2:
                    printf("Введие номер строки: ");
                    scanf_s("%d", &pn);
                    TT.TBL[m - 1].setString(TT.TBL[m - 1].line_change_text, pn, TT.TBL[m - 1].row_number, TT.TBL[m - 1].date_of_change);
                    break;
                case 3:
                    printf("Введие номер страницы: ");
                    scanf_s("%d", &rn);
                    TT.TBL[m - 1].setString(TT.TBL[m - 1].line_change_text, TT.TBL[m - 1].page_number, rn, TT.TBL[m - 1].date_of_change);
                    break;
                case 4:
                    printf("Введите дату в формате DD.MM.YYYY: ");
                    scanf_s("%d.%d.%d", &d.dd, &d.mm, &d.yy);
                    TT.TBL[m - 1].setString(TT.TBL[m - 1].line_change_text, TT.TBL[m - 1].page_number, TT.TBL[m - 1].row_number, d);

                    break;
                case 5:
                    printf("Введите строку: ");
                    gets_s(lct, 1000);
                    gets_s(lct, 1000);
                    printf("Введие номер страницы: ");
                    scanf_s("%d", &pn);
                    printf("Введие номер строки: ");
                    scanf_s("%d", &rn);
                    printf("Введите дату в формате DD.MM.YYYY: ");
                    scanf_s("%d.%d.%d", &d.dd, &d.mm, &d.yy);
                    TT.TBL[m - 1].setString(lct, pn, rn, d);
                    break;
                default:
                    break;
                }
            }
            else { printf("Такого номера нет!"); }
            printf("\n");
            break;
        case 9:
            printf("Введите номер строки в таблице: ");
            scanf_s("%d", &m);
            TT.TBL[m - 1].showString();
            printf("\n");
            break;
        case 10:
            // Тут должжна быть ещё одна функция, которую тебе назначиит учитель
            printf("\n");
            break;
        case 0:
            run = 0;
            break;
        default:
            cout << "Ошибка ввода!" << endl;
        }
    }
    return 0;
}
Editor is loading...