Advertisement
believe_me

Untitled

May 19th, 2022
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8.  
  9. int inputIntegerNumber(const int MIN_NUMBER, const int MAX_NUMBER) {
  10.     bool IsIncorrect;
  11.     int Number;
  12.     std::string input = "";
  13.     do {
  14.         getline(cin, input);
  15.         IsIncorrect = false;
  16.         try {
  17.             Number = stoi(input);
  18.         }
  19.         catch (invalid_argument ex) {
  20.             cout << "Введите число:\n";
  21.             IsIncorrect = true;
  22.         }
  23.         catch (out_of_range ex) {
  24.             cout << "Число не должно быть меньше " << MIN_NUMBER << " и больше, чем "
  25.                 << MAX_NUMBER << "\n";
  26.             IsIncorrect = true;
  27.         }
  28.         if (!IsIncorrect && (Number <  MIN_NUMBER || Number > MAX_NUMBER)) {
  29.             cout << "Число не должно быть меньше " << MIN_NUMBER << " и больше, чем "
  30.                 << MAX_NUMBER << "\n";
  31.             IsIncorrect = true;
  32.         }
  33.     } while (IsIncorrect);
  34.     return Number;
  35. }
  36.  
  37.  
  38. bool checkExtension(const string& PathToFile) {
  39.     const string extension = "txt";
  40.     bool Flag;
  41.     if (PathToFile.length() > 4 && PathToFile.substr(PathToFile.length() - 3) == extension) {
  42.         Flag = true;
  43.     }
  44.     else {
  45.         cout << "Неверное расширение.\n";
  46.         Flag = false;
  47.     }
  48.     return Flag;
  49. }
  50.  
  51.  
  52. bool checkPermissionForWriting(const string& PathToFile) {
  53.     bool Flag;
  54.     ofstream FileOut(PathToFile);
  55.     if (FileOut.is_open()) {
  56.         FileOut.close();
  57.         Flag = true;
  58.     }
  59.     else {
  60.         cout << "Файл не доступен для записи.\n";
  61.         Flag = false;
  62.     }
  63.     return Flag;
  64. }
  65.  
  66. bool checkPermissionForReading(const string& PathToFile) {
  67.     bool Flag;
  68.     ifstream FileIn(PathToFile);
  69.     if (FileIn.is_open()) {
  70.         FileIn.close();
  71.         Flag = true;
  72.     }
  73.     else {
  74.         cout << "Файл не доступен для чтения.\n";
  75.         Flag = false;
  76.     }
  77.     return Flag;
  78. }
  79.  
  80.  
  81. const string inputPathToFileForReading() {
  82.     string PathToFile;
  83.     do {
  84.         cout << "Введите путь к файлу для чтения:\n";
  85.         getline(cin, PathToFile);
  86.     } while (!checkExtension(PathToFile) || !checkPermissionForReading(PathToFile));
  87.     return PathToFile;
  88. }
  89.  
  90.  
  91. bool checkFile(const string PathToFile) {
  92.     bool Flag = true;
  93.     int CurrentNumber;
  94.     ifstream InputFile(PathToFile);
  95.     while ((Flag) && (!InputFile.eof())) {
  96.         try {
  97.             InputFile >> CurrentNumber;
  98.         }
  99.         catch (invalid_argument ex) {
  100.             cout << "Некорректные данные в файле.";
  101.             Flag = false;
  102.         }
  103.         catch (out_of_range ex) {
  104.             cout << "Некорректные данные в файле.";
  105.             Flag = false;
  106.         }
  107.         if (!Flag && (CurrentNumber < 0 || CurrentNumber > 20)) {
  108.             cout << "Некорректные данные в файле.";
  109.             Flag = false;
  110.         }
  111.     }
  112.     InputFile.close();
  113.     return Flag;
  114. }
  115.  
  116.  
  117.  
  118. const string inputPathToFileForWriting() {
  119.     string PathToFile;
  120.     do {
  121.         cout << "Введите путь к файлу для записи: \n";
  122.         getline(cin, PathToFile);
  123.     } while (!checkExtension(PathToFile) || !checkPermissionForWriting(PathToFile) || !checkFile(PathToFile));
  124.     return PathToFile;
  125. }
  126.  
  127.  
  128. typedef struct Node* PNode;
  129.  
  130. struct Node {
  131.     PNode Next;
  132.     int Value;
  133. };
  134.  
  135.  
  136. struct List {
  137.     PNode PHeader;
  138.     bool IsCreated = false;
  139.     List() : PHeader(new struct Node) {}
  140.  
  141.  
  142.     void create() {
  143.         PHeader->Next = PHeader;
  144.         IsCreated = true;
  145.         cout << "Список создан.\n";
  146.     }
  147.  
  148.  
  149.     bool isEmpty() {
  150.         if (PHeader->Next == PHeader)
  151.             return true;
  152.         else
  153.             return false;
  154.     }
  155.  
  156.  
  157.     void push(int Data) {
  158.         PNode PCurrentNode = PHeader->Next;
  159.         while (PCurrentNode->Next != PHeader)
  160.             PCurrentNode = PCurrentNode->Next;
  161.         PCurrentNode->Next = new struct Node;
  162.         PCurrentNode = PCurrentNode->Next;
  163.         PCurrentNode->Value = Data;
  164.         PCurrentNode->Next = PHeader;
  165.     }
  166.  
  167.  
  168.     int length() {
  169.         int Length = 0;
  170.         PNode PCurrentNode = PHeader->Next;
  171.         while (PCurrentNode != PHeader) {
  172.             PCurrentNode = PCurrentNode->Next;
  173.             Length++;
  174.         }
  175.         return Length;
  176.     }
  177.  
  178.  
  179.     void deleteList() {
  180.         PNode PCurrentNode = PHeader->Next;
  181.         PNode PTemp;
  182.         while (PCurrentNode != PHeader) {
  183.             PTemp = PCurrentNode;
  184.             PCurrentNode = PCurrentNode->Next;
  185.             free(PTemp);
  186.         }
  187.         PHeader->Next = PHeader;
  188.     }
  189.  
  190.  
  191.     void remove(int Index, int NumberOfElementsToDelete) {
  192.         if (NumberOfElementsToDelete >= length())
  193.             deleteList();
  194.         else {
  195.             int Counter = 1;
  196.             int NumberOfDeleted = 0;
  197.             PNode PTempHeader = PHeader;
  198.             PNode PCurrentNode = PTempHeader->Next;
  199.             PNode PDeletingNode = nullptr;
  200.             while (NumberOfDeleted != NumberOfElementsToDelete) {
  201.                 if (PCurrentNode->Next == PTempHeader) {
  202.                     if ((Counter + 1) % Index == 0) {
  203.                         PDeletingNode = PTempHeader->Next;
  204.                         PTempHeader->Next = PTempHeader->Next->Next;
  205.                         PCurrentNode = PTempHeader->Next;
  206.                         free(PDeletingNode);
  207.                         NumberOfDeleted++;
  208.                         Counter++;
  209.                     }
  210.                     else
  211.                         PCurrentNode = PTempHeader->Next;
  212.                     Counter++;
  213.                 }
  214.                 else {
  215.                     if ((Counter + 1) % Index == 0) {
  216.                         PDeletingNode = PCurrentNode->Next;
  217.                         PCurrentNode->Next = PCurrentNode->Next->Next;
  218.                         PCurrentNode = PCurrentNode->Next;
  219.                         free(PDeletingNode);
  220.                         NumberOfDeleted++;
  221.                         Counter++;
  222.                     }
  223.                     else
  224.                         PCurrentNode = PCurrentNode->Next;
  225.                     Counter++;
  226.                 }
  227.             }
  228.             PHeader = PTempHeader;
  229.         }
  230.     }
  231.  
  232.  
  233.     string toString() {
  234.         PNode PCurrentNode = PHeader->Next;
  235.         string ResultString = " - ";
  236.         while (PCurrentNode != PHeader){
  237.             ResultString += to_string(PCurrentNode->Value) + " - ";
  238.             PCurrentNode = PCurrentNode->Next;
  239.         }
  240.         return ResultString;
  241.     }
  242.  
  243. };
  244.  
  245. void saveToFile(List& CircleList) {
  246.     if (!CircleList.isEmpty()) {
  247.         string path = inputPathToFileForWriting();
  248.         string ResultString = CircleList.toString();
  249.         ofstream fileOut;
  250.         fileOut.open(path, ios::trunc);
  251.         fileOut << "Итоговый список:\n" << ResultString;
  252.         fileOut.close();
  253.         cout << "Информация записана в файл.\n";
  254.     }
  255.     else
  256.         cout << "Список пуст.\n";
  257. }
  258.  
  259.  
  260. void add(List &CircleList) {
  261.     if (CircleList.IsCreated) {
  262.         int NumberOfElements = 0;
  263.         cout << "Введите количество элементов для добавления:\n";
  264.         NumberOfElements = inputIntegerNumber(1, 10);
  265.         int Data = 0;
  266.         for (int i = 0; i < NumberOfElements; i++) {
  267.             cout << "Введите значение элемента: ";
  268.             Data = inputIntegerNumber(0, 20);
  269.             CircleList.push(Data);
  270.             cout << '\n';
  271.         }
  272.     }
  273.     else
  274.         cout << "Создайте список.\n";
  275. }
  276.  
  277.  
  278. vector<int> receiveNumbersFromFile() {
  279.     string PathToFile = inputPathToFileForReading();
  280.     vector<int> Elements;
  281.     int CurrentNumber;
  282.     ifstream InputFile(PathToFile);
  283.     while (!InputFile.eof()) {
  284.         InputFile >> CurrentNumber;
  285.         Elements.push_back(CurrentNumber);
  286.     }
  287.     InputFile.close();
  288.     return Elements;
  289. }
  290.  
  291.  
  292. void openFromFile(List& CircleList) {
  293.     if (CircleList.IsCreated) {
  294.         CircleList.deleteList();
  295.     }
  296.     vector<int> Elements = receiveNumbersFromFile();
  297.     CircleList.create();
  298.     for (int i = 0; i < Elements.size(); i++)
  299.         CircleList.push(Elements[i]);
  300.     cout << "Список прочитан из файла.\n";
  301. }
  302.  
  303.  
  304. void removeElements(List& CircleList) {
  305.     if (CircleList.IsCreated) {
  306.         if (CircleList.isEmpty())
  307.             cout << "Список пуст.\n";
  308.         else {
  309.             cout << "Введите позицию для удаления: ";
  310.             int Index = inputIntegerNumber(0, 20);
  311.             cout << '\n' << "Введите количество элементов для удаления: ";
  312.             int NumberOfElementsToDelete = inputIntegerNumber(1, CircleList.length());
  313.             CircleList.remove(Index, NumberOfElementsToDelete);
  314.             cout << "\nЭлементы удалены.\n";
  315.         }
  316.     }
  317.     else
  318.         cout << "Создайте список.\n";
  319. }
  320.  
  321.  
  322. void printInConsole(List& CircleList) {
  323.     if (CircleList.IsCreated) {
  324.         if (CircleList.isEmpty())
  325.             cout << "Список пуст.\n";
  326.         else
  327.             cout << "Итоговый список:\n" << CircleList.toString() << '\n';
  328.     }
  329.     else
  330.         cout << "Создайте список.\n";
  331. }
  332.  
  333.  
  334. int main() {
  335.     system("chcp 1251");
  336.     List CircleList;
  337.     bool IsEnd = false;
  338.     int CurrentInstruction = 0;
  339.     int NumberOfElements = 0;
  340.     int Index = 0;
  341.     cout << "Выберите команду:\n1 - создать пустой список;\n2 - добавить n элементов в конец списка;\n3 - Создать список по данным из файла;\n4 - начиная с начала списка, удалить m элементов через k позиций;\n5 - вывести список в консоль;\n6 - записать в файл.\n7 - завершить программу.\n";
  342.     do {
  343.         cout << "Введите команду:\n";
  344.         CurrentInstruction = inputIntegerNumber(1, 7);
  345.         switch (CurrentInstruction) {
  346.         case 1: {
  347.             CircleList.create();
  348.             break;
  349.         }
  350.         case 2: {
  351.             add(CircleList);
  352.             break;
  353.         }
  354.         case 3: {
  355.             openFromFile(CircleList);
  356.             break;
  357.         }
  358.         case 4: {
  359.             removeElements(CircleList);
  360.             break;
  361.         }
  362.         case 5: {
  363.             printInConsole(CircleList);
  364.             break;
  365.         }
  366.         case 6: {
  367.             saveToFile(CircleList);
  368.             break;
  369.         }
  370.         case 7: {
  371.             IsEnd = true;
  372.             break;
  373.         }
  374.         default: {
  375.             cout << "Неизвестная команда.\n";
  376.         }
  377.         }
  378.     } while (!IsEnd);
  379.     if (CircleList.IsCreated) {
  380.         CircleList.deleteList();
  381.         free(CircleList.PHeader);
  382.     }
  383.     cout << "Выполнение программы завершено.";
  384.     return 0;
  385. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement