Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Класс Персона. Данные: имя, возраст, должность, оклад.
- #include <iostream>
- #include <clocale>
- #include <string.h>
- #include <stdio.h>
- using namespace std;
- class Person //Класс Персона
- {
- public:
- Person(): m_name(NULL), m_age(0), m_position(NULL), m_salary(0) {} // Конструктор по умолчанию
- Person(char *name, int age, char *position, int salary)
- {
- m_age = age;
- m_salary = salary;
- m_name = new char[strlen(name) + 1]; //Динамически даем указателю на name место для строки
- strcpy(m_name, name); //Заносим туда всё, что было в строке параметра
- m_position = new char[strlen(name) + 1];
- strcpy(m_position, position);
- //привязываем к указателю динамический массив
- //длиной в исходную строку +1 (для нулевого символа),
- //и записываем туда строку-параметр
- }
- Person(const Person &obj) //Конструктор копирования
- {
- m_age = obj.m_age;
- m_salary = obj.m_salary;
- m_name = new char[strlen(obj.m_name) + 1];
- strcpy(m_name, obj.m_name);
- m_position = new char[strlen(obj.m_position) + 1];
- strcpy(m_position, obj.m_position);
- //Вместо того, чтобы написать name = obj.name,
- //мы выделяем память под новую строку и записываем туда
- //содержимое исходной. Иначе при удалении второго объекта
- //удалится и память, выделенная для исходного name, даже
- //если основной объект, включающий name, будет всё еще жить.
- }
- ~Person() // Деструктор для освобождения выделенной памяти
- {
- delete [] m_name;
- delete [] m_position;
- }
- void show()
- {
- cout << m_name << endl;
- cout << m_age << " y.o." << endl;
- cout << m_position << endl;
- cout << "Оклад - " << m_salary << endl;
- }
- int getSalary() { return m_salary; }
- private:
- char *m_name; //имя
- int m_age; //возраст
- char *m_position; //должность
- int m_salary; //оклад
- };
- void personSort(Person** A, unsigned N)// Сортировка Шелла, заменяем только строку, где сравниваются значения
- {
- unsigned i, j, k;
- Person* t;
- for(k = N / 2; k > 0; k /= 2)
- for(i = k; i < N; i++)
- {
- t = A[i];
- for(j = i; j >= k; j -= k)
- {
- if(t->getSalary() < A[j - k]->getSalary()) // сравниваем оклады
- A[j] = A[j - k];
- else
- break;
- }
- A[j] = t;
- }
- }
- int main()
- {
- setlocale(LC_CTYPE, "rus");
- unsigned size = 0;
- do
- {
- cout << "Введите размер массивов: ";
- cin >> size;
- }
- while(size == 0);
- Person** array1 = new Person*[size];
- Person** array2 = new Person*[size];
- for (int i = 0; i < size; ++i)
- {
- cout << "Введите данные о персоне №" << i + 1 << ":" << endl;
- char name[256];
- char position[256];
- int age;
- int salary;
- cout << "Введите имя: ";
- cin >> name;
- cout << "Введите должность: ";
- cin >> position;
- cout << "Введите возраст: ";
- cin >> age;
- cout << "Введите оклад: ";
- cin >> salary;
- array1[i] = new Person(name, age, position, salary);
- array2[i] = new Person(*array1[i]); // Копируем введеную персону во второй массив
- }
- personSort(array2, size);
- cout << "Неотсортированный массив:" << endl;
- for (int i = 0; i < size; ++i) {
- array1[i]->show();
- }
- cout << "Отсортированный массив:" << endl;
- for (int i = 0; i < size; ++i)
- {
- array2[i]->show();
- }
- for (int i = 0; i < size; ++i)// Освобождаем память
- {
- delete array1[i];
- delete array2[i];
- }
- delete [] array1;
- delete [] array2;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement