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

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

27.02.2018, 15:17. Показов 2243. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.02.2018, 15:17
Ответы с готовыми решениями:

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

Быстрая» сортировка (разделением) с использованием указателей
У меня не принимают работу, так как говорят, что не по заданию. В чем ошибка? #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt;...

Быстрая» сортировка (разделением) с использованием указателей
У меня не принимают работу, так как говорят, что не по заданию. В чем ошибка? #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; ...

4
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.02.2018, 15:39
Lunmijo, для начала нужно перегрузить оператор сравнения для char* потом уже можно настроить алгоритм быстрой сортировки.

Добавлено через 38 секунд
Lunmijo, задача так скажем не слишком тривиальна, кодить лень.
1
4 / 4 / 2
Регистрация: 27.02.2018
Сообщений: 15
27.02.2018, 15:43  [ТС]
Есть же перегруженный оператор > и < для класса, где мы проверяем на больше/меньше соответственно char
Или это не оно что-то?
0
365 / 321 / 219
Регистрация: 21.02.2013
Сообщений: 756
27.02.2018, 19:25
Лучший ответ Сообщение было отмечено 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
4 / 4 / 2
Регистрация: 27.02.2018
Сообщений: 15
28.02.2018, 16:57  [ТС]
Спасибо большое!
Как обычно, лажаю на мелочах, там last = n-1 должно быть %)

И за пример большое спасибо, разбираю)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.02.2018, 16:57
Помогаю со студенческими работами здесь

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

Быстрая сортировка и объекты класса
На днях столкнулся с такой задачей. Попробую ее сформулировать. Дан класс. class A { ... vector&lt;double&gt; x; ...

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

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

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru