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

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

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

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

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

вот условия:

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

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

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

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

Реализовать стек для хранения и операций с данными - C++
Ребята, помогите, пожалуйста. Заранее огромное спасибо! Реализовать стек для хранения и операций с данными вида: Имя процедуры...

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

Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и почтового ад - C++
Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 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Эксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 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Эксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 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Эксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 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Эксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 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");
}
igorrr37
1646 / 1274 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 23:33
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.11.2012, 23:33
Ответ Создать тему
Опции темы

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