stos pewien problem

0

Witam mam pewien problem, mianowicie program (jest poniżej), musi obsługiwać wszystkie typy zmiennych (np: integer, char itp.) mogli byście mi pomóc?

#include <iostream>

using namespace std;

bool push3t(int liczba);
bool pop3t(int &liczba);

#define SIZE 10

int stos[SIZE];
int w=0;

int main(){
int i=0;
int l;

cout<<"ile liczb odlozyc na stos: ";
cin>>i;
for (int f=0; f<i; f++){
cout<<"Podaj kolejna liczbe: ";
cin>>l;
if (push3t(l)==false){cout<<"przekroczono pojemnosc stosu!"<<endl; break;}
cout<<"wierzcholek stosu:"<<w<<endl;
}
cout<<endl<<endl<<"Aktualna zawartosc stosu: "<<endl;
for (int f=0; f<i; f++){
cout<<"stos["<<f<<"] = "<<stos[f]<<endl;
}
cout<<"ile liczb chcesz zdjac ze stosu?: ";
cin>>i;
for (int f=0; f<i; f++){
pop3t(l);
cout<<"Ostatnio zdjeto ze stosu: "<<l<<endl;
cout<<"wierzcholek stosu: "<<w<<endl;
cout<<endl<<endl<<"aktualna zawartosc stosu: "<<endl;
for(int f=0; f<w; f++){
cout<<"stos["<<f<<"] = "<<stos[f]<<endl;
}
}
return 0;
}

bool push3t(int liczba){
if (w==(SIZE)) return false;
else
{
stos[w] = liczba;
w++;
return true;
}

}

bool pop3t(int &liczba){
if(w==0) return false;
else{
liczba = stos[w-1];
w--;
return true;
}
}

0

Poczytaj o klasach i wzorcach.

0

Kurcze a nie mógł byś mi poprawić tego programiku bo muszę go naprawdę na biegu zrobić.:( Byłbym bardzo wdzięczny.

0

to znaczy a jak bym chciał odkładać na stos litery to nie mogę... Nie obsługuje on np intiger char flooat double, a mi zależy na tym żeby obsługiwał te typy zmiennych. Masz jakąś radę?

0

Tak panowie wiem ale jak już napisałem czy naprawdę nikt nie mógł by tak na biegu go poprawić bo mi zależy żeby on był na już :( A zanim sam do tego dojdę to trochę minie...

0

Dokładne polecenie- to Przekształć tak strukture danych aby pobierała i zabierała ze stosu różne typy zmiennych np intiger char flooat double, teraz chyba nie trzeba zmieniać calego programu :D pomożecie??

0

dzięki można na was liczyć :D

0

Ja pomogę... o ile podasz dobre wytłumaczenie dlaczego go potrzebujesz, a sam nie potrafisz zrobić (dobrze się zastanów)...

0

Więć tak nauczyciel dal mi kawałek programu już go zrobiłem tak żeby użytkownik podawał liczbę elementów w stosie i sobie odbierał potem ile chce elementów ale mogą być to tylko liczby. A ja potrzebuje żeby to były wszystkie typy zmiennych... , a potrzebuje go dlatego że dzięki temu programowi mogę wybrnąć z ciężkiej sytuacji chyba wiecie o co chodzi koniec semestru... A naprawdę nie mam pojęcia jak go zrobić siedzę już chyba z 7 godzin. Naprawdę proszę o pomoc sam zrobiłem tyle ale potrzebuje jeszcze tego małego elementu.

1

Nie powinienem, ale znaj moje dobre serce...

  // zmienne globalne:
  const int stack_size = 1024 * 1024; // maksymalna wielkość stosu - tutaj 1MB
  char stack[stack_size]; // pamięć stosu
  char* stack_ptr = stack; // wskaźnik na obecny 'szczyt stosu'

  // WARIANT PROSTY ALE BEZ KONTROLI TEGO CO JEST NA STOSIE,
  // czyli sam musisz kontrolować żeby push-typ było zdejmowane przez pop-typ w dokładnie odwrotnej kolejności w jakiej pushowałeś

  // funkcje dla poszczególnych typów
  void push_int(int a)
  {
    *(int*)stack_ptr = a; // zapis wartości
    stack_ptr += sizeof(int); // przesunięcie 'szczytu stosu'
  }
  int pop_int()
  {
    stack_ptr -= sizeof(int); // cofnięcie 'szczytu stosu'
    return *(int*)stack_ptr; // zwrócenie wartości
  }


  void push_double(double a)
  {
    *(double*)stack_ptr = a;
    stack_ptr += sizeof(double);
  }
  double pop_double()
  {
    stack_ptr -= sizeof(double);
    return *(double*)stack_ptr;
  }

  //... itd dla wszystkich typów


  // gdybyś wiedział czym jest szablon to tak wygląda uniwersalna funkcja:
  template<typename TYPE>
  void push(TYPE a)
  {
    *(TYPE*)stack_ptr = a; // typ musi obsługiwać operator = jak nie to trzeba memcpyiować
    stack_ptr += sizeof(TYPE);
  }
  template<typename TYPE>
  TYPE pop()
  {
    stack_ptr -= sizeof(TYPE);
    return *(TYPE*)stack_ptr;
  }


  // przykład:
  push_int(6);
  push_double(6.66);
  push<char>('A');

  // ściąganie
  char c = pop<char>(); // zwróci 'A'
  double d = pop_double(); // zwróci 6.66
  int in = pop_int(); // zwróci 6

  // ściąganie dokładnie w odwrotnej kolejnosci
  // jeśli pomylisz kolejność ściągania, możesz zepsuć STOS!
1
nobody__ napisał(a):

Nie powinienem, ale znaj moje dobre serce...

Wystarczylo:

template<class T>
class Stack
{
	public:
		void add(T d) { data.push_back(d); }
		void remove() { data.pop_back();   } 
	private:
		std::vector<T> data;
};
0

wątpię, aby na tym poziomie, wiedział czym jest klasa czy STL... zresztą pewnie i tak nie wiele z tego co napisałem zrozumie, a przecież, pewnie będzie na temat tego kodu musiał 'coś powiedzieć'...

0

A mógłbyś to umieścić w moim programie bo nie chce czegoś spartolić, naprawdę byłbym bardzo wdzięczny, dla cb to parę min roboty a ja zaraz coś zepsuje, a potem jeszcze napisze do cb na pw bo oczywiście musi być zapłata za pomoc :D (i naprawdę dzięki że jako jedyny zechciałeś mi pomóc jeszcze są ludzie którzy mogą pomagać bezinteresownie)... W sumie to nie będę za bardzo musiał o tym opowiadać o tym dlaczego czyta wszystkie zmienne ale to musi być...

0

heh nie na pewno nie bo za parę lat na 100% nie będę w tej branży bo zupełnie mnie to nie interesuje i błędem było pójście do klasy informatycznej, a jakoś muszę wybrnąć z ciężkiej sytuacji, wiec jak możecie to proszę was o wcielenie tego do mojego programu większość i tak sam zrobiłem ale tego ni w pień nie rozumiem a musi być :(

0

Jeśli chcesz gotowca to wrzuć kod, który dostałeś od nauczyciela, oraz podaj treść zadania, bo z tego co wrzuciłeś nie wiem właściwie czego zadanie wymaga.

0

On ci nie pomógł tylko zaszkodził, bo masz częściowe rozwiązanie, którego nie dość, że nie rozumiesz to nawet nie wiesz jak "to użyć". Takich jak ty tutaj jest wielu i walczymy z nimi tłumacząc jak cepom (nie, nie, do @cepy nic nie mam), że to co zrobił @nobody__ to nie jest pomoc. Ponadto skoro ktoś ci w szkole zadał takie zadanie to znaczy, że powinieneś mieć podstawową wiedzę, którą musisz wykorzystać do rozwiązania go. Ty nie masz żadnej wiedzy i jesteś kolejnym przykładem porażki całego systemu edukacji bo z taką niewiedzą nie powinieneś w ogóle dostać możliwości rozwiązywania tego zadania. Niestety jednak system jest jaki jest i to nie jest twoja wina, dlatego masz możliwość rozwiązania tego zadania ale żeby nie było tak łatwo za gotowca powinieneś zapłacić. Jednak niektórzy "programiści" z tego forum jeszcze tego nie rozumieją i walą gotowcami tych banalnych programów ociekając przy tym zajebistością. W rezultacie takich jak ty nie będzie ubywać bo jesteś doskonałym przykładem, że nadal jednak bardziej (na krótką metę co prawda) opłaca się błagać i poniżać na forum przez 1,5 godziny niż przysiąść nad książką, doczytać przez ten czas 2 rozdziały i zrobić to samemu. Na przyszłość takie tematy zakładaj w dziale praca to przynajmniej ja nie będę musiał ich czytać. Wszedłem tutaj z myślą by ci pomóc jednak gdy zobaczyłem twój drugi post to tylko krew mnie zalała.

Na tym forum pomoc uzyskuje większość pytających ... pytających, nie błagających o gotowe rozwiązanie.

0

nobody_: kod jest taki jak w 1 poście a treść to "Przekształć tak strukture danych aby pobierała i zabierała ze stosu różne typy zmiennych np intiger char flooat double"

0

&odp
Jaki bulwers, nie wiń, człowieka za to, że system edukacyjny to także biznes i teraz jest być może tego ofiarą, a pewnie i sam autor się do nauki nie przykładał i ot źródło problemu...
Fakt można na nim zarobić i przecież nierzadko się tak dzieje, ale od czasu do czasu można człowiekowi pomóc bezinteresownie, chociaż zdarza się to nader rzadko, bo zwykle się nie chce... to tym razem coś mnie tchnęło, tak czasem mam, być może dlatego, że czasem także bywałem postawiony pod ścianą i wiem jak to jest... może nie Miałeś w życiu problemów i Tobie się to nie zdarzało, nie wnikam...

W zadaniu może chodzić o coś takiego:

#include <iostream>

using namespace std;


#define SIZE 10


enum Typ { // dozwolone typy
  tNienzany = 0, // nieznany
  // integery
  tShort, tInt, tLong,
  // zmiennoprzecinkowe
  tFloat, tDouble,
  // litery
  tChar,
};

struct Element {
  Typ typ; // typ zmiennej

  union {
    short _short;
    int _int;
    long _long;

    float _float;
    double _double;

    char _char;
  };
};

Element stos[SIZE];
int w=0;


bool push3t(Element liczba);
bool pop3t(Element &liczba);


int main(){
 int i=0;
 Element el;
 string typ; // string na nazwę typu
 bool nie_wlasciwy_typ; // czy podany typ jest właściwy

 cout<<"ile liczb odlozyc na stos: ";
 cin>>i;
 for (int f=0; f<i; f++){
  
  do {
    // najpierw wybierasz typ do umieszczenia
    cout << "Podaj kolejny typ i jego wartosc: ";
    cin >> typ;
    nie_wlasciwy_typ = false; // zakładamy ze jest właściwy
    
    if(typ == "short")
    {
      el.typ = tShort;
      cin >> el._short;
    }
    else if(typ == "int")
    {
      el.typ = tInt;
      cin >> el._int;
    }
    else if(typ == "long")
    {
      el.typ = tLong;
      cin >> el._long;
    }
    else if(typ == "float")
    {
      el.typ = tFloat;
      cin >> el._float;
    }
    else if(typ == "double")
    {
      el.typ = tDouble;
      cin >> el._double;
    }
    else if(typ == "char")
    {
      el.typ = tChar;
      cin >> el._char;
    }
    else
    {
      cout << "Nieznany typ, podaj jeszcze raz" << endl;
      nie_wlasciwy_typ = true; // powtarzamy petlę
    }
  }
  while(nie_wlasciwy_typ);
  
  if (push3t(el)==false){cout<<"przekroczono pojemnosc stosu!"<<endl; break;}
  cout<<"wierzcholek stosu:"<<w<<endl;
 }
 cout<<endl<<endl<<"Aktualna zawartosc stosu: "<<endl;
 for (int f=0; f<i; f++){
   cout<<"stos["<<f<<"] = ";

   if(stos[f].typ == tShort) cout << stos[f]._short;
   else if(stos[f].typ == tInt) cout << stos[f]._int;
   else if(stos[f].typ == tLong) cout << stos[f]._long;
   else if(stos[f].typ == tFloat) cout << stos[f]._float;
   else if(stos[f].typ == tDouble) cout << stos[f]._double;
   else if(stos[f].typ == tChar) cout << stos[f]._char;

   cout << endl;
 }
 cout<<"ile liczb chcesz zdjac ze stosu?: ";
 cin>>i;
 for (int f=0; f<i; f++){
   pop3t(el);

   cout<<"Ostatnio zdjeto ze stosu: ";
   if(el.typ == tShort) cout << el._short;
   else if(el.typ == tInt) cout << el._int;
   else if(el.typ == tLong) cout << el._long;
   else if(el.typ == tFloat) cout << el._float;
   else if(el.typ == tDouble) cout << el._double;
   else if(el.typ == tChar) cout << el._char;
   cout << endl;

   cout<<"wierzcholek stosu: "<<w<<endl;
   cout<<endl<<endl<<"aktualna zawartosc stosu: "<<endl;
   
   for(int f=0; f<w; f++){
     cout<<"stos["<<f<<"] = ";

     if(stos[f].typ == tShort) cout << stos[f]._short;
     else if(stos[f].typ == tInt) cout << stos[f]._int;
     else if(stos[f].typ == tLong) cout << stos[f]._long;
     else if(stos[f].typ == tFloat) cout << stos[f]._float;
     else if(stos[f].typ == tDouble) cout << stos[f]._double;
     else if(stos[f].typ == tChar) cout << stos[f]._char;

     cout << endl;
   }
 } 
return 0;
}

nie testowane

0

Jesteś wielki :D

0

nobody__ sorki żę cie tak mecze ale już chyba wiem o co chodziło mojemu nauczycielowi zeby można było zapisywać do stosu rożne zmienne nie tylko inty, np jak chce zapisać litere to mnie wywala a powinno zapisać dał byś rade jeszcze przerobić ??

0

@Sopelek nie przywykłem do używania polskich nazw zmiennych i już samo to wywoływało dziwne uczucie podczas pisania tego kodu ^^

szwedos2 napisał(a):

nobody__ sorki żę cie tak mecze ale już chyba wiem o co chodziło mojemu nauczycielowi zeby można było zapisywać do stosu rożne zmienne nie tylko inty, np jak chce zapisać litere to mnie wywala a powinno zapisać dał byś rade jeszcze przerobić ??

To właśnie zrobiłem... tyle, że kod się nie kompiluje, bo nie dokopiowałem części kodu i brakuje #include<string>, napisałem, że nie testowane, tyle co mi intelisense podkreślało na bieżąco

#include <iostream>
#include <string>
 
using namespace std;
 
 
#define SIZE 10
 
 
enum Typ { // dozwolone typy
  tNienzany = 0, // nieznany
  // integery
  tShort, tInt, tLong,
  // zmiennoprzecinkowe
  tFloat, tDouble,
  // litery
  tChar,
};
 
struct Element {
  Typ typ; // typ zmiennej
 
  union {
    short _short;
    int _int;
    long _long;
 
    float _float;
    double _double;
 
    char _char;
  };
};
 
Element stos[SIZE];
int w=0;
 
 
bool push3t(Element liczba);
bool pop3t(Element &liczba);
 
 
int main(){
 int i=0;
 Element el;
 string typ; // string na nazwę typu
 bool nie_wlasciwy_typ; // czy podany typ jest właściwy
 
 cout<<"ile liczb odlozyc na stos: ";
 cin>>i;
 for (int f=0; f<i; f++){
 
  do {
    // najpierw wybierasz typ do umieszczenia
    cout << "Podaj kolejny typ i jego wartosc: ";
    cin >> typ;
    nie_wlasciwy_typ = false; // zakładamy ze jest właściwy
 
    if(typ == "short")
    {
      el.typ = tShort;
      cin >> el._short;
    }
    else if(typ == "int")
    {
      el.typ = tInt;
      cin >> el._int;
    }
    else if(typ == "long")
    {
      el.typ = tLong;
      cin >> el._long;
    }
    else if(typ == "float")
    {
      el.typ = tFloat;
      cin >> el._float;
    }
    else if(typ == "double")
    {
      el.typ = tDouble;
      cin >> el._double;
    }
    else if(typ == "char")
    {
      el.typ = tChar;
      cin >> el._char;
    }
    else
    {
      cout << "Nieznany typ, podaj jeszcze raz" << endl;
      nie_wlasciwy_typ = true; // powtarzamy petlę
    }
  }
  while(nie_wlasciwy_typ);
 
  if (push3t(el)==false){cout<<"przekroczono pojemnosc stosu!"<<endl; break;}
  cout<<"wierzcholek stosu:"<<w<<endl;
 }
 cout<<endl<<endl<<"Aktualna zawartosc stosu: "<<endl;
 for (int f=0; f<i; f++){
   cout<<"stos["<<f<<"] = ";
 
   if(stos[f].typ == tShort) cout << stos[f]._short;
   else if(stos[f].typ == tInt) cout << stos[f]._int;
   else if(stos[f].typ == tLong) cout << stos[f]._long;
   else if(stos[f].typ == tFloat) cout << stos[f]._float;
   else if(stos[f].typ == tDouble) cout << stos[f]._double;
   else if(stos[f].typ == tChar) cout << stos[f]._char;
 
   cout << endl;
 }
 cout<<"ile liczb chcesz zdjac ze stosu?: ";
 cin>>i;
 for (int f=0; f<i; f++){
   pop3t(el);
 
   cout<<"Ostatnio zdjeto ze stosu: ";
   if(el.typ == tShort) cout << el._short;
   else if(el.typ == tInt) cout << el._int;
   else if(el.typ == tLong) cout << el._long;
   else if(el.typ == tFloat) cout << el._float;
   else if(el.typ == tDouble) cout << el._double;
   else if(el.typ == tChar) cout << el._char;
   cout << endl;
 
   cout<<"wierzcholek stosu: "<<w<<endl;
   cout<<endl<<endl<<"aktualna zawartosc stosu: "<<endl;
 
   for(int f=0; f<w; f++){
     cout<<"stos["<<f<<"] = ";
 
     if(stos[f].typ == tShort) cout << stos[f]._short;
     else if(stos[f].typ == tInt) cout << stos[f]._int;
     else if(stos[f].typ == tLong) cout << stos[f]._long;
     else if(stos[f].typ == tFloat) cout << stos[f]._float;
     else if(stos[f].typ == tDouble) cout << stos[f]._double;
     else if(stos[f].typ == tChar) cout << stos[f]._char;
 
     cout << endl;
   }
 }
 return 0;
}



bool push3t(Element element){
 if (w==(SIZE)) return false;
 else
 {
  stos[w] = element;
  w++;
  return true;
 }


}

bool pop3t(Element &element){
 if(w==0) return false;
 else{
  element = stos[w-1];
  w--;
  return true;
 }
}

Na początku wpisujesz typ zmiennej, dopiero potem wartość

Jeśli będzie przeszkadzać Ci, że program się sam zamyka dopisujesz

system("PAUSE");

przed

return 0;

przy końcu programu

0

jesteś wielki :D trochę ciężko będzie mi to omówić ale jakoś może mi się uda :D

0
szwedos2 napisał(a):

jesteś wielki :D trochę ciężko będzie mi to omówić ale jakoś może mi się uda :D

To lepiej sobie to dobrze przeanalizuj...

I nie nastawiaj się, że częściej będziesz dostawał gotowca, prawdopodobieństwo na to, że dostaniesz darmowego gotowca jest małe... akurat dziś masz farta, wyjątkowo miałem chęć pomóc, następnym razem pewnie zabulisz parę złotych, jak zauważyłeś ludzie chcą coś zarobić... biznes is biznes

0

@n0name_l prawdopodobnie masz rację...

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