C-struktury i struktury zagnieżdżone.

0

Witam.
Dopiero zaczynam przygodę z programowaniem jak i z samymi strukturami.

Mam coś takiego w f. main

using std::cout;
    using std::endl;
    Couple cpls[]={
    {{"John",{PKO,1200}}, {"Marry",{BGZ,1500}}},
    {{"Peter",{BGZ,1300}},{"Suzy",{BRE,1300}}},
    {{"Kevin",{PKO,1600}},{"Katy",{BPH,1500}}},
    {{"Kenny",{BPH,1800}},{"Lucy",{BRE,1700}}},
    };
    cout<<cpls<<endl; //pytanie 1

dodam jeszcze deklaracje tej struktury:

enum Banks {PKO, BGZ, BRE, BPH};

struct Account{
    Banks bank;
    int balance;
};

struct Person{
char name[20];
Account account;
};

struct Couple{
Person he;
Person she;
};

Mam 2 pytania:

  1. czy tam gdzie jest komentarz "pytanie 1" to w wyświetlenie tego powoduje wyświetlenie adresu początku tej tablicy, jak przy "normalnych" tablicach?( wyświetla mi sie coś z przedrostkiem 0x czyli system szesnastkowy a wiec adres???)
  2. Jak "dobrać" się do nazwy banku??? Chodzi mi np. o to żeby nazwę tą wyświetlić sobie.
    Próbowałem mniej więcej tak (dla Johna)
cpls[0].he.account.bank

ale to nie wychodzi ;/ Czytałem o strukturach-najpierw w C potem w Cpp ale jakoś nie umiem połączyć to w całość od razu w takim dosyć skomplikowanym, jak na początkującego, problemie.
Dziękuję za wszystkie sensowne sugestie i podpowiedzi.

1
  1. Tak.
    Typ tablicy nie ma znaczenia. Zachowuje się tak samo dla każdego typu. Polecam std::array<>.
  2. enum nie trzyma stringów, tylko wartości całkowite, jak int lub char.
    Zamiast enuma zastosuj std::string i w nim trzymaj nazwę banku.
char name[20]; 

skoro piszesz w C++ korzystaj z std::string.
I może tak?

std::map<Person, Account, Cmp> accounts 

, gdzie Cmp to komparator porównujący Persony.

0

Dzięki!!! W tym enum to nie moja sprawka te stringi tylko autora zadania-zakładam zatem że tak ma być. A co do Twojej propozycji to trochę jej nie rozumiem na ten moment ale spróbuję poczytać. :( Jednak czy można jakoś zrobić tak że gdyby w tym enum były jakieś tam liczby zamiast tych banków no i oczywiście te same liczby tam gdzie jest tablica w f. main to jak "dobrać" się do takiej wartości bo np. "odkryłem" że gdy zrobię:

cpls[0].he.account.balance 

to mi wyświetli saldo "Johna" problem tkwi z tym enum chyba w takim razie (może autor się pomylił jednak chociaż w sumie w pewnym skrypcie widziałem tam też łańcuchy(?)) a no i jak zamienie balance na to nieszczęśliwe bank no to mi wyświetla indeksy tablicy (może nie ale dal mnie tak to wygląda) no bo jak sobie zmienie tam [0] na [1] to zamiast 0 bedzie 1... Troche zawile ale mam nadzieje, ze ktoś się połapie. :D

1

Wyswietla liczby, bo najprawdopodobniej autor używał ich jako indeksy tablicy łańcuchów z nazwami banków.

edit: to jest dość prosty przykład z wykorzystaniem tablicy std::array

#include <iostream>
#include <string>
#include <array>

struct Person {
    std::string name;
    std::string surname;
    Person(const std::string& nm, const std::string& snm)
        :name{ nm }, surname{ snm }
    {}
    friend 
        std::ostream& operator<<(std::ostream& out, const Person& person)
    {
        return out << person.name << ", " << person.surname << ": ";
    }
};

struct Account {    
    std::string bankName;
    double balance;
    Account(const std::string& bnm, double bal)
        :bankName{ bnm }, balance{ bal }
    {}
    friend
        std::ostream& operator<<(std::ostream& out, const Account& account)
    {
        return out << "Nazwa banku: " << account.bankName
            << ", saldo: " << account.balance;
    }
};

struct AccountsIndex {
    Person person;
    Account account;
    AccountsIndex(const Person& per, const Account& acc)
        :person{ per }, account{ acc }
    {}
    friend       
        std::ostream& operator<<(std::ostream& out, const AccountsIndex& accInd)
    {
        return out << accInd.person << accInd.account;
    }
};

void print(const std::array<AccountsIndex, 5>& coll)
{
    for (auto const& el : coll) {
        std::cout << el << '\n';
    }
}

int main()
{
    std::array<AccountsIndex, 5> accounts{
        AccountsIndex{Person{"John", ""}, Account{"PKO", 1200}},
        AccountsIndex{Person{"Marry", "Mm"}, Account{"BGZ", 1500}},
        AccountsIndex{Person{"Marry", "Mmm"}, Account{"BGZ", 1800}},
        AccountsIndex{Person{"Kevin", ""}, Account{"BPH", 2236.16}},
        AccountsIndex{ Person{"Antonio", ""}, Account{"BRE", 111.23}}
    };
    print(accounts);
} 

http://ideone.com/Qvk5KP
i drugi przykład z wykorzystaniem std::map
http://ideone.com/FUOSEa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.