Program - Stos

0

Witam,

Przedstawiam jeden z moich programów. Który możliwe, że się komuś przyda;)
Przedstawia on działanie Stosu

Początkowo jest implementowany stos o rozmiarze 4.
Podczas dodawania 4 elementu następuje powiększenie stosu do rozmiaru 8, następnie 12 itd.

Jeśli skorzystałeś z tego postu, oddaj głos w ankiecie.
Dziękuje :-)

Klasa stos.h


int *backup;
class stack
{
public:
	void push(int a);  // dodanie elementu do stosu
	int pop();    // usunięcie elementu ze stosu
	void clear();  // czyszczenie stosu
        int getStackSize(); //pokazuje rozmiar stosu
	stack();                    // wywolanie stosu  (kostruktor)
	stack(int size);          // wywolanie stosu  (kostruktor z zadanym rozmiarem stosu)
	stack(stack& s);        // konstruktor kopiowania
	~stack();	               // destruktor
        stack& operator=(stack& s);          // operator kopiowania
	int update();            // funkcja powiększająca stos
	void show();            // wyświetlanie stosu

private:
	int size; // rozmiar stosu
	int top; // pozycja ostatniego elementu
	int* dane; // stos
};

Main.cpp


#include <iostream>
#include <windows.h>
#include "stos.h"

using namespace std;
void gotoxy(int x, int y) // umieszcza kursor na wybranej pozycji
{
COORD c;

c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

int main()
{
    int liczba;
    int i,key,choise;
    stack stos; // deklaracja zmiennej danej klasy (poprzez tą zmienna odwołujemy sie do danej klasy)

    stack(); // rozpoczęcie stosu
    key=1;
    while(key!=0)
    {

          gotoxy(30,1);
          cout<<"Zmiany w widoku stosu sa realizowane z opoznieniem.";
          gotoxy(1,3);
          cout<<"Co chcesz zrobic?\n";
          gotoxy(3,4);
          cout<<"1-Push()\n";
          gotoxy(3,5);
          cout<<"2-Pop()\n";
          gotoxy(3,6);
          cout<<"3-Clear()\n";
          gotoxy(3,7);
          cout<<"4-Size\n";
          // wariany w menu które sa realizowane w switch ponizej
          for (i=1;i<25;i++)
              {
               gotoxy(25,i);
               cout<<"|";
               }
          gotoxy(8,8);
          cin>>choise;
          switch(choise)
          {
                   case 1:
                        gotoxy(30,5);
                        cout<<"Podaj liczbe która chcesz dodać do stosu.";
                        gotoxy(30,6);
                        cout<<"A= ";
                        cin>>liczba;
                        gotoxy(30,7);
                        stos.push(liczba);
                        break;
                   case 2:
                        stos.pop();
                        break;
                   case 3:
                        stos.clear();
                        break;
                   case 4:
                        stos.getStackSize();
                        break;
                       }


          stos.show();
          gotoxy(30,8);
          cout<<"Kontynuowac? 1-tak 0-nie :";cin>>key;
          system("cls");
          stos.show();
        }

stos.show();
stos.~stack();
cout<<"\n\n";
system("pause"); // pauza systemowa

return 0;
}




//**********************************************************************
void stack::push(int a)
{

     this->dane[top]=a; // dodawanie liczby a do stosu
     this->top++;
     if(top==size)
     update();
     cout<<"Dodano liczbe "<<a<<" do stosu.\n";
}
//**********************************************************************
int stack::pop()
{
    if (top>0) // usuwanie ostatniej liczby ze stosu jesli jest taka mozliwosc
    {
    this->top--;
    gotoxy(30,5);
    cout<<"Usunieto ostatnia liczbe ze stosu.\n";
    }
    else
    {
    gotoxy(30,5);
    cout<<"Brak elementów do usuniecia.\n";
    }
    }
//**********************************************************************
void stack::clear()
{
   this->top=0; //  czyszczenie stosu
   gotoxy(30,5);
   cout<<"Stos wyczyszczono.";
}
//**********************************************************************
void stack::show() // Fukcja wypisująca stos oraz podaje ile liczb jest w stosie
{
 int j=top;
 int t=16;
gotoxy(35,14);cout<<"Na stosie znajduje sie "<<top<<" liczb.";
gotoxy(35,15);cout<<"Te liczby to:";

 for(int i=0;i<j;i++)
    {

    gotoxy(45,t);
    cout<<dane[i];
    t++;
    }

}
//**********************************************************************
stack::stack()
{
	this->top=0; // rozpoczęcie stosu i przypisanie zmiennej top wartosci zero
	int* dane = new int[4];
	this->size=4;
}
//**********************************************************************
stack::~stack()
{
delete[] dane;
}
//**********************************************************************
stack::stack(int Nsize)
{
this->top=0; // rozpoczęcie stosu i przypisanie zmiennej top wartosci zero
dane = new int[Nsize];
size = Nsize;
}
//**********************************************************************
stack::stack(stack& s)
{

this-> dane = new int [s.size];

for (int i=0;i<s.size; i++)
this->dane[i] = s.dane[i];

this->size = s.size;
cout<<"Stos został sklonowany.\n";
}
//**********************************************************************
stack& stack::operator=(stack& s)
{
	delete[] dane;
	this->dane= new int[s.size];
	for (int i=0;i<s.size; i++)
   this->dane[i] = s.dane[i];
   this->size = s.size;

}
//**********************************************************************
int stack::getStackSize()
{
gotoxy(30,5);
cout<<"Stos ma rozmiar "<<size<<" wyrazów.";
}
//**********************************************************************
int stack::update()
{int i;

backup= new int[size];
for(i=0;i<size;i++)
backup[i]=dane[i];

delete[] dane;
size+=4;
this->dane= new int[size];

for(i=0;i<size;i++)
dane[i]=backup[i];

delete[] backup;
gotoxy(30,10);
cout<<"Stos zostal powiekszony.";
}


0

Zdajesz sobie sprawę z tego ze w tym serwisie istnieje mozliwośc pisania artykułów? Zamiast zakładać temat który zostanie zakopany w ciągu kilku dni, lepiej dodać kod (o ile jest dobry i sensowny) jako arta. Tutaj masz przykład arta na ten temat co twój post ale w C
Własny stos
tutaj masz wykaz artów na temat C/C++
Artykuły
Chcąc dodać nowy artykuł po prostu wpisz w pasku adresu
http://4programmers.net/C/Artykuły/Temat_arta_blabla
i pojawi ci się link gdzie mozesz edytować ten artykuł i po prostu go w ten sposób stworzyć ;)

0

Konstruktor kopiujący i operator przypisania są napisane żle.
Wątpliwe też jest jawne wywoływanie destruktora w kodzie programu ..

Czy skorzystałeś z tego postu?

Tak ,przeczytałem go +1 głos [green]

0

Rzuciłem okiem na kod i @dzejo ma rację, szkolny bląd w operatorze= (brak sprawdzenia czy this != &wzor)
Jawne wywołanie destruktora pewnie skutkuje segfaultem (przy usuwaniu zmiennych lokalnych) ale ze program od razu sie kończy to autor go pewnie nie widział nawet ;]
No i piękny wyciek pamięci przy tym wywołaniu stack() które autor nazwał "rozpoczęciem stosu" a które w rzeczywistości jest zwykłym wywołaniem konstruktora (i przy okazji wyciekiem pamięci).
No i ta zbędna zmienna globalna backup?
Nie mówię już nawet o tym że warto sprawdzać czy new[] zadziałało obsługując wyjątek std::bad_alloc albo dać tam std::nothrow i testować czy new nie zwrócił nam nulla, inaczej program może polecieć w kosmos jak się coś nie zaalokuje.

0

wątek zostawiam, bo a nuż może autor zrozumie i poprawi błędy

1 użytkowników online, w tym zalogowanych: 0, gości: 1