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

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

Войти
Регистрация
Восстановить пароль
 
 
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
#1

Добавление и удаление студента - C++

26.04.2017, 15:58. Просмотров 415. Ответов 22
Метки нет (Все метки)

Всем привет. Есть некая задача, не могу написать 1 из функций, а именно: добавление и удаление 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
void FuncAdd(Student *st, Student *st2, Group *gr)//функция в которую передаю существующих студентов, которых буду добавлять и группу
{
    if (gr->instock == gr->capasity)//Если количество существующих = максимальному разрешимому количеству, то заходим в тело...
    {
        gr->st2 = new Student[2 * gr->capasity];// выделяем новую дин память под новый список, большего размера в 2 раза
        //Ввожу данные о новом студенте и сохраняю их в переменную st2
        
        cout << "Введите данные о студенте:" << endl;
        cout << "Введите имя:" << endl;
        cin >> st2->name;
        cout << "Введите фамилию:" << endl;
        cin >> st2->surname;
        cout << "Введите возраст:" << endl;
        cin >> st2->age;
        cout << "Введите адрес:" << endl;
        cin >> st2->address;
        cout << "Введите номерок:" << endl;
        cin >> st2->phone;
 
// И дальше не могу понять: Есть старые и есть новые, как их объединить в 1 переменную st
 
                memcpy(gr->st2, gr->st, sizeof(Student) * gr->capasity);//копировать что-то куда-то или как....
        gr->st = gr->st2;
Подскажите пожалуйста хотя бы алгоритм решения...
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2017, 15:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавление и удаление студента (C++):

Описать класс «множество» (добавление и удаление элемента, пересечение, объединение и удаление множеств ) - C++
Описать класс «множество», позволяющий выполнять основные операции – добавление и удаление элемента, пересечение, объединение и удаление...

Удаление элементов списка со средним баллом студента, меньше заданного числа - C++
Реализовать односвязный список для хранения данных вида: ФИО, группа, средний балл. Обеспечить выполнение операций: добавление...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей - C++
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе написания, но уже наверное есть ошибки....

Структуры и файлы (посчитать средний балл каждого студента и вывести фамилию студента с наибольшим баллом) - C++
У меня есть структура и файл, в котором находятся фамилии и оценки учащихся, как мне посчитать средний балл каждого студента и вывести...

Добавление и удаление элемента в списке - C++
Ребят сделал код создания элементов списка, но не могу написать 1) код добавления элемента списка в конец списка 2) код удаления...

Добавление, удаление элементов в дереве - C++
Сформировать массив записей, описывающих следующую таблицу:Фамилия, Адрес, N телефона. Удалить из массива тех абонентов, телефон которых ...

22
nd2
2455 / 2044 / 718
Регистрация: 29.01.2016
Сообщений: 6,726
26.04.2017, 16:05 #2
Group - это что? Зачем двух Student в функцию передаёшь?
0
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
26.04.2017, 21:24  [ТС] #3
nd2, это группа, в которой находится студент. И группу и студента описываю через структуры. а зачем 2х студентов передаю - не знаю, сам задумался) Надо передавать 1го, а под нового студента создавать переменную прямо в функции, а не на глобальном уровне, правильно?
0
nd2
2455 / 2044 / 718
Регистрация: 29.01.2016
Сообщений: 6,726
26.04.2017, 21:40 #4
Цитата Сообщение от jekakeba Посмотреть сообщение
это группа
Покажи, что из себя представляет эта структура.
0
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
26.04.2017, 21:49  [ТС] #5
nd2, вот они
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Student
{
    char name[15];
    char surname[20];
    int age;
    char address[100];
    char phone[12];
};
 
struct Group
{
    int capasity = 2;
    int instock = 0;
    Student *st;
    
};
Добавлено через 6 минут
я как думаю, надо создать дин память больше размер, чем уже существует. Вот так ее создаю:
C++
1
Student *st2 = new Student[2 * gr->capasity];
Потом копирую со старой памяти в новую:
C++
1
memcpy(st2, gr->st, sizeof(Student) * gr->capasity);
Потом cin ом ввожу нового пользователя и записываю его в новую память через st2->name и т.п.

и потом записываю этого нового с новой памяти st2 в st:
C++
1
gr->st[gr->instock] = *st2;
Но оно меняет первого со старой на нового, который должен быть по моей идеи третьим(
0
nd2
2455 / 2044 / 718
Регистрация: 29.01.2016
Сообщений: 6,726
26.04.2017, 21:53 #6
instock что хранит?

Добавлено через 3 минуты
Цитата Сообщение от jekakeba Посмотреть сообщение
Потом копирую со старой памяти в новую:
Не нужно так копировать. Копируй, в цикле, элементы.
0
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
26.04.2017, 21:57  [ТС] #7
nd2, текущее количество студентов в группе, и если их меньше чем реально разрешенно в этой группе, если
C++
1
instock < capasity
, то добавляю следующего вот так:
C++
1
2
3
4
5
6
7
8
9
if (gr->instock < gr->capasity)//Добавляем студента, если их меньше, чем в наличии, т.н. instock
    {
        for (int i = gr->instock; i < gr->instock; i++)//gr->instock
        {
            Student st;
            FuncWrite(&st);
            gr->st[i] = st;
        }
    }
надеюсь, эта часть кода будет работать, еще не проверял)

а если текущее количество, которое я считаю при инициализации, равно разрешенному, то надо создавать дин память больше размера в 2 раза(к примеру), копировать в нее старых студентов и добавлять последним нового...
0
nd2
2455 / 2044 / 718
Регистрация: 29.01.2016
Сообщений: 6,726
26.04.2017, 21:57 #8
Цитата Сообщение от jekakeba Посмотреть сообщение
Потом cin ом ввожу нового пользователя и записываю его в новую память через st2->name и т.п.
C++
1
gr->st[gr->instock] = *st2;
Не то.
0
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
26.04.2017, 22:00  [ТС] #9
Цитата Сообщение от nd2 Посмотреть сообщение
Не нужно так копировать. Копируй, в цикле, элементы.
В цикле имеем поверхностное копирование, а надо глубокое!

Добавлено через 1 минуту
nd2, что не то? не правильно ввожу нового?

Это вообще вот так выглядит:
C++
1
2
3
4
5
6
7
8
9
10
11
cout << "Введите данные о добавляемом студенте:" << endl;
        cout << "Введите имя:" << endl;
        cin >> st2->name;
        cout << "Введите фамилию:" << endl;
        cin >> st2->surname;
        cout << "Введите возраст:" << endl;
        cin >> st2->age;
        cout << "Введите адресс:" << endl;
        cin >> st2->address;
        cout << "Введите номерок:" << endl;
        cin >> st2->phone;
Добавлено через 51 секунду
Ж...ой чую, что строка
C++
1
gr->st[gr->instock] = *st2;
- это бред)
0
nd2
2455 / 2044 / 718
Регистрация: 29.01.2016
Сообщений: 6,726
26.04.2017, 22:03 #10
Цитата Сообщение от jekakeba Посмотреть сообщение
C++
1
int i = gr->instock; i < gr->instock;
Может
C++
1
i < gr->capasity;
?

Добавлено через 2 минуты
Цитата Сообщение от jekakeba Посмотреть сообщение
а надо глубокое!
С такой структурой Student не нужно никакого глубокого, да и memcpy() - это никакое не глубокое копирование.
1
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
26.04.2017, 22:09  [ТС] #11
nd2, i < gr->capasity;
да, согласен. спасибо!

Добавлено через 43 секунды
а вот как быть, если
C++
1
gr->instock == gr->capasity
это врыв мозга(
0
nd2
2455 / 2044 / 718
Регистрация: 29.01.2016
Сообщений: 6,726
26.04.2017, 22:22 #12
Приблизительно так:
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
void FuncAdd(Student *st, Group *gr)//функция в которую передаю студента, который добавляется в группу
{
    if (gr->instock == gr->capasity)//Если количество существующих = максимальному разрешимому количеству, то заходим в тело...
    {
        Student* temp = new Student[2 * gr->capasity];// выделяем новую дин память под новый список, большего размера в 2 раза
        gr ->capasity *= 2;
        
        // копирование из старой памяти в новую
        for (int i = 0; i < gr ->instock; ++i)
            temp[i] = gr->st[i];
        
        delete [] gr ->st;
        gr ->st = temp;
 
        cout << "Введите данные о студенте:" << endl;
        cout << "Введите имя:" << endl;
        cin >> st ->name;
        cout << "Введите фамилию:" << endl;
        cin >> st ->surname;
        cout << "Введите возраст:" << endl;
        cin >>  st ->age;
        cout << "Введите адрес:" << endl;
        cin >> st ->address;
        cout << "Введите номерок:" << endl;
        cin >> st ->phone;
 
        gr ->st[gr ->instock] = *st; // добавляем нового в группу
        ++gr ->instock;
 
    }
    else
    {
        gr ->st[gr ->instock] = *st;
        ++gr ->instock;
    }
}
Добавлено через 5 минут
Логичнее было бы не передавать сюда Student *st, а внутри создавать объект.
0
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
26.04.2017, 22:27  [ТС] #13
nd2, ну я
C++
1
Student *st
сюда передаю, так как первая инициализация будет вообще в другой функции...

Я конечно очень благодарен Вам за помощь, сложноватая темка(
Но блин, не работает, выводит все равно только 2 студента... Может у меня функция вывода не правильная, посмотрите плиз:
C++
1
2
3
4
5
6
7
void FuncPrint(Group *gr, Student *st)//Вывод данных о студентах
{
    for (int i = 0; i < gr->capasity; i++)
    {
        cout << gr->st[i].name << ' ' << gr->st[i].surname << ' ' << gr->st[i].age << " лет " << " Проживает: " << gr->st[i].address << " Телефон: " << gr->st[i].phone << endl;
    }
}
Добавлено через 1 минуту
и еще, может здесь что-то не так(((( я уже ничего не знаю(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main()
{
    setlocale(LC_ALL, "Russian");
    Group gr;
    Student st;
 
    gr.st = new Student[gr.capasity];
    FuncInic(&gr, &st);//Инициализация студентов
    //FuncPrint(&gr, &st);
    FuncAdd(&st, &gr);
    FuncPrint(&gr, &st);// Проверка добавления
    //FuncEdit(&st, &gr);
    FuncPrint(&gr, &st);// Проверка изменения
    
 
    cout << gr.instock << ' ' << gr.capasity;
}
0
nd2
2455 / 2044 / 718
Регистрация: 29.01.2016
Сообщений: 6,726
27.04.2017, 17:39 #14
Цитата Сообщение от jekakeba Посмотреть сообщение
сюда передаю, так как первая инициализация будет вообще в другой функции...
Поля там заполняются? Если заполняются, то из этой функции нужно заполнение убрать, если нет, то нужно, в моём варианте кода, вынести заполнение из if.

Добавлено через 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
void FuncAdd(Student *st, Group *gr)//функция в которую передаю студента, который добавляется в группу
{
        cout << "Введите данные о студенте:" << endl;
        cout << "Введите имя:" << endl;
        cin >> st ->name;
        cout << "Введите фамилию:" << endl;
        cin >> st ->surname;
        cout << "Введите возраст:" << endl;
        cin >>  st ->age;
        cout << "Введите адрес:" << endl;
        cin >> st ->address;
        cout << "Введите номерок:" << endl;
        cin >> st ->phone;
    
    if (gr->instock == gr->capasity)//Если количество существующих = максимальному разрешимому количеству, то заходим в тело...
    {
        Student* temp = new Student[2 * gr->capasity];// выделяем новую дин память под новый список, большего размера в 2 раза
        gr ->capasity *= 2;
        
        // копирование из старой памяти в новую
        for (int i = 0; i < gr ->instock; ++i)
            temp[i] = gr->st[i];
        
        delete [] gr ->st;
        gr ->st = temp;
        
    }
    
    gr ->st[gr ->instock] = *st; // добавляем нового в группу
    ++gr ->instock;
    
}
Добавлено через 5 минут
Цитата Сообщение от jekakeba Посмотреть сообщение
Может у меня функция вывода не правильная, посмотрите плиз:
Неправильная. Зачем туда Student *st передаётся? И сравнивать, в параметрах цикла, нужно с instock, а не с capasity.
Цитата Сообщение от jekakeba Посмотреть сообщение
может здесь что-то не так
Где-то ещё не так. Нужно разобраться с соотношением instock и capasity.

Добавлено через 5 минут
FuncInic() покажи. Впрочем, не нужно, она всё равно лишняя.

Добавлено через 59 минут
Кликните здесь для просмотра всего текста
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
struct Student
{
    char name[15];
    char surname[20];
    int age;
    char address[100];
    char phone[12];
};
 
struct Group
{
    int capasity;
    int instock;
    Student *st;
    Group() : capasity(2), instock(0), st(new Student[capasity])
    {}
    ~Group()
    { delete [] st; }
    
};
 
void FuncAdd(Group& gr)
{
        Student st;
        cout << "Введите данные о студенте:" << endl;
        cout << "Введите имя:" << endl;
        cin >> st.name;
        cout << "Введите фамилию:" << endl;
        cin >> st.surname;
        cout << "Введите возраст:" << endl;
        cin >>  st.age;
        cout << "Введите адрес:" << endl;
        cin >> st.address;
        cout << "Введите номерок:" << endl;
        cin >> st.phone;
    
    if (gr.instock == gr.capasity)//Если количество существующих = максимальному разрешимому количеству, то заходим в тело...
    {
        Student* temp = new Student[2 * gr.capasity];// выделяем новую дин память под новый список, большего размера в 2 раза
        gr.capasity *= 2;
        
        // копирование из старой памяти в новую
        for (int i = 0; i < gr.instock; ++i)
            temp[i] = gr.st[i];
        
        delete [] gr.st;
        gr.st = temp;
        
    }
    
    gr.st[gr.instock] = st; // добавляем нового в группу
    ++gr.instock;
    
}
 
void FuncPrint(const Group& gr)
{
    for (int i = 0; i < gr.instock; i++)
    {
        cout << gr.st[i].name << ' ' << gr.st[i].surname << ' ' << gr.st[i].age << " лет " << " Проживает: " << gr.st[i].address << " Телефон: " << gr.st[i].phone << endl;
    }
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    Group gr;
    char ch;
    do
    {
        FuncAdd(gr);
        FuncPrint(gr);
        
        cout << "Ещё (y/n)? :";
        cin >> ch;
    } while (ch != 'n');
    
    system("pause");
    return 0;
}
1
jekakeba
0 / 0 / 0
Регистрация: 31.12.2016
Сообщений: 60
27.04.2017, 18:40  [ТС] #15
nd2, Здравствуйте! С добавлением и с Вашей помощью я разобрался)
Помогите пожалуйста, еще и с удалением студента с существующего списка...

Вот что пока придумал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void FuncDelete(Student *st, Group *gr)
{
//создаем новую дин память размером на 1 меньше, чем студентов в наличии
    Student* st2 = new Student[gr->instock - 1];
    int num;
    cout << "Введите номер студента для удаления: ";
    cin >> num;
    if (num > 0 && num <= gr->instock)
    {
        //копируем со старого массива в новый
        memmove(&st2[gr->instock - num], &gr->st[num], sizeof(Student)* (gr->capasity - gr->instock));
 
        // А что дальше не могу понять((((( Если можно, объясните алгоритм решения задачи, может я его сам переведу в код....
    }
    else
    {
        
        cout << "Ошибка! Нет такого студента";
    }
}
Спасибо!

Добавлено через 3 минуты
по-ходу, я и с
C++
1
memmove
тоже наплужил....
0
27.04.2017, 18:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2017, 18:40
Привет! Вот еще темы с ответами:

Добавление и удаление элемента динамического массива - C++
Подскажите какие существую способы добавления и удалеия элемента одномерного динамического массива(переопределяя размер массива)....

Удаление и добавление элементов однонаправленного списка - C++
Здравствуйте уважаемые гуру. Хотелось бы попросить вашей помощи в данном задании: Записи в линейном списке содержат ключевое поле типа...

Односвязный список. Добавление и удаление в строку - C++
Здравствуйте, есть задача. Дана строка, если в ней встречается '*', то нужно удвоить ее, если встречаются два '-' подряд, то нужно один...

Деревья (добавление, удаление и вывод элементов) - C++
Задача - реализовать дерево на С++, чтобы была возможность добавлять елементы, удалять их оттуда и выводить. Программа запускается и сразу...


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

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

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