Форум программистов, компьютерный форум CyberForum.ru

Неисправный код - C++

Восстановить пароль Регистрация
 
Spirit2222
0 / 0 / 1
Регистрация: 02.11.2013
Сообщений: 32
19.11.2014, 15:23     Неисправный код #1
Дан код:
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include<iostream>
#define CHAR_LENGTH 200
#define NOTHING_FOUND -1
 
class Student {
private:
    char* name;
    char* lastName;
    int iq;
 
    void init() {
        name = new char[CHAR_LENGTH] {};
        lastName = new char[CHAR_LENGTH] {};
    }
 
public:
    Student() {
        init();
        iq = 0;
    }
 
    Student(char* _name, char* _lastName, int _iq) {
        init();
        strncpy_s(name, CHAR_LENGTH, _name, strlen(_name));
        strncpy_s(lastName, CHAR_LENGTH, _lastName, strlen(_lastName));
        iq = _iq;
    }
 
    ~Student() {
        delete[] name;
        delete[] lastName;
    }
 
    char* getName() {
        return name;
    }
 
    char* getLastName() {
        return lastName;
    }
 
    int getIq() {
        return iq;
    }
 
    bool equals(Student* student) {
        return  strncmp(name, student->name, CHAR_LENGTH) == 0 &&
            strncmp(lastName, student->lastName, CHAR_LENGTH) == 0 &&
            iq == student->iq;
    }
 
    void show() {
        using namespace std;
        cout << "Name: " << name << " Last name: " << lastName << " IQ: " << iq << endl;
    }
};
 
class Group {
private:
    Student* students;
    int groupSize;
    int currentSize;
 
    void init(int _groupSize) {
        students = new Student[_groupSize];
        groupSize = _groupSize;
        currentSize = 0;
    }
 
    int findStudent(Student* student) {
        for (int i = 0; i < currentSize; i++) {
            if (students[i].equals(student)) {
                return i;
            }
        }
 
        return NOTHING_FOUND;
    }
 
public:
    Group() {
        init(20);
    }
 
    Group(int groupSize) {
        init(groupSize);
    }
 
    ~Group() {
        delete[] students;
    }
 
    bool addStudent(Student* student) {
        if (currentSize >= groupSize) {
            return false;
        }
 
        students[currentSize++] = Student(student->getName(), student->getLastName(), student->getIq());
        return true;
    }
 
    bool removeStudent(Student* student){
        return removeStudent(findStudent(student));
    }
 
    bool removeStudent(int index) {
        if (index < 0 || index >= currentSize) {
            return false;
        }
 
        for (int i = index; i < currentSize - 1; i++)
        {
            std::swap(students[i], students[i + 1]);
        }
        --currentSize;
        return true;
    }
 
    void show() {
        for (int i = 0; i < currentSize; i++) {
            students[i].show();
        }
    }
};
 
void main(){
    Student vasya("Vasya", "Pipkin", 1200);
    Student petya("Petya", "Pupkin", 100);
    Student grisha("Grigoriy", "Vasechkin", -500);
 
    Group group(5);
    group.addStudent(&vasya);
    group.addStudent(&petya);
    group.addStudent(&grisha);
 
    group.show();
 
    group.removeStudent(&vasya);
 
    group.show();
    system("pause");
 
}
его нужно исправить. Помогите пожалуйста, не могу понять, что не так. Препод намекнул что нужно написать конструктор копирования, но все равно не понятно.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 15:23     Неисправный код
Посмотрите здесь:

Visual c++ код перевести в gcc linux код C++
C++ Не получается запустить длинный код Алгоритма Гомори, код правильный.
C++ прога, которая по нажатой клавише выводит ascii - код символа это клавиши или scan - код самой клавиши.
код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, как сделатьь так чтобы Студия воспринимала этот код?? C++
перевод десятичного вещественного в машинный код(двоичный код) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гоблин-инженер
113 / 113 / 32
Регистрация: 18.09.2014
Сообщений: 337
19.11.2014, 15:30     Неисправный код #2
Spirit2222, а в чем проблемы? Лично у меня в Qt не компилит, strcmp ругается
Spirit2222
0 / 0 / 1
Регистрация: 02.11.2013
Сообщений: 32
19.11.2014, 15:37  [ТС]     Неисправный код #3
Проблема в том, что код не выводит то, что должен выводить, он выдает набор символов вместо слов
Гоблин-инженер
113 / 113 / 32
Регистрация: 18.09.2014
Сообщений: 337
19.11.2014, 15:45     Неисправный код #4
Spirit2222, вы же на с++ пишете... Используйте string. Проще же, что эти ваши манипуляции с init()... Ну если препод утверждает, что требуется добавить конструктор копирования, добавьте
C++
1
2
3
Student(const Student &original) {
// Создаем класс на основе другого, то есть просто копируем все поля
}
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
19.11.2014, 16:09     Неисправный код #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Добавил в класс Student оператор присвоения:
Кликните здесь для просмотра всего текста
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include<iostream>
#include <cstring>
#define CHAR_LENGTH 200
#define NOTHING_FOUND -1
 
class Student {
private:
    char* name;
    char* lastName;
    int iq;
 
    void init() {
        name = new char[CHAR_LENGTH] {};
        lastName = new char[CHAR_LENGTH] {};
    }
 
public:
    Student() {
        init();
        iq = 0;
    }
 
    Student(char* _name, char* _lastName, int _iq) {
        init();
        strncpy(name, _name, strlen(_name));
        strncpy(lastName, _lastName, strlen(_lastName));
        iq = _iq;
    }
 
    ~Student() {
        delete[] name;
        delete[] lastName;
    }
 
    char* getName() {
        return name;
    }
 
    char* getLastName() {
        return lastName;
    }
 
    int getIq() {
        return iq;
    }
 
    bool equals(Student* student) {
        return  strncmp(name, student->name, CHAR_LENGTH) == 0 &&
            strncmp(lastName, student->lastName, CHAR_LENGTH) == 0 &&
            iq == student->iq;
    }
 
    void show() {
        using namespace std;
        cout << "Name: " << name << " Last name: " << lastName << " IQ: " << iq << endl;
    }
    Student& operator= (const Student& st) {
        strncpy(name, st.name, strlen(st.name));
        strncpy(lastName, st.lastName, strlen(st.lastName));
        iq = st.iq;
        return *this;
    }
};
 
class Group {
private:
    Student* students;
    int groupSize;
    int currentSize;
 
    void init(int _groupSize) {
        students = new Student[_groupSize];
        groupSize = _groupSize;
        currentSize = 0;
    }
 
    int findStudent(Student* student) {
        for (int i = 0; i < currentSize; i++) {
            if (students[i].equals(student)) {
                return i;
            }
        }
 
        return NOTHING_FOUND;
    }
 
public:
    Group() {
        init(20);
    }
 
    Group(int groupSize) {
        init(groupSize);
    }
 
    ~Group() {
        delete[] students;
    }
 
    bool addStudent(Student* student) {
        if (currentSize >= groupSize) {
            return false;
        }
        students[currentSize++] = *student;
 
        return true;
    }
 
    bool removeStudent(Student* student){
        return removeStudent(findStudent(student));
    }
 
    bool removeStudent(int index) {
        if (index < 0 || index >= currentSize) {
            return false;
        }
 
        for (int i = index; i < currentSize - 1; i++)
        {
            std::swap(students[i], students[i + 1]);
        }
        --currentSize;
        return true;
    }
 
    void show() {
        for (int i = 0; i < currentSize; i++) {
            students[i].show();
        }
    }
};
 
int main(){
    Student vasya("Vasya", "Pipkin", 1200);
    Student petya("Petya", "Pupkin", 100);
    Student grisha("Grigoriy", "Vasechkin", -500);
 
    Group group(5);
    group.addStudent(&vasya);
    group.addStudent(&petya);
    group.addStudent(&grisha);
 
    group.show();
 
    group.removeStudent(&vasya);
 
    group.show();
    //system("pause");
    return 0;
}

Вот здесь:
C++
1
2
3
4
5
6
    Student& operator= (const Student& st) {
        strncpy(name, st.name, strlen(st.name));
        strncpy(lastName, st.lastName, strlen(st.lastName));
        iq = st.iq;
        return *this;
    }
C++
1
2
3
4
5
6
7
8
    bool addStudent(Student* student) {
        if (currentSize >= groupSize) {
            return false;
        }
        students[currentSize++] = *student;
 
        return true;
    }
И вот здесь:
C++
1
2
3
4
5
6
7
8
    bool addStudent(Student* student) {
        if (currentSize >= groupSize) {
            return false;
        }
 
        students[currentSize++] = Student(student->getName(), student->getLastName(), student->getIq());
        return true;
    }
У вас происходила неприятная вещь. Указатели теперь стали указывать на один и тот же участок памяти, что приводило к падению программы при вызове деструкторов. Инкапсулируйте динамически выделяемые учаски памяти.
Yandex
Объявления
19.11.2014, 16:09     Неисправный код
Ответ Создать тему
Опции темы

Текущее время: 02:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru