Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Lunmijo
4 / 4 / 2
Регистрация: 27.02.2018
Сообщений: 15
Завершенные тесты: 1
1

Массив указателей объектов класса и их быстрая сортировка

27.02.2018, 15:17. Просмотров 758. Ответов 4
Метки нет (Все метки)

Приветствую!
Собственно, у меня есть:
Класс Worker;
Динамический массив, хранящий в себе объекты класса Worker;
Конструктор копирования для класса Worker (который хз насколько правильно реализован);
Функция qsort(Worker *Workers, int n); которая должна отсортировать массив по полю LastName/

Проблема возникает в том, конструктор копирования срабатывает (если кто-то может, прошу, пожалуйста, объясните как это происходит, ибо cpp-studio не особо помог разобраться), но когда входит функция в цикл, вылетает ошибка проблемы с памятью - "access violation reading location ошибка".
Помогите, пожалуйста, с быстрой сортировкой. Как правильно её реализовать, чтобы она работала и не выдавала ошибку.
Чары нужны только потому, что так написано в задании лабы.
Сам код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* 12.  Напишите функции для  поиска и сортировки в массиве объектов типа Worker. */
 
#include "Worker.h"
 
void qsort(Worker *Workers, int n);
void main() {
    int n;
    cout << "Enter number of workers you need: ";
    cin >> n;
        Worker *Workers = new Worker[n];
        for (int i = 0; i < n; i++) {
            Workers[i].enterLastName();
        }
        qsort(Workers, n);
        for (int i = 0; i < n; i++) {
            cout << endl << "Worker #" << i;
            Workers[i].coutLastName();
        }   
    cin.get();
    cin.get();
}
 
void qsort(Worker *Workers,int n) { //тут эта функция вообще бред какой-то, это попытки потестировать эту быструю сортировку
    int first = 1, last = n, mid = n/2;
    for (int i = 0; i < mid; i++) {
        if ((Workers[first] > Workers[mid]) && (Workers[last] < Workers[mid])) {
            swap(Workers[first], Workers[last]);
            last = n - 1;
        }
    }
}
файл Worker.h :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#pragma once
 
#include <iostream>
#include <string>
#include <cstdio>
 
using namespace std;
 
class Worker {
private:
    int age;
    char gender[10] = "";
    char LastName[40] = "";
    string Adress;
    double grant;
public:
    Worker();
    void setAllWorker(int a, char g[10], char L[20], double gr, string ad);
    void setAge(int ag);
    void setGender(char g[10]);
    void setLastName(char L[20]);
    void enterLastName();
    void setAdress(string A);
    void enterAdress();
    void coutAllWorker();
    void coutAdress();
    void setGrant(double gr);
    int getAge() const;
    int operator ==(Worker &W2);
    int operator <(Worker &W2);
    int operator >(Worker &W2);
 
    void coutLastName();
    char* getGender();
    char* getLastName();
    string getAdress() const;
    double getGrant() const;
 
    Worker(const Worker & obj);
    ~Worker();
};
Worker.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifndef WORKER_H
#define WORKER_H
 
#include "Worker.h"
 
Worker::Worker() { }
void Worker::setAllWorker(int a, char g[10], char L[20], double gr, string ad) {
    age = a;
    grant = gr;
    strcat_s(gender, g);
    strcat_s(LastName, L);
    Adress = ad;
}
 
void Worker::setAge(int ag) {
    ag > 0 ? age = ag : age = 0;
}
void Worker::setGender(char g[10]) {
    gender[10] = g[10];
 
}
void Worker::setLastName(char L[20]) {
    LastName[20] = L[20];
}
void Worker::setAdress(string A) {
    Adress = A;
}
void Worker::setGrant(double gr) {
    gr > 0 ? grant = gr : grant = 0;
}
 
void Worker::enterLastName() {
    cout << "Enter last name: ";
    cin >> LastName;
}
void Worker::enterAdress() {
    cout << "Enter adress: " << endl;
    getline(cin, Adress);
}
 
void Worker::coutAdress() {
    cout << endl << "Adress: " << Adress;
}
void Worker::coutLastName() {
    cout << endl << "Last name: " << LastName;
}
void Worker::coutAllWorker() {
    cout << endl << "Age: " << age;
    cout << endl << "Gender: " << gender;
    cout << endl << "Last name: " << LastName;
    cout << endl << "Adress: " << Adress;
    cout << endl << "Grant: " << grant << endl;
}
 
 
int Worker::getAge() const {
    return age;
}
char* Worker::getGender() {
    return gender;
}
char* Worker::getLastName() {
    return LastName;
}
string Worker::getAdress() const {
    return Adress;
}
double Worker::getGrant() const {
    return grant;
}
Worker::~Worker() { }
 
int Worker::operator ==(Worker &W2) {
    if (strcmp(LastName, W2.LastName) == 0) {
        return 1;
    }
    else {
        return 0;
    }
}
int Worker::operator <(Worker &W2) {
    if (strcmp(LastName, W2.LastName) == -1) {
        return 1;
    }
}
int Worker::operator >(Worker &W2) {
    if (strcmp(LastName, W2.LastName) == 1) {
        return 1;
    }
}
 
Worker::Worker(const Worker & obj)
{
    cout << "copy constr";
    strcpy_s(LastName,obj.LastName);
    age = obj.age;
    grant = obj.grant;
    strcat_s(gender, obj.gender);
    Adress = obj.Adress;
}
#endif
Заранее спасибо за помощь.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2018, 15:17
Ответы с готовыми решениями:

Двухмерный массив указателей из элементов объектов класса
//point1.h #ifndef POINT_H #define POINT_H #include &lt;iostream&gt; class...

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char...

Быстрая сортировка и объекты класса
На днях столкнулся с такой задачей. Попробую ее сформулировать. Дан класс....

Быстрая сортировка для массива обьектов пользовательского класса
Насколько я знаю в Си++ есть встроеная ф-ция быстрой сортировки. Как нею...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод...

4
_stanislav
Рука
417 / 379 / 207
Регистрация: 16.08.2014
Сообщений: 1,701
Завершенные тесты: 2
27.02.2018, 15:39 2
Lunmijo, для начала нужно перегрузить оператор сравнения для char* потом уже можно настроить алгоритм быстрой сортировки.

Добавлено через 38 секунд
Lunmijo, задача так скажем не слишком тривиальна, кодить лень.
1
Lunmijo
4 / 4 / 2
Регистрация: 27.02.2018
Сообщений: 15
Завершенные тесты: 1
27.02.2018, 15:43  [ТС] 3
Есть же перегруженный оператор > и < для класса, где мы проверяем на больше/меньше соответственно char
Или это не оно что-то?
0
jurok_85
275 / 258 / 190
Регистрация: 21.02.2013
Сообщений: 617
Завершенные тесты: 1
27.02.2018, 19:25 4
Лучший ответ Сообщение было отмечено Lunmijo как решение

Решение

полностью не смотрел ваш код но вот что приметилось:
Цитата Сообщение от Lunmijo Посмотреть сообщение
int first = 1, last = n, mid = n/2;
в функции qsort. Потом при первой итерации цикла
Цитата Сообщение от Lunmijo Посмотреть сообщение
Workers[last]
улетает за рамки массива.
быстрая сортировка при помощи рекурсии реализуется. Вот пример хороший под свою программу можешь переделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
 
void qsort (int * arr, int b, int e)
{
  int l = b, r = e;
  int piv = arr[(l + r) / 2]; // Опорным элементом для примера возьмём средний
  while (l <= r)
  {
    while (arr[l] < piv)
      l++;
    while (arr[r] > piv)
      r--;
    if (l <= r)
      swap (arr[l++], arr[r--]);
  }
  if (b < r)
    qsort (arr, b, r);
  if (e > l)
    qsort (arr, l, e);
}    /* ----- end of function qsort ----- */
 
// qsort (0, n-1);
int main() {
       const int N = 5;
       int arr[N] = {4,5,3,1,2};
       qsort(arr, 0, N - 1);
       for (int i = 0; i != N; i++)
            cout << arr[i]<< " ";
 
}
1
Lunmijo
4 / 4 / 2
Регистрация: 27.02.2018
Сообщений: 15
Завершенные тесты: 1
28.02.2018, 16:57  [ТС] 5
Спасибо большое!
Как обычно, лажаю на мелочах, там last = n-1 должно быть %)

И за пример большое спасибо, разбираю)
0
28.02.2018, 16:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2018, 16:57

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) {...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем...

Быстрая сортировка не сортирует весь массив
Программа быстрой сортировки сортирует только первые 10 элементов, остальная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru