Untitled
unknown
plain_text
3 years ago
15 kB
6
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...