Объектно-ориентированное программирование - упражнение C ++ - PullRequest
0 голосов
/ 11 марта 2019
#include <iostream> 
#include <string> 
#include <cstdlib> 
#define MAX_SIZE 100
int pos=-1;
using namespace std; 

class StackElement { 
private: 
    int data; 
    string name; 
public: 
    StackElement() { 
        data=0;
        name="brak";
        } 
    StackElement(int d, string n) { 
        data = d;
        name = n;
        } 
    void getData() { 
        cin>>data;
        } 
    void getName() {
        cin>>name;
        } 
};
class Stack {
private: 
    int stackSize; 
    StackElement element[]; 
    public:
    Stack() {
        stackSize = 0;
        cout<<"Stack is empty now."<<endl;
        }
    Stack(int s) {
        stackSize = s;
        }
    void push() {
        element[pos+1].getData();
        cout<<"Enter element name:"<<endl;
        element[pos+1].getName();
        pos++;
        }
    void pop() {
        pos--;
        }
    bool isEmpty() {
        if(stackSize==0)
             return true;
        }
    bool isFull() {
        if(pos==MAX_SIZE)
             return true;
        }
 }; 
int main() {
    Stack stack(MAX_SIZE);
    int choice;
    cout<<"1. Push in stack.\n2. Pop from stack.\n3. Display stack.\n4. Exit."<<endl;
    if(stack.isEmpty())
        cout<<endl<<"Stack is empty."<<endl<<endl;
    do { 
        cout<<"Enter your choice"<<endl;
        cin>>choice;
        switch(choice) {
            case 1:
                 cout<<"Enter value:"<<endl;
                 stack.push();
                 break;
            case 2:
                 stack.pop();
                 break;
            case 3:
                cout<<"Soon-to-be displayer"<<endl;
                 break;
            case 4:
                cout<<"Exit"<<endl;
                break;
            default:
                cout<<"Invalid choice"<<endl;
        }
        if(stack.isFull()) {
            cout<<"Stack is full!"<<endl;
            break;
        }
    } while (choice != 4);
return 0; 
}

Упражнение выглядит следующим образом: создайте класс Stack и StackElement.Элемент стека должен содержать: 2 частных пула одного выбора, геттер / геттер и 2 конструктора - один по умолчанию и параметризованный (с 2 параметрами).Стек должен содержать: элементы типа StackElement, частный пул размер , один конструктор по умолчанию и один параметризованный (один параметр), методы push, pop, isEmpty, isFull

Моя проблема в том, что когда я запускаю программу, она падает сразу после того, как я пытаюсь поместить элемент в стек.

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Функция push начинается с

element[pos+1].getData();

pos - это глобальная переменная, начинающаяся с -1, поэтому для начала это будет 0. Прежде чем пытаться получить данные от элементов, которых там нет, вам необходимо выяснить, каков размер вашего стека.

StackElement element[]; необходимо изменить размер или объявить его следующим образом:

StackElement element[MAX_SIZE]; 
0 голосов
/ 11 марта 2019

Хорошо, я понял это. Если кому-то понадобилась подобная вещь, вот код:

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class StackElement {
private:
    int data;
    string name;
public:
    StackElement() {
        data=0;
        name="-";
        }
    StackElement(int d, string n) {
        data = d;
        name = n;
        }
    void getElement() {
        cin>>data;
        cout<<"Enter name: "<<endl;
        cin>>name;
        }
};
class Stack {
private:
    int stackSize;
    int pos;
    StackElement *element;
public:
    Stack() {
        stackSize = 10;
        element = new StackElement[stackSize];
        }
    Stack(int s) {
        stackSize = s;
        element = new StackElement[stackSize];
        }
    void push() {
        element[pos++].getElement();
        ++stackSize;
        }
    StackElement pop() {
        return element[--pos];
        }
    bool isEmpty() {
        return pos == 0;
        }
    bool isFull() {
        return stackSize == pos;
        }
    void position() {
        pos=0;
    }
};

int main() {
    Stack stack(10);
    stack.position();
    int choice;
    cout<<"1. Push in stack.\n2. Pop from stack.\n3. Exit."<<endl;
    if(stack.isEmpty())
        cout<<endl<<"Stack is empty."<<endl<<endl;
    do {
        cout<<"Enter your choice"<<endl;
        cin>>choice;
        switch(choice) {
            case 1:
                cout<<"Enter value:"<<endl;
                stack.push();
                break;
            case 2:
                if(!stack.isEmpty())
                    stack.pop();
                else
                    cout<<"Stack is empty already."<<endl;
                break;
            case 3:
                cout<<"Exit"<<endl;
                break;
            default:
                cout<<"Invalid choice"<<endl;
        }
        if(stack.isFull()) {
            cout<<"Stack is full!"<<endl;
            break;
        }
    } while (choice != 4);
return 0;
}

PS. Я знаю, что ему не хватает свободной памяти и деструктора, я мог бы поработать над этим в ближайшем будущем:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...