Książka adresowa – wymiana tablicy struktur na wektor struktur

0

Cześć! Tworzę właśnie program, który jest książką adresową przechowującą dane znajomych. Potrzebuję zmodyfikować go teraz tak, aby nowe kontakty dopisywał do wektora struktur a nie do tablicy struktur. Tworzę taką strukturę:

struct adresat
{
    string imie, nazwisko, numerTelefonu, email, adres;
    int idZapisanegoKontaktu;
};

i wektor:

vector <adresat> adresaci;

w jaki sposób mogę dopisywać nowe kontakty, za pomocą push_back? Stworzyłam taką funkcję:

string imie, nazwisko, numerTelefonu, email, adres;
    cout << "Podaj imie:";
    cin >> imie;
    cout << "Podaj nazwisko:";
    cin >> nazwisko;
    cout << "Podaj numer telefonu:";
    cin.sync();
    getline(cin, numerTelefonu);
    cout << "Podaj adres:";
    cin.sync();
    getline(cin, adres);
    cout << "Podaj e-mail:";
    cin >> email;

    adresaci.imie.push_back(imie);
    adresaci.nazwisko.push_back(nazwisko);
    adresaci.numerTelefonu.push_back(numerTelefonu);
    adresaci.adres.push_back(adres);
    adresaci.email.push_back(email);

ale niestety pokazuje mi błąd:

'class std::vector<adresat>' has no member named imie''

Co robię źle?

0

stworzyles taki vector

vector <adresat> adresaci;

wiec musisz dodawac obiekt (strukture) adresat

czyli

auto adresatToBeAdded = unique_ptr<adresat>();
adresatToBeAdded->imie = imie;
// ... i tak dalej az uzupelnisz caly obiekt
adresaci.push_back(adresatToBeAdded);
  1. klasy zaczynaj wielka litera
  2. uzywaj angielskich nazw
0

Mam jeszcze jedno pytanie, jak wypisać zawartość takiego wektora struktur?

0

nie musisz cytowac poprzedniej wiadomosci ;)

for (auto adresat : adresaci)
{
   cout << adressat.imie;
   // ... i reszte struktury
}

jezeli nie chcesz korzystac z takiego fora to mozesz zrobic tak

for(int i = 0 ; i < adresaci.size() ; i++)
{
  cout <<  adresaci[i].imie;
}

z wektora mozna korzystac z jak normalnej tablicy

0

Rzeczywiście można to zrobić w tak prosty sposób. Dzięki!

0

Nadal nie rozwiązałam problemu, o co chodzi w tym?

 auto adresatToBeAdded = unique_ptr<adresat>();
adresatToBeAdded->imie = imie;
// ... i tak dalej az uzupelnisz caly obiekt
 adresaci.push_back(adresatToBeAdded);

Wpisując auto wyskakuje mi błąd. Nie wiem czym jest unique_ptr. Czy jest jakiś inny sposób na wypełnienie wektora struktury?

0
kinga1833 napisał(a):

Nadal nie rozwiązałam problemu, o co chodzi w tym?

 auto adresatToBeAdded = unique_ptr<adresat>();
adresatToBeAdded->imie = imie;
// ... i tak dalej az uzupelnisz caly obiekt
 adresaci.push_back(adresatToBeAdded);

Pytanie dotyczy wektora obiektów a nie wskaźników na obiekty, więc nie wiem czemu @fasadin wtłoczył tu unique_ptr ;)

Na początek wystarczy, że swoją funkcję przerobisz tak:

adresat obiekt;  // zamiast luźnych zmiennych imie,nazwisko, itd.
cout << "Podaj imie: ";
cin >> obiekt.imie;
cout << "Podaj nazwisko: ";
cin >> obiekt.nazwisko;
// etc...
adresaci.push_back( obiekt );
0

Otrzymałam cenną wskazówkę co do tego jak dodawać elementy do wektora struktur, jednak teraz mam problem z zapisem tego wektora do pliku. Poniżej wklejam kod, program ten jest książką adresową gdzie jedną z funkcjonalności jest dodawanie kontaktów, które zostają zapisane do pliku. Problem polega na tym, że zapisuje mi jedynie jeden kontakt do pliku, przy zapisie kolejnego kontaktu, program przestaje działać. Działał natomiast kiedy funkcjonalność zapisu nowej osoby do książki adresowej umieściłam w funkcji main, zamiast w funkcji int zapisanieNowejOsoby jak poniżej. Przepraszam, że używam języka polskiego, już tak napisałam ten program, na razie nie chcę tego zmieniać. Może ktoś wie gdzie robię błąd, bardzo proszę o pomoc.

struct Adresat
{
    int idZapisanegoKontaktu = 0;
    string imie, nazwisko, numerTelefonu, email, adres;
};

int zapisanieNowejOsoby (vector <Adresat> adresaci, int liczbaZnajomych)
{
    Adresat obiekt;

    obiekt.idZapisanegoKontaktu = liczbaZapisanychZnajomych +1;
    cout << "Podaj imie:";
    cin >> obiekt.imie;
    cout << "Podaj nazwisko:";
    cin >> obiekt.nazwisko;
    cout << "Podaj numer telefonu:";
    cin.sync();
    getline(cin, obiekt.numerTelefonu);
    cout << "Podaj adres:";
    cin.sync();
    getline(cin, obiekt.adres);
    cout << "Podaj e-mail:";
    cin >> obiekt.email;

    adresaci.push_back(obiekt);

    fstream plik;
    plik.open("ksiazkaadresowa.txt", ios::out | ios::app);

    if (plik.good() == true)
    {
        plik << adresaci[liczbaZnajomych].idZapisanegoKontaktu << endl;
        plik << adresaci[liczbaZnajomych].imie << endl;
        plik << adresaci[liczbaZnajomych].nazwisko << endl;
        plik << adresaci[liczbaZnajomych].numerTelefonu << endl;
        plik << adresaci[liczbaZnajomych].adres << endl;
        plik << adresaci[liczbaZnajomych].email << endl;
        plik.close();
    }
    else
    {
        cout << "Nie udalo sie otworzyc pliku i zapisac do niego danych." << endl;
        system ("pause");
    }

    cout << "Nowy kontakt zostal dodany do ksiazki adresowej"<< endl;
    Sleep(1000);
    return liczbaZnajomych+1;

int main()
{
    vector <Adresat> adresaci;
    int liczbaZapisanychZnajomych = 0;
    char wybor;

    liczbaZapisanychZnajomych = wczytajLiczbeZnajomych(adresaci);

    while (true)
    {
        system("cls");
        cout << "1. Zapisz nowa osobe do ksiazki adresowej." << endl;
        cout << "2. Wyszukaj znajomego wedlug imienia." << endl;
        cout << "3. Wyszukaj znajomego wedlug nazwiska." << endl;
        cout << "4. Wyswietl cala liste znajomych."<< endl;
        cout << "9. Koniec pracy." << endl;

        cin >> wybor;
        if (wybor == '1')
        {
            liczbaZapisanychZnajomych = zapisanieNowejOsoby (adresaci,liczbaZapisanychZnajomych);
        }
}
}
0

Zmienna liczbaZapisanychZnajomych którą przekazujesz do funkcji zapisanieNowejOsoby jest ustawiana przed pętlą. W rezultacie funkcja zapisanieNowejOsoby zapisuje do pliku ciągle ten sam obiekt.

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