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

Książka adresowa jako struktura

Object Storage Arubacloud
0 głosów
822 wizyt
pytanie zadane 3 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

Piszę program - książka adresowa, w którym chcę mieć nazwisko, nr tel oraz nazwę ulicy mieszkańców. Przy czym mój program w nazwie ulicy ma zmieniać  literę B i Z na Y. Nie wiem jak mam wywołać taką funkcję, bo kompilator wyrzuca mi błędy. Jeszcze jedno pytanie: Czy jest możliwym określenie długości obiektu nazwaUlicy, który należy do struktury (wers 16.)  

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

using namespace std;

struct osoba
{
    string nazwisko;
    long long int nr_tel;
    char nazwaUlicy[20];
};

void usunZKsiazkiAdresowej (osoba &adres)
{
    int dlugosc = osoba.nazwaUlicy.size();

    for (int i = 0; i < dlugosc; i++)
    {
        if(adres.nazwaUlicy[i] == 'B' || adres.nazwaUlicy[i] == 'Z')
        {
           adres.nazwaUlicy[i] = 'Y';
        }

    }

}

int main()
{
    cout << "Witaj w ksiazce telefonicznej. Zaczynamy zabawe!" << endl << endl;

    int rozmiar;
    cin >> rozmiar;

    int *wielkosc = new int [rozmiar];
    osoba *mieszkancy = new osoba;
    for (int i = 0; i < rozmiar; i++)
    {
        cin >> mieszkancy->nazwisko >> mieszkancy->nr_tel >> mieszkancy->nazwaUlicy;
    }

    usunZKsiazkiAdresowej()


    delete [] wielkosc;
    delete mieszkancy;


    return 0;
}

 

komentarz 3 września 2019 przez DragonCoder Nałogowiec (36,500 p.)
Czy to ma byc C++, czy C?
komentarz 3 września 2019 przez j23 Mędrzec (194,920 p.)

@magda_19, osoba::nazwisko jest typu std::string, a osoba::nazwaUlicy to char[20]. WTF? Skąd ta niekonsekwencja?
 

komentarz 3 września 2019 przez magda_19 Gaduła (3,080 p.)

@DragonCoder, C++

komentarz 3 września 2019 przez magda_19 Gaduła (3,080 p.)
Nie wiem,  jakoś tak mi się char napisało
komentarz 3 września 2019 przez j23 Mędrzec (194,920 p.)

No to zmień tę tablicę na std::stringa i problem z linii 16 zniknie.

2 odpowiedzi

0 głosów
odpowiedź 3 września 2019 przez DevLukiLL Obywatel (1,050 p.)

Co do linii 16. jeśli chcesz określić rozmiar tablicy typu char polecam skorzystać z funkcji sizeof(nazwaUlicy);

W funkcji main wydaję mi się, że powinnaś zrobić tablice dynamiczną typu osoba, z tego co widzę rezerwujesz jedną przestrzeń pamięci na "jedną osobę". 

osoba *mieszkancy = new osoba; - > osoba *mieszkancy = new osoba[rozmiar];

I w funkcji  usunZKsiazkiAdresowej musisz podesłać w argumencie strukturę jak to zadeklarowałaś, dlatego wyskakują błędy. 

A co do pytania długość nazwaUlicy można określić przez zmienną typu const nad strukturą, żeby była widoczna globalnie,albo dodanie po prostu do struktury zmiennej typu int przechowującą tą wartość. Ale nie wiem czy do końca oto Ci chodziło.

 

komentarz 3 września 2019 przez j23 Mędrzec (194,920 p.)

To już lepiej, jak już musi być tablica char, zamiast tego sizeof niech użyje strlen.

komentarz 3 września 2019 przez tkz Nałogowiec (42,000 p.)
No nie, bo jak chce określić faktyczny rozmiar to używa sizeof, a jak długość do strlen. strlen () wyszukuje znak NULL i zlicza liczbę przekazanych adresów pamięci, więc faktycznie liczy liczbę elementów obecnych w ciągu przed znakiem NULL, a sizeof () zwraca rzeczywistą ilość pamięci przydzielonej dla operand.
komentarz 3 września 2019 przez DevLukiLL Obywatel (1,050 p.)
A no tak macie racje, mój błąd.
0 głosów
odpowiedź 3 września 2019 przez magda_19 Gaduła (3,080 p.)

Utworzyłam dodatkową zmienną w strukturze, dlugosc, ale nie wiem jak się do niej odwołać w pętli for, bo nadal nie chcę się kompilować

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

using namespace std;

struct osoba
{
    string nazwisko;
    long long int nr_tel;
    char nazwaUlicy[20];
    const int dlugosc = sizeof(nazwaUlicy);


};

void usunZKsiazkiAdresowej (osoba &adres)
{

    for (int i = 0; i < osoba.dlugosc; i++)
    {
        if(adres.nazwaUlicy[i] == 'B' || adres.nazwaUlicy[i] == 'Z')
        {
            adres.nazwaUlicy[i] = 'Y';
        }

    }

}

int main()
{
    cout << "Witaj w ksiazce telefonicznej. Zaczynamy zabawe!" << endl << endl;

    int rozmiar;
    cin >> rozmiar;

    int *wielkosc = new int [rozmiar];
    osoba *mieszkancy = new osoba[rozmiar];
    for (int i = 0; i < rozmiar; i++)
    {
        cin >> mieszkancy->nazwisko >> mieszkancy->nr_tel >> mieszkancy->nazwaUlicy;
    }

    //usunZKsiazkiAdresowej()


    delete [] wielkosc;
    delete mieszkancy;


    return 0;
}

 

komentarz 3 września 2019 przez tkz Nałogowiec (42,000 p.)
void usunZKsiazkiAdresowej (osoba &adres)
{
 
    for (int i = 0; i < osoba.dlugosc; i++)
    {
        if(adres.nazwaUlicy[i] == 'B' || adres.nazwaUlicy[i] == 'Z')
        {
            adres.nazwaUlicy[i] = 'Y';
        }
 
    }
 
}


Na to:


void usunZKsiazkiAdresowej (osoba &adres)
{

    for (int i = 0; i < adres.dlugosc; i++)
    {
        if(adres.nazwaUlicy[i] == 'B' || adres.nazwaUlicy[i] == 'Z')
        {
            adres.nazwaUlicy[i] = 'Y';
        }

    }

}

Masz błąd w argumencie funkcji. 

komentarz 3 września 2019 przez magda_19 Gaduła (3,080 p.)
Czyli teraz funkcja powinna powinna przechodzić po każdej literce w nazwie ulicy, tak aby zamieniała spotkane literki B lub Z na Y?
komentarz 3 września 2019 przez tkz Nałogowiec (42,000 p.)

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

using namespace std;

struct osoba
{
    string nazwisko;
    long long int nr_tel;
    char nazwaUlicy[20];
    const int dlugosc = sizeof(nazwaUlicy);
};

void usunZKsiazkiAdresowej (osoba &adres)
{

    for (int i = 0; i < adres.dlugosc; i++)
    {
        if(adres.nazwaUlicy[i] == 'B' || adres.nazwaUlicy[i] == 'Z')
        {
            adres.nazwaUlicy[i] = 'Y';
        }
    }
}

int main()
{
    cout << "Witaj w ksiazce telefonicznej. Zaczynamy zabawe!" << endl << endl;

    int rozmiar;
    cin >> rozmiar;

    int *wielkosc = new int [rozmiar];
    osoba *mieszkancy = new osoba[rozmiar];
    for (int i = 0; i < rozmiar; i++)
    {
        cin >> mieszkancy->nazwisko >> mieszkancy->nr_tel >> mieszkancy->nazwaUlicy;
    }
    for (int i = 0; i < rozmiar; i++)
    {
        usunZKsiazkiAdresowej(mieszkancy[i]);
    }
    std::cout<<mieszkancy[0].nazwaUlicy;


    delete [] wielkosc;
    delete mieszkancy;


    return 0;
}

Tak

komentarz 3 września 2019 przez DragonCoder Nałogowiec (36,500 p.)
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>

struct osoba
{
    std::string nazwisko;
    long long int nr_tel;
    std::string nazwaUlicy;
};

void usunZKsiazkiAdresowej (osoba &adres)
{

    for (int i = 0; i < adres.nazwaUlicy.length(); i++)
    {
        if((toupper(adres.nazwaUlicy[i]) == 'B') || (toupper(adres.nazwaUlicy[i]) == 'Z'))
        {
            adres.nazwaUlicy[i] = 'Y';
        }
    }
}

int main()
{
    std::cout << "Witaj w ksiazce telefonicznej. Zaczynamy zabawe!" << std::endl << std::endl;

    int rozmiar;
    std::cin >> rozmiar;
    std::vector<osoba> mieszkancy;

    for (int i = 0; i < rozmiar; i++) {
        mieszkancy.push_back(osoba());
        std::cin >> mieszkancy[i].nazwisko;
        std::cin >> mieszkancy[i].nr_tel;
        std::cin >> mieszkancy[i].nazwaUlicy;
    }
    for (int i = 0; i < rozmiar; i++) {
        usunZKsiazkiAdresowej(mieszkancy[i]);
    }

    mieszkancy.clear();

    return 0;
}

Czy to nie wyglada lepiej?

komentarz 3 września 2019 przez tkz Nałogowiec (42,000 p.)
Jak się już czepiamy co do "czystości", to powinieneś użyć jeszcze reserve i emplace_back. Nie potrzebne clear, to samo zrobi destruktor, a nawet zwolni pamięć, czego clear nie robi. Metoda at jest bezpieczniejsza od [].
komentarz 3 września 2019 przez j23 Mędrzec (194,920 p.)

emplace_back niewiele tu zmieni, bo osoba nie ma konstruktora parametrycznego.

komentarz 3 września 2019 przez tkz Nałogowiec (42,000 p.)
Faktycznie. Celem użycia emplace_back jest uniknięcie tworzenia obiektu tymczasowego, który jest następnie kopiowany (lub przenoszony) do miejsca docelowego. A bez konstruktora nie ma to sensu. Żeby zadziałało emplace_back musiał by wywoływać konstruktor. Dzięki.

Podobne pytania

0 głosów
1 odpowiedź 169 wizyt
0 głosów
1 odpowiedź 437 wizyt
pytanie zadane 2 lipca 2017 w C i C++ przez kakaPL Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 326 wizyt
pytanie zadane 13 marca 2021 w Rozwój zawodowy, nauka, praca przez Aidenn Nowicjusz (120 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...