tranerius

24. 23 с возможностью экспорта/импорта

Jan 21st, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <Windows.h>
  5. double valueCheck(std::string);
  6. class DataBase {
  7.     int age, ID;
  8.     float weight, height;
  9.     std::string name, surname;
  10.     static int count;
  11.     friend void DataBaseCreateArray(DataBase*&, int);
  12.     friend void DataBaseDeleteUser(DataBase*&, int&, int);
  13.     friend std::ostream & operator << (std::ostream&, const DataBase&);
  14.     friend std::istream & operator >> (std::istream&, DataBase&);
  15.     friend void SetCountID(int);
  16.     friend void RefreshIDs(DataBase*&,int);
  17.     void AddUserID() {
  18.         ID = count++;
  19.     }
  20. public:
  21.     DataBase() {
  22.         name = "Unknown";
  23.         surname = "Unknown";
  24.         age = 0;
  25.         weight = 0;
  26.         height = 0;
  27.         ID = 0;
  28.     }
  29.     DataBase(DataBase& object) {
  30.         age = object.age;
  31.         weight = object.weight;
  32.         height = object.height;
  33.         name = object.name;
  34.         surname = object.surname;
  35.     }
  36.     int GetID() {
  37.         return ID;
  38.     }
  39.     std::string GetName() {
  40.         return name;
  41.     }
  42.     std::string GetSurname() {
  43.         return surname;
  44.     }
  45.     int GetAge() {
  46.         return age;
  47.     }
  48.     float GetWeight() {
  49.         return weight;
  50.     }
  51.     float GetHeight() {
  52.         return height;
  53.     }
  54.     bool operator ==(const DataBase& object) {
  55.         return (name == object.name && surname == object.name && ID == object.ID && age == object.age && weight == object.weight && height == object.height);
  56.     }
  57. };
  58. int DataBase::count = 1;
  59. int main() {
  60.     setlocale(LC_ALL, "ru");
  61.     int size = 0;
  62.     char answer_txt;
  63.     int answer_number;
  64.     std::string path, valuecheck;
  65.     std::fstream fs;
  66.     DataBase* db = nullptr;
  67.     DataBase temp;
  68.     while (true) {
  69.         std::cout << "Список доступных операций:\n1 - Добавить пользователя"
  70.             << "\n2 - Отобразить пользователей"
  71.             << "\n3 - Изменить данные пользователя"
  72.             << "\n4 - Удалить пользователя"
  73.             << "\n5 - Отчистить данные"
  74.             << "\n6 - Открыть файл с базой данных"
  75.             << "\n7 - Записать базу данных в файл"
  76.             << "\ne - Завершить работу"
  77.             << "\nКакую операцию необходимо выполнить? ";
  78.         std::cin >> answer_txt;
  79.         if (answer_txt < 49 || (answer_txt > 55 && answer_txt != 101)) {
  80.             std::cout << "Неверный ответ. Попробуйте снова" << std::endl;
  81.             system("pause");
  82.             std::cout << std::endl;
  83.             continue;
  84.         }
  85.         switch (answer_txt) {
  86.         case '1':
  87.             DataBaseCreateArray(db, size);
  88.             size++;
  89.             system("pause");
  90.             std::cout << std::endl;
  91.             break;
  92.         case '2':
  93.             if (size == 0) {
  94.                 std::cout << "Вы ещё не добавили пользователей" << std::endl;
  95.             }
  96.             else {
  97.                 std::cout << "ID\tИмя\t\tФамилия\t\tВозраст\tРост\tВес" << std::endl;
  98.                 for (int i = 0; i < size; i++) {
  99.                     std::cout << db[i];
  100.                 }
  101.             }
  102.             system("pause");
  103.             std::cout << std::endl;
  104.             break;
  105.         case '3':
  106.             if (size == 0) {
  107.                 std::cout << "Вы ещё не добавили пользователей" << std::endl;
  108.             }
  109.             else {
  110.                 while (true) {
  111.                     std::cout << "Введите ID пользователя, данные которого необходимо изменить: ";
  112.                     std::cin >> valuecheck;
  113.                     answer_number = static_cast<int>(valueCheck(valuecheck));
  114.                     if (answer_number<1 || answer_number>size) {
  115.                         std::cout << "Пользователь с таким ID не найден" << std::endl;
  116.                         continue;
  117.                     }
  118.                     else {
  119.                         std::cin >> db[answer_number - 1];
  120.                         break;
  121.                     }
  122.                 }
  123.             }
  124.             system("pause");
  125.             std::cout << std::endl;
  126.             break;
  127.         case '4':
  128.             if (size == 0) {
  129.                 std::cout << "Вы ещё не добавили пользователей" << std::endl;
  130.             }
  131.             else {
  132.                 std::cout << "Введите ID пользователя, которого необходимо удалить: ";
  133.                 std::cin >> valuecheck;
  134.                 answer_number = static_cast<int>(valueCheck(valuecheck));
  135.                 if (answer_number > size || answer_number < 1) {
  136.                     std::cout << "Пользователь с таким ID не найден" << std::endl;
  137.                 }
  138.                 else {
  139.                     DataBaseDeleteUser(db, size, answer_number);
  140.                 }
  141.             }
  142.             system("pause");
  143.             std::cout << std::endl;
  144.             break;
  145.         case '5':
  146.             if (size == 1) {
  147.                 delete db;
  148.                 size = 0;
  149.                 SetCountID(0);
  150.             }
  151.             else if (size > 1) {
  152.                 delete[]db;
  153.                 size = 0;
  154.                 SetCountID(0);
  155.             }
  156.             else {
  157.                 std::cout << "База данных - пустая" << std::endl;
  158.             }
  159.             system("pause");
  160.             std::cout << std::endl;
  161.             break;
  162.         case '6':
  163.             std::cout << "Введите имя файла с БД без расширения: ";
  164.             SetConsoleCP(1251);
  165.             std::cin >> path;
  166.             SetConsoleCP(866);
  167.             path = path + ".data";
  168.             fs.open(path, std::fstream::in | std::fstream::binary);
  169.             if (!fs.is_open()) {
  170.                 std::cout << "Файл с БД не найден" << std::endl;
  171.             }
  172.             else {
  173.                 fs.seekg(0, std::ios::end); //ставит указатель в конец файла
  174.                 if (fs.tellg() % sizeof(DataBase) != 0) { //fs.tellg принимает значение метода seekg
  175.                     std::cout << "Ошибка чтения файла" << std::endl;
  176.                 }
  177.                 else {
  178.                     if (size != 0) {
  179.                         if (size == 1) {
  180.                             delete db;
  181.                             db = nullptr;
  182.                         }
  183.                         else {
  184.                             delete[]db;
  185.                             db = nullptr;
  186.                         }
  187.                     }
  188.                     size = fs.tellg() / sizeof(DataBase);
  189.                     fs.seekg(0, std::ios::beg); //возвращает указатель в начало файла
  190.                     if (size < 2) {
  191.                         if (size == 1) {
  192.                             db = new DataBase;
  193.                         }
  194.                     }
  195.                     else {
  196.                         db = new DataBase[size];
  197.                     }
  198.                     if (size != 0) {
  199.                         for (int i = 0; i < size; i++) {
  200.                             fs.read((char*)&temp, sizeof(DataBase));
  201.                             db[i] = temp;   //костыль. Если принимать данные сразу в массив, то потом, при удалении, компилятор выдает ошибку.
  202.                         }
  203.                         SetCountID(0);
  204.                         RefreshIDs(db,size);
  205.                         SetCountID(size+1);
  206.                     }
  207.                 }
  208.             }
  209.             fs.close();
  210.             system("pause");
  211.             std::cout << std::endl;
  212.             break;
  213.         case '7':
  214.             if (size == 0) {
  215.                 std::cout << "Вы ещё не добавили пользователей" << std::endl;
  216.             }
  217.             else {
  218.                 std::cout << "Введите имя файла без расширения: ";
  219.                 SetConsoleCP(1251);
  220.                 std::cin >> path;
  221.                 SetConsoleCP(866);
  222.                 path = path + ".data";
  223.                 fs.open(path, std::fstream::out | std::fstream::binary | std::fstream::trunc);
  224.                 for (int i = 0; i < size; i++) {
  225.                     fs.write((char*)&db[i], sizeof(DataBase));
  226.                 }
  227.                 fs.close();
  228.             }
  229.             system("pause");
  230.             std::cout << std::endl;
  231.             break;
  232.         case 'e':
  233.             if (size == 1) {
  234.                 delete db;
  235.             }
  236.             else if (size > 1) {
  237.                 delete[]db;
  238.             }
  239.             return 0;
  240.             break;
  241.         }
  242.     }
  243. }
  244. void DataBaseCreateArray(DataBase*&object, int size) {
  245.     if (size == 0) {
  246.         object = new DataBase;
  247.         object[size].AddUserID();
  248.         std::cin >> object[size];
  249.     }
  250.     else {
  251.         DataBase* newDB = new DataBase[size + 1];
  252.         for (int i = 0; i < size; i++) {
  253.             newDB[i] = object[i];
  254.         }
  255.         if (size == 1) {
  256.             delete object;
  257.         }
  258.         else {
  259.             delete[]object;
  260.         }
  261.         object = newDB;
  262.         newDB = nullptr;
  263.         object[size].AddUserID();
  264.         std::cin >> object[size];
  265.     }
  266. }
  267. void DataBaseDeleteUser(DataBase*&object, int&size, int UserID) {
  268.     DataBase* newData = new DataBase[size - 1];
  269.     for (int i = 0, j = 0; i < size; i++, j++) {
  270.         if (object[i] == object[UserID - 1]) {
  271.             for (int temp = i; temp < size; temp++) {
  272.                 object[temp].ID--;
  273.             }
  274.             j--;
  275.             continue;
  276.         }
  277.         newData[j] = object[i];
  278.     }
  279.     if (size == 1) {
  280.         delete object;
  281.     }
  282.     else {
  283.         delete[]object;
  284.     }
  285.     object = newData;
  286.     newData = nullptr;
  287.     size--;
  288.     object[size].count--;
  289.     if (size == 1) {
  290.         DataBase *newDB = new DataBase;
  291.         newDB[0] = object[0];
  292.         delete[]object;
  293.         object = newDB;
  294.         newDB = nullptr;
  295.     }
  296. }
  297. std::ostream & operator << (std::ostream&os, const DataBase&object) {
  298.     os << object.ID << "\t" << object.name << "\t\t" << object.surname << "\t\t"
  299.         << object.age << "\t" << object.height << "\t" << object.weight << "\n";
  300.     return os;
  301. }
  302. std::istream & operator >> (std::istream&is, DataBase&object) {
  303.     std::string valuecheck;
  304.     std::cout << "Введите имя пользователя: ";
  305.     SetConsoleCP(1251);
  306.     std::cin >> object.name;
  307.     SetConsoleCP(866);
  308.     std::cout << "Введите фамилию пользователя: ";
  309.     SetConsoleCP(1251);
  310.     std::cin >> object.surname;
  311.     SetConsoleCP(866);
  312.     std::cout << "Введите возраст пользователя: ";
  313.     std::cin >> valuecheck;
  314.     object.age = static_cast<int>(valueCheck(valuecheck));
  315.     std::cout << "Введите рост пользователя: ";
  316.     std::cin >> valuecheck;
  317.     object.height = static_cast<float>(valueCheck(valuecheck));
  318.     std::cout << "Введите вес пользователя: ";
  319.     std::cin >> valuecheck;
  320.     object.weight = static_cast<float>(valueCheck(valuecheck));
  321.     return is;
  322. }
  323. double valueCheck(std::string value) {
  324.     int temp;
  325.     for (int i = 0; i < value.size(); i++) {
  326.         if (value[i] == '.') {
  327.             value[i] = ',';
  328.         }
  329.         if (value[i] == ',') {
  330.             temp = i + 1;
  331.             for (; temp < value.size(); temp++) {
  332.                 if (value[temp] == ',' || value[temp] == '.') {
  333.                     for (; temp < value.size(); temp++) {
  334.                         value[temp] = value[temp + 1];
  335.                     }
  336.                     temp = i + 1;
  337.                 }
  338.             }
  339.         }
  340.         if ((value[i] < 48 && value[i] != 43 && value[i] != 44 && value[i] != 45 && value[i] != 0) || value[i] > 57) {
  341.             temp = i;
  342.             for (; temp < value.size(); temp++) {
  343.                 value[temp] = value[temp + 1];
  344.             }
  345.             i--;
  346.         }
  347.     }
  348.     if (value[0] == '\0') {
  349.         value[0] = '0';
  350.         value[1] = '\0';
  351.     }
  352.     return std::stod(value);
  353. }
  354. void SetCountID(int value) {
  355.     DataBase::count = value;
  356. }
  357. void RefreshIDs(DataBase*&object, int size) {
  358.     for (int i = 0; i < size; i++) {
  359.         object[i].ID = i + 1;
  360.     }
  361. }
Advertisement
Add Comment
Please, Sign In to add comment