Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Spirit2222
0 / 0 / 1
Регистрация: 02.11.2013
Сообщений: 32
#1

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

19.11.2014, 15:23. Просмотров 168. Ответов 4
Метки нет (Все метки)

Дан код:
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");
 
}
его нужно исправить. Помогите пожалуйста, не могу понять, что не так. Препод намекнул что нужно написать конструктор копирования, но все равно не понятно.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 15:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Неисправный код (C++):

Неисправный односвязный список - C++
Вот код: #include &quot;stdafx.h&quot; #include &quot;locale.h&quot; #include &quot;math.h&quot; #include &quot;conio.h&quot; #include &quot;iostream&quot; #include &quot;iomanip&quot; ...

Код написан в Dev C. Не работает в Visual. Как нужно переделать код? - C++
Здравствуйте. Столкнулась с такой проблемой: код был написан в Dev C, но в Visual он выдаёт ошибку. ...

Не получается запустить длинный код Алгоритма Гомори, код правильный. - C++
Собственно как запустить код через С++Builder 6 #include&lt;ctype.h&gt; #include&lt;string.h&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt; ...

Написать код для игры НИМ. проверьте пожалуйста тот ли это код - C++
#include &lt;string&gt; using namespace std; int compChoose(int markers); int userChoose(int markers); int...

Как получить исходный код *.exe или отредактировать его исполняемый код? - C++
Собственно возможно ли декомпилить его так, чтобы можно было потом обратно скомпилировать? Или хотя-бы отредактировать код, только не...

перевод десятичного вещественного в машинный код(двоичный код) - C++
пожалуйста , подскажите пожалуйста код C++ ,для перевода вещественного числа в машиное (двоичное представление,32 бит). Без использования...

4
Гоблин-инженер
113 / 110 / 32
Регистрация: 18.09.2014
Сообщений: 337
19.11.2014, 15:30 #2
Spirit2222, а в чем проблемы? Лично у меня в Qt не компилит, strcmp ругается
0
Spirit2222
0 / 0 / 1
Регистрация: 02.11.2013
Сообщений: 32
19.11.2014, 15:37  [ТС] #3
Проблема в том, что код не выводит то, что должен выводить, он выдает набор символов вместо слов
0
Гоблин-инженер
113 / 110 / 32
Регистрация: 18.09.2014
Сообщений: 337
19.11.2014, 15:45 #4
Spirit2222, вы же на с++ пишете... Используйте string. Проще же, что эти ваши манипуляции с init()... Ну если препод утверждает, что требуется добавить конструктор копирования, добавьте
C++
1
2
3
Student(const Student &original) {
// Создаем класс на основе другого, то есть просто копируем все поля
}
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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;
    }
У вас происходила неприятная вещь. Указатели теперь стали указывать на один и тот же участок памяти, что приводило к падению программы при вызове деструкторов. Инкапсулируйте динамически выделяемые учаски памяти.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 16:09
Привет! Вот еще темы с ответами:

перевести код на С++ или написать свой код - C++
Задано предложение. Составить программу вывода на экран слов, в которых первая и последняя буквы совпадают. program Project1; ...

Visual c++ код перевести в gcc linux код - C++
Ниже есть код. Нужно сделать так, что бы он компилировался и работал в линуксе(компиляция с помощью gcc). #include &quot;stdio.h&quot; #pragma...

код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, как сделатьь так чтобы Студия воспринимала этот код?? - C++
Ребята, обьясните мне чего код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, там требуються существенно другие...

Перевести код программы Паскаля в код С++ - C++
В массиве Х (15) найти произведение и количество элементов расположенных между наибольшими и наименьшими элементами кто может перевести...


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

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

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