Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Silense123
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 3
1

Некорректно работает функция добавления, указать ошибку

13.05.2015, 16:45. Просмотров 256. Ответов 5
Метки нет (Все метки)

Здравствуйте, в моей программе некорректно работает добавление элемента, функция addBook. Также прошу проверить правильность работы деструктора. При выходе из программы выводит ошибку, есть подозрение что что-то не так с памятью. Заранее спасибо.
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstdio>
using namespace std;
class book
{
private:
    int year;
    char* author;
public:
    book() {
        author = new char(50);
    }
 
    ~book() {
        delete[] author;
    }
    void SetYear(int a){                    //задаем год
        year = a;
    }
    void SetAuthor(char* author1){          //задаем автора
        author = author1;
    }
    int GetYear(){                          //возвращаем год
        return(year);
    }
    char* GetAuthor(){                      //возвращаем автора
        return(author);
    }
    void ShowData()
    {
        char* avtor1 = new char[50];
        OemToAnsi(author, avtor1);
        cout << "Год издания - " << year << endl
            << "Автор - " << avtor1 << endl;
    }
};
class library
{
private:
    int kol;
public:
    book f[10];
    library(int a) {
        kol = a;
        int i;
        for (i = 0; i<kol; i++){
            int b;
            cout << "Введите год издания" << endl;
            cin >> b;
            f[i].SetYear(b);
            char* Author = new char[50];
            cout << "Введите автора" << endl;
            getchar();
            cin.getline(Author, 256);
            f[i].SetAuthor(Author);
        }
    }
    void addBook(){                             //добавление книги
        int b;
        cout << "Введите год издания" << endl;
        cin >> b;
        f[kol].SetYear(b);
        char* Author = new char[50];
        cout << "Введите автора" << endl;
        getchar();
        cin.getline(Author, 256);
        f[kol].SetAuthor(Author);
        delete Author;
        kol++;
    };
    void deleteBook(int a){                     //удаление книги
        int i;
        for (i = a; i<kol; i++){
            int k;
            k = f[i + 1].GetYear();
            f[i].SetYear(k);                    //книги сдвигаются на одну позицию влево 
            char* avtor;
            avtor = f[i + 1].GetAuthor();
            f[i].SetAuthor(avtor);
        }
        f[kol].SetYear(0);
        kol--;                                  //лишняя позиция убирается
    };
    void SortBookYear(){                        //сортировко книг по возрастанию
        bool a = 1;
        while (a) {
            a = 0;
            int i;
            int j;
            for (i = 0; i<kol - 1; i++){
            for (j = 0; j<kol - i - 1; j++)
                if (f[i].GetYear()>f[i + 1].GetYear()) {
                    int k = f[i].GetYear();
                    f[i].SetYear(f[i + 1].GetYear());
                    f[i + 1].SetYear(k);
 
                    char* ksim = f[i].GetAuthor();
                    f[i].SetAuthor(f[i + 1].GetAuthor());
                    f[i + 1].SetAuthor(ksim);
                    a = 1;
                }
 
 
            }
 
        }
    };
    void ShowAllBooks(){
        int i = 0;
        for (i = 0; i<kol; i++){
            cout << "Номер книги - " << i + 1 << endl;
            f[i].ShowData();
        }
    };
 
};
int main()
{
 
    setlocale(LC_ALL, "Russian");
    cout << "Введите количество книг" << endl;
    int a;
    cin >> a;
    library home(a);
 
    while (a){
        cout << "Выберите дальнейшие действия: " << endl
            << "1 - Добавить книгу" << endl
            << "2 - Удалить книгу" << endl
            << "3 - Отсортировать книги по году" << endl
            << "4 - Показать все книги" << endl
            << "5 - Выход из программы" << endl;
        int h;
        cin >> h;
        switch (h)
        {
        case 1: {
            home.addBook();
            break;
        }
        case 2: {
            cout << "Введите номер книги:" << endl;
            int j;
            cin >> j;
            home.deleteBook(j - 1);
            break;
        }
        case 3: {
            home.SortBookYear();
            break;
        }
        case 4: {
            home.ShowAllBooks();
            break;
        }
        case 5: {
            a = 0;
            break;
        }
        default: {
            cout << "Вы ввели неправильный вариант. Попробуйте еще раз." << endl;
        }
 
 
        }
        
    }
    system("pause");
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2015, 16:45
Ответы с готовыми решениями:

Функция работает некорректно
#include &lt;iostream&gt; using namespace std; short fill(double*, short); const short size = 5; ...

Функция работает некорректно
написал функцию,возвращающий нажатую клавишу: char func2(){ if(_kbhit()){ char c;...

Некорректно работает функция
Функция Small_S должна находить короткое слово в строке str, а она почему-то выводит первое слово!...

Некорректно работает функция Delete
Слепил прожку. Которая должна записать в файл информацию о стране. А потом функция Делит должна по...

Некорректно работает функция rand
в полном коде почему-то не работает корректно функция rand, вот пример: #include&lt;cstdlib&gt;...

5
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
13.05.2015, 19:00 2
C++
1
2
3
book() {
        author = new char[50];
    }
0
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
13.05.2015, 19:07 3
***
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
13.05.2015, 19:11 4
Если в book хранишь указатели на динамическую память, то зачем, в addBook(), освобождать её после добавления указателя в book?
0
Gr1f0nn
242 / 162 / 133
Регистрация: 30.09.2012
Сообщений: 690
13.05.2015, 19:16 5
C++
1
2
3
 void SetAuthor(char* author1){          //задаем автора
//        author = author1;
strcpy(author, author1); // ?
C++
1
2
3
4
5
6
7
8
void ShowData()
    {
        char* avtor1 = new char[50];
        OemToAnsi(author, avtor1);
        cout << "Год издания - " << year << endl
            << "Автор - " << avtor1 << endl;
delete[] avtor1; // <<--
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void addBook(){                             //добавление книги
        int b;
        cout << "Введите год издания" << endl;
        cin >> b;
        f[kol].SetYear(b);
        char* Author = new char[50];
        cout << "Введите автора" << endl;
        getchar();
        cin.getline(Author, 256);
        f[kol].SetAuthor(Author);
/*        delete Author;*/
delete[] Author; 
        kol++;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void deleteBook(int a){                     //удаление книги
        int i;
        for (i = a; i<kol; i++){
            int k;
            k = f[i + 1].GetYear();
            f[i].SetYear(k);                    //книги сдвигаются на одну позицию влево 
/*            char* avtor;*/
char* avtor = new char[50]; 
/*            avtor = f[i + 1].GetAuthor();*/
strcpy(avtor, f[i+1].GetAuthor());
            f[i].SetAuthor(avtor);
        }
        f[kol].SetYear(0);
        kol--;                                  //лишняя позиция убирается
delete[] avtor // <<--
    };
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
13.05.2015, 19:36 6
Цитата Сообщение от lss Посмотреть сообщение
Если в book хранишь указатели на динамическую память, то зачем, в addBook(), освобождать её после добавления указателя в book?
Или, раз выделяешь память в book под указатель, то делай копирование (как Gr1f0nn, написал), но тогда нет смысла в методах выделять пмять в куче, чтобы потом тут же её освобождать.
0
13.05.2015, 19:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2015, 19:36

Некорректно работает функция проверки на численность
Фрагмент кода: //... bool is_number() { //* while(cin.fail()) { cin.clear(); cin.sync();...

Не работает функция добавления данных в класс C++
Добрый день всем. Задание: создать клас для хранения БД (тел. справочник). Создать производный...

Функция возвращает остаток от деления первого параметра на второй. Указать ошибку
Мне нужно было разработать функцию типа int, которая возвращает остаток от деления первого...


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

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

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