Advertisement
MARSHAL327

Untitled

Nov 27th, 2019
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <string>
  5. #include <windows.h>
  6. #include <conio.h>
  7. #include <stdio.h>
  8. #include <cwchar>
  9. #include <winuser.h>
  10. #include <tchar.h>
  11. using namespace std;
  12. //===============================================Global_Elemenst================================================
  13. string File_name;
  14. float total_elements = 0;
  15. int num_pages = 5,
  16. width = 0,
  17. height = 0;
  18. //===============================================Menu_Names===============================================
  19. const string items[9] = {
  20.     "   Add              ",
  21.     "   Delete All       ",
  22.     "   Delete First     ",
  23.     "   View             ",
  24.     "   Read File(txt)   ",
  25.     "   Save File(txt)   ",
  26.     "   Read File(bin)   ",
  27.     "   Save File(bin)   ",
  28.     "   Exit             " };
  29. //===============================================Sort_Names===============================================
  30. const string sort_items[6] = {
  31.     "| Name                       ",
  32.     "Bithday  ",
  33.     "Sex ",
  34.     "Weight ",
  35.     "Rang "
  36.     "Team         |" };
  37. //===============================================Buttons===============================================
  38. const int up = 72,
  39. down = 80,
  40. right_btn = 77,
  41. left_btn = 75,
  42. enter = 13,
  43. esc = 27,
  44. del = 83;
  45. //===============================================Data============================
  46. struct info {
  47.     string Name;
  48.     string Birthday;
  49.     string Sex;
  50.     string Weight;
  51.     string Rank;
  52.     string Team;
  53. };
  54. //===============================================List============================
  55. struct Sportsman {
  56.     info D;
  57.     Sportsman* next;
  58.     Sportsman* prev;
  59. };
  60. //===============================================Interface===============================================
  61. Sportsman* Add(Sportsman* right, const Sportsman& S);
  62. Sportsman* Add_first(const Sportsman& S);
  63. Sportsman* Del(Sportsman* left);
  64. Sportsman Information();
  65. void Print(const Sportsman& S);
  66. void Watch(Sportsman* left);
  67. void Read_File(string File_name, Sportsman** left, Sportsman** right);
  68. void Write_File(string File_name, Sportsman* left);
  69. void SetColor(int text, int bg);
  70. void print_menu(int sym, const string items[], const int N_ITEMS);
  71. void cls();
  72. void gotoxy(int xpos, int ypos);
  73. int menu(int& active, const string items[], int num_el);
  74. int Read_Bin_File(string filename, Sportsman** left, Sportsman** right);
  75. void Write_Bin_File(string File_name, Sportsman* left);
  76. void clearRow(int row);
  77.  
  78. //===============================================_Main_===============================================
  79. int main() {
  80.     Sportsman* left = 0,
  81.         * right = 0;
  82.     //========================================Width/height_OF_Window=======================================
  83.     HANDLE hCon;
  84.     hCon = GetStdHandle(-12);
  85.     CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
  86.     if (GetConsoleScreenBufferInfo(hCon, &consoleInfo))
  87.     {
  88.         width = consoleInfo.srWindow.Right - consoleInfo.srWindow.Left + 1;
  89.         height = consoleInfo.srWindow.Bottom - consoleInfo.srWindow.Top + 1;
  90.     }
  91.     //========================================Open_Full_Winodw=======================================
  92.     ShowWindow(GetConsoleWindow(), SW_MAXIMIZE);
  93.     //============================================Case======================================================
  94.     int current = 1;
  95.     //      Read_File("1.txt", &left, &right);
  96.     while (1)
  97.     {
  98.         switch (menu(current, items, 9))
  99.         {
  100.         case 1:
  101.             system("cls");
  102.             if (left) right = Add(right, Information());
  103.             else {
  104.                 left = Add_first(Information());
  105.                 right = left;
  106.             } break;
  107.         case 2:
  108.             system("cls");
  109.             while (left)
  110.                 left = Del(left);
  111.             cout << "Press any key" << endl;
  112.             cin.get();
  113.             break;
  114.         case 3:
  115.             system("cls");
  116.             left = Del(left);
  117.             cout << "Press any key" << endl;
  118.             cin.get();
  119.             break;
  120.         case 4:
  121.             system("cls");
  122.             cout << "Name " << setw(24) << "|";
  123.             cout << " Birthday" << setw(4) << "|";
  124.             cout << " Sex " << "|";
  125.             cout << " Weight " << "|";
  126.             cout << " Rank " << "|";
  127.             cout << " Team " << setw(14) << "|" << endl;
  128.             Watch(left);
  129.             break;
  130.  
  131.         case 5:
  132.             system("cls");
  133.             cout << "Choose Name of the File" << endl;
  134.             cin >> File_name;
  135.             Read_File(File_name, &left, &right);
  136.             break;
  137.         case 6:
  138.             system("cls");
  139.             cout << "Choose Name of the File" << endl;
  140.             cin >> File_name;
  141.             Write_File(File_name, left);
  142.             break;
  143.         case 7:
  144.             system("cls");
  145.             cout << "Choose Name of the File" << endl;
  146.             cin >> File_name;
  147.             Read_Bin_File(File_name, &left, &right);
  148.             break;
  149.         case 8:
  150.             system("cls");
  151.             cout << "Choose Name of the File" << endl;
  152.             cin >> File_name;
  153.             Write_Bin_File(File_name, left);
  154.             break;
  155.         case 9:
  156.             return 0;
  157.             break;
  158.  
  159.         }
  160.     }
  161. }
  162. //=============================================Functions============================
  163. //=============================================Add==================================
  164. Sportsman* Add(Sportsman* right, const Sportsman& S) {
  165.     Sportsman* newE = new Sportsman;
  166.     *newE = S;
  167.     newE->next = 0;
  168.     right->next = newE;
  169.     right = newE;
  170.     return right;
  171. }
  172. //=============================================Add_First==============================
  173. Sportsman* Add_first(const Sportsman& S) {
  174.     Sportsman* left = new Sportsman;
  175.     *left = S;
  176.     left->next = 0;
  177.     return left;
  178. }
  179. //=============================================Delete=============================================
  180. Sportsman* Del(Sportsman* left) {
  181.     Sportsman* temp;
  182.     if (!left) { cout << "Empty" << endl; return 0; }
  183.     else {
  184.         temp = left;
  185.         left = left->next;
  186.         delete temp;
  187.     }
  188.     return left;
  189. }
  190. //=============================================Information=============================================
  191. Sportsman Information() {
  192.     struct Sportsman S;
  193.     cout << "Choose Name" << endl;
  194.     getline(cin, S.D.Name);
  195.     cout << "Choose Birthday" << endl;
  196.  
  197.     do {
  198.         int length = 0;
  199.         int pospos = 0;
  200.         int posarrays[8] = { 0, 1, 3, 4, 6, 7, 8, 9 };
  201.         int pos = posarrays[pospos];
  202.         S.D.Birthday = "__.__.____";
  203.         cout << S.D.Birthday;
  204.         while (length != 8) {
  205.             int ch = _getch();
  206.             if (ch == 8 && length != 0) {
  207.                 length--;
  208.                 S.D.Birthday[pos - ((length == 3 || length == 1) ? 2 : 1)] = '_'; // пропускаем точки
  209.                 gotoxy(0, 3);
  210.                 pospos--;
  211.                 pos = posarrays[pospos];
  212.                 cout << S.D.Birthday;
  213.             }
  214.             else if (ch >= '0' && ch <= '9') {
  215.                 length++;
  216.                 S.D.Birthday[pos] = ch;
  217.                 gotoxy(0, 3);
  218.                 pospos++;
  219.                 pos = posarrays[pospos];
  220.                 cout << S.D.Birthday;
  221.             }
  222.         }
  223.         int Day = stoi(S.D.Birthday.substr(0, 2));
  224.         int Month = stoi(S.D.Birthday.substr(3, 2));
  225.         int Year = stoi(S.D.Birthday.substr(6, 4));
  226.         int days_in_month[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  227.         if (Year % 4 == 0)
  228.             days_in_month[2] = 29;
  229.         if ((Month < 1) || (Month > 12))
  230.             MessageBox(0, L"Wrong Month!", L"Warning", MB_ICONWARNING | MB_SETFOREGROUND);
  231.         else if ((Day < 1) || (Day > days_in_month[Month]))
  232.             MessageBox(0, L"Wrong Day!", L"Warning", MB_ICONWARNING | MB_SETFOREGROUND);
  233.         else break;
  234.  
  235.         gotoxy(0, 3);
  236.         clearRow(4);
  237.     } while (true);
  238.  
  239.  
  240.     cout << "\nChoose Sex" << endl;
  241.     getline(cin, S.D.Sex);
  242.     cout << "Choose Weight" << endl;
  243.     getline(cin, S.D.Weight);
  244.     cout << "Choose Rank" << endl;
  245.     getline(cin, S.D.Rank);
  246.     cout << "Choose Team" << endl;
  247.     getline(cin, S.D.Team);
  248.     return S;
  249. }
  250. // ==========ОЧИСТКА СТРОКИ==========
  251. void clearRow(int row)
  252. {
  253.     DWORD a;
  254.     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); // получаем хэндл окна консоли
  255.     COORD coord = { 0, row - 1 }; // получаем координаты строки для очистки
  256.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  257.     GetConsoleScreenBufferInfo(hStdOut, &csbi); // получаем данные из буфера вывода консоли
  258.     FillConsoleOutputCharacter(hStdOut, ' ', 80, coord, &a); // заполняем строку пробелами
  259. }
  260. // ===================================Gotoxy==========================
  261. void gotoxy(int xpos, int ypos)
  262. {
  263.     COORD scrn;
  264.     HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
  265.     scrn.X = xpos; scrn.Y = ypos;
  266.     SetConsoleCursorPosition(hOuput, scrn);
  267. }
  268. //=================================SetColor================================
  269. void SetColor(int text, int bg) {
  270.     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  271.     SetConsoleTextAttribute(hStdOut, (WORD)((bg << 4) | text));
  272. }
  273. //=================================Print_Menu=================================
  274. void print_menu(int sym, const string items[], const int N_ITEMS) {
  275.     for (int i = 1; i <= N_ITEMS; i++) {
  276.         SetColor(7, 0);
  277.         gotoxy((width/2)-6, (height/2)+i - 3);
  278.         if (i == sym) {
  279.             SetColor(7, 12);
  280.         }
  281.         cout << items[i - 1] << endl;
  282.         SetColor(7, 0);
  283.     }
  284. }
  285. //=================================Menu=================================
  286. int menu(int& active, const string items[], int num_el) {
  287.     wint_t buf;
  288.     do {
  289.         system("cls");
  290.         print_menu(active, items, num_el);
  291.         buf = _getwch();
  292.         switch (buf) {
  293.         case up:
  294.             if (active > 1) active--;
  295.             break;
  296.         case down:
  297.             if (active < num_el) active++;
  298.             break;
  299.         case enter:
  300.             return active;
  301.         case esc:
  302.             return -1;
  303.         case del:
  304.             return -active;
  305.         }
  306.     } while (1);
  307. }
  308. //===============================================Print=============================================
  309. void Print(const Sportsman & S) {
  310.     cout << S.D.Name << setw(30 - S.D.Name.length()) << " | ";
  311.     cout << S.D.Birthday << " | ";
  312.     cout << " " << S.D.Sex << "  | ";
  313.     cout << S.D.Weight << setw(9 - S.D.Weight.length()) << " | ";
  314.     cout << S.D.Rank << "    | ";
  315.     cout << S.D.Team << setw(20 - S.D.Team.length()) << " | " << endl;
  316. }
  317. //===============================================Watch=============================================
  318. void Watch(Sportsman * left) {
  319.     if (!left) { cout << "Empty" << endl; cin.get(); return; }
  320.     Sportsman* temp = left;
  321.     cout << "====================================================================================" << endl;
  322.     while (temp) {
  323.         Print(*temp);
  324.         temp = temp->next;
  325.     }
  326.     cout << "====================================================================================" << endl;
  327.     cout << "Press any key" << endl;
  328.     wint_t buf = _getwch();
  329. }
  330. //===============================================CLS=============================================
  331. void cls() {
  332.     HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
  333.     COORD cd;
  334.     cd.X = 0;
  335.     cd.Y = 0;
  336.     SetConsoleCursorPosition(hd, cd);
  337. }
  338. //===============================================Read_File=============================================
  339. void Read_File(string File_name, Sportsman * *left, Sportsman * *right) {
  340.     ifstream File_in;
  341.     File_in.open(File_name);
  342.     if (!File_in) {
  343.         MessageBox(0, L"Trere is no File!", L"ERROR", MB_ICONERROR | MB_SETFOREGROUND);
  344.         return;
  345.     }
  346.     Sportsman S;
  347.     *left = 0;
  348.     while (getline(File_in, S.D.Name)) {
  349.         getline(File_in, S.D.Birthday);
  350.         getline(File_in, S.D.Sex);
  351.         getline(File_in, S.D.Weight);
  352.         getline(File_in, S.D.Rank);
  353.         getline(File_in, S.D.Team);
  354.         if (*left)
  355.             * right = Add(*right, S);
  356.         else {
  357.             *left = Add_first(S); *right = *left;
  358.         }
  359.         total_elements++;
  360.     }
  361.     File_in.close();
  362.     return;
  363. }
  364. //===============================================Write_File=============================================
  365. void Write_File(string File_name, Sportsman * left) {
  366.     ofstream File_out;
  367.     File_out.open(File_name);
  368.     if (!File_out) {
  369.         MessageBox(0, L"Trere is no File!", L"ERROR", MB_ICONERROR | MB_SETFOREGROUND);
  370.         return;
  371.     }
  372.     while (left) {
  373.         File_out << left->D.Name << endl;
  374.         File_out << left->D.Birthday << endl;
  375.         File_out << left->D.Sex << endl;
  376.         File_out << left->D.Weight << endl;
  377.         File_out << left->D.Rank << endl;
  378.         File_out << left->D.Team << endl;
  379.         left = left->next;
  380.     }
  381.     File_out.close();
  382.     return;
  383. }
  384. //===================================================Bin_File(Read)=========================
  385. int Read_Bin_File(string filename, Sportsman * *left, Sportsman * *right) {
  386.     total_elements = 0;
  387.     ifstream file_read;
  388.     file_read.open(filename, ios::binary);
  389.  
  390.     if (!file_read) {
  391.         MessageBox(0, L"There is no file!", L"Error", MB_ICONERROR | MB_SETFOREGROUND);
  392.         return 1;
  393.     }
  394.     file_read.seekg(ios_base::beg);
  395.     Sportsman* S = new Sportsman;
  396.     S->next = NULL;
  397.     S->prev = NULL;
  398.     *left = 0;
  399.  
  400.     while (file_read.read((char*)& S->D, sizeof(S->D))) {
  401.         if (*left)
  402.             * right = Add(*right, *S);
  403.         else {
  404.             *left = Add_first(*S); *right = *left;
  405.         }
  406.         total_elements++;
  407.     }
  408.  
  409.     file_read.close();
  410.     return 0;
  411. }
  412. //===================================================Bin_File(Write)=========================
  413. void Write_Bin_File(string File_name, Sportsman * left) {
  414.     ofstream File_Bin_Write;
  415.     File_Bin_Write.open(File_name, ios::binary | ios::out);
  416.     if (!File_Bin_Write) {
  417.         MessageBox(0, L"Trere is no File!", L"ERROR", MB_ICONERROR | MB_SETFOREGROUND);
  418.         return;
  419.     }
  420.     while (left) {
  421.         File_Bin_Write.write((char*)& left->D, sizeof left->D);
  422.         left = left->next;
  423.     }
  424.     File_Bin_Write.close();
  425.     return;
  426. }
  427. //====================================================Wrong_Type_Errors============================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement