• 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

Object Storage Arubacloud
0 głosów
340 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 (172,590 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 (172,590 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 (172,590 p.)
Przyjdzie z czasem :P

Podobne pytania

+1 głos
2 odpowiedzi 955 wizyt
pytanie zadane 22 stycznia 2021 w C i C++ przez Karson Obywatel (1,000 p.)
0 głosów
3 odpowiedzi 1,003 wizyt
pytanie zadane 2 maja 2020 w Python przez lenzo1 Początkujący (360 p.)
0 głosów
1 odpowiedź 750 wizyt
pytanie zadane 24 czerwca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...