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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
#1

CТЕК ! - C++

26.07.2011, 14:48. Просмотров 1796. Ответов 17
Метки нет (Все метки)

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
#include <iostream>
 
using namespace std;
 
class stack {
    int st[100];
    int tos;
    public:
        int back();
        void init();
        void push(int i);
        int pop();
        int size();
        void clear();
};
 
void stack::init()
{
    tos = 0;
}
void stack::push(int i)
{
    if (tos == 100)
    {
        cout <<"Stack is full\n";
        return;
    }
    st[tos] = i;
    tos++;
    cout << "ok";
}
 
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
 
    }
    tos--;
    return st[tos];
    st[tos] = 0;
}
 
void stack::clear()
{
    for(int i = 0; i <= tos; i++)
        st[i] = 0;
        cout <<"ok";
        tos = 0;
}
 
int stack::back()
{
    return st[tos-1];
}
int stack::size()
{
    return tos;
}
 
int main()
{
    stack stack1;
    int n;
    stack1.init();
    string str;
        while(true)
        {
            cin >> str;
            if (str == "push")
            {
                cin >> n;
                stack1.push(n);
                cout << endl;
            }
            if (str =="pop")
              {
                    cout << stack1.pop();
              }
 
            if (str == "exit")
             {
                    cout << "bye" ;
                    return 0;
             }
            if (str == "clear")
             {
                 stack1.clear();
                 cout << endl;
             }
            if (str == "size")
             {
                 cout << stack1.size();
                 cout << endl;
             }
            if (str =="back")
            {
                cout << stack1.back();
                cout << endl;
            }
        }
 
    return 0;
}
Pop чет нито работает ! return 0 мне нужно выйти а он возвращает 0

Добавлено через 6 минут
проверьте плиз функцию int stack:: pop() , когда я добавляю return 0 , у меня выводит значение return -а

Добавлено через 30 минут
вот условие задачи
Реализуйте структуру данных "стек". Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в стек число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из стека последний элемент. Программа должна вывести его значение.
back
Программа должна вывести значение последнего элемента, не удаляя его из стека.
size
Программа должна вывести количество элементов в стеке.
clear
Программа должна очистить стек и вывести ok.
exit
Программа должна вывести bye и завершить работу.

Перед исполнением операций back и pop программа должна проверять, содержится ли в стеке хотя бы один элемент. Если во входных данных встречается операция back или pop, и при этом стек пуст, то программа должна вместо числового значения вывести строку error.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2011, 14:48     CТЕК !
Посмотрите здесь:

1C 8.x (тонкий) Получение количества некоторых единиц на тек.момент - 1С
подскажите в чем ошибка и как ее исправить мне необходимо перед записью документа &quot;продажи&quot;, вычесть из реквизита Единицы документа...

Как аспскриптом узнать какие файлы лежат в тек директории ? - C# ASP.NET
?

В админке редактируется текст (размер шрифта, отступы и др.)а на странице не отображается отредактируемый тек - WordPress
Подскажите пожалуйста В админке редактируется текст (размер шрифта, отступы и др.) а на странице не отображается отредактируемый текст

Хочу чтобы VBA мне вывел перечень тек. устройств компьютера прямо в лист Excel - VBA
Хочу чтобы VBA мне вывел перечень тек. устройств компьютера прямо в лист Excel


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
26.07.2011, 14:51     CТЕК ! #2
C++
1
2
3
4
5
6
7
8
9
10
11
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";return 0;
 
    }
    tos--;
    return st[tos];
  
}
По-моему в pop последняя строка лишняя. Ну, я уже убрал её)
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 14:53  [ТС]     CТЕК ! #3
а удалять же надо
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,251
Записей в блоге: 1
Завершенные тесты: 1
26.07.2011, 14:54     CТЕК ! #4
Первое, что сразу заметил, это строка после return.
C++
1
2
3
4
5
6
7
8
9
10
11
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
 
    }
    tos--;
    return st[tos];
    st[tos] = 0;//эта строка никогда не выполнится
}
есть даже какой-то специальный англоязычный термин для этой ситуации, я его не помню, но по-русски он звучит примерно как "мертвый код".

Второе: если tos==0, то ты все равно его декримируешь и пытаешься вернуть st[-1], что естественно ведет к ошибке. Вот так будет правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
        return 0;
 
    }
    else{
        tos--;
        return st[tos];
    }
}
обнулять освобожденный элемент необязательно, если стек организован правильно, то ни к чему плохому это не превидет, можно не беспокоиться.
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
26.07.2011, 14:56     CТЕК ! #5
Да, вот только заметил, что, когда tos равен 0 выхода из ф-ции нет.
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 14:57  [ТС]     CТЕК ! #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
Первое, что сразу заметил, это строка после return.
C++
1
2
3
4
5
6
7
8
9
10
11
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
 
    }
    tos--;
    return st[tos];
    st[tos] = 0;//эта строка никогда не выполнится
}
есть даже какой-то специальный англоязычный термин для этой ситуации, я его не помню, но по-русски он звучит примерно как "мертвый код".

Второе: если tos==0, то ты все равно его декримируешь и пытаешься вернуть st[-1], что естественно ведет к ошибке. Вот так будет правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
        return 0;
 
    }
    else{
        tos--;
        return st[tos];
    }
}
обнулять освобожденный элемент необязательно, если стек организован правильно, то ни к чему плохому это не превидет, можно не беспокоиться.
все равно не получается
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,251
Записей в блоге: 1
Завершенные тесты: 1
26.07.2011, 15:03     CТЕК ! #7
Еще для справки:
в стеке из STL есть 2 функции pop() (удаляет верхний элемент стека) и top() (возвращает, но не удаляет, верхний элемент стека).
Реализованно так, потому что:
1) Каждая функция должна выполнять одно действие, а удаление элемента и возвращение элемента - это 2 разный действия.
2)Допустим pop() была бы реализованна так, что она удаляет и возвращает верхний элемент, теперь допустим, что в процессе удаления элемента (там стек - это не массив) возникло исключение, которое прекратило работу текущего кода. Таким образом имеем - индекс декремирован, а элемент не возвращен - т.е. верхний элемент теряется навсегда.
Вот, где-то так) Поэтому в стеке из STL мы имеем 2 функции, а не одну.
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
26.07.2011, 15:03     CТЕК ! #8
У меня всё работает, только я вместо ф-ции
C++
1
2
3
4
void stack::init()
{
    tos = 0;
}
сделал конструктор:
C++
1
stack(){tos=0;};
upd. хотя и так, и так работает)
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,251
Записей в блоге: 1
Завершенные тесты: 1
26.07.2011, 15:05     CТЕК ! #9
murod, а что не получается, сделай скриншот.
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 15:47  [ТС]     CТЕК ! #10
Реализуйте структуру данных "стек". Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в стек число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из стека последний элемент. Программа должна вывести его значение.
back
Программа должна вывести значение последнего элемента, не удаляя его из стека.
size
Программа должна вывести количество элементов в стеке.
clear
Программа должна очистить стек и вывести ok.
exit
Программа должна вывести bye и завершить работу.

Перед исполнением операций back и pop программа должна проверять, содержится ли в стеке хотя бы один элемент. Если во входных данных встречается операция back или pop, и при этом стек пуст, то программа должна вместо числового значения вывести строку error.
Ввод с клавиатуры !

Вот условие задачи посмотрите сами , а то свою ошибку не понял вы свой вариант сделайте !
LosAngeles
Заблокирован
26.07.2011, 16:09     CТЕК ! #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
#include <deque>
#include <string>
#include <stdexcept>
 
 
template <typename T, typename C = std::deque<T> >
        class stack
{   
    C c;
public:
    void    pop();
    void    push(T const&);
    T       top() const;
    size_t  size() const;
    void    clear();
 
};
 
 
 
template <typename T, typename C>
        inline void stack<T, C>::push(T const& rhs)
{
    c.push_back(rhs);
}
 
 
 
template <typename T, typename C>
        inline void stack<T, C>::pop()
{
    if (!c.size()) throw (std::underflow_error("}I{0na"));
    c.pop_back();
}
 
 
 
template <typename T, typename C>
        inline T stack<T, C>::top() const
{
    return c.back();
}
 
 
template <typename T, typename C>
        inline size_t stack<T, C>::size() const
{
    return c.size();
}
 
 
template <typename T, typename C>
        inline void stack<T, C>::clear()
{
    c.clear();
}
 
 
 
int main() {
    using namespace std;
 
 
    stack<string> stk;
    stk.clear();
    stk.push("lkhjkh");
    stk.push("oiouio");
    stk.pop();
    stk.size();
    stk.top();
    stk.clear();
 
 return 0;
}
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 17:18  [ТС]     CТЕК ! #12
LosAngeles, а у тя точно ввод с клавиатуры
LosAngeles
Заблокирован
26.07.2011, 17:22     CТЕК ! #13
Я только стек написал, программу можешь сам написать. Меню сделаешь, ввод-вывод, что душа пожелает
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 17:37  [ТС]     CТЕК ! #14
LosAngeles, )извини но никак не получается я
добавил директиву <iostream> не получается ввести с клавиатуры с помощью Cin >> , а других функций я пока не знаю
LosAngeles
Заблокирован
26.07.2011, 17:48     CТЕК ! #15
код в студию
Yandex
Объявления
26.07.2011, 17:48     CТЕК !
Ответ Создать тему
Опции темы

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