Dodawanie do struktury

0

Witam, jest sposób, aby do structury, która jest vectorem dodać elementy, bez konstruktora.

 struct ocena
{
	string przedmiot;
	int ocena;
};

struct indeks
{
	string imie;
	string nazwisko;
	vector <ocena> oceny;
};

void pobierz (vector <indeks> ind)
{
string a, b;
cin>>a;
cin>>b;
ind->imie.push_back(a);
ind->nazwisko.push_back(b);
}
2

Jedno z dwóch:
1.

string a, b;
cin>>a>>b;
indeks x;
x.imie=a;
x.nazwisko=b;
ind.push_back(x);
indeks x;
cin>>x.imie>>x.nazwisko;
ind.push_back(x);

Ale to i tak nie zadziała bo masz błąd tu: void pobierz (vector <indeks> ind)

0

Mam taki error: Error type(s) preceding 'ocena' (constructor with return type, or illegal redefinition of current class-name?)
Nie rozumiem co zrobić, aby go naprawić. Proszę o jakąś pomoc

 #include <iostream>
#include <cstdlib>
#include <vector>
#include <string>

using namespace std;

struct ocena
{
	string przedmiot;
	int ocena;
};

struct indeks
{
	string imie;
	string nazwisko;
	vector <ocena> oceny;
};

void pobierz (vector <indeks>& ind)
{
	indeks x;
	cin>>x.imie>>x.nazwisko;
	ind.push_back(x);
}


int main ()
{
	vector <indeks> indeksy;
	pobierz(indeksy);



	system ("pause");
	return 0;
}
2

Użyj opcję rebuild http://ideone.com/mSV0Xb

Możliwe że twój kompilator czepia się kolizji nazw:
struct ocena
{
string przedmiot;
int ocena;
};

0

Witam, mam kolejny problem z dodaniem do struktury
Program się kompiluje, dodaje te wartości ocen i przy wyświetlaniu wyświetla się tylko imię i nazwisko.
Gdzie mam błąd? :)

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>

using namespace std;

struct ocena
{
	string przedmiot;
	int wartosc;
};

struct indeks
{
	string imie;
	string nazwisko;
	vector <ocena> oceny;
};

void pobierz (vector <indeks> &ind, int n, vector <ocena> &o)
{
	indeks x;
	ocena z;
	cin>>x.imie>>x.nazwisko;
	for (int i=0; i<n; i++)
	{

		cin>>z.wartosc;
		o.push_back(z);

	}
	ind.push_back(x);
}

void wyswietl (const vector <indeks> &ind, int n)
{
	for (auto v=ind.begin(); v!=ind.end(); ++v)
	{
		cout<<(*v).imie<<" "<<(*v).nazwisko<<endl;
		for(auto w=v->oceny.begin(); w!=v->oceny.end(); ++w)
			cout<<(*w).wartosc;
	}

}

int main ()
{
	vector <indeks> indeksy;
	vector <ocena> ocenki;
	char a;
	int n;
	cout <<"Podaj ile ocen brac pod uwage: ";
	cin>>n;
	while (1)
	{
		cin>>a;
		switch(a)
		{
		case '1':
			{
				pobierz(indeksy, n, ocenki);
			}break;
		case '2':
			{
				wyswietl(indeksy, n);
			}break;
		case 'x':
			{
				exit(0);
			}break;
		}


	}
	system ("pause");
	return 0;
}
2

Dodajesz oceny do: vector <ocena> ocenki; z main()
Zaś wyświetlasz z: vector <ocena> oceny; z indeks

0

Mogę prosić o pomoc w pobraniu wartości ocen do vector <ocena> oceny z indeks. Nie miałem pomysłu, próbowałem też metodą prób i błędów i nic.
Pomocy.

1

Zacznij od wywalenia: vector <ocena> ocenki; i jako skutek nie przekazywanie jej do pobierz() ani odbierania jej w pobierz().
Dalej sam się domyślisz bo zostanie zmienić jeden wiersz.

0

Przeceniłeś moje umiejętności :(
Próbowałem taką metodą

ind[0].oceny.push_back(a); 

, ale też nic. Nie mam pojęcia jak dodać int'a i stringa do vectora, który jest w strukturze

0

No to przerasta cię ten projekt. Weź się za jakiś kurs.

0

Udało się, ale przy próbie napisania kolejnej funkcji, mam nie spotykany wcześniej błąd.
Dołączyłem plik nagłówkowy <algorithm> i dostałem błędy:
error C1903: unable to recover from previous error(s); stopping compilation
error C2064: term does not evaluate to a function taking 2 arguments
Co zrobić?
kod:

#ifndef Header.h
#define Header_h
#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

struct ocena
{
	string przedmiot;
	int wartosc;
};

struct indeks
{
	string imie;
	string nazwisko;
	vector <ocena> oceny;
};
void pobierz (vector <indeks> &ind, int n);
void wyswietl (const vector <indeks> &ind, int n);
bool porownaj(vector <indeks> &ind);
void sort (vector <indeks> &ind);
#endif
#include "Header.h"
bool porownaj(vector <indeks> &ind)
{
	indeks s1, s2;
	if (s1.imie<s2.imie)
		return true;
	else return false;
}
void sort (vector <indeks> &ind)
{
	sort(ind.begin(), ind.end(), porownaj(ind));

}
void pobierz (vector <indeks> &ind, int n)
{
	indeks x;
		ocena o;
	cin>>x.imie>>x.nazwisko;

	for (int i=0; i<n; i++)
	{
	cout<<"Podaj przedmiot: ";
	cin>>o.przedmiot;
	cout<<"Podaj ocene: ";
	cin>>o.wartosc;
     x.oceny.push_back(o);
	}
		ind.push_back(x);
}

void wyswietl (const vector <indeks> &ind, int n)
{
	for (auto v=ind.begin(); v!=ind.end(); ++v)
	{
		cout<<(*v).imie<<" "<<(*v).nazwisko<<endl;
		for(auto w=v->oceny.begin(); w!=v->oceny.end(); ++w)
			cout<<(*w).przedmiot<<": "<<(*w).wartosc<<endl;
	}

}
 
0

Dopóki jesteś początkujący nawet nie próbuj czytać niczego po pierwszym błędzie.
Naprawiasz pierwszy, kompilujesz jeszcze raz.
I tak w kółko.

0

Ale jak naprawić ten błąd, bo w internecie nic nie znalazłem, a zupełnie go nie ruzmiem? :)

0

Ten czyli który?

0

Ten: error C1903: unable to recover from previous error(s); stopping compilation
Chociaż one się biorą z jednego 'źródła' chyba, nie?

0

To nie może być pierwszym błędem przecież jasno napisano: ... from previous error(s) ...
Znajdź w menu Rebuild All, jeżeli się nie uda to pokasuj ręcznie wszytko oprócz źródeł.

0

Wstawiam screena listy błędów :)
user image

0

Napraw te ostrzeżenia a te błędy znikną. Masz wyraźnie napisano że coś jest nie tak w pliku header.h, na 100% przed dołączeniem <algorythm>

0

Poprawiłem, uwag już nie ma, a błędy są cały czas te same.
Jeśli nie mam pliku nagłówkowego <algorithm> to kompilator przechodzi przez pre procesor, a tak to wydaje mi się, że nie

#ifndef Header_h
#define Header_h


#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

struct ocena
{
	string przedmiot;
	int wartosc;
};

struct indeks
{
	string imie;
	string nazwisko;
	vector <ocena> oceny;
};
void pobierz (vector <indeks> &ind, int n);
void wyswietl (const vector <indeks> &ind, int n);
bool porownaj(vector <indeks> &ind);
void sort (vector <indeks> &ind);
#endif
0

Nie rób using namespace wewnątrz nagłówka.

1

Już widzę:

bool porownaj(const indeks &a,const indeks &b)
{
	return a.imie<b.imie;
}

void sort (vector <indeks> &ind)
{
    sort(ind.begin(), ind.end(), porownaj);
 
}
0

@Garniturek: bo to niszczy ideę namespace'ów. z założenia wszystko co dany nagłówek udostępnia, powinno być zamknięte w przestrzeni nazw. ale nawet jeśli nie jest, to nie powinieneś wciągać innych namespace'ów, bo „przywracasz bałagan” - w efekcie (w dużym projekcie, używającym wielu bibliotek) jeśli jakaś nazwa w nagłówku koliduje z nazwą w innym nagłówku, to która zostanie użyta będzie zależało od kolejności #include'ów w projekcie, albo nie da się użyć danych dwóch nagłówków jednocześnie. po to wymyślono namespace'y, by rozwiązać te problemy - ale pod warunkiem że nie robi się using namespace w nagłówkach.

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