Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для jhdanov
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 5

Описать класс, реализующий стек и работу с ним

29.06.2015, 20:26. Показов 2717. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Написал программу, суть которой в том, что нужно описать класс, реализующий стек.
Класс содержит сведения о студентах, такие как успеваемость, номер группы, оценки.
В классе реализованы такие действия, как
1) добавление данных о студентах
2) удаление данных о студенте, фамилия которого была введена
3) вывод сведений обо всех студентах
4) вывод студентов, имеющих оценки только 4 и 5.

Возникает ошибка при удалении несуществующего студента.
Вот сам код:
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
#include "stdafx.h"
#include "locale.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#include "windows.h"
#include <iostream>
#include <string>
 
class STACK
{
public:
    void push(STACK **top, char *item1, int item2, int *item3, int j);
    void del(STACK **pbeg, char *name);
    void OTLICHNIKI(STACK *s, int j, int p);
    void VIVOD(STACK *s, int j);
private:
    char NAME[20];
    int GRUPPA;
    int USP[5];
    STACK *next;
};
 
 
void STACK::push(STACK **top, char *item1, int item2, int *item3, int j)
{
    STACK *new_item;
    new_item = new STACK;
    strcpy_s(new_item->NAME, item1);
    new_item->GRUPPA = item2;
    for (j = 0; j < 5; j++)
    {
        new_item->USP[j] = item3[j];
    }
    new_item->next = *top;
    *top = new_item;
}
void STACK::del(STACK **top, char *name)
{
    int flag = 0;
    if (*top)
    {
        STACK *current = *top;
        STACK *previous = 0;
        while (strcmp(current->NAME, name) != 0)
        {
 
            previous = current;
            current = current->next;
        }
        //удаление в начале стека
        if (current == *top)
        {
            *top = (*top)->next;
            flag = 1;
 
        }
        else
        {
            if (current->next == NULL)//удаление в конце стека
            {
                previous->next = NULL;
                flag = 1;
 
            }
 
 
            else//удаление в середине стека
            {
                previous->next = current->next;
                flag = 1;
 
            }
        }
 
        free(current);
        if (flag == 0) printf("\nТакого студента не существует!  \n");
        if (flag == 1) printf("\nСтудент удалён!  \n");
    }
    else
    {
        printf("\nНе добавлено ни одного студента!  \n");
    }
}
 
void STACK::OTLICHNIKI(STACK *s, int j, int p)
{
    STACK *t;
    t = s;
    int z = 0;
    while (t != NULL)
    {
        p = 0;
        for (j = 0; j < 5; j++)
        {
            if (t->USP[j] == 4 || t->USP[j] == 5)
            {
                p++;
            }
        }
        if (p == 5)
        {
            printf("%s\n", t->NAME);
            z++;
        }
        t = t->next;
    }
    if (z == 0)printf("Студентов, имеющих имеющих только 4 и 5 нет.\n");
 
};
void STACK::VIVOD(STACK *s, int j)
{
    STACK *t;
    t = s;
    while (t != NULL)
    {
        printf("%s\n", t->NAME);
        printf("%d\n", t->GRUPPA);
        for (j = 0; j < 5; j++)
        {
            printf("%d\n", t->USP[j]);
        }
        t = t->next;
 
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
 
    int i = 0, j, n = 0, x = 0, g[10], num = 0, p = 0;
    char name[20];
 
    STACK *s = 0, st1;
    char NAME[20];
    int GRUPPA;
    int USP[5];
    while (num != 5)
    {
        std::cout << "Пункты задачи:\n\n";
        puts("1) Добавить студента в список");
        puts("2) Удалить студента из списка");
        puts("3) Вывести сведения обо всех студентах");
        puts("4) Вывести студентов, имеющих оценки 4 и 5");
        puts("5) Выход");
 
        scanf_s("%d", &num);
 
        printf("\n\n");
        if (num == 1)
        {
 
            printf("Введите ФИО студента (Например: Zhdanov_M.A.)\n");
            scanf_s("%s", NAME, 20);
            printf("Введите  группу \n");
            scanf_s("%d", &GRUPPA);
            printf("Введите оценки (5 штук):\n");
            for (j = 0; j < 5; j++)
            {
                scanf_s("%d", &USP[j]);
            }
            st1.push(&s, NAME, GRUPPA, USP, j);
            i++;
            printf("\n\n");
        };
 
        if (num == 2)
        {
            puts("Введите имя студента, которого хотите удалить");
            scanf_s("%s", name, 20);
 
            st1.del(&s, name);
            printf("\n\n");
        };
        if (num == 3)
        {
            st1.VIVOD(s, j);
            printf("\n\n");
        };
        if (num == 4)
        {
            st1.OTLICHNIKI(s, j, p);
            printf("\n\n");
        };
    };
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2015, 20:26
Ответы с готовыми решениями:

Описать класс, реализующий стек и работу с ним
Вот вроде понял и что такое стек, и что такое классы и как их реализовать в отдельности. Но как их объеденить в одну программу...

Описать класс, реализующий стек
Всем привет, нуждаюсь в помощи. Описать класс, реализующий стек. Написать программу, использующую этот класс для моделирования...

Описать класс, реализующий стек
Очень нужна хоть какая-нибудь помощь! У меня никак не получается написать программу а заказывать времени уже нет. обратиться больше некуда....

4
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
29.06.2015, 20:52
вы бы привели код из main такой, чтобы руками не надо было ничего вводить. что-нибудь типа:
C++
1
2
3
4
Stack s;
s.push(...);
s.push(...);
s.del(...); // проблема
а то проблема глазами искать долго и муторно, а чтобы задебажить - постоянно вдалбливать одно и то же
да еще и неизвестно что, т.к. вы не описали последовательность ввода. и что за ошибка - тоже.

+ такой топик будет в пользу если еще не знаете про возможности отладки:
https://www.cyberforum.ru/cpp-... 62479.html
0
 Аватар для jhdanov
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 5
29.06.2015, 21:11  [ТС]
Часть кода, отвечающая за удаление:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void STACK::del(STACK **top, char *name)
{
    int flag = 0;
    if (*top)
    {
        STACK *current = *top;
        STACK *previous = 0;
        while (strcmp(current->NAME, name) != 0)
        {
 
            previous = current;
            current = current->next;
        }
        //удаление в начале стека
        if (current == *top)
        {
            *top = (*top)->next;
            flag = 1;
 
        }
        else
        {
            if (current->next == NULL)//удаление в конце стека
            {
                previous->next = NULL;
                flag = 1;
 
            }
 
 
            else//удаление в середине стека
            {
                previous->next = current->next;
                flag = 1;
 
            }
        }
 
        free(current);
        if (flag == 0) printf("\nТакого студента не существует!  \n");
        if (flag == 1) printf("\nСтудент удалён!  \n");
    }
    else
    {
        printf("\nНе добавлено ни одного студента!  \n");
    }
}
Ошибку выдает следующую
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
30.06.2015, 02:12
и так было понятно, что внутри del функции проблемы. я говорил, что ее поведение
зависит от того, что вы вводили до этого и что в стеке и что вы там удалить пытаетесь.

вот может вам все-таки поможет спец пост из указанной ранее темы, который специально
под такие окошки с ошибками написан: https://www.cyberforum.ru/post7188204.html
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.06.2015, 02:56
Цитата Сообщение от jhdanov Посмотреть сообщение
2) удаление данных о студенте, фамилия которого была введена
1) Структура данных типа стек не поддерживает удаления произвольной записи. Если возможно удаление произвольной записи, то это уже список. Если такая терминологическая чехарда была прямо в задании, это повод поискать другой учебник/ВУЗ.
2) То что вы написали, может считаться "в классе реализованы действия" лишь формально. С объектом своего класса (который доступен через this) ваши методы не работают никак. Классом должна была быть обертка вокруг "STACK *s = 0". А то что вы обозвали STACK надо было переименовать в какое ни будь VALUE.
3) И конструкторы с деструкторами надо.
Цитата Сообщение от jhdanov Посмотреть сообщение
Часть кода, отвечающая за удаление:
Гляньте этот пост.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.06.2015, 02:56
Помогаю со студенческими работами здесь

Описать класс, реализующий стек
Описать класс, реализующий стек. Написать программу, использующую этот класс для моделирования T-образного сортировочного узла на...

Описать класс, реализующий стек целых чисел типа LIFO.
Методы класса: а) создание стека; б) добавление элемента в стек (функция push); в) выбор элемента из стека, удаляя его из стека...

Описать класс, реализующий тип данных «вещественная матрица» и работу с ними
Доброго времени суток, необходима помощь в написании программы. Описать класс, реализующий тип данных «вещественная матрица» и работу...

Классы (Описать класс, реализующий тип данных «вещественная матрица» и работу с ними)
само задание звучит так:Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие...

Класс, реализующий стек
Помогите девушке, только учусь программировать и чет пока не очень=( плиииииииииииииииииииииииииз кого не затруднит...... Задание 5....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru