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

Struktura na wzór listy kontaktów

Object Storage Arubacloud
0 głosów
216 wizyt
pytanie zadane 27 grudnia 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

Witam, mam do zrobienia następujące zadanie:

Jest to jedno z trudniejszych zadań z jakimi miałem dotychczas do czynienia i niestety nie mam jeszcze wystarczających umiejętności, żeby w pełnii dojść do wszystkiego sam, więc proszę o pomoc w poprawieniu mojego kodu:

#include <iostream>
#include <string>


struct Kontakt {
    int numer_telefonu;
    std::string nazwisko;
    int liczba_polaczen;

    void wypisz(Kontakt k[5000])
    {
        for (int i = 0; i < 5000; i++) {
            std::cout << k[i].numer_telefonu << " " << k[i].nazwisko << " "
                      << k[i].liczba_polaczen << std::endl;
        }
    }

    void szukaj(Kontakt k[5000], int n)
    {
        for (int i = 0; i < 5000; i++) {
            if (n == k[i].numer_telefonu) {
                std::cout << k[i].numer_telefonu << " " << k[i].nazwisko
                          << std::endl;
            } else {
                std::cout << "Podanego numeru nie ma w ksiazce" << std::endl;
            }
        }
    }

    void dodaj(Kontakt k[5000], int n, std::string& na, int l)
    {
        bool t;
        for (int i = 0; i < 5000; i++) {
            if (n != k[i].numer_telefonu) {
                t = true;
            } else {
                t = false;
            }
        }

        if (t) {
            numer_telefonu  = n;
            nazwisko        = na;
            liczba_polaczen = l;
        } else {
            std::cout << "Istnieje już kontakt o takim numerze" << std::endl;
        }
    }

    void usun(Kontakt k[5000], int n)
    {
        for (int i = 0; i < 5000; i++) {
            if (n == k[i].numer_telefonu) {
                for (int j = i; j < 5000 - 1; j++)
                    k[i] = k[i + 1];
            } else {
                std::cout << "Podanego numeru nie ma w ksiazce" << std::endl;
            }
        }
    }

    void polacz(Kontakt k[5000], std::string n)
    {
        for (int i = 0; i < 5000; i++) {
            if (n == k[i].nazwisko) {
                k[i].liczba_polaczen++;
                std::cout << k[i].numer_telefonu << " " << k[i].nazwisko << " "
                          << k[i].liczba_polaczen << std::endl;
            } else {
                std::cout << "Podanego nazwiska nie ma w ksiazce" << std::endl;
            }
        }
    }
};


auto main() -> int
{
    Kontakt ksiazka[5000];
    int a, nr;
    std::string naz;
    int liczba_tel;


    while (a != 0) {
        switch (a) {
        case 1:
            std::cout << "Podaj numer: ";
            std::cin >> nr;

            ksiazka[5000].szukaj(ksiazka[5000], nr);
            break;

        case 2:
            std::cout << "Podaj numer: ";
            std::cin >> nr;
            std::cout << std::endl;
            std::cout << "Podaj nazwisko: ";
            std::cin >> naz;
            std::cout << std::endl;

            ksiazka[5000].dodaj(ksiazka[5000], nr, naz, 0);

            break;

        case 3:
            std::cout << "Podaj numer: ";
            std::cin >> nr;

            ksiazka[5000].usun(ksiazka[5000], nr);

            break;

        case 4:
            std::cout << "Podaj nazwisko: ";
            std::cin >> naz;

            ksiazka[5000].polacz(ksiazka[5000], naz);

           break;

        case 5:
            ksiazka.wypisz(ksiazka[5000]);
            break;

        default:
            std::cout << "Co chcesz zrobić?\n 1 - szukaj numeru, 2 - dodaj "
                         "numer, 3 - usuń numer, 4 - połącz z kontaktem, 5 - "
                         "wypisz numery, 0 - wyjdź";
            std::cin >> a;
            break;
        }
    }


    return 0;
}

Nie jestem pewien, czy w poprawnie tworzę tablicę tych obiektów i czy mogę wywoływać na niej funkcje w taki spsób, plus czy można podawać jako argument funkcji struktury tablicę obiektów tej struktury.

Przy takim kodzie w tym momencie wyskakuje mi taki błąd:

error: no matching function for call to ‘Kontakt::szukaj(Kontakt&, int&)’
             ksiazka[5000].szukaj(ksiazka[5000], nr);


Byłbym bardzo wdzięczny za pomoc w napisaniu tego programu i z góry dziękuję

1
komentarz 27 grudnia 2021 przez Oscar Nałogowiec (29,290 p.)
Zdecyduj się, czy robisz to strukturalnie, czy obiektowo. Jeśli już obiektowo, to metody klas/struktur (w C++ to zasadniczo to samo) mają operować na pojedynczych egzemplarzach a nie całych tablicach. Możesz zastosować dwie klasy - Kontakt i ksiazka, pierwsza to pojedynczy kontakt, druga cała tabela.

Zadanie podaje, że ma być tablica, ale nie przecyzuje jak ma być użyta. Masz wybór - allokacja dynamiczna w miarę potrzeb (zadanie nie podaje maksymalnego rozmiaru więc chyba tak będzie właściwie), albo statyczny rozmiar maks.

I jeszcze pytanie - reallokujemy za każdym razem, czy dopuszczamy elementy wolne.

W drugim przypadku - czy wszystkie użyte są na początku i pamiętamy tylko ich liczbę, czy każdy element ma znacznik, czy jest użyty.

I jeszcze wiele podobnych pytań, na które trzeba odpowiedzieć, zanim zacznie się pisać kod...
1
komentarz 27 grudnia 2021 przez j23 Mędrzec (194,920 p.)

@MKolaj15, 

error: no matching function for call to ‘Kontakt::szukaj(Kontakt&, int&)’
             ksiazka[5000].szukaj(ksiazka[5000], nr);

Jeśli już koniecznie metody klasy Kontakt mają operować na wszystkich kontaktach, zrób je statycznymi i wtedy analogiczne wywołanie wyglądałoby tak:

Kontakt::szukaj(ksiazka, nr); //brakuje tutaj info o ilości kontaktów w 'ksiazka'

To rozwiązanie jest średnie, bo niby dlaczego klasa Kontakt ma definiować metody do obsługi książki.

Wywal te metody poza klasę Kontakt i wywołuj je jak normalne funkcje.  Zamiast tablicy Kontakt[5000] użyj klasy std::vector.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
5 odpowiedzi 271 wizyt
pytanie zadane 27 kwietnia 2019 w C# przez Moras Obywatel (1,620 p.)
0 głosów
0 odpowiedzi 263 wizyt
pytanie zadane 4 października 2017 w Java przez fipooo Bywalec (2,880 p.)
0 głosów
1 odpowiedź 555 wizyt
pytanie zadane 26 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

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

...