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

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

Войти
Регистрация
Восстановить пароль
 
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
#1

Добавление данных в массив объектов - C++

28.05.2012, 15:45. Просмотров 954. Ответов 14
Метки нет (Все метки)

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
void main()
{
    setlocale(LC_ALL, "Russian");
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    int kol;
    Group *gr=new Group[10];
    int n=0;
    
    
   do
   {
    cout<<" 1-создать список студентов \n 2-показать список \n 3-добавить студента \n 0-выход\n";
    cin>>n;
    switch(n)
    {
    case 1:
    cout<<"Введите количество студентов в группе:\n";
           cin>>kol;
 
            for(int i=0;i<kol;i++)
                {
                 gr[i].Info();
                gr[i].Info_gr ();
                }
            
            break;
 
    case 2:
        for(int i=0;i<kol;i++)
        {
        cout<<"Студент N"<<i+1<<"\n";
        gr[i].show();
        gr[i].Show_gr();
        }
        break;
    case 3:
        int dob;
        cout<<"Введите количество студентов которое необходимо добавить "<<endl;
        cin>>dob;
        for (int i=kol;i<kol+dob;i++)
        {  
                gr[i].Info();
                gr[i].Info_gr ();
        }
 
    }
    }
    while(n!=0);
}
Проблема в том, что при добавлении новых объектов (case 3) все вроде как добавляется, но при показе (case 2) показываются только те объекты, которые были созданы ранее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 15:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавление данных в массив объектов (C++):

C++ Добавление нового элемента в массив объектов - C++
Ошибка заключается в том что, после добавления нового элемента в массив groupArray через функцию Add, если попытаться вывести их происходит...

Реализовать добавление/удаление элементов в массив объектов типа PhoneBook - C++
Есть небольшая задача создать телефонную книгу с возможностью записи контакта. выводом контактов на экран. и удалением всех контактов ...

Добавление данных в двумерный массив из файла - C++
int tab = { { ' ', 'a', 'b', 'c', }, { 0, 1, 2, 3 }};Как данный массив заполнить тем же самым только из файла?

Как запретить добавление данных в массив при повторении? С++ - C++
Стоит задача: ...Реализовать функцию добавления данных в массив. Если введена информация об авторе книги и ее названии, которые уже...

Добавление объектов в вектор - C++
У меня есть класс в котором очень много объектов. Мне нужно все объекты добавить в вектор, но делать это вот так очень долго: ...

Добавление и удаление объектов с перегрузкой операторов '+' и '-' - C++
У нас есть массив указателей на объекты, и нужно осуществить добавление и удаление объектов с помощью перегрузки оперторов '+' и '-'. ...

14
Кот Ангенс
318 / 268 / 38
Регистрация: 24.05.2012
Сообщений: 629
28.05.2012, 15:50 #2
Для ответа требуется знать интерфейс структуры и реализацию этих методов:
C
1
2
gr[i].Info();
gr[i].Info_gr ();
0
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
28.05.2012, 18:35  [ТС] #3
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
#include <iostream>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include<stdio.h>
#include<windows.h>
using namespace std;
struct  date
{
    int day;
    char month [10];
    int  year;
};
class Student
{
    private:
    char *fam;
    char *name;
    int contact;
    date br;
    public:
    Student()
    {
        fam=new char[20];
        name=new char[20];
        date br1={1,"Января",1980};
        contact=0;
    }
    
void Info ()
{
    cout<<"Введите фамилию:\n";
    cin>>fam;
    cout<<"Введите имя:\n";
    cin>>name;
    cout<<"Введите дату в формате 00 (ENTER)/месяц(ENTER)/0000:\n";
    cin>>br.day;
    cin>>br.month;
    cin>>br.year;
    cout<<"Введите номер телефона:\n";
    cin>>contact;
}
 
void show ()
{
    cout<<"фамилия:\t"<<fam<<endl;
    cout<<"имя:\t\t"<<name<<endl;
    cout<<"дата рождения:\t"<<br.day<<"/"<<br.month<<"/"<<br.year<<endl;
    cout<<"телефон:\t"<<contact<<endl;
}
~Student()
    {
        delete[]fam;
        delete[]name;
    }
};
class Group: public Student
{
private:
 char* Name;
 char* Specializ;
 Student st[30];
public:
 Group()
    {
       
        Name=new char[25];
        Specializ=new char[25];
    }
 
  void Info_gr ()
{
    cout<<"Введите имя группы:\n";
    cin>>Name;
    cout<<"Введите специальность:\n";
    cin>>Specializ;
}
 
void Show_gr ()
{
    cout<<"имя группы::\t"<<Name<<endl;
    cout<<"специальность:\t"<<Specializ<<endl;
}
~Group()
    {
        delete[]Name;
        delete[]Specializ;
    }
};
Добавлено через 40 минут
добавил класс

Добавлено через 45 минут
up////

Добавлено через 1 час 16 минут
неужто никто не знает в чем трабла?

попробовал case 3 переделать в

case 3:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    
        int TEMP;
        Group *temp=new Group[10];
        for (int i=0;i<kol;i++)
        {
        temp[i]=gr[i];
         TEMP=i;
        }
        temp[TEMP+1].Info();
        temp[TEMP+1].Info_gr();
        delete[] gr;
 
        Group *gr=new Group[10];
 
        for(int i=0;i<kol;i++)
         gr[i]=temp[i];
        
        delete[] temp;
Но тогда после добавления вылетает окно с ошибкой
0
Кот Ангенс
318 / 268 / 38
Регистрация: 24.05.2012
Сообщений: 629
29.05.2012, 07:03 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <clocale>
#include <string>
#include <vector>
#include <wincon.h>
 
using namespace std;
 
struct date {
    short day;
    string month;
    short year;
};
 
class Student {
    string surname, name;
    int contact;
    date br;
public:
    Student(): br( { 1, "Января", 1980 } ) {
        contact = 0;
    }
 
    void Scan() {
        cout << "Введите фамилию:\n";
        cin >> surname;
        cout << "Введите имя:\n";
        cin >> name;
        cout << "Введите дату в формате \"00{ENTER}/месяц{ENTER}/0000\":\n";
        cin >> br.day >> br.month >> br.year;
        cout << "Введите номер телефона:\n";
        cin >> contact;
    }
 
    void Print() const {
        cout << "Фамилия:\t" << surname << "\nИмя:\t\t" << name << "\nДата рождения:\t"
            << br.day << '/' << br.month << '/' << br.year << "\nТелефон:\t" << contact << endl;
    }
};
 
class Group {
    string name, special;
    vector<Student*> st;
public:
    void Scan() {
        cout << "Введите название группы:\n";
        cin >> name;
        cout << "Введите специальность:\n";
        cin >> special;
    }
 
    void Print() const {
        cout << "Название группы:\t" << name << "\nСпециальность:\t" << special << "\n\n";
        for (unsigned short i = 0; i < st.size(); i++) {
            cout << "Студент №" << i << endl;
            st[i]->Print();
            cout << endl;
        }
    }
 
    void Add(Student* s) {
        st.push_back(s);
    }
 
    int Remove(const Student* s) {
        return st.erase(s);
    }
 
    void Clear() {
        st.clear();
    }
};
 
 
int main() {
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Group g;
    vector<Student*> allStudents;
    cout << " 1 - создать список студентов\n"
        " 2 - показать список\n 3 - добавить студента\n 0-выход\n\n";
    short i;
    char n;
    while ((n = cin.get()) != '0')
        switch (n) {
            case 1:
                g.Clear();
                g.Scan();
            case 3:
                cout << "Введите количество студентов, которых необходимо добавить:\n";
                cin >> i;
                while (i--) {
                    allStudents.push_back(new Student);
                    allStudents[allStudents.size() - 1]->Scan();
                    g.Add(allStudents[allStudents.size() - 1]);
                }
                break;
 
            case 2:
                g.Print();
        }
    for (i = 0; i < allStudents.size(); i++)
        delete allStudents[i];
}
1
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
29.05.2012, 09:43  [ТС] #5
спасибо...но я как бы не совсем вкурсе о векторах и не понимаю код. Так же не пойму что есть
st.size()
st.push_back(s);
st.erase(s);
st.clear();
и для чего служат три последних метода. в которых используются эти функции
0
alex_bojik
Заблокирован
29.05.2012, 09:48 #6
Если не ошибаюсь, при добавлении переменная kol не увеличивается и цикл вывода просто не доходит до новых введенных строк
0
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
29.05.2012, 10:00  [ТС] #7
Цитата Сообщение от alex_bojik Посмотреть сообщение
Если не ошибаюсь, при добавлении переменная kol не увеличивается и цикл вывода просто не доходит до новых введенных строк
угу....case 3 у меня уже выглядит следующим образом

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
case 3:
        cout<<"Введите количество студентов которое необходимо добавить "<<endl;
        cin>>size;
        Group *temp=new Group[kol+size];
        for (int i=0;i<kol;i++)
        {
        temp[i]=gr[i];
        
        }
        for (int i=kol;i<kol+size;i++)
        {
        temp[i].Info();
        temp[i].Info_gr();
        }
        delete[] gr;
        kol=kol+size;
        cout<<"количество элементов "<<kol;
 
        Group *gr=new Group[kol];
 
        for(int i=0;i<kol;i++)
         gr[i]=temp[i];
        
        delete[] temp;
 
        break;
Но после добавления объектов окно все равно вылетает
0
alex_bojik
Заблокирован
29.05.2012, 10:08 #8
Цитата Сообщение от Alt_Shift Посмотреть сообщение
Group *gr=new Group[kol];
тут заново объявляется gr... по-моему достаточно просто gr = new...
0
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
29.05.2012, 10:16  [ТС] #9
Цитата Сообщение от alex_bojik Посмотреть сообщение
тут заново объявляется gr... по-моему достаточно просто gr = new...
действительно достаточно Но проблему это не решило
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
29.05.2012, 12:14 #10
Alt_Shift,

Вы когда создаете новый объект, вы не инструктируете компилятор о том, чтобы он увеличил счетчик объектов, поэтому отображается ровно столько, сколько объектов было изначально создано. Я дам вам ваш же код, вы все наверное поймете. Только уберите ненужные setlocale (я понаписал и где не надо просто)

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 "stdafx.h"
#include <iostream>
 
using namespace std;
 
struct  date
{
    int day;
    char month [10];
    int  year;
};
class Student
{
    private:
    char *fam;
    char *name;
    int contact;
    date br;
    public:
    Student()
    {     
        fam=new char[20];
        name=new char[20];
        date br1={1,"Января",1980};
        contact=0;
    }
    
void Info ()
{
    cout<<"\n";
    cout<<"Введите фамилию: "; cin>>fam;
    cout<<"Введите имя: ";     cin>>name;
    cout<<"Введите дату в формате 00 (ENTER)/месяц(ENTER)/0000:\n ";
    cin>>br.day;
    cin>>br.month;
    cin>>br.year;
    cout<<"Введите номер телефона: "; cin>>contact;
}
 
void show ()
{
    setlocale(LC_ALL, "Russian");
    cout<<"фамилия:\t"<<fam<<endl;
    cout<<"имя:\t\t"<<name<<endl;
    cout<<"дата рождения:\t"<<br.day<<"/"<<br.month<<"/"<<br.year<<endl;
    cout<<"телефон:\t"<<contact<<endl;
}
~Student()
    {
        delete[]fam;
        delete[]name;
    }
};
class Group: public Student
{
private:
 char* Name;
 char* Specializ;
 Student st[30];
public:
 Group()
    {
        
        Name=new char[25];
        Specializ=new char[25];
    }
 
  void Info_gr ()
{
    setlocale(LC_ALL, "Russian");
    cout<<"Введите имя группы: ";   cin>>Name;
    cout<<"Введите специальность: ";cin>>Specializ;
}
 
void Show_gr ()
{
    cout<<"имя группы::\t"<<Name<<endl;
    cout<<"специальность:\t"<<Specializ<<endl;
}
 
~Group()
    {
        delete[]Name;
        delete[]Specializ;
    }
};
 
void main()
{
    setlocale(LC_ALL, "Russian");
 
    int kol;
    Group *gr=new Group[10];
    int n=0;
    
    
   do
   {
    cout<<" 1-создать список студентов \n 2-показать список \n 3-добавить студента \n 0-выход\n";
    cin>>n;
    switch(n)
    {
    case 1:
    cout<<"Введите количество студентов в группе: ";
           cin>>kol;
 
            for(int i=0;i<kol;i++)
                {
                 gr[i].Info();
                 gr[i].Info_gr ();
                }
            
            break;
 
    case 2:
        for(int i=0;i<kol;i++)
        {
        cout<<"Студент N"<<i+1<<"\n";
        gr[i].show();
        gr[i].Show_gr();
        }
        break;
    case 3:
        int dob; int temp=kol;  //temp - Изначальное число объектов
        cout<<"Введите количество студентов которое необходимо добавить "<<endl;
        cin>>dob; kol=kol+dob; //Вычисляете сколько объектов будет и обновляете kol
 
        for (int i=temp;i<kol;i++)  
        {  
                gr[i].Info();
                gr[i].Info_gr ();
        }
 
    }
    }
    while(n!=0);
}
1
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
29.05.2012, 13:09  [ТС] #11
Цитата Сообщение от daslex Посмотреть сообщение
Alt_Shift,

Вы когда создаете новый объект....
Спасибо Все заработало.

Добавлено через 9 минут
и еще вопрос...каким образом описать case 4 для удаления объекта номер которого введен с клавиатуры?Как то так я понимаю

int del;
cin>>del;
for (int i=0;i<kol;i++)
{
if (i+1==del)

но дальше стопорюсь
0
Кот Ангенс
318 / 268 / 38
Регистрация: 24.05.2012
Сообщений: 629
29.05.2012, 13:14 #12
Если честно, я не совсем понимаю, зачем наследовать группу от студента.
0
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
29.05.2012, 14:06  [ТС] #13
в задании указано что бы было наследование, так то оно там лишнее, согласен.

Добавлено через 19 минут
повторюсь...
каким образом описать case 4 для удаления объекта номер которого введен с клавиатуры?Как то так я понимаю

C++
1
2
3
4
5
int del;
 cin>>del;
 for (int i=0;i<kol;i++)
 {
 if (i+1==del)
но дальше стопорюсь
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
29.05.2012, 14:08 #14
C++
1
2
3
4
5
int kol=0;
    Group *gr=new Group[10];
    int n=0;
    int dob; int temp=kol;
    int number;
C++
1
2
3
4
5
6
7
case 4:
        cout<<"Удалить N "; cin>>number; //number - номер удаляемого объекта
        temp=kol; kol--; //как и ранее говорил, инструктируем компилятор об уменьшении объектов
        for (int i=number-1;i<temp;i++) //Отсчет массива идет с нуля, поэтому Number указан как на единицу меньше
        {
            gr[i]=gr[i+1];  //Обновление элементов      
        }
В отредактированном вам мною коде я объявлял переменные внутри case чтоб вы видели что и зачем добавляется. Но такое объявление переменных не есть хорошо. Нужно их вынести к общей группе переменных (надеюсь разберетесь).
1
Alt_Shift
50 / 50 / 2
Регистрация: 28.05.2012
Сообщений: 161
29.05.2012, 14:31  [ТС] #15
Цитата Сообщение от daslex Посмотреть сообщение
В отредактированном вам мною коде я объявлял переменные внутри case чтоб вы видели что и зачем добавляется. Но такое объявление переменных не есть хорошо. Нужно их вынести к общей группе переменных (надеюсь разберетесь).
ну это я понял сразу, как только оно начало матерится на переменную внутри case 3 при попытке ее использовать в case 4 Спасибо
0
29.05.2012, 14:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2012, 14:31
Привет! Вот еще темы с ответами:

Написать класс Матрица. Массив объектов класса Массив - C++
Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего задания). В классе реализовать следующие...

Организовать добавление данных в файл, просмотр, поиск и очистку данных - C++
НАписать программу. Компонентами типизированного файла являются записи, состоящие из следующих полей: - фамилия; - имя; - отчество; - город...

Ввод данных, добавление данных, получение информации из файла по заданным критериям выборки - C++
Все привет!!!Обращаюсь к вам за помощью...никак не получается решить задачку... Суть такая....Написать на языке программирования С++,...

С++ массив объектов - C++
Люди начался новый учебный год опять обращаюсь за помощью File Имя файла.размер. количество обращений. создать массив объектов.ввывести. ...


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

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

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