x2311

Untitled

Jun 7th, 2022
1,181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <new>
  3. #include <fstream>
  4. #include <sstream>
  5. #include <string>
  6.  
  7. using namespace std;
  8. struct UserInformation {
  9.     string name; // the name of the applicant
  10.     int averageScore{};  //average score
  11. };
  12.  
  13. // клас, що реалізує стек у вигляді динамічного масиву
  14. template<typename T>
  15. class STACK {
  16. private:
  17.     T *stack; // Динамічний масив-покажчик на стек
  18.     int count; // Вершина стеку - к-сть елементів типу T в стеку
  19.  
  20. public:
  21.     // конструктор за замовчуванням
  22.     STACK() {
  23.         stack = nullptr; // необов'язково
  24.         count = 0; // к-сть елементів у стеку визначається за значенням count
  25.     }
  26.  
  27.     // помістити елемент в стек
  28.     void push(T item) {
  29.         T *tmp; // тимчасовий покажчик
  30.  
  31.         // блок try необхідний для перехоплення виключення, якщо пам'ять не виділиться
  32.         try {
  33.             // покажчик показує на stack (щоб не загубити адресу покажчика stack)
  34.             tmp = stack;
  35.  
  36.             // виділити пам'ять на 1 елемент більше, ніж було виділено перед цим в стеку
  37.             stack = new T[count + 1];
  38.  
  39.             // збільшити кількість елементів в стеку на 1
  40.             count++;
  41.  
  42.             // скопіювати дані з пам'яті, на яку вказує tmp в пам'ять,
  43.             // на яку вказує stack
  44.             for (int i = 0; i < count - 1; i++)
  45.                 stack[i] = tmp[i];
  46.  
  47.             // додати останній елемент
  48.             stack[count - 1] = item;
  49.  
  50.             // звільнити пам'ять, яка була перед цим виділена для stack,
  51.             // на цю пам'ять вказує tmp
  52.             if (count > 1)
  53.                 delete[] tmp;
  54.         }
  55.         catch (bad_alloc e) {
  56.             // якщо пам'ять не виділилась
  57.             cout << e.what() << endl;
  58.         }
  59.     }
  60.  
  61.     // конструктор копіювання STACK(const STACK&) - необхідний для уникнення
  62.     // недоліків побітового копіювання
  63.     STACK(const STACK &st) {
  64.         try {
  65.             // 1. Виділити нову ділянку пам'яті для масиву stack
  66.             stack = new T[st.count];
  67.  
  68.             // 2. Скопіювати дані з st в поточний об'єкт
  69.             count = st.count;
  70.             for (int i = 0; i < count; i++)
  71.                 stack[i] = st.stack[i];
  72.         }
  73.         catch (bad_alloc e) {
  74.             // якщо пам'ять не виділилась, то вивести відповідне повідомлення
  75.             cout << e.what() << endl;
  76.         }
  77.     }
  78.  
  79.     // операторна функція operator=(const STACK&) - необхідна для уникнення
  80.     // недоліків побітового копіювання
  81.     STACK operator=(const STACK &st) {
  82.         // Потрібно скопіювати з st в поточний об'єкт
  83.         // 1. Звільнити попередньо виділену пам'ять для поточного об'єкту
  84.         if (count > 0) {
  85.             count = 0;
  86.             delete[] stack; // звільнити пам'ять під попередній масив
  87.         }
  88.  
  89.         // 2. Виділити нову ділянку пам'яті для масиву stack
  90.         try {
  91.             // спроба виділити пам'ять
  92.             stack = new T[st.count];
  93.  
  94.             // 3. Скопіювати дані з st в поточний об'єкт
  95.             count = st.count;
  96.             for (int i = 0; i < count; i++)
  97.                 stack[i] = st.stack[i];
  98.         }
  99.         catch (bad_alloc e) {
  100.             // якщо не вдалось виділити пам'ять, то вивести відповідне повідомлення
  101.             cout << e.what() << endl;
  102.         }
  103.  
  104.         // 4. Повернути поточний об'єкт
  105.         return *this;
  106.     }
  107.  
  108.     // Деструктор - звільняє пам'ять
  109.     ~STACK() {
  110.         if (count > 0)
  111.             delete[] stack;
  112.     }
  113.  
  114.     // Кількість елементів у стеку
  115.     int Count() {
  116.         return count;
  117.     }
  118.  
  119.     // Функція, що виводить стек
  120.     void Print(int o) {
  121.         T *p; // тимчасовий покажчик, рухається по елементах стеку
  122.  
  123.         // 1. Встановити покажчик p на вершину стеку
  124.         p = stack;
  125.  
  126.         // 2. Вивід
  127.         if (count == 0)
  128.             cout << "is empty." << endl;
  129.         if (o == -1) {
  130.             for (int i = 0; i < count; i++) {
  131.                 cout << *p;
  132.                 p++; // прокрутити покажчик на наступний елемент
  133.             }
  134.         } else {
  135.             for (int i = count - o; i < count; i++) p++;
  136.  
  137.             cout << *p;
  138.         }
  139.     }
  140. };
  141.  
  142. int main() {
  143.     //---------------------------------------------------------------------------
  144.     STACK<UserInformation> ST;
  145.     UserInformation temporaryStructure;
  146.  
  147.     STACK<int> stX;
  148.     STACK<string> stY;
  149.     //import file
  150.     ifstream file;
  151.     file.open("..\\tess.txt");
  152.  
  153.     //read line by line and write to database
  154.     string line;
  155.     int min = -1;
  156.  
  157.     while (getline(file, line)) {
  158.         stringstream word(line);
  159.         word >> temporaryStructure.name;
  160.         word >> temporaryStructure.averageScore;
  161.         if (min == -1 || min > temporaryStructure.averageScore) {
  162.             min = temporaryStructure.averageScore;
  163.             stX = *new STACK<int>;
  164.             stY = *new STACK<string>;
  165.             stX.push(temporaryStructure.averageScore);
  166.             stY.push(temporaryStructure.name);
  167.         } else if (min == temporaryStructure.averageScore) {
  168.             stX.push(temporaryStructure.averageScore);
  169.             stY.push(temporaryStructure.name);
  170.         }
  171.  
  172.     }
  173.     cout << "---[1]---" << endl;
  174.  
  175.     for (int i = 0; i < stY.Count(); i++) {
  176.         stY.Print(i);
  177.         cout << " ";
  178.         stX.Print(i);
  179.         cout << endl;
  180.     }
  181.    
  182.  
  183.     cout << endl << endl << "-------------------------" << endl;
  184.     //---------------------------------------------------------------------------
  185. }
Advertisement
Add Comment
Please, Sign In to add comment