72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
1

Как в классе сделать ввод с клавиатуры, удаление, добавление и редактирование строк?

05.09.2018, 10:25. Показов 12631. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня. Написал программу с использованием класса. Но смог написать только так, чтобы значения задавались сразу (Автор книги, Название книги, Год издания, Группа). Теперь нужно сделать так, чтобы книги можно было записывать самому, чтобы можно было удалить какую-нибудь книгу или добавить какую-нибудь книгу. Не могу понять как это сделать через классы. Понятно, что для удаления, добавления и редактирования нужно написать функции. Может создать ещё один класс? Вот мой код. Подскажите, пожалуйста, как можно сделать всё то, что я описал. Буду очень благодарен.

Book.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
#pragma once
 
namespace Program
{
    class Book
    {
    private:
        const char *Autor;
        const char *Name;
        int Year;
        const char *Group;
    public:
        Book();
        Book(const char* autor, const char* name, int year, const char* group);
        void setAutor(const char*);
        const char* getAutor() const;
        void setName(const char*);
        const char* getName() const;
        void setGroup(const char*);
        const char* getGroup() const;
        const int getYear() const;
        void setYear(int);
        void Print() const;
        ~Book();
    };
 
}
Book.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
#include "Book.h"
#include <iostream>
#include <iomanip>
 
namespace Program
{
    Book::Book()
    {
        Autor = "Автор не указан";
        Name = "Название не указано";
        Year = 0;
        Group = "Группа не указана";
    }
 
    Book::~Book()
    {
    }
 
    Book::Book(const char* autor, const char* name, int year, const char* group)
    {
        Autor = autor;
        Name = name;
        Group = group;
        Year = year;
    }
 
    void Book::setAutor(const char* autor)
    {
        Autor = autor;
    }
 
    const char* Book::getAutor() const
    {
        return Autor;
    }
 
    void Book::setName(const char* name)
    {
        Name = name;
    }
 
    const char* Book::getName() const
    {
        return Name;
    }
 
    void Book::setGroup(const char* group)
    {
        Group = group;
    }
 
    const char* Book::getGroup() const
    {
        return Group;
    }
 
    const int Book::getYear() const
    {
        return Year;
    }
 
    void Book::setYear(int year)
    {
        Year = year;
    }
 
    void Book::Print() const
    {
            std::cout << Autor << std::setw(6) << '\t' << Name << std::setw(14) << '\t' << Year << std::setw(14) << '\t' << Group << std::endl;
            std::cout << "----------------------------------------------------------------------------" << std::endl;
    }
}

main.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
#include <iostream>
#include <conio.h>
#include <iomanip>
#include "Book.h"
 
using namespace std;
 
using Program::Book;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    Book A("Сенкевич", "Потоп", 1978, "X");
    Book B("Ландау", "Механика", 1989, "Y");
    Book C("Дойль", "Сумчатые", 1990, "С");
 
    cout << "Каталог библиотеки" << std::endl;
    cout << "----------------------------------------------------------------------------" << endl;
    cout << "Автор книги\t" << "Название" << "            " << "Год выпуска" << "              " << "Группа\t" << endl;
    cout << "----------------------------------------------------------------------------" << endl;
    A.Print();
    B.Print();
    C.Print();
    cout << "Примичание: Х - художественная литература; Y - учебная литература; С - справочная литература" << endl;
    cout << "----------------------------------------------------------------------------" << endl;
 
    _getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2018, 10:25
Ответы с готовыми решениями:

Вместо рандома, сделать ввод количества строк, столбцов и элементов массива с клавиатуры
Изначально задание такое: Уплотнить заданную матрицу, удалив из нее строки и столбцы, заполненные...

Как сделать проверку на ввод в классе?
В методе класса не получается сделать ошибку при вводе числа меньшего нуля. Записано все верно,...

Как сделать добавление/редактирование/удаление записи в dbgrid?
подскажите, пожалуйста, как сделать добавление/редактирование/удаление записи в dbgrid? проект и...

Как в привязанной к БД DataGridView производить добавление и редактирование строк
Всем добрый вечер. Есть форма на ней созданн dataGridView....соединил с БД...получилось добалять...

13
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,326
Записей в блоге: 3
05.09.2018, 10:37 2
Нужна полка, на которую можно ставить книги и убирать.
Её можно реализовать, например, используя один из стандартных контейнеров, сконструировав новый класс std::vector<Book>

Добавлено через 5 минут
Для хранения текстовой информации внутри Program::Book проще использовать std::string.
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
05.09.2018, 12:24  [ТС] 3
politoto, Спасибо, string точно буду использовать. Значить нужен ещё один класс...

Добавлено через 1 час 21 минуту
politoto, А можете ещё подсказать, если реализовать ещё один класс, то это получится наследование или нет?

Добавлено через 3 минуты
А, нет вроде
0
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
06.09.2018, 14:12  [ТС] 4
Вроде написал. Но в главной функции в switch функции Add, Del, Input, InputIndex и Replace подчёркнуты и написано, что идентификатор не определён. Подскажите, как исправить. И будет ли работать данная программа?
Book.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
#pragma once
#include <string>
#include <vector>
 
namespace Program
{
    typedef std::string str;
    class Book
    {
    private:
        str Author;
        str Name;
        int Year;
        char Group;
        Book *Prev;
        Book *Next;
    public:
        Book();
        Book(str author, str name, int year, char group);
        void setAuthor(const str&);
        const str& getAuthor() const;
        void setName(const str&);
        const str& getName() const;
        void setGroup(char);
        const char getGroup() const;
        const int getYear() const;
        void setYear(int);
 
        //void Print() const;
        Book Input();
        int InputIndex(Book *);
        void Add(Book **, Book&);
        void Del(Book **, int);
        void Replace(Book *, int, Book&);
        void Print(Book *, str&);
 
        ~Book();
    };
}
Book.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
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include "Book.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
namespace Program
{
    Book::Book()
    {
        Author = "Автор не указан";
        Name = "Название не указано";
        Year = 0;
        Group = '0';
    }
 
    Book::~Book()
    {
    }
 
    Book::Book(str author, str name, int year, char group)
        : Author(author), Name(name), Year(year), Group(group)
    { }
 
    void Book::setAuthor(const str& author)
    {
        Author = author;
    }
 
    const str& Book::getAuthor() const
    {
        return Author;
    }
 
    void Book::setName(const str& name)
    {
        Name = name;
    }
 
    const str& Book::getName() const
    {
        return Name;
    }
 
    void Book::setGroup(const char group)
    {
        Group = group;
    }
 
    const char Book::getGroup() const
    {
        return Group;
    }
 
    const int Book::getYear() const
    {
        return Year;
    }
 
    void Book::setYear(int year)
    {
        Year = year;
    }
 
    
    Book Book::Input()
    {
        Book B;
        cout << "Введите данные о книге" << endl;
        cout << "Автор: ";        // Ввод автора и названия - без проверок
        getline(cin, B.Author);
        cout << "Название: ";
        getline(cin, B.Name);
        do                         // Ввод года с проверкой на число
        {
            cout << "Год: ";
            str Y;
            getline(cin, Y);           // Ввод в виде строки
            B.Year = atoi(Y.c_str());   // Попытка преобразование в число (0 - неудачно)
            if (B.Year < 0)
                B.Year = 0;    // Отрицательный год также считать некорректным
            if (!B.Year)
                cout << "Некорректный год!" << endl;
        } while (!B.Year);
        do                         // Ввод группы с проверкой на один из трёх символов
        {                         // (аналогично вводу года)
            cout << "Группа: ";
            str G;
            getline(cin, G);
            B.Group = G.length() == 1 ? G[0] : 0;
            if (!(B.Group == 'Х' || B.Group == 'У' || B.Group == 'С'))
                B.Group = 0;
            if (!B.Group)
                cout << "Некорректная группа!" << endl;
        } while (B.Group == ' ');
        return B;
    }
 
    int Book::InputIndex(Book *Head)
    {
        int Index, t;
        do                        // Цикл ввода с проверкой (аналогично вводу данных о книге)
        {
            cout << "Введите индекс книги: ";
            str S;
            getline(cin, S);
            Index = atoi(S.c_str());
            if (Index < 1)
                cout << "Некорректный индекс!" << endl;
        } while (Index < 1);
        t = Index;
        while (Head && --t)     // Поиск книги с таким индексом
            Head = Head->Next;
        if (!Head)
            Index = 0;        // Не найдено - вернуть ноль
        return Index;
    }
 
    void Book::Add(Book **Head, Book& Data)
    {
        Book *NewBook = new Book;  // СОздание нового элемента
        *NewBook = Data;             // Заполнение данными
        NewBook->Next = NULL;        // Добавление в конец
        if (!*Head)                 // Список пуст - инициализировать голову
        {
            NewBook->Prev = NULL;
            *Head = NewBook;
        }
        else                       // Список не пуст
        {
            Book *Curr = *Head;
            while (Curr->Next) Curr = Curr->Next; // Найти последний элемент
            NewBook->Prev = Curr;       // и связаться с ним
            Curr->Next = NewBook;
        }
    }
 
    void Book::Del(Book **Head, int Index)
    {
        Book *Curr = *Head;
        while (Curr && --Index)                       // Поиск удаляемого элемента
            Curr = Curr->Next;
        if (Curr == *Head)
            *Head = Curr->Next;                            // Удаляется первый элемент - изменить голову
        else Curr->Prev->Next = Curr->Next;           // иначе - перезвязать предыдущий элемент
        if (Curr->Next) Curr->Next->Prev = Curr->Prev;  // Пересвязывание следующего элемента (если он есть)
        delete Curr;                                 // Освобождение памяти
        cout << endl << "Книга удалена!" << endl;
    }
 
    void Book::Replace(Book *Head, int Index, Book& Data)
    {
        while (Head && --Index)  // Поиск элемента по индексу
            Head = Head->Next;
        Data.Prev = Head->Prev;   // Инициализация указателей
        Data.Next = Head->Next;
        *Head = Data;             // Обновление данных
        cout << endl << "Книга обновлена!" << endl;
    }
 
    void Book::Print(Book *Head, str &Autor)
    {
        if (Autor != "")
            cout << endl << "Найденные книги автора: ";
        else cout << "Каталог библиотеки: ";
        bool Found = false;  // Признак того, что есть найденные кнги
        int Idx = 0;         // Индекс
        while (Head)        // Проход по списку
        {
            Idx++;
            if (Autor == "" || Head->Author == Autor)  // Если строка поиска пуста или совпадает с автором - вывести книгу
            {
                if (!Found)
                    cout << endl << " №   Автор          Название                     Год   Группа" << endl;
                cout.width(3); cout << Idx << " ";
                cout.setf(ios::left);
                cout.width(15); cout << Head->Author;
                cout.width(30); cout << Head->Name;
                cout.width(9); cout << Head->Year;
                cout.unsetf(ios::left);
                cout << Head->Group << endl;
                Found = true;
            }
            Head = Head->Next;
        }
        if (!Found)         // Книг по критериям поиска не найдено - вывести сообщение
            if (Autor != "")
                cout << "отсутствуют" << endl;
            else cout << "пуст" << endl;
    }
}
main.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
#include <iostream>
#include <string>
#include <conio.h>
#include <iomanip>
#include "Book.h"
 
using namespace std;
 
using Program::Book;
 
void Menu()
{
    cout << "1 - Добавить книгу\n";
    cout << "2 - Удалить книгу\n";
    cout << "3 - Изменить данные книги\n";
    cout << "4 - Найти книгу\n";
    cout << "0 - Выход\n";
} 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    Book *Head;
    string Sel;
    Book B;
    int Index;
    char c;
    do
    {
        Menu();
        cin >> c;
 
        switch (c)
        {
        case '1':
            B = Input();                  // Добавление книги
            Add(&Head, B);
            cout << "Книга добавлена!" << endl;
            break;
        case '2':
            Index = InputIndex(Head);     // Удаление книги
            if (Index)
            {
                Del(&Head, Index);
            }
            else cout << endl << "Книги с таким индексом не существует!" << endl;
            break;
        case '3':
            Index = InputIndex(Head);     // Изменение информации о книге
            if (Index)
            {
                B = Input();
                Replace(Head, Index, B);
            }
            else cout << endl << "Книги с таким индексом не существует!" << endl;
            break;
        case '4':
            cout << "Введите автора: ";   // Поиск по автору
            getline(cin, Sel);
            Print(Head, Sel);       
            break;
        case '0':
            break;
        default: cout << "Некорректный вариант выбора!" << endl;
        }
        system("cls");
    } while (c != '0');
_getch();
    return 0;
}
1
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,326
Записей в блоге: 3
06.09.2018, 14:30 5
Сложно как-то Вы реализовали...
Add, Del и т.д. - это члены класса Program::Book.
Нужен объект этого класса или указатель на объект, чтобы их вызвать.

Например, так:
C++
1
Index = B.InputIndex( Head );
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
06.09.2018, 14:38  [ТС] 6
politoto, да, сложновато. Через вектор что-то не получилось, плохо знаю его.
Что-то компилятор ругается на 42 строку в главном файле, не нравится Head. Можете, пожалуйста, подсказать, что не так?
1>c:\visual c++\лаб.1\лаб.1\source.cpp(42): error C4703: используется потенциально неинициализированная локальная переменная-указатель "Head"
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,326
Записей в блоге: 3
06.09.2018, 14:39 7
Цитата Сообщение от eganator Посмотреть сообщение
И будет ли работать данная программа?
У Вас нет возможности откомпилировать и посмотреть, будет ли работать эта программа?
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
06.09.2018, 14:44  [ТС] 8
politoto, Пока не компилируется, ошибка в 42-ой строке. Написал выше. Пытаюсь разобраться.
1
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,326
Записей в блоге: 3
06.09.2018, 14:49 9
Цитата Сообщение от eganator Посмотреть сообщение
Что-то компилятор ругается на 42 строку в главном файле, не нравится Head): error C4703: используется потенциально неинициализированная локальная переменная-указатель "Head"
Я думаю, компилятор не зря предупредил. Если попытаться поискать или изменить информацию о книгах, пока ни одной книги не добавлено, в Head неизвестно что.
Инициализируйте указатель там, где он определяется. Напр. так:
C++
1
Book* Head = nullptr;
Или по-новомодному:
C++
1
Book* Head{};
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
06.09.2018, 14:58  [ТС] 10
politoto, Спасибо! Скомпилировалось, но пока не корректно работает. Буду искать ошибки, исправлять.
0
328 / 81 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
06.09.2018, 20:51 11
Я бы начал так:
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
#include <string>
struct book
{
public:
    std::string name, author;
    int year;
    char g;
 
    void Print() const;
    bool Author ( const std::string& ) const;
};
 
bool 
book::Author ( const std::string &name) const
{
    return name == author;
}
 
 
//=//
 
#include <deque>
class Books
{
    std::deque<book> books;
 
public:
using idx = size_t;
void    Del( idx i )
{
    if ( books.size() > i )
        books.erase( i + books.begin() );   
};
 
void    Add( const book& data )
{
    books.push_back(data);
}
 
void    Change(  idx i, const book& data )
{
    if ( books.size() > i )
        books[i] = data;
}
 
 
void    Print ( const std::string& name ) const
{
    for ( const auto & b : books )
    if ( b.Author(name) )
        b.Print();  
}
 
};
//==//
 
#include <iostream>
void
book::Print() const
{
    std::cout << "Book:" "\n" << name << "\n"
        << "Author:" "\n" << author << "\n"
        << "Year:" "\n" << year << "\n\n";
 
}
 
void
InputBook ( Books & bbb )
{
    std::string name, author;
    auto &o = std::cout; auto &i = std::cin;
    o << "Author:";
    getline(i, author);
    o << "Book:";
    getline(i, name);
    int year {-1,}; 
    o << "Year:";   i >> year;
 
 
    bbb.Add ( book{ name, author, year,  } );
 
}
Не знаю, так ли надо (c++11-17).
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
07.09.2018, 11:20  [ТС] 12
Не много добавленный вариант. Есть файл с данными, который автоматически считывается при запуске программы. И есть запись в файл. Но когда программа запускается, то перед глазами просто чёрный экран, меню не выводится. А если в main.cpp убрать строку Book *Head = B.LoadFile(); и заменить на Book *Head {}; То меню выводится, но программа работает коряво. Если у Вас есть возможность, то попробуйте, пожалуйста, запустить её у себя. Не получается разобраться в ошибках.

Book.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
#pragma once
#include <string>
namespace Program
{
    typedef std::string str;
 
    class Book
    {
    private:
        str Author;
        str Name;
        int Year;
        char Group;
        Book *Prev;
        Book *Next;
    public:
        Book();
        Book(str author, str name, int year, char group);
        void setAuthor(const str&);
        const str& getAuthor() const;
        void setName(const str&);
        const str& getName() const;
        void setGroup(char);
        const char getGroup() const;
        const int getYear() const;
        void setYear(int);
 
        Book Input();
        int InputIndex(Book *);
        void Add(Book **, Book&);
        void Del(Book **, int);
        void Replace(Book *, int, Book&);
        void Print(Book *, str&);
        Book* LoadFile();
        void SaveFile(Book *Head);
 
        ~Book();
    };
}
Book.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
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#include "Book.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
 
namespace Program
{
    Book::Book()
    {
        Author = "Автор не указан";
        Name = "Название не указано";
        Year = 0;
        Group = '0';
    }
 
    Book::~Book()
    {
    }
 
    Book::Book(str author, str name, int year, char group)
        : Author(author), Name(name), Year(year), Group(group)
    { }
 
    void Book::setAuthor(const str& author)
    {
        Author = author;
    }
 
    const str& Book::getAuthor() const
    {
        return Author;
    }
 
    void Book::setName(const str& name)
    {
        Name = name;
    }
 
    const str& Book::getName() const
    {
        return Name;
    }
 
    void Book::setGroup(const char group)
    {
        Group = group;
    }
 
    const char Book::getGroup() const
    {
        return Group;
    }
 
    const int Book::getYear() const
    {
        return Year;
    }
 
    void Book::setYear(int year)
    {
        Year = year;
    }
 
 
    Book Book::Input()
    {
        Book B;
        cout << "Введите данные о книге" << endl;
        cout << "Автор: ";        // Ввод автора и названия - без проверок
        getline(cin, B.Author);
        cout << "Название: ";
        getline(cin, B.Name);
        do                         
        {
            cout << "Год: ";
            str Y;
            getline(cin, Y);           
            B.Year = atoi(Y.c_str());   
            if (B.Year < 0)
                B.Year = 0;    
            if (!B.Year)
                cout << "Некорректный год!" << endl;
        } while (!B.Year);
        do                         
        {                         
            cout << "Группа: ";
            str G;
            getline(cin, G);
            B.Group = G.length() == 1 ? G[0] : 0;
            if (!(B.Group == 'Х' || B.Group == 'У' || B.Group == 'С'))
                B.Group = 0;
            if (!B.Group)
                cout << "Некорректная группа!" << endl;
        } while (B.Group == ' ');
        return B;
    }
 
    int Book::InputIndex(Book *Head)
    {
        int Index, t;
        do                        // Цикл ввода с проверкой (аналогично вводу данных о книге)
        {
            cout << "Введите индекс книги: ";
            str S;
            getline(cin, S);
            Index = atoi(S.c_str());
            if (Index < 1)
                cout << "Некорректный индекс!" << endl;
        } while (Index < 1);
        t = Index;
        while (Head && --t)     // Поиск книги с таким индексом
            Head = Head->Next;
        if (!Head)
            Index = 0;        
        return Index;
    }
 
    void Book::Add(Book **Head, Book& Data)
    {
        Book *NewBook = new Book;  // Сoздание нового элемента
        *NewBook = Data;             
        NewBook->Next = NULL;        
        if (!*Head)                 
        {
            NewBook->Prev = NULL;
            *Head = NewBook;
        }
        else                       
        {
            Book *Curr = *Head;
            while (Curr->Next) Curr = Curr->Next; 
            NewBook->Prev = Curr;       
            Curr->Next = NewBook;
        }
    }
 
    void Book::Del(Book **Head, int Index)
    {
        Book *Curr = *Head;
        while (Curr && --Index)                       // Поиск удаляемого элемента
            Curr = Curr->Next;
        if (Curr == *Head)
            *Head = Curr->Next;                            
        else Curr->Prev->Next = Curr->Next;           
        if (Curr->Next) Curr->Next->Prev = Curr->Prev;  
        delete Curr;                                 // Освобождение памяти
        cout << endl << "Книга удалена!" << endl;
    }
 
    void Book::Replace(Book *Head, int Index, Book& Data)
    {
        while (Head && --Index)  // Поиск элемента по индексу
            Head = Head->Next;
        Data.Prev = Head->Prev;   
        Data.Next = Head->Next;
        *Head = Data;             // Обновление данных
        cout << endl << "Книга обновлена!" << endl;
    }
 
    void Book::Print(Book *Head, str &Autor)
    {
        if (Autor != "")
            cout << endl << "Найденные книги автора: ";
        else cout << "Каталог библиотеки: ";
        bool Found = false;  // Признак того, что есть найденные кнги
        int Idx = 0;         
        while (Head)        
        {
            Idx++;
            if (Autor == "" || Head->Author == Autor)  // Если строка поиска пуста или совпадает с автором - вывести книгу
            {
                if (!Found)
                    cout << endl << " №   Автор          Название                     Год   Группа" << endl;
                cout.width(3); cout << Idx << " ";
                cout.setf(ios::left);
                cout.width(15); cout << Head->Author;
                cout.width(30); cout << Head->Name;
                cout.width(9); cout << Head->Year;
                cout.unsetf(ios::left);
                cout << Head->Group << endl;
                Found = true;
            }
            Head = Head->Next;
        }
        if (!Found)         
            if (Autor != "")
                cout << "отсутствуют" << endl;
            else cout << "пуст" << endl;
    }
 
    Book* Book::LoadFile()
    {
        Book *Head = NULL;
        ifstream Fin("Books.txt");
        while (!Fin.eof())         // Построчное чтение файла
        {
            Book B;
            getline(Fin, B.Author);    
            if (B.Author == "") break;   
            getline(Fin, B.Name); 
            Fin >> B.Year >> B.Group;   
            Add(&Head, B);           
            string NL;               
            getline(Fin, NL);
        }
        Fin.close();
        return Head;
    }
 
    void Book::SaveFile(Book *Head)
    {
        ofstream Fout("Books.txt", ios_base::trunc);  // Перезапись файла
        while (Head)                  // Проход по списку
        {
            Fout << Head->Author << endl;    // Запись данных
            Fout << Head->Name << endl;
            Fout << Head->Year << endl;
            Fout << Head->Group << endl;
            Head = Head->Next;
        }
        Fout.close();
    }
}

main.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
#include <iostream>
#include <string>
#include <conio.h>
#include <iomanip>
#include <fstream>
#include "Book.h"
 
using namespace std;
 
using Program::Book;
 
void Menu()
{
    cout << "1 - Добавить книгу\n";
    cout << "2 - Удалить книгу\n";
    cout << "3 - Изменить данные книги\n";
    cout << "4 - Найти книгу\n";
    cout << "5 - Отобразить список\n";
    cout << "0 - Выход\n";
} 
 
int main()
{
    setlocale(LC_ALL, "Russian");
char c;
            do
            {
                string Sel;
                Book B;
                Book *Head = B.LoadFile();
                int Index;
                Menu();
                cin >> c;
 
                switch (c)
                {
                case '1':
                    B = B.Input();                  // Добавление книги
                    B.Add(&Head, B);
                    cout << "Книга добавлена!" << endl;
                    B.SaveFile(Head);
                    break;
                case '2':
                    Index = B.InputIndex(Head);     // Удаление книги
                    if (Index)
                    {
                        B.Del(&Head, Index);
                        B.SaveFile(Head);
                    }
                    else cout << endl << "Книги с таким индексом не существует!" << endl;
                    break;
                case '3':
                    Index = B.InputIndex(Head);     // Изменение информации о книге
                    if (Index)
                    {
                        B = B.Input();
                        B.Replace(Head, Index, B);
                        B.SaveFile(Head);
                    }
                    else cout << endl << "Книги с таким индексом не существует!" << endl;
                    break;
                case '4':
                    cout << "Введите автора: ";   // Поиск по автору
                    getline(cin, Sel);
                    B.Print(Head, Sel);
                    break;
                case '5':
                    Sel = "";                     
                    B.Print(Head, Sel);
                    break;
                case '0':
                    break;
                default: cout << "Некорректный вариант выбора!" << endl;
                }
                system("cls");
            } while (c != '0'); 
    _getch();
    return 0;
}
Добавлено через 1 минуту
ОС, Спасибо, хороший вариант. Но что такое deque пока не знаю. Его вроде можно заменить на вектор?
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,326
Записей в блоге: 3
07.09.2018, 12:25 13
eganator, да, можно заменить std::deque на std::vector.
Все контейнеры STL похожи по интерфейсу.
Отличия в скорости выполнения различных операций, а также в том, что в некоторых контейнерах есть специфические методы, которых нет в других.
1
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
07.09.2018, 14:57  [ТС] 14
politoto, Хорошо, спасибо, буду пытаться)
0
07.09.2018, 14:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2018, 14:57
Помогаю со студенческими работами здесь

Как сделать ввод с клавиатуры
Задание:Вычитание неупакованных двоично-десятичных чисел. Программа работает,только не знаю как...

Как сделать ввод с клавиатуры?
Дана последовательность целых чисел. найти количество различных чисел в этой последовательности. ...

Как сделать ввод с клавиатуры?
Подскажите, как переделать под ввод данных a и b с клавиатуры #include &quot;stdafx.h&quot; #include...

Как сделать ввод с клавиатуры?
как сделать ввод с клавиатуры( фио,возраст,бал) и как сделать цикл вода даных 5 раз #include...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru