Stos jako zmienna klasy. Przypisanie wartosci do stosu.

0

Witam, szukalem w goolach z 5 godzin i nic nie znalazlem. Jak przypisac wartosci do stosu ktora jest zmienna klasy. Potrafie przypisac poszczegolne wartosci gdy zmienna klasy jest tablicą ale ze stosem mi nie wychodzi. Ponizej przykladowy kod:

#include <iostream>
#include <stack>

using namespace std;


class dane{
public:

 		
		char imie[20];
		char nazwisko[20]
		int wiek ;
		




		
		
};
stack <dane> stos;

// ponizej glowna funkcja z ktorej chcialbym dodawac na stos nowy element do stosu na zasadzie stos.push(?) a w //elemencie przypisywalbym sobie skladniowe imie, nazwisko i wiek.


int main(){
 


//??????????????

	
	
return 0;	
}
0

o_O

dane d;
//przpisanie wartości
stos.push(d);

Już widzę jak "szukałeś 5 godzin" skoro dokumentacja daje od razu przykład:
http://www.cplusplus.com/reference/stack/stack/push/

1

Jak masz w miarę nowy kompilator

	stos.push(dane{"Ala","Kowalska",19});

poza tym nie nazywaj klasy dane.

0

A jak zrobic by uzytkownik sam wypelnial stos skladniowymi np jesli chce tylko przypisac sam wiek bez imienia i nazwiska? Tak jak np w tablicy to by bylo

  
dane tablica[5];
cin>>tablica[0].wiek;
0
dane tmp;
while(scanf("%d %s", &tmp.int, tmp.string)) {
  stos.push(new dane(tmp));
}
#include <iostream>
#include <stack>
#include <string>
using namespace std;

class Data {
public:
	Data(): intVariable(0), stringVariable("") { ; }
	Data(int iVal, const string& sVal):
		intVariable(iVal),
		stringVariable(sVal)
	{
		;
	}
		
	Data(const Data& d):
		intVariable(d.intVariable),
		stringVariable(d.stringVariable)
	{
		;
	}
	
	friend ostream& operator<<(ostream& out, const Data& d) {
		return out << "-> " << d.intVariable << "\t" << d.stringVariable;
	}
	
	friend istream& operator>>(istream& in, Data& d) {
		return in >> d.intVariable >> d.stringVariable;
	}
	
private:
	int intVariable;
	string stringVariable;
};

int main() {
	
	stack<Data> myStack;
	Data temp;
	while(cin >> temp) {
		myStack.push(temp);
	}
	
	while (!myStack.empty()) {
		cout << myStack.top() << endl;
		myStack.pop();
	}
  	
	return 0;
}

http://ideone.com/zRD4Gp

Mozna tak, np.

0

No wlasnie nie odpala ten kod. Jak to przerobic na c++?

Bardziej mi chodzilo o to by program wyswietlal - "podaj wiek: " a uzytkownik wpisuje do plola przeznaczonego na wiek liczbe. Analogicznie z imieniem.

1
dane tmp;
printf("Podaj wiek i imie: ");
if(scanf("%d %s",&tmp.wiek,tmp.imie)==2) stos.push(tmp);

Przerobiono z pierwotnego kodu od @n0name_l.
@januszexxxx nie czekaj aż za ciebie zrobią całość, jak coś nie działa to znaczy gdzieś się wkradł drobny błąd, który da się naprawić samodzielnie używając wskazówek kompilatora.

0

Jest tu jeszcze ktos?

Eh kombinuje z tym przypisaniem nazwiska do stosu i cholera nie wychodzi. Ponizej kilka potworkow hehe. Niech ktos wreszcie napisze jak to powinno byc.

#include <iostream>
#include <stack>
#include <cstdio>
using namespace std;


class dane{
public:

 		
		char imie[20];
		char nazwisko[20];
		int wiek ;
		
	
};
stack <dane> stos;
////////////////////////////////////////////////////////////////////
int main(){


//cin>>stos.push(dane.nazwisko);                            <-- lipa
//cin>>stos.push(dane{}.nazwisko);                         <-- lipa
//cin>>stos.push(dane({}).nazwisko);                      <-- lipa
//cin>>stos.push(dane().nazwisko);                         <-- lipa
//cin>>stos.push(dane{.nazwisko});                        <-- lipa
//cin>>stos.push(dane().nazwisko);                         <-- lipa

cout<<stos.top().nazwisko;

return 0;
}
0

Ech, szkoda słów. Tworzysz stos obiektów "dane" i TYLKO takie rzeczy mozesz wkładać/zdejmować z tego stosu. Koniec, kropka! Nie możesz tam wrzucić samego nazwiska bo nazwisko to char[] a nie dane.
Nie da się tego w ogóle zrobić tak jak pokazałeś. Musisz wczytać za pomocą cin>> dane do jakiejś zmiennej tymczasowej a potem wrzucić ją na stos.

0

O to co wykombinowalem. Niestety jest jakis problem z wyswietlaniem napisow. Program sie kompiluje ale z błędem:
"53 11 C:\Documents and Settings..\Untitled2.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]"

Co to moze byc?


#include <iostream>
#include <stack>

using namespace std;


class dane{
public:

 		
		char imie[20];
		char nazwisko[20];
		int wiek;
		
	
};
stack <dane> stos;
////////////////////////////////////////////////////////////////////
int main(){
 	
 char a[20];
 char b[20];
 int c;
 char wyb;

cout<<"czy dodac imie?  T - tak: ";
cin>>wyb;
if (wyb=='t')
{
	cout<<"Wpisz imie: ";
	cin>>a;
		
}


cout<<"czy dodac nazwisko?  T - tak: ";
cin>>wyb;
if (wyb=='t')
{
	cout<<"Wpisz nazwisko: ";
	cin>>b;
}


cout<<"czy dodac wiek?  T - tak: ";
cin>>wyb;
if (wyb=='t')
{
	cout<<"Wpisz wiek: ";
	cin>>c;
}

stos.push(dane{{a[20]},{b[20]},c});

cout<<stos.top().imie<<endl;
cout<<stos.top().nazwisko<<endl;
cout<<stos.top().wiek<<endl;

return 0;	
}



0

Boże widzisz, a nie grzmisz. Otóż może to być pomroczność jasna albo twoja nieumiejętność czytania. Sam wybierz.

extended initializer lists only available with -std=c++11 or -std=gnu++11

otóż takie coś:

stos.push(dane{{a[20]},{b[20]},c});

dostępne jest dopiero w C++11 jak wyraźnie kompilator napisał. Co więcej napisała to też osoba która ci ten kod podała:

Jak masz w miarę nowy kompilator

Abstrahuję tu nawet od błędnego podania parametrów bo a[20] to jest 21 element tablicy a nie cała tablica. Co więcej tablica 'a' ma u ciebie tylko 20 elementów więc a[20] to jest wyjście poza obszar twojej pamięci i pewnie nawet jakbyś to skompilował to by się wysypało...

Jeśli nie masz, albo nie umiesz włączyć sobie c++11 to zrób to normalnie jak człowiek, za pomocą zwykłego konstruktora. Po co używasz kodu którego nie rozumiesz?

2

Musisz zrozumieć jedną prostą rzecz, dopóki nie nauczysz się składni - nie dasz rady programować.
Uczenie się programowanie metodą prób i błędów jest całkiem dobre ale dopiero kiedy mniej więcej ogarniasz składnie.
Prawdopodobnie chcesz stworzyć coś a la: http://ideone.com/we0GGZ

0

Tak Dragon wlasnie o takie cos mi chodzilo! Serdeczne dzieki mistrzu.
Btw dlaczego w 21linijce dales taki sam warunek chyba wkradl sie blad? if((wyb=='t')||(wyb=='t')) ?
Pobawilem sie tym manipulatorem setw(19) przypisanym do char imie[20] i wychodzi mi na to ze setw(19) przypisuje 18 znakow plus '\0' a char imie ma 19znakow plus '\0' wiec setw i char powinny byc ustawione na ten sam rozmiar np 20?

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