Zadanie programowanie obiektowe.

Zadanie programowanie obiektowe.
Przemek Susoł
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:6
0

Cześć, mam takie zadanko:
Proszę napisać definicję klas: Stack i StackElement.

StackElement:
Klasa ma zawierać dwa pola prywatne wybranych typów oraz
udostępniać następujące metody: konstruktor domyślny, konstruktor
dwu-parametrowy i getter lub gettery.

Stack:
Klasa ma realizować funkcjonalność stosu przechowującego
elementy typu StackElement a więc udostępniać konstruktory:
domyślny i jedno-parametrowy (rozmiar), metody push(), pop()
isEmpty() isFull().

Następnie proszę napisać program który sprawdzi poprawność
stworzonego rozwiązania.

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

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 = NULL;
		cout<<"Stack is empty"<<endl;
	}
	Stack(int s)
	{
		stackSize = s;
	}
	void push()
	{
		element.getData();
		element.getName();
		stackSize+=stackSize;
	}
	void pop()
	{
		
	}
	void isEmpty()
	{
		if(stackSize==0)
			cout<<"Stack is empty"<<endl;
	}
	void isFull()
	{
		if(stackSize==) // ???
			cout<<"Stack is full!"<<endl;
	}
};

int main()
{
	
return 0;
}

Stworzyłem coś takiego, nie umiem tutaj załatwić paru rzeczy i ogólnie nie do końca wiem co dalej robić. Proszę o pomoc!

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4885
1

W klasie Stack musi być jakaś struktura do przechowywania danych typu StackElement, np. tablica, jak tutaj:
https://www.tutorialspoint.com/cplusplus-program-to-implement-stack-using-array


AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Postów:3561
1

Metody sprawdzające mają być typu logicznego, raczej nie powinny drukowac wewnątrz, ewentualne drukowanie może zrobić kod kliencki.

Kopiuj
bool isEmpty()
    {
        if(stackSize==0)
            return true;
        return false // nie jest to najkrótszy kod, ale nieco podobny do twojego
    }
    bool isFull()
    {
 // albo tak
           return (stacksize== Xxxxx);
       }

Tutaj przypisanie NULL-a jest mylące, normalne zero, drukowanie jest zbędne

Kopiuj

stackSize = NULL;
        cout<<"Stack is empty"<<endl;

Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
Przemek Susoł
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:6
0
Kopiuj
#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<<"Stack is empty."<<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; 
}

Okej, doprowadziłem to do takiej formy, ale mam jeden błąd - jak już umieszczę jeden element, to konsola sie zatrzymuje i nie przyjmuje więcej.

edytowany 1x, ostatnio: hauleth
lion137
" ale mam jeden błąd" (?!?). Po pierwsze, jak to Ci się w ogóle skompilowało, skoro pos nie jest zadeklarowane!
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4885
1

Nie, nie, przecież rozmiar tablicy w klasie Stack jest znany dopiero w runtime, więc musi być zadeklarowana, jako wskażnik (albo inna dynamiczna struktura). Te czytania danych w metodach są nieestetyczne, niech się o to martwi klient. Nie ma tam powiedziane, ale musi być jakaś domyślna wielkość stosu w bezparametrowym konstruktorze. I, finalnie, jakoś tak to będzie (Potrzebujesz jeszcze destruktor i jakiś sposób drukowania obiektu):

Kopiuj
class StackElement {
		 
	private: 
	int data; 
	string name;
	public:
    StackElement() { 
        data=0;
        name="brak";
    } 
    StackElement(int d, string n) { 
        data = d;
        name = n;
    } 
    void getData(int d) { 
        data = d;
    } 
    void getName(string n) {
        name = n;
    } 
};

class Stack { 
	private:
	int N = 0;;
	int cnt = 0;
	StackElement * arr;
	public:
    Stack() {
        N = 10;
        arr = new StackElement[N];
    }
    Stack(int s) {
        N = s;
        arr = new StackElement[N];
    }
    void push(StackElement item) {
        arr[cnt++] = item;
    }
    StackElement pop() {
        return arr[--cnt];
    }
    bool isEmpty() {
        return cnt == 0;
    }
    bool isFull() {
        return N == cnt;;
    }
}; 

Zobacz pozostałe 3 komentarze
AK
3 w duchu C++ push do już pełnego stosu powinien rzucić wyjątkiem - symetrycznie pop przy pobraniu poniżej sera
AK
zgadzam się, nr 1 w/s pos dotyczy innego
tajny_agent
@AnyKtokolwiek: wyjątków pewnie jeszcze nie mieli, optional jest pewnie jeszcze "za nowy" żeby o nim uczyli. O delegowaniu konstruktorów czy dekorowaniu metod jako const czy noexcept chyba nawet nie ma co wspominać :P Ale już do niepotrzebnego przesyłania przez wartość można się przyczepić :)
lion137
No tak, zawsze coś:), dodam, tylko, że struktura przesyłana nie jest jakaś monstrualna:)
tajny_agent
Jako, że wątek zaczyna się od "mam zadanie..." to można przymknąć oko ;)
Przemek Susoł
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:6
0
lion137 napisał(a):

Nie, nie, przecież rozmiar tablicy w klasie Stack jest znany dopiero w runtime, więc musi być zadeklarowana, jako wskażnik (albo inna dynamiczna struktura). Te czytania danych w metodach są nieestetyczne, niech się o to martwi klient. Nie ma tam powiedziane, ale musi być jakaś domyślna wielkość stosu w bezparametrowym konstruktorze. I, finalnie, jakoś tak to będzie (Potrzebujesz jeszcze destruktor i jakiś sposób drukowania obiektu):

Kopiuj
    StackElement pop() {
        return arr[--cnt];
    }

Mógłbyś jeszcze mi wytłumaczyć na jakiej zasadzie to działa? Bo nie rozumiem tego

edytowany 2x, ostatnio: Przemek Susoł
lion137
--n - najpierw dekrementuje, a potem zwraca (do wyrażenia) wartość, odwrotnie n++ https://en.cppreference.com/w/cpp/language/operator_incdec
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)