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

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

Войти
Регистрация
Восстановить пароль
 
 
narsky
2 / 2 / 1
Регистрация: 23.03.2016
Сообщений: 117
#1

Составить программу формирования данных о книгах: автор, название, год издания, цена - C++

24.08.2016, 21:05. Просмотров 511. Ответов 17
Метки нет (Все метки)

Задача: Книжный архив. Составить программу формирования данных о книгах: автор, название, год издания, цена. Организовать выбор книг, изданных за последние 2 года, выдать их на экран, упорядочив по датам издания.
Код:
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        void ShowCatalog() const;
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int c, n;
    while (true)
    {
        c = menu();
        Catalog catalog;
        switch (c)
       {
            case 1:
                system("cls");
                cout << "Введите номер книги: ";
                cin >> n;
                catalog.FillCatalog(n);
                break;
            case 2:
                system("cls");
                catalog.ShowCatalog();
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author)).get();
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title)).get();
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) max = list[i].GetYear();
    return max;
}
 
void Catalog::ShowCatalog() const
{
    if (size <= 0) return;
    for (int i = 0; i < size; ++i)
    {
        cout << "Вывод данных о " << i+1 << " книге:" << endl;
        list[i].ShowBook();
        cout << endl;
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, изданные за последние два года, упорядочив их по датам создания" << endl;
    cout << "3 - Выход" << endl;
    cout << "Ваш выбор: ";
    cin >> choice;
    return choice;
}
Проблема: программа вылетает после ввода данных для 1 книги, после ввода названия книги. И хотелось бы, если это возможно, услышать ваши предложения об улучшении кода или его уменьшения, заранее благодарю.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2016, 21:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Составить программу формирования данных о книгах: автор, название, год издания, цена (C++):

Вывести на экран сведений о книгах: автор, название, год издания - C++
Программирование задач обработки структур и файлов Даны сведения о книгах: автор, название, год издания. Вывести на экран сведения о...

Дан файл , содержащий сведения о книгах. Сведения о каждой из книг – это фамилия автора, название и год издания. а) Найти названия книг данного автор - C++
Здравствуйте,я тот несчастный студент,который учился в школе где не было программирования.Поэтому нуждаюсь в вашей помощи.Теорию удалось...

Создать класс КНИГА с такими полями в защищенной части: значення_УДК, автор, название, издательство, год издания. - C++
Здраствуйте) Нужна помощь, а то незнаю как сделать даное задание! Создать класс КНИГА с такими полями в защищенной части: значення_УДК,...

Структура содержит название книги, автора, год издания. Удалить издания с годом меньше заданного - C++
Структура содержит название книги, автора, год издания. Удалить издания с годом меньше заданного.

Из структуры, содержащей название книги, автора, год издания, удалить издания с годом меньше заданного. - C++
Задание: Структура содержит название книги, автора, год издания. Удалить издания с годом меньше заданного. Планирую сделать меню...

Найдите старейшую книгу в библиотеке. Выведите год ее издания и название - C++
Сабж. Нужна программа, которая будет выводить на экран год издания и название самой старой книги из условной библиотеки. Язык - С++.

17
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
25.08.2016, 05:38 #2
Цитата Сообщение от narsky Посмотреть сообщение
программа вылетает после ввода данных
Цитата Сообщение от narsky Посмотреть сообщение
(cin >> price).get()
Сделать аналогично в menu().
0
narsky
2 / 2 / 1
Регистрация: 23.03.2016
Сообщений: 117
25.08.2016, 17:22  [ТС] #3
nd2, не помогло. Попробуйте у себя запустить программу, не получается создать каталог.
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        void ShowCatalog() const;
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int c, n;
    while (true)
    {
        c = menu();
        Catalog catalog;
        switch (c)
       {
            case 1:
                system("cls");
                cout << "Введите количество книг в каталоге: ";
                cin >> n;
                catalog.FillCatalog(n);
                break;
            case 2:
                system("cls");
                catalog.ShowCatalog();
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author)).get();
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title)).get();
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) max = list[i].GetYear();
    return max;
}
 
void Catalog::ShowCatalog() const
{
    if (size <= 0) return;
    for (int i = 0; i < size; ++i)
    {
        cout << "Вывод данных о " << i+1 << " книге:" << endl;
        list[i].ShowBook();
        cout << endl;
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, изданные за последние два года, упорядочив их по датам создания" << endl;
    cout << "3 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
25.08.2016, 17:34 #4
Цитата Сообщение от narsky Посмотреть сообщение
C++
1
cin.getline(author, sizeof(author)).get();
Тут get() не нужен.
А тут нужен:
Цитата Сообщение от narsky Посмотреть сообщение
C++
1
2
cout << "Введите количество книг в каталоге: ";
cin >> n;
1
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
25.08.2016, 17:39 #5
Цитата Сообщение от narsky Посмотреть сообщение
Попробуйте у себя запустить программу
...
1
Миниатюры
Составить программу формирования данных о книгах: автор, название, год издания, цена  
narsky
2 / 2 / 1
Регистрация: 23.03.2016
Сообщений: 117
25.08.2016, 17:48  [ТС] #6
nd2, благодарю! Каталог создается, большое спасибо! Только вот после создания каталога выбор книг, изданных за последние два года, не идет. Я подумал, может нужно ввести команду, которая предлагает пользователю ввести текущий год, от которого и будет зависеть выбор книг?

Добавлено через 40 секунд
Код на данный момент:
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        void ShowCatalog() const;
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Книжный архив" << endl << "Автор: студент гр. РИ-150005 Рогожников Роман Сергеевич" << endl << "Екатеринбург, 2016 г." << endl;
    system ("pause");
    int c, n;
    while (true)
    {
        c = menu();
        Catalog catalog;
        switch (c)
       {
            case 1:
                system("cls");
                cout << "Введите количество книг в каталоге: ";
                (cin >> n).get();
                catalog.FillCatalog(n);
                break;
            case 2:
                system("cls");
                catalog.ShowCatalog();
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author));
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title));
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) max = list[i].GetYear();
    return max;
}
 
void Catalog::ShowCatalog() const
{
    if (size <= 0) return;
    for (int i = 0; i < size; ++i)
    {
        cout << "Вывод данных о " << i+1 << " книге:" << endl;
        list[i].ShowBook();
        cout << endl;
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, изданные за последние два года, упорядочив их по датам создания" << endl;
    cout << "3 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
25.08.2016, 18:10 #7
Добавь метод сортировки.
0
narsky
2 / 2 / 1
Регистрация: 23.03.2016
Сообщений: 117
25.08.2016, 18:44  [ТС] #8
nd2, извините, я в этом совсем не шарю, попытался сделать что-то вроде этого, но там одни ошибки.
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        void ShowCatalog() const;
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int c, n;
    while (true)
    {
        c = menu();
        Catalog catalog;
        switch (c)
       {
            case 1:
                system("cls");
                cout << "Введите количество книг в каталоге: ";
                (cin >> n).get();
                catalog.FillCatalog(n);
                break;
            case 2:
                system("cls");
                catalog.ShowCatalog();
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author));
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title));
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) max = list[i].GetYear();
    return max;
}
 
 template< class T >
void Catalog::ShowCatalog(T* arr, int size) const
{
    if (size <= 0) return;
    T tmp;
    for(int i = 0; i < size; ++i)
    { 
        int pos = i; 
        tmp = arr[i];
        for(int j = i + 1; j < size; ++j)
        {
            if (arr[j] < tmp) 
           {
               pos = j; 
               tmp = arr[j]; 
           }
        }
        arr[pos] = arr[i]; 
        arr[i] = tmp;
        cout << "Вывод данных о " << i+1 << " книге:" << endl;
        list[i].ShowBook();
        cout << endl;
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, изданные за последние два года, упорядочив их по датам создания" << endl;
    cout << "3 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
25.08.2016, 21:16 #9
Доделывай под себя:

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 <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        int GetPrice() const
        {
            return price;
        }
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        const Book* GetList() const
        { return list; }
        void ShowCatalog() const;
        void SortingCatalog(char* f);
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Книжный архив" << endl << "Автор: студент гр. РИ-150005 Рогожников Роман Сергеевич" << endl << "Екатеринбург, 2016 г." << endl;
    system ("pause");
    int c, n;
    
    Catalog catalog;
    
    while (true)
    {
        c = menu();
        
       switch (c)
       {
            case 1:
                system("cls");
                if (catalog.GetList())
                    delete [] catalog.GetList();
                cout << "Введите количество книг в каталоге: ";
                (cin >> n).get();
                catalog.FillCatalog(n);
                catalog.ShowCatalog();
                system("pause");
                break;
            case 2:
                system("cls");
                catalog.SortingCatalog("year");
                catalog.ShowCatalog();
                system("pause");
                break;
            case 3:
                system("cls");
                catalog.SortingCatalog("price");
                catalog.ShowCatalog();
                system("pause");
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author));
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title));
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) 
            max = list[i].GetYear();
    return max;
}
 
void Catalog::SortingCatalog(char* f)
{
    if (!list || size <= 0) 
        return;
    
    Book temp;
    for(int i = 0; i < size - 1; ++i)
    {
        for(int j = 0; j < size - 1; ++j)
        {
            bool flag = false;
            if (!strcmp(f, "year"))
            {
                flag = (list[j].GetYear() > list[j + 1].GetYear());
            }
            else if (!strcmp(f, "price"))
            {
                flag = (list[j].GetPrice() > list[j + 1].GetPrice());
            }
            if (flag)
            {
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
            }
        }
    }
}
 
void Catalog::ShowCatalog() const
{
    if (size <= 0) return;
    for (int i = 0; i < size; ++i)
    {
        cout << "Вывод данных о " << i+1 << " книге:" << endl;
        list[i].ShowBook();
        cout << endl;
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, упорядочив их по датам создания" << endl;
    cout << "3 - Показать книги, упорядочив их по цене" << endl;
    cout << "4 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
0
narsky
2 / 2 / 1
Регистрация: 23.03.2016
Сообщений: 117
26.08.2016, 11:06  [ТС] #10
nd2, посмотрите пожалуйста:
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        int GetPrice() const
        {
            return price;
        }
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        const Book* GetList() const
        { return list; }
        void ShowCatalog() const;
        void SortingCatalog(char* f);
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Книжный архив" << endl << "Автор: студент гр. РИ-150005 Рогожников Роман Сергеевич" << endl << "Екатеринбург, 2016 г." << endl;
    system ("pause");
    int c, n;
    
    Catalog catalog;
    
    while (true)
    {
        c = menu();
        
       switch (c)
       {
            case 1:
                system("cls");
                if (catalog.GetList())
                    delete [] catalog.GetList();
                cout << "Введите количество книг в каталоге: ";
                (cin >> n).get();
                catalog.FillCatalog(n);
                catalog.ShowCatalog();
                system("pause");
                break;
            case 2:
                system("cls");
                catalog.SortingCatalog("year");
                catalog.ShowCatalog();
                system("pause");
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author));
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title));
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) 
            max = list[i].GetYear();
    return max;
}
 
void Catalog::SortingCatalog(char* f)
{
    if (!list || size <= 0) 
        return;
    
    Book temp;
    for(int i = 0; i < size - 1; ++i)
    {
        for(int j = 0; j < size - 1; ++j)
        {
            bool flag = false;
            if (!strcmp(f, "year"))
            {
                flag = (list[j].GetYear() < list[j + 1].GetYear());
            }
            if (flag)
            {
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
            }
        }
        if (list[i].GetYear() < list[0].GetYear() - 2)
 
    }
}
 
void Catalog::ShowCatalog() const
{
    if (size <= 0) return;
    for (int i = 0; i < size; ++i)
    {
        cout << "Вывод данных о " << i+1 << " книге:" << endl;
        list[i].ShowBook();
        cout << endl;
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, упорядочив их по датам создания" << endl;
    cout << "3 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
Добавлено через 8 минут
Что нужно написать в 157 строке, чтобы информация о книге, которая соответствует данному условию, не выводилась?
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
26.08.2016, 12:45 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
В сортировку ничего не добавляй. Отсортировал по нужному полю, потом, отдельным действием (или отдельной функцией) извлекаешь из отсортированного нужные данные. Если: "Показать книги, изданные за последние два года", то сортируешь по годам, по возрастанию (как сейчас в коде), и выводишь данные двух последних книг в каталоге.
0
narsky
2 / 2 / 1
Регистрация: 23.03.2016
Сообщений: 117
26.08.2016, 13:12  [ТС] #12
nd2, спасибо, все получилось!
Окончательный код:
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        int GetPrice() const
        {
            return price;
        }
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        const Book* GetList() const
        { return list; }
        void ShowCatalog() const;
        void SortingCatalog(char* f);
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int c, n;
    
    Catalog catalog;
    
    while (true)
    {
        c = menu();
        
       switch (c)
       {
            case 1:
                system("cls");
                if (catalog.GetList())
                    delete [] catalog.GetList();
                cout << "Введите количество книг в каталоге: ";
                (cin >> n).get();
                catalog.FillCatalog(n);
                catalog.ShowCatalog();
                system("pause");
                break;
            case 2:
                system("cls");
                catalog.SortingCatalog("year");
                catalog.ShowCatalog();
                system("pause");
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author));
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title));
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) 
            max = list[i].GetYear();
    return max;
}
 
void Catalog::SortingCatalog(char* f)
{
    if (!list || size <= 0) 
        return;
    
    Book temp;
    for(int i = 0; i < size - 1; ++i)
    {
        for(int j = 0; j < size - 1; ++j)
        {
            bool flag = false;
            if (!strcmp(f, "year"))
            {
                flag = (list[j].GetYear() < list[j + 1].GetYear());
            }
            if (flag)
            {
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
            }
        }
    }
}
 
void Catalog::ShowCatalog() const
{
    if (size <= 0) return;
    for (int i = 0; i < size; ++i)
    {
        if (list[i].GetYear() > list[0].GetYear() - 2)
        {
            cout << "Вывод данных о " << i+1 << " книге:" << endl;
            list[i].ShowBook();
            cout << endl;
        }
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, упорядочив их по датам создания" << endl;
    cout << "3 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
26.08.2016, 13:30 #13
С условием не всё правильно, и я тебе не правильно написал. И пункт меню, тогда к чему? Если: "2 - Показать книги, упорядочив их по датам создания", то просто вывод всех книг, отсортированных по дате. Если: ""Показать книги, изданные за последние два года", то отсчёт нужно вести от текущего года (или от какого?), а не от самой младшей даты в каталоге (как у тебя сделано).
0
narsky
2 / 2 / 1
Регистрация: 23.03.2016
Сообщений: 117
26.08.2016, 13:49  [ТС] #14
nd2, Обновленный код:
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        int GetPrice() const
        {
            return price;
        }
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size, y;
    public:
        Catalog(): list(0), size(0), y(){}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        int GetMaxYear() const;
        const Book* GetList() const
        { return list; }
        void ShowCatalog() const;
        void SortingCatalog(char* f);
};
 
int menu();
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int c, n;
    
    Catalog catalog;
    
    while (true)
    {
        c = menu();
        
       switch (c)
       {
            case 1:
                system("cls");
                if (catalog.GetList())
                    delete [] catalog.GetList();
                cout << "Введите количество книг в каталоге: ";
                (cin >> n).get();
                catalog.FillCatalog(n);
                catalog.ShowCatalog();
                system("pause");
                break;
            case 2:
                system("cls");
                catalog.SortingCatalog("year");
                catalog.ShowCatalog();
                system("pause");
                break;
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author));
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title));
    cout << "Введите год публикации: ";
    do {cin >> year;}
    while (year > y);
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    cout << "Введите текущий год: " << endl;
    cin >> y;
    size = s;
    if (size <= 0) return;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
int Catalog::GetMaxYear() const
{
    if (!list || size <= 0) return 0;
    int max = 0;
    for (int i = 0; i < size; ++i)
        if (max < list[i].GetYear()) 
            max = list[i].GetYear();
    return max;
}
 
void Catalog::SortingCatalog(char* f)
{
    if (!list || size <= 0) 
        return;
    
    Book temp;
    for(int i = 0; i < size - 1; ++i)
    {
        for(int j = 0; j < size - 1; ++j)
        {
            bool flag = false;
            if (!strcmp(f, "year"))
            {
                flag = (list[j].GetYear() < list[j + 1].GetYear());
            }
            if (flag)
            {
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
            }
        }
    }
}
 
void Catalog::ShowCatalog() const
{
    if (size <= 0) return;
    for (int i = 0; i < size; ++i)
    {
        if (list[i].GetYear() > y - 2)
        {
            cout << "Вывод данных о " << i+1 << " книге:" << endl;
            list[i].ShowBook();
            cout << endl;
        }
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, вышедшие за 2 последних года, упорядочив их по датам создания" << endl;
    cout << "3 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
Добавлено через 1 минуту
В 82 строке ошибка, где нужно инициализировать переменную y (обозначающую текущий год), чтобы её можно было использовать и в функции создать книгу, и в функции показать каталог?
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
26.08.2016, 18:42 #15
Кликните здесь для просмотра всего текста
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
226
227
228
229
230
231
232
233
234
235
236
237
238
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Book 
{
    char author[30];
    char title[30];
    int year;
    int price;
    public:
        void SetBook();
        int GetYear() const;
        int GetPrice() const
        {
            return price;
        }
        void ShowBook() const;
};
 
class Catalog
{
    Book *list;
    int size;
    public:
        Catalog(): list(0), size(0) {}
        ~Catalog();
        void FillCatalog(int n);
        int GetSize() const; //если понадобится размер каталога книг
        const Book* GetList() const
        { return list; }
        void ShowCatalog() const;
        void FindYear(unsigned int year, char f) const;
        void SortingCatalog(char* f);
};
 
int menu();
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Книжный архив" << endl << "Автор: студент гр. РИ-150005 Рогожников Роман Сергеевич" << endl << "Екатеринбург, 2016 г." << endl;
    system ("pause");
    int c, n;
    
    Catalog catalog;
    
    while (true)
    {
       system("cls"); 
       c = menu();
        
       switch (c)
       {
            case 1:
                
                if (catalog.GetList())
                    delete [] catalog.GetList();
                cout << "Введите количество книг в каталоге: ";
                (cin >> n).get();
                catalog.FillCatalog(n);
                system("cls");
                catalog.ShowCatalog();
                system("pause");
                break;
            case 2:
                
                if (catalog.GetSize() > 0)
                {
                    catalog.SortingCatalog("year");
                    catalog.ShowCatalog();
                    system("pause");
                }
                break;
            case 3:
                
                if (catalog.GetSize() > 0)
                {
                    catalog.SortingCatalog("price");
                    catalog.ShowCatalog();
                    system("pause");
                }
                break;
            case 4:
                
                if (catalog.GetSize() > 0)
                {
                    catalog.SortingCatalog("year");
                    cout << "Введите год издания: ";
                    int year;
                    (cin >> year).get();
                
                    cout << "Найти книги именно этого года (введите 'o')" << endl;
                    cout << "Найти книги старше этого года (введите 'b')" << endl;
                    cout << "Найти книги младше этого года (введите 's')" << endl;
                    char f;
                    (cin >> f).get();
 
                    catalog.FindYear(year, f);
                    system("pause");
                }
                break;
            
           default:
                return 0;
        }
    }
}
 
void Book::SetBook()
{
    cout << "Введите имя автора: ";
    cin.getline(author, sizeof(author));
    cout << "Введите название книги: ";
    cin.getline(title, sizeof(title));
    cout << "Введите год публикации: ";
    cin >> year;
    cout << "Введите цену книги: ";
    (cin >> price).get();
}
 
int Book::GetYear() const
{
    return year;
}
 
void Book::ShowBook() const
{
    cout << "Автор: " << author << endl;
    cout << "Заголовок: " << title << endl;
    cout << "Год публикации: " << year << endl;
    cout << "Цена: " << price << endl;
}
 
Catalog::~Catalog()
{
    delete[] list;
}
 
void Catalog::FillCatalog(int s)
{
    if (s <= 0) return;
    size = s;
    list = new Book[size];
    for (int i = 0; i < size; ++i)
    {
        cout << "Введите данные о " << i+1 << " книге:" << endl;
        list[i].SetBook();
        cout << endl;
    }
}
 
int Catalog::GetSize() const
{
    return size;
}
 
void Catalog::SortingCatalog(char* f)
{
    if (size == 0) 
        return;
    
    Book temp;
    for(int i = 0; i < size - 1; ++i)
    {
        for(int j = 0; j < size - 1; ++j)
        {
            bool flag = false;
            if (!strcmp(f, "year"))
            {
                flag = (list[j].GetYear() > list[j + 1].GetYear());
            }
            else if (!strcmp(f, "price"))
            {
                flag = (list[j].GetPrice() > list[j + 1].GetPrice());
            }
            if (flag)
            {
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
            }
        }
    }
}
 
void Catalog::ShowCatalog() const
{
    for (int i = 0; i < size; ++i)
    {
        cout << "Вывод данных о " << i+1 << " книге:" << endl;
        list[i].ShowBook();
        cout << endl;
    }
}
 
void Catalog::FindYear(unsigned int year, char f) const
{
    for (int i = 0; i < size; ++i)
    {
        bool flag = false;
        switch (f)
        {
        case 'o':
            if (list[i].GetYear() == year)
              flag = true;
            break;
        case 'b':
            if (list[i].GetYear() > year)
                flag = true;
            break;
        case 's':
            if (list[i].GetYear() < year)
                flag = true;
            break;
        }
        if (flag)
        {
            cout << "Вывод данных о " << i+1 << " книге:" << endl;
            list[i].ShowBook();
            cout << endl;
        }
    }
}
 
int menu()
{
    int choice;
    cout << "1 - Создать каталог" << endl;
    cout << "2 - Показать книги, упорядочив их по датам создания" << endl;
    cout << "3 - Показать книги, упорядочив их по цене" << endl;
    cout << "4 - Показать книги определённого года" << endl;
    cout << "5 - Выход" << endl;
    cout << "Ваш выбор: ";
    (cin >> choice).get();
    return choice;
}
1
26.08.2016, 18:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2016, 18:42
Привет! Вот еще темы с ответами:

Ook: Автор, Название, Издательство, Год, Количество страниц. Создать массив объектов. Вывести: - C++
Book: Автор, Название, Издательство, Год, Количество страниц. Создать массив объектов. Вывести: а) список книг заданного...

Составить программу обработки данных о книгах - C++
Ребят помогите плиз решить задачку,очень срочно надо... Составить программу обработки данных о книгах. Сведения о каждой книге – это...

Составить программу, в которой описывается структура из полей: Название товара, Цена, Размер партии товара... - C++
Составить программу, в которой описывается структура из полей: Название товара, Цена, Размер партии товара (в штуках). Организовать ввод...

Записная книжка. Составить программу формирования данных о людях - C++
Записная книжка. Составить программу формирования данных о людях: Ф.И.О., город, улица, дом, квартира, № телефона. Организовать выбор...


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

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

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