• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Zagnieżdżone pętle - wyświetlanie danych z kontenerów

0 głosów
128 wizyt
pytanie zadane 20 września 2016 w C i C++ przez plkpiotr Stary wyjadacz (12,420 p.)
zamknięte 21 września 2016 przez plkpiotr

Program służy jako baza danych sieci sklepów z zabawkami, o podanym pliku nagłówkowym. Baza danych jest reprezentowana przez kontener (od zera zaimplementowany) składa się z obiektów Chain, która posiada kontener (wektor/STL) obiektów Shop, a te posiadają kontener (wektor/STL) obiektów Toy - jak niżej:

class Toy {
public:
    string name;
    double price;
    int amount;
    Toy(string name, double price, int amount);
    ~Toy() {}
    friend ostream& operator<<(ostream& out, const Toy& toy);
    friend istream& operator>>(istream& in, Toy& toy);
};

class Shop {
public:
    string address;
    vector<Toy> Toys;
public:
    Shop(string address);
    Shop() {}
    ~Shop() {}
    void addToys();
    void addToysExtended(string name, double price, int amount);
    void deleteToy(string name);
    string getAddress();
    friend ostream& operator<<(ostream& out, const Shop& shop);
    friend istream& operator>>(istream& in, Shop& shop);
};

class Chain {
private:
    string trademark;
    unsigned short amount;
public:
    vector<Shop> Shops;
    Chain(string trademark);
    Chain() {};
    ~Chain() {}
    void addShop();
    void addShopExtended(string address);
    string getTrademark();
    friend ostream& operator<<(ostream& out, const Chain& chain);
    friend istream& operator>>(ostream& in, Chain& chain);
};

void displayMenu();
void pressKey();
void clearScreen();

W funkcji głównej main() mam za zadanie wyświetlić zabawki sklepu z danej sieci. Stale próbuję napisać własny sposób wyświetlenia kolejnych zabawek, jednak algorytm działa poprawie tylko dla pierwszego przelotu tzn. dla pierwszej sieci i pierwszego sklepu, próba wyświetlenia zawartości dalszych sieci->sklepów kończy się fiaskiem, bo nic nie wyświetla. Tak wyglądają moje zapiski:

string trademark;
cout << "Chain's name: ";
cin.ignore(USHRT_MAX, '\n');
getline(cin, trademark);
for (it = database.begin(); it != database.end(); it++) {
	if (trademark == (*it).getTrademark() && (*it).Shops.size() != 0) {
		string address;
		cout << "Address: ";
		getline(cin, address);
		for (unsigned short i = 0; i < (*it).Shops.size(); i++) {
			if (address == (*it).Shops[i].address && (*it).Shops[i].Toys.size() != 0) {
				for (unsigned short j = 0; j < (*it).Shops[i].Toys.size(); j++)
					cout << (*it).Shops[i].Toys[j] << endl;
				break;
			}
			if (address == (*it).Shops[i].address && (*it).Shops[i].Toys.size() == 0)
				cout << "No toys." << endl;
			break;
		}
	}
	if (trademark == (*it).getTrademark() && (*it).Shops.size() == 0) {
		cout << "No shops." << endl;
		break;
	}
}

Oddzielne funkcje wyświetlające sieci lub sieci ze sklepami napisałem w porządku, jednak z wyświetlaniem zabawek mam problem, stąd proszę o pomoc...

komentarz zamknięcia: Użytkownik Criss wyjaśnił co było błędem w komentarzach : )
1
komentarz 21 września 2016 przez Criss Mędrzec (171,460 p.)
Podobno jakoś się dało.. ale nie mam pojęcia jak. Ważne, że się wyjaśniło :P
komentarz 21 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)

Dla potomnych :)
Jeżeli ktoś miałby jakieś zastrzeżenia - bardzo proszę...

string trademark;
cout << "Chain's name: ";
cin.ignore(USHRT_MAX, '\n');
getline(cin, trademark);
for (it = database.begin(); it != database.end(); it++) {
	if (trademark == (*it).getTrademark() && (*it).Shops.size() != 0) {
		string address;
		cout << "Address: ";
		getline(cin, address);
		for (unsigned short i = 0; i < (*it).Shops.size(); i++) {
			if (address == (*it).Shops[i].address && (*it).Shops[i].Toys.size() == 0)
				cout << "No toys." << endl;
			else if (address == (*it).Shops[i].address) {
				for (unsigned short j = 0; j < (*it).Shops[i].Toys.size(); j++)
					cout << (*it).Shops[i].Toys[j] << endl;
			} else if (i == (*it).Shops.size() - 1)
				cout << "This shop doesn't exist." << endl;
		}
	} else if (trademark == (*it).getTrademark() && (*it).Shops.size() == 0)
		cout << "No shops." << endl;
	else if (trademark != (*it).getTrademark() && it == database.end() - 1)
		cout << "This chain doesn't exist." << endl;
}

Zastanawiam się jedynie, nad break'ami - czy w odpowiednich miejscach nie przyspieszyłyby one działania programu?

1
komentarz 21 września 2016 przez Criss Mędrzec (171,460 p.)

Tutaj:

            if (address == (*it).Shops[i].address && (*it).Shops[i].Toys.size() == 0)
                cout << "No toys." << endl;

i tutaj:

else if (trademark == (*it).getTrademark() && (*it).Shops.size() == 0)
        cout << "No shops." << endl;

Jeśli już w tych momentach jesteś w stanie stwierdzić, że "No toys." / "No shops." to możesz wrzucić w te ify break-a. Nie ma sensu dalej sprawdzać jeśli wiesz, że dalej już nic nie znajdziesz. Tylko wtedy wnioskuje, że w database i w Shops istnieją tylko unikaty - tzn. jest max jeden obiekt (w database) o danym trademarku i max jeden sklep o danym adresie. Jeśli tak nie jest, to nie wiem na jakiej podstawie stwierdzasz, że nie ma sklepów / zabawek jeszcze przed przeszukaniem wszystkiego.

komentarz 21 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Dzięki raz jeszcze :)
Widzę, że nie mam wystarczającej wiedzy/doświadczenia, bo faktycznie tego nie rozpatrzyłem o czym piszesz...
1
komentarz 21 września 2016 przez Criss Mędrzec (171,460 p.)
Przyjdzie z czasem :P

Podobne pytania

0 głosów
1 odpowiedź 92 wizyt
pytanie zadane 24 czerwca w C i C++ przez magda_19 Obywatel (1,820 p.)
0 głosów
2 odpowiedzi 289 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez ofnero Użytkownik (830 p.)
0 głosów
2 odpowiedzi 2,718 wizyt
pytanie zadane 22 stycznia 2017 w JavaScript, jQuery, AJAX przez svyatogor92 Użytkownik (660 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

67,127 zapytań

114,075 odpowiedzi

241,784 komentarzy

47,030 pasjonatów

Przeglądających: 227
Pasjonatów: 17 Gości: 210

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...