Untitled
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...