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

Динамический массив структур - C++

Восстановить пароль Регистрация
 
klimenko
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 17
13.09.2012, 04:58     Динамический массив структур #1
Нужно создать базу данных библиотеки состоящую из структур: книга, автор, количество читателей взявших эту книгу.
Реализовать функции: ввода, вывода, добавления, удаления из динамического массива структур.
В структуре книга поля: название, жанр, поле автор(вложенная структура), количество читателей взявших эту книгу(вложенная структура), количество страниц.
В структуре автор поля: ФИО, дата рождения.
В структуре количество читателей взявших эту книгу поля: ФИО, список книг взятых данным читателем.

Вот все, что пока есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
using namespace std;
 
struct writer {
    char name[100];
    int d,m,y;
};
 
struct reader {
    char name[100];
    int kol;
};
const int SIZE = 100;
struct book {
    char name[100];
    char genre[100];
    writer a;
    reader b;
    int number_of_pages;
} BD[SIZE];
 
int menu();
void enter();
void show();
void add();
void delet();
void input(int);
 
int main()
{
    char choise;
 
    for(;;) {
        choise = menu();
        switch(choise) {
            case 'e': enter();
            case 's': show();
            case 'a': add();
            case 'd':delet();
            case 'q': return 0;
        }
    }
}
 
int menu()
{
    char ch;
    cout << '\n';
    do {
        cout << "(E)nter\n";
        cout << "(S)how\n";
        cout << "(A)dd\n";
        cout << "(D)elete\n";
        cout << "(Q)uit\n";
        cout << "select: ";
        cin >> ch;
    } while(!strchr("eduq", tolower(ch)));
    return tolower(ch);
}
 
void enter()
{
    int i;
    for(i=0;i<SIZE; i++)
        if(!*BD[i].name) break;
    if(i==SIZE) {
        cout << "list is full.\n";
        return;
    }
    input(i);
}
 
void input(int i)
{
    int j,k=0;
    cout << "book title: ";
    cin >> BD[i].name;
    cout << "genre of the book: ";
    cin >> BD[i].genre;
    cout << "the name of the author: ";
    cin >> BD[i].a.name;
    cout << "type the date author's birthday in the format dd.mm.yyyy: ";
    cin>>setw(2)>>BD[i].a.d; //дата
    cin.ignore();    //точка
    cin>>setw(2)>>BD[i].a.m; //месяц
    cin.ignore();    //точка
    cin>>setw(4)>>BD[i].a.y; //год
    cout<<"\n\n"<<BD[i].a.d<<'\t'<<BD[i].a.m<<'\t'<<BD[i].a.y;
    cout << "the number of readers who took the book: ";
    cin >> BD[i].b.kol;
    k=BD[i].b.kol;
    if(k!=0){
        for(j=0;j<k;j++){
            cout << "the name of reader: ";
            cin >> BD[i].b.name;
        }
    }
}
 
void show()
{
    int t;
    for(t=0;t<SIZE;t++){
        if(*BD[t].name){
            cout << "book title: ";
            cout << BD[t].name << '\n';
            cout << "\ngenre of the book: ";
            cout << BD[t].genre;
            cout << "\n\nthe name of the author: ";
            cout << BD[t].a.name;
            cout << "\n\nthe date of author's birthday: ";
            cout <<BD[t].a.d<<'\t'<<BD[t].a.m<<'\t'<<BD[t].a.y;
            cout << "\n\nthe number of readers who took the book: ";
            cout << BD[t].b.kol;
        }
    }
}
Меня интересует, как из того, что у меня есть, сделать динамический массив структур.
Изменится ли при этом функция ввода/вывода, если да, то как?
Как реализовать ф-цию удаления?

Вроде пока все...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2012, 04:58     Динамический массив структур
Посмотрите здесь:

Динамический массив структур C++
Динамический массив структур C++
C++ Динамический массив структур ...
C++ Динамический массив структур
C++ Динамический массив структур
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
miron_arhimedov
0 / 0 / 0
Регистрация: 31.10.2011
Сообщений: 5
13.09.2012, 09:04     Динамический массив структур #2
В качестве динамического массива хорошо подойдёт SLT контейнер vector.
Чтоб долго не распространятся на тему того что это и как в коде ниже показано как приблизительно всё должно выглядеть. Но предуперждаю, что не всех жуков в коде выловил Ну и по возможности замените массивы символов строками, а то как то некрасивенько
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
#include <iostream>
#include <iomanip>
#include <cstring>
#include <vector>
using namespace std;
 
struct writer {
    char name[100];
    int d,m,y;
};
 
struct reader {
    char name[100];
    int kol;
};
 
const int SIZE = 100;
/*struct book {
    char name[100];
    char genre[100];
    writer a;
    reader b;
    int number_of_pages;
} BD[SIZE];*/
struct book {
    char name[100];
    char genre[100];
    writer a;
    reader b;
    int number_of_pages;
};
 
book shtuke;
vector < book > BD;
vector < book >::iterator It;
 
int menu();
void enter();
void show();
void add();
void delet();
void input(int);
 
int main()
{
    char choise;
 
    for(;;) {
        choise = menu();
        switch(choise) {
            case 'e': enter(); break;
            case 's': show(); break;
            case 'a': add(); break;
            case 'd': delet(); break;
            case 'q': return 0;
        }
    }
}
 
int menu()
{
    char ch;
    cout << '\n';
    do {
        cout << "(E)nter\n";
        cout << "(S)how\n";
        cout << "(A)dd\n";
        cout << "(D)elete\n";
        cout << "(Q)uit\n";
        cout << "select: ";
        cin.clear();
        cin >> ch;
    } while(!strchr("esadq", tolower(ch)));
    return tolower(ch);
}
 
void enter()
{
    int i;
    for(i=0;i<SIZE; i++)
        if(!*BD[i].name) break;
    if(i==SIZE) {
        cout << "list is full.\n";
        return;
    }
    input(i);
}
 
void input(int i)
{
    int j,k = 0;
    cout << "book title: ";
    cin >> BD[i].name;
    cout << "genre of the book: ";
    cin >> BD[i].genre;
    cout << "the name of the author: ";
    cin >> BD[i].a.name;
    cout << "type the date author's birthday in the format dd.mm.yyyy: ";
    cin>>setw(2)>>BD[i].a.d; //дата
    cin.ignore();    //точка
    cin>>setw(2)>>BD[i].a.m; //месяц
    cin.ignore();    //точка
    cin>>setw(4)>>BD[i].a.y; //год
    cout<<"\n\n"<<BD[i].a.d<<'\t'<<BD[i].a.m<<'\t'<<BD[i].a.y;
    cout << "the number of readers who took the book: ";
    cin >> k;
    BD[i].b.kol = k;
    if(k!=0){
        for(j=0;j<k;j++){
            cout << "the name of reader: ";
            cin >> BD[i].b.name;
        }
    }
}
 
void show()
{
    int t=0;
//    for(t=0;t<SIZE;t++){
    for(It=BD.begin();It!=BD.end();It++){
        cout<<"book number: "<<t<<endl;
        //if(*BD[t].name){
            cout << "book title: ";
//            cout << BD[t].name << '\n';
            cout << It->name << '\n';
            cout << "\ngenre of the book: ";
//            cout << BD[t].genre;
            cout << It->genre;
            cout << "\n\nthe name of the author: ";
//            cout << BD[t].a.name;
            cout << It->a.name;
            cout << "\n\nthe date of author's birthday: ";
//            cout <<BD[t].a.d<<'\t'<<BD[t].a.m<<'\t'<<BD[t].a.y;
            cout <<It->a.d<<'\t'<<It->a.m<<'\t'<<It->a.y;
            cout << "\n\nthe number of readers who took the book: ";
//            cout << BD[t].b.kol;
            cout << It->b.kol;
        //}
        t++;
    }
}
 
void add(){
    int sz;
    BD.push_back(shtuke);
    sz = BD.size();
    cout<<"add book number "<<sz-1<<endl;
    input(sz-1);
}
 
void delet(){
    int pos;
    cout<<"book number to delete:";cin>>pos;
    BD.erase(BD.begin()+pos);
}
klimenko
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 17
13.09.2012, 21:05  [ТС]     Динамический массив структур #3
Спасибо, вчера пытался разобраться с контейнером vector, но в 3 часа ночи это вышло не очень успешно.

Только сейчас когда ввожу 'e', выкидывает и пишет:

Debug Assertion Failed!

Program: ...s\1\documents\visual studio
2010\Projects\lb_1\Debug\lb_1.exe
File: c:\program files\microsoft visual studio 10.0\vc\include\vector
Line: 932

Express: vector subscript out of range

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)


Добавлено через 7 часов 28 минут
Кстати, при вызове функции add вроде все в порядке.
miron_arhimedov
0 / 0 / 0
Регистрация: 31.10.2011
Сообщений: 5
14.09.2012, 05:18     Динамический массив структур #4
Я немного не понимаю какую смысловую нагрузку в программе несёт это поле меню. Я про e - (E)nter. В исходном варианте программы, насколько я понимаю, это действие добавляло книгу к базе данных. В новом варианте программы для этого предусмотрена функция add() с соответствующим пунктом меню (A)dd.

Добавлено через 19 минут
вот как то так по идее должно выглядеть...
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
#include <iostream>
#include <iomanip>
#include <cstring>
#include <vector>
using namespace std;
 
struct writer {
    char name[100];
    int d,m,y;
};
 
struct reader {
    char name[100];
    int kol;
};
 
struct book {
    char name[100];
    char genre[100];
    writer a;
    reader b;
    int number_of_pages;
};
 
book shtuke;
vector < book > BD;
vector < book >::iterator It;
 
int menu();
void enter();
void show();
void add();
void delet();
void input(int);
 
int main()
{
    char choise;
 
    for(;;) {
        choise = menu();
        switch(choise) {
            case 's': show(); break;
            case 'a': add(); break;
            case 'd': delet(); break;
            case 'q': return 0;
        }
    }
}
 
int menu()
{
    char ch;
    cout << '\n';
    do {
        cout << "(S)how\n";
        cout << "(A)dd\n";
        cout << "(D)elete\n";
        cout << "(Q)uit\n";
        cout << "select: ";
        cin.clear();
        cin >> ch;
    } while(!strchr("esadq", tolower(ch)));
    return tolower(ch);
}
  
void input(int i)
{
    int j,k = 0;
    cout << "book title: ";
    cin >> BD[i].name;
    cout << "genre of the book: ";
    cin >> BD[i].genre;
    cout << "the name of the author: ";
    cin >> BD[i].a.name;
    cout << "type the date author's birthday in the format dd.mm.yyyy: ";
    cin>>setw(2)>>BD[i].a.d; //дата
    cin.ignore();    //точка
    cin>>setw(2)>>BD[i].a.m; //месяц
    cin.ignore();    //точка
    cin>>setw(4)>>BD[i].a.y; //год
//    cout<<"\n\n"<<BD[i].a.d<<'\t'<<BD[i].a.m<<'\t'<<BD[i].a.y;
    cout << "the number of readers who took the book: ";
    cin >> k;
    BD[i].b.kol = k;
    if(k!=0){
        for(j=0;j<k;j++){
            cout << "the name of reader: ";
            cin >> BD[i].b.name;
        }
    }
}
 
void show()
{
    for(It=BD.begin();It!=BD.end();It++){
        cout<<"Book number : "<<t<<endl;
        cout <<"\t book title: ";
        cout << It->name << '\n';
        cout << "\t genre of the book: ";
        cout << It->genre<< '\n';
        cout << "\t the name of the author: ";
        cout << It->a.name<< '\n';
        cout << "\t the date of author's birthday: ";
        cout <<It->a.d<<"."<<It->a.m<<"."<<It->a.y<< '\n';
        cout << "\t the number of readers who took the book: ";
        cout << It->b.kol<< '\n';
    }
}
 
void add(){
    int sz;
    BD.push_back(shtuke);
    sz = BD.size();
    cout<<"add book number "<<sz-1<<endl;
    input(sz-1);
}
 
void delet(){
    int pos;
    cout<<"book number to delete:";cin>>pos;
    if(BD.size()<=pos) cout<<"there is no such a book in database."<<endl;
    else BD.erase(BD.begin()+pos);
}
klimenko
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 17
15.09.2012, 12:52  [ТС]     Динамический массив структур #5
Спасибо.
Yandex
Объявления
15.09.2012, 12:52     Динамический массив структур
Ответ Создать тему
Опции темы

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