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

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

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

Стек для хранения данных - C++

16.11.2012, 20:40. Просмотров 833. Ответов 10
Метки нет (Все метки)

вот условия:

(Динамические структуры данных)
Реализовать стек для хранения данных вида: ФИО, группа, средний балл.
Обеспечить выполнение операций:
добавление записи в стек;
удаление записи из стека;
очистка стека;
отображение последней введенной записи.

вроде задание лёгкое, но ничего не получается((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 20:40     Стек для хранения данных
Посмотрите здесь:

Организуйте стек для хранения целых чисел - C++
Организуйте стек для хранения целых чисел. Для стека используйте массив unsigned short. Продемонстрируйте добавление элемента,...

Стек для хранения целых чисел (int) - C++
Стек для хранения целых чисел (int). В классе должны быть функции добавления элемента на вершину стека (push), чтение верхнего элемента...

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

Класс для хранения массива данных - C++
Описать класс для хранения массива данных. Реализовать для него операцию индексации с контролем выходы индексов за пределы массива. В...

Подскажите контейнер для хранения данных - C++
Доброе время суток, имеем файл следующего содержания: # | Name | Type | Target 1 test txt toLSS 2 test2 avi ...

Работа со структурой для хранения данных о ноутбуках - C++
Здравствуйте, уважаемые программисты. Очень нужна помощь. Попытался написать программу и там куча ошибок Для хранения данных о...

Структуры данных для хранения и работы с матрицами - C++
Доброго времени суток! Есть матрица, у которой надо периодически удалять то столбец целиком, то строку. Вариант "вектор векторов" дает...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 20:51     Стек для хранения данных #2
Цитата Сообщение от serj_xl Посмотреть сообщение
вроде задание лёгкое, но ничего не получается((
Что именно не получается?
serj_xl
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 17
16.11.2012, 20:54  [ТС]     Стек для хранения данных #3
не могу найти пример, с которого можно было бы что-то понять..( (
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 21:01     Стек для хранения данных #4
Цитата Сообщение от serj_xl Посмотреть сообщение
не могу найти пример, с которого можно было бы что-то понять..( (
Думаете, что пример поможет? =)

main.cpp
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
#include <iostream>
#include "state.h"
using std::cout;
using std::cin;
using std::endl;
 
 
void Function1(int d){
cout<<"\tВызвана функция Function1 с параметром d = "<<d<<endl;
}
void Function2(int d){
cout<<"\tВызвана функция Function2 с параметром d = "<<d<<endl;
}
void Function3(int d){
cout<<"\tВызвана функция Function3 с параметром d = "<<d<<endl;
}
 
int main(){
StatesManager SM;
setlocale(LC_ALL,"Rus");
int q,nf;
void (*pF)(int);
do{
system("cls");
cout<<"Колличество состояний в стеке: "<<SM.GetCount()<<endl;
cout<<"Вызов текущей функции: "<<endl;
SM.ExecuteHead();
cout<<"Выберите действие (EXIT - 0; PUSH - 1; POP 2): ";
cin>>q;
cout<<endl;
 
if (q==1){
cout<<"Выберите функцию (1,2,3): ";
cin>>nf;
cout<<endl;
pF=0;
switch (nf){
case 1:
pF=Function1;
break;
case 2:
pF=Function2;
break;
default:
pF=Function3; break;
}
}
switch(q){
case 1:
SM.StatePush(pF);
break;
case 2:
SM.StatePop();
break;
default:
q=0; break;
}
}while(q);
 
return 0;
}
state.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef _STACK_H_
#define _STACK_H_
 
class StatesManager{
private:
typedef struct STATE{
void (*Func)(int);
STATE *pNext;
} STATE;
STATE * pStates;
int nCount;
public:
int GetCount();
StatesManager();
~StatesManager();
bool StatePush(void (*Func)(int));
bool StatePop();
void ExecuteHead();
}; 
#endif//_STACK_H_
state.cpp
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
#include "state.h"
 
StatesManager::StatesManager(){
this->nCount=0;
this->pStates=0;
}
 
StatesManager::~StatesManager(){
STATE *pS;
while(pStates){
pS=pStates;
pStates=pStates->pNext;
delete pS;
}
}
 
int StatesManager::GetCount(){return this->nCount;}
 
bool StatesManager::StatePush(void (*Function)(int)){
if (Function==0)
return false;
STATE *pNS=new STATE;
pNS->Func=Function;
pNS->pNext=this->pStates;
this->pStates=pNS;
this->nCount++;
return true;
}
bool StatesManager::StatePop(){
if (!pStates)
return false;
STATE *pTS;
pTS=this->pStates;
this->pStates=this->pStates->pNext;
delete pTS;
this->nCount--;
if (!pStates)
return false;
return true;
}
void StatesManager::ExecuteHead(){
if(pStates){
pStates->Func(this->nCount);
}
}
serj_xl
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 17
16.11.2012, 21:08  [ТС]     Стек для хранения данных #5
ну вот подобное я и нахожу.. и ничего с этого не могу переделать на свое.
долго ли такую прогу писать с нуля?
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 21:09     Стек для хранения данных #6
давно писал, в него сохраняются указатели на функции

Добавлено через 39 секунд
Цитата Сообщение от serj_xl Посмотреть сообщение
долго ли такую прогу писать с нуля?
минут 20, может полчаса
serj_xl
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 17
16.11.2012, 21:12  [ТС]     Стек для хранения данных #7
эта прога очень надо.....(

от куда можно больше узнать о строении этих стеков и подобное в С++ ??
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 21:14     Стек для хранения данных #8
Цитата Сообщение от serj_xl Посмотреть сообщение
от куда можно больше узнать о строении этих стеков и подобное в С++ ??
В любом учебнике написано =)
serj_xl
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 17
16.11.2012, 21:16  [ТС]     Стек для хранения данных #9
а не могли бы вы помочь сделать мне эту программу??
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
16.11.2012, 23:12     Стек для хранения данных #10
Цитата Сообщение от serj_xl Посмотреть сообщение
а не могли бы вы помочь сделать мне эту программу?
Отпарируете сами:
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
#include <iostream>
#include <locale>
#include <cstdlib>
using namespace std;
 
class Stack;
 
class Data{
private:
    friend Stack;
    Data *next;
    char *family;
    char *name;
    char *patronymic;
    int group;
    int ball;
public:
    void ShowData() const;
    Data(char*,char*,char*,int,int);
    Data();
    void SetData(char*,char*,char*,int,int);
    ~Data();
};
 
 
void Data::SetData(char *m_family,char *m_name,char *m_patronymic,int group,int ball){
    this->group=group;
    this->ball=ball;
    int len;
    char *p=m_family;
    delete [] this->family;
    delete [] this->name;
    delete [] this->patronymic;
    if(p){
        len=strlen(p);
        this->family=new char[len+1];
        int i=0;
        while(*p){*(this->family+i)=*p;++p;++i;}
        *(this->family+len)=0;
    }else{
        this->family=new char[7];
        strcpy(this->family,"Unknow");
    }
    p=m_name;
    if(p){
        len=strlen(p);
        this->name=new char[len+1];
        int i=0;
        while(*p){*(this->name+i)=*p;++p;++i;}
        *(this->name+len)=0;
    }else{
        this->name=new char[7];
        strcpy(this->name,"Unknow");
    }
    p=m_patronymic;
    if(p){
        len=strlen(p);
        this->patronymic=new char[len+1];
        int i=0;
        while(*p){*(this->patronymic+i)=*p;++p;++i;}
        *(this->patronymic+len)=0;
    }else{
        this->patronymic=new char[7];
        strcpy(this->patronymic,"Unknow");
    }
}
 
 
Data::Data(char *m_family,char *m_name,char *m_patronymic,int group,int ball){
    this->family=this->name=this->patronymic=NULL;
    this->SetData(m_family,m_name,m_patronymic,group,ball);
    this->next=NULL;
}
Data::Data(){
    this->family=this->name=this->patronymic=NULL;
    this->SetData(NULL,NULL,NULL,0,0);
    this->next=NULL;
}
Data::~Data(){
    delete [] this->name;
    delete [] this->patronymic;
    delete [] this->family;
}
 
void Data::ShowData() const{
    std::cout<<family<<" "<<name<<" "<<patronymic<<"\nGroup:\t"<<group<<"\nBall:\t"<<ball<<std::endl;
}
 
class Stack{
    Data *top;  
public:
    Stack();
    ~Stack();
    void push(Data*);
    Data const * const pop();
    bool deletetop();
    void clear();
};
 
Stack::Stack(){
    top=0;
}
void Stack::push(Data *data){
    if(!data) return;
    data->next=top;
    top=data;
}
Data const * const Stack::pop(){
    return top;
}
 
bool Stack::deletetop(){
    if(top){
        Data *p=top;
        top=top->next;
        delete p;
        return ((top)?true:false);
    }
    return false;
}
 
void Stack::clear(){
    Data *p;
    while(top){
        p=top;
        top=top->next;
        delete p;
    }
}
 
Stack::~Stack(){
    this->clear();
}
 
 
 
int main(){
    {
    Data *p;    
    const Data *cp;
    Stack stack;
    setlocale(LC_ALL,"Russian");
    int retval;
    do{
        cout<<"Ваши действия:\n\t1 - PUSH,\n\t2 - SHOW TOP\n\t3 - DELETE TOP\n\t4 - CLEARCTACK\n\tOTHER - EXIT\n\t->";
        cin>>retval;
        switch(retval){
        case 1:
            stack.push(new Data("MyFamily","MyName","MyPatronymic",4,5)); 
            break;
        case 2:
            if(cp=stack.pop())
                cp->ShowData();
            else
                cout<<"СТЭК ПУСТ\n";
            break;
        case 3:
            if(!stack.deletetop())
                cout<<"СТЭК ПУСТ\n";
            break;
        case 4:
            stack.clear();
            cout<<"СТЭК ОЧИЩЕН\n";
            break;
        default:
            retval=0;
        }           
    }while(retval);
    }
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 23:33     Стек для хранения данных
Еще ссылки по теме:

Как организовать массив для хранения данных? - C++
не судите только начал изучать с++ , правильно ли так сохранять все данные в массив? const int sz = 10; class publication {...

Создайте класс для хранения данных о студенте - C++
1. Создайте класс для хранения данных о студенте: фамилия, специальность, курс, успеваемость (массив из пяти элементов). В классе должны...

Выделение памяти для хранения массива данных - C++
Вопрос заключается в том, как правильно задать размер массива. Знаю что можно константой, но мне нужно, чтоб пользователь сам задал его. ...

Разработать шаблон класса для хранения данных (контейнер) - C++
Я не понял как описать шаблон класса для хранения данных (контейнер). Данные должны хранится, например, в виде массива. Шаблон должен...

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


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

Или воспользуйтесь поиском по форуму:
igorrr37
1641 / 1269 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
16.11.2012, 23:33     Стек для хранения данных #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
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
#include <iostream>
#include <algorithm>
#include <stdexcept>
#include <string>
 
template<typename T>
class Vector
{
public:
    Vector() : psize(0), p(0){}
    void push_back(T const& lhs)
    {
            T* pt = static_cast<T*>(operator new[](sizeof(T) * (psize + 1)));
            for(size_t i = 0; i < psize; ++i)
            {
                new(pt + i)T(p[i]);
            }
            new(pt + psize)T(lhs);
            std::swap(p, pt);
            for(size_t i = 0; i < psize; ++i)
            {
                pt[i].~T();
            }
            operator delete[](pt);
            pt = 0;
            ++psize;
    }
    void pop_back()
    {
        if(psize)
            --psize;
    }
    T& back()
    {
        if(!psize)
        {
            throw std::out_of_range("Vector<T>::back failed");
        }
        return p[psize - 1];
    }
    void clear()
    {
        for(size_t i = 0; i < psize; ++i)
        {
            p[i].~T();
        }
        operator delete[](p);
        p = 0;
        psize = 0;
    }
    size_t size() const
    {
        return psize;
    }
    ~Vector()
    {
        for(size_t i = 0; i < psize; ++i)
        {
            p[i].~T();
        }
        operator delete[](p);
        p = 0;
        psize = 0;
    }
private:
    size_t psize;
    T* p;
    Vector(Vector const&);
    Vector& operator=(Vector);
};
 
template<typename T, typename Container = Vector<T>>
class Stack
{
public:
    void push(T const& lhs)
    {
        con.push_back(lhs);
    }
    void pop()
    {
        con.pop_back();
    }
    T& top()
    {
        return con.back();
    }
    void clear()
    {
        con.clear();
    }
    size_t size() const
    {
        return con.size();
    }
private:
    Container con;
};
 
struct Student
{
    Student(std::string const& name, std::string const& group, double const mark) :
        name_(name), group_(group), mark_(mark){}
    std::string name_, group_;
    double mark_;
};
 
std::ostream& operator<<(std::ostream& ost, Student const& st)
{
    return ost << st.name_ << '\n' << st.group_ << '\n' << st.mark_;
}
 
int main()
{
    Stack<Student> stack;
    stack.push(Student("name1", "group1", 4.56));
    stack.push(Student("name2", "group2", 3.3));
    stack.clear();
    stack.push(Student("name3", "group3", 4.09));
    stack.push(Student("name4", "group4", 3.33));
    size_t stacksize = stack.size();
    for(size_t i = 0; i < stacksize; ++i)
    {
        std::cout << "stack.size is " << stack.size() << std::endl;
        std::cout << stack.top() << std::endl;
        stack.pop();
    }
    return 0;
}
Yandex
Объявления
16.11.2012, 23:33     Стек для хранения данных
Ответ Создать тему
Опции темы

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