Tworzenie liczbowego stosu strukturalnego

Tworzenie liczbowego stosu strukturalnego
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Mam takie zadanie:

Napisz program w języku C/C++, który oferuje możliwość tworzenia struktury danych typu stos liczb całkowitych.

Program jak tak ma wyglądać tak samo jak obiektowo, tylko zamiast klasy powinien mieć struct ? Bo czy bez struktury da się napisać stos strukturalnie ? Obiektowo umiem napisać, jednak nie bardzo wiem jak napisać strukturalnie.

dodanie znacznika <quote> - @furious programming

edytowany 1x, ostatnio: flowCRANE
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Khe?

#Nie istnieje taki język jak C/C++.
#W tym zadaniu nie ma mowy o żadnym programowaniu strukturalnym.
#http://pl.wikipedia.org/wiki/Struktura_danych
#Napisz zwykłą klasę stosu.

N3
Stos ma być napisany strukturalnie, więc nie może być użyta klasa.
spartanPAGE
ad 1. czyli chodzi o C :P
N3
może być c++ aby nie był obiektowo.
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:6 dni
0

_
Zmień odrobinę nazwę i ogranicz delikatnie funkcjonalność, voila.

edytowany 1x, ostatnio: spartanPAGE
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Ale klasa to już programowanie obiektowe, a ma być stos napisany strukturalnie.

spartanPAGE
tam nie ma klasy, to jest kod w C
kaczus
w c tez można obiektowo pisać :)
spartanPAGE
ale ten kod z prawie-że-gotowca taki nie jest :P
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Tylko za bardzo nie wiem jak za pomocą listy mogę napisać stos. Tak jak wcześniej pisałem obiektowo napisać potrafię.

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Ale klasa to już programowanie obiektowe, a ma być stos napisany strukturalnie.

Jak rozumiem dla ciebie kod poniżej to programowanie obiektowe?

Kopiuj
using System;
using System.Linq;
using System.Collections.Generic;

public class Test
{
	public class IntStack {
		public IList<int> Data { get; set; }
		
		public static void Init(IntStack stack) {
			stack.Data = new List<int>();
		}
		
		public static void Push(IntStack stack, int value) {
			stack.Data.Add(value);
		}
		
		public static int Pop(IntStack stack) {
			var value = stack.Data[stack.Data.Count - 1];
			stack.Data.RemoveAt(stack.Data.Count - 1);
			return value;
		}
		
		public static void Print(IntStack stack) {
			Console.WriteLine(string.Join(", ", stack.Data.Select(i => i.ToString())));
		}
	}
	
	public static void Main()
	{
		var stack = new IntStack();
		IntStack.Init(stack);
		IntStack.Push(stack, 3);
		IntStack.Push(stack, 4);
		IntStack.Push(stack, 5);
		IntStack.Print(stack);
		Console.WriteLine("last: {0}", IntStack.Pop(stack));
		IntStack.Pop(stack);
		IntStack.Print(stack);
	}
}
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Tak, a tak nie jest ? Już jest klasa i posługujemy się obiektami. To kiedy programowanie jest obiektowe ?

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0
N3
to jeśli Twój wcześniejszy program nie ma pól to nie jest obiektowy ?
SO
Tam jest pole :P
N3
to nie wiem czemu ten program nie jest obiektowy, tworzysz w nim przecież obiekt, więc posługujesz się polami i tym obiektem, czyli programowanie obiektowe.
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

To kod n0name'a jest obiektowy czy nie ?

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Programowanie obiektowe jest wtedy, gdy używamy klas jako blueprintów do modelowania obiektów ze świata rzeczywistego i interakcji między nimi, hermetyzując ich bebechy.
Jeśli ktoś używa klasy jako pojemnika na dane (struktury) i definiuje zestaw nie powiązanych funkcji z samą strukturą, to to jest programowanie strukturalne.

N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

To taka implementacja stosu jest obiektowa czy strukturalna, tutaj funkcje są powiązane ze strukturą , więc obiektowe ?

Kopiuj
#include <iostream>

using namespace std;

class stack
{
public:
    int m_count;
    int max_size;
    int *tablica;

    ////////////////////////////////////////////////////////////////////////

    void init(int max)
    {
        max_size = max;
        m_count = 0;
        tablica = new int [max_size];
    }

    ////////////////////////////////////////////////////////////////////////

    bool empty()
    {
        return m_count == 0;  // !m_count
    }

    ////////////////////////////////////////////////////////////////////////

    bool full()
    {
        return m_count == max_size;
    }

    ////////////////////////////////////////////////////////////////////////

    void destroy()
    {
        delete [] tablica ;
    }

    ////////////////////////////////////////////////////////////////////////

    void Push(int number)
    {
        if(m_count < max_size)
        {
            tablica[m_count++] = number;
        }

    }

    ////////////////////////////////////////////////////////////////////////

    int Top(void)
    {
        if(m_count)
        {
            return tablica[m_count - 1];
        }

    }

    ////////////////////////////////////////////////////////////////////////

    int Pop()
    {
        if(m_count)
        {
            --m_count;
        }
    }

};
int main()
{
    int number_user;
    int count_number;

    cout << "Podaj ilosc liczb ktore chcesz wlozyc na stos: ";
    cin >> count_number;

    stack s1;
    stack s2;

    s1.init(count_number);
    s2.init(count_number);

    cout << "\nPodawaj kolejne liczby stosu:\n\n";
    for(int i = 0; i < count_number; ++i)
    {
        cin >> number_user;
        s1.Push(number_user);
    }

   for(int i = 0; i < count_number; ++i)
    {
       s2.Push(s1.Top());
       s1.Pop();
    }
    cout << endl;
    for(int i = 0; i < count_number; ++i)
    {
        cout << s2.Top() << endl;
        s2.Pop();
    }

    return 0;

}
 
MO
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tam gdzie jest (centy)metro...
0

No i nie ma problemu. Zdefiniuj strukturę stosu z jakimś kontenerem (dla C będzie to najprostsza tablica, dla C++ polecam vector), dodaj do struktury pole maxsize oraz size. W maxsize będzie maksymalna wielkość stosu a w size jego aktualna wielkość.
Zaimplementuj funkcje obsługi stosu (push(), pop() itd... ) które przyjmują jako 1 argument wskaźnik na strukturę stosu i wykonują operacje na tymże stosie i masz strukturalną implementację.
O masz... http://groups.csail.mit.edu/graphics/classes/6.837/F04/cpp_notes/stack1.html
Tylko poczytaj o stosie i trochę poćwicz z nim jak działa.


Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
Zobacz pozostałe 16 komentarzy
N3
Dobra, ale jakbym stworzył klasę bez metod w środku. Funkcję napisał jako globalne i do każdej argument to wskaźnik na obiekt klasy to czemu to nie jest to samo ? Dlatego, że działam na obiekcie ?
MO
Mylisz 2 pojęcia. Stosowanie klas/obiektów w programie i sposób programowania. Możesz mieć obiekty/klasy używane uwaga.. 2 raz to słowo się pojawia PASYWNIE i wykonywać operację z użyciem zewnętrznych funkcji wtedy taka PASYWNA klasa z widocznymi danymi tworzy STRUKTURĘ a ty programujesz strukturalnie bo klasa jest PASYWNA i nie posiada zachowań więc nie używasz na niej technik programowania obiektowego. Jak masz klasę/obiekt na którym wywołujesz ZACHOWANIA, to programujesz obiektowo. Programowanie obiektowe i strukturalne to SPOSÓB programowania czyli PARADYGMAT.
N3
to czyli odpowiedź na moje pytanie dwa komentarze dwa wyżej to będzie to samo co stworzenie struktury bez metod w środku.
MO
I idź w pokoju.. a jak przeczytasz ze zrozumieniem to Cię olśni :-)
N3
to czyli źle sobie odpowiedziałem na swój komentarz ;p ?
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Jeśli funkcję Pop mam zapisaną w ten sposób:

Kopiuj
 void Pop(Stack *S)
    {
        if(S->m_count)
        {
            S->(--m_count);
        }
    }

To jak sprawić aby kompilator nie pokazywał błędu ? Chodzi o ten operator --. Przed nim jest wskaźnik i przez to jest błąd. Nie wiem jak poprawnie to zapisać.

twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad rok
  • Postów:2500
1
Kopiuj
--(S->m_count)

nawiasy nie są wymagane

edytowany 1x, ostatnio: twonek
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Czy ten kod teraz jest strukturalny i czy jest dobry? :

Kopiuj
#include <iostream>

using namespace std;

struct Stack
{
    int m_count;
    int max_size;
    int *tablica;
};

    ////////////////////////////////////////////////////////////////////////

    void init(Stack *S,int max)
    {
        S->max_size = max;
        S->m_count = 0;
        S->tablica = new int [S->max_size];
    }

    ////////////////////////////////////////////////////////////////////////

    bool empty(Stack *S)
    {
        return S->m_count == 0;  // !m_count
    }

    ////////////////////////////////////////////////////////////////////////

    bool full(Stack *S)
    {
        return S->m_count == S->max_size;
    }

    ////////////////////////////////////////////////////////////////////////

    void destroy(Stack *S)
    {
        delete [] S->tablica ;
    }

    ////////////////////////////////////////////////////////////////////////

    void Push(Stack *S,int number)
    {
        if(S->m_count < S->max_size)
        {
            S->tablica[S->m_count++] = number;
        }

    }

    ////////////////////////////////////////////////////////////////////////

    int Top(Stack *S)
    {
        if(S->m_count)
        {
            return S->tablica[S->m_count - 1];
        }
        else
        {
            return -1;
        }

    }

    ////////////////////////////////////////////////////////////////////////

    void Pop(Stack *S)
    {
        if(S->m_count)
        {
            --(S->m_count);
        }
    }


int main()
{
    struct Stack p;
    struct Stack *s = &p;
    init(s,10);
    Push(s,3);
    cout << Top(s);
    return 0;

}
 
flowCRANE
Edytuj swoje posty, jeśli chcesz coś poprawić i jeszcze nikt na nie nie odpisał;
twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad rok
  • Postów:2500
1

Ogólnie nic merytorycznie złego się nie rzuca w oczy, ale jeśli miałbym się czepiać:

  1. Niepotrzebne wcięcie przy tych funkcjach.
  2. Brak konsekwencji przy nazwach, init, empty z małej, a Pop, Top z wielkiej.
  3. Nie wywołałeś destroy() pod koniec.
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Na razie tylko sprawdzałem czy działa Push i Top, temu destroya nie użyłem. Wcięcia usunę.

kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Łódź
  • Postów:1402
0

Jakbyś miał system bez śledzenia pamięci, miałbyś już wyciek....


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
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)