Advertisement
Guest User

1

a guest
Apr 22nd, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.72 KB | None | 0 0
  1.  
  2. //Класс Персона. Данные: имя, возраст, должность, оклад.
  3.  
  4. #include <iostream>
  5. #include <clocale>
  6. #include <string.h>
  7. #include <stdio.h>
  8.  
  9. using namespace std;
  10.  
  11. class Person //Класс Персона
  12. {
  13. public:
  14.  
  15.     Person(): m_name(NULL), m_age(0), m_position(NULL), m_salary(0) {} // Конструктор по умолчанию
  16.  
  17.     Person(char *name, int age, char *position, int salary)
  18.     {
  19.         m_age = age;
  20.         m_salary = salary;
  21.        
  22.         m_name = new char[strlen(name) + 1]; //Динамически даем указателю на name место для строки
  23.         strcpy(m_name, name); //Заносим туда всё, что было в строке параметра
  24.  
  25.         m_position = new char[strlen(name) + 1];
  26.         strcpy(m_position, position);
  27.         //привязываем к указателю динамический массив
  28.         //длиной в исходную строку +1 (для нулевого символа),
  29.         //и записываем туда строку-параметр
  30.     }
  31.  
  32.     Person(const Person &obj) //Конструктор копирования
  33.     {
  34.         m_age = obj.m_age;
  35.         m_salary = obj.m_salary;
  36.  
  37.         m_name = new char[strlen(obj.m_name) + 1];
  38.         strcpy(m_name, obj.m_name);
  39.  
  40.         m_position = new char[strlen(obj.m_position) + 1];
  41.         strcpy(m_position, obj.m_position);
  42.         //Вместо того, чтобы написать name = obj.name,
  43.         //мы выделяем память под новую строку и записываем туда
  44.         //содержимое исходной. Иначе при удалении второго объекта
  45.         //удалится и память, выделенная для исходного name, даже
  46.         //если основной объект, включающий name, будет всё еще жить.
  47.  
  48.     }
  49.  
  50.     ~Person() // Деструктор для освобождения выделенной памяти
  51.     {
  52.         delete [] m_name;
  53.         delete [] m_position;
  54.     }
  55.  
  56.     void show()
  57.     {
  58.         cout << m_name << endl;
  59.         cout << m_age << " y.o." << endl;
  60.         cout << m_position << endl;
  61.         cout << "Оклад - " << m_salary << endl;
  62.     }
  63.    
  64.     int getSalary() { return m_salary; }
  65.    
  66.    
  67. private:
  68.     char *m_name;     //имя
  69.     int m_age;        //возраст
  70.     char *m_position; //должность
  71.     int m_salary;     //оклад
  72. };
  73.  
  74. void personSort(Person** A, unsigned N)// Сортировка Шелла, заменяем только строку, где сравниваются значения
  75. {
  76.     unsigned i, j, k;
  77.     Person* t;
  78.     for(k = N / 2; k > 0; k /= 2)
  79.         for(i = k; i < N; i++)
  80.         {
  81.             t = A[i];
  82.             for(j = i; j >= k; j -= k)
  83.             {
  84.                 if(t->getSalary() < A[j - k]->getSalary()) // сравниваем оклады
  85.                     A[j] = A[j - k];
  86.                 else
  87.                     break;
  88.             }
  89.             A[j] = t;
  90.         }
  91. }
  92.  
  93. int main()
  94. {
  95.     setlocale(LC_CTYPE, "rus");
  96.  
  97.     unsigned size = 0;
  98.     do
  99.     {
  100.         cout << "Введите размер массивов: ";
  101.         cin >> size;
  102.     }
  103.     while(size == 0);
  104.  
  105.     Person** array1 = new Person*[size];
  106.     Person** array2 = new Person*[size];
  107.  
  108.     for (int i = 0; i < size; ++i)
  109.     {
  110.         cout << "Введите данные о персоне №" << i + 1 << ":" << endl;
  111.        
  112.         char name[256];
  113.         char position[256];
  114.         int age;
  115.         int salary;
  116.        
  117.         cout << "Введите имя: ";
  118.         cin >> name;
  119.         cout << "Введите должность: ";
  120.         cin >> position;
  121.         cout << "Введите возраст: ";
  122.         cin >> age;
  123.         cout << "Введите оклад: ";
  124.         cin >> salary;
  125.        
  126.         array1[i] = new Person(name, age, position, salary);
  127.         array2[i] = new Person(*array1[i]); // Копируем введеную персону во второй массив
  128.     }
  129.  
  130.     personSort(array2, size);
  131.  
  132.  
  133.     cout << "Неотсортированный массив:" << endl;
  134.     for (int i = 0; i < size; ++i) {
  135.         array1[i]->show();
  136.     }
  137.  
  138.  
  139.     cout << "Отсортированный массив:" << endl;
  140.     for (int i = 0; i < size; ++i)
  141.     {
  142.         array2[i]->show();
  143.     }
  144.  
  145.  
  146.     for (int i = 0; i < size; ++i)// Освобождаем память
  147.     {
  148.         delete array1[i];
  149.         delete array2[i];
  150.     }
  151.  
  152.     delete [] array1;
  153.     delete [] array2;
  154.  
  155.     return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement