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

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

Восстановить пароль Регистрация
 
serj_xl
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 17
16.11.2012, 20:40     Стек для хранения данных #1
вот условия:

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

вроде задание лёгкое, но ничего не получается((
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 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     Стек для хранения данных
Еще ссылки по теме:

Стек для хранения целых чисел (int) C++
Класс для хранения массива данных C++
C++ Как организовать массив для хранения данных?

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

Или воспользуйтесь поиском по форуму:
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 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     Стек для хранения данных
Ответ Создать тему
Опции темы

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