Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Nie rozumiem wskazników i struktur. Problem z zadaniem z rozdziału 45. Prośba o porade dotycząca dalszej drogi programowania

Ostatnio zmodyfikowano 2018-11-19 22:12
Autor Wiadomość
Mr_ZuXii
Temat założony przez niniejszego użytkownika
Nie rozumiem wskazników i struktur. Problem z zadaniem z rozdziału 45. Prośba o porade dotycząca dalszej drogi programowania
» 2018-11-17 22:32:44
Witam,
piszę temat, ponieważ nie rozumiem wskaźników i struktur
oraz mam duże problemy z rozdziałem 45, praktycznie nic nie rozumiem.

Nie proszę o gotowe rozwiązanie a nakierowanie. Prawde mówiąc to 2/4 zadan z tego
kursu nie potrafiłem samodzielnie rozwiązać, mimo kilku podejść oraz przerobienie danego
tematu kilkukrotnie.

Dodam jeszcze, że kurs ten zaczałem przerabiać, ponieważ zadania z książki Stephana Prata
od pewnego rozdziału, były dla mnie za trudne.Macie jakieś porady co do mojej dalszej nauki programowania?
P-172884
pekfos
» 2018-11-17 22:40:30
Jeśli masz problem z zadaniem z kursu, ten dział forum jest właśnie od takich spraw.
P-172885
YooSy
» 2018-11-17 22:53:33
Macie jakieś porady co do mojej dalszej nauki programowania?
Zadawaj pytania. Programista nie jest skazany na samotność.
P-172886
mateczek
» 2018-11-18 17:07:14
skocz do biblioteki wypożycz nawet starą symfonie c++ tam to jest wytłumaczone tak że nie sposób nie zrozumieć :)
P-172887
Mr_ZuXii
Temat założony przez niniejszego użytkownika
» 2018-11-18 21:17:33
Niestety nie mam możliwości kupienia symfoni. A co do tego problemu
z rozdziałem 45, to nie rozumiem funkcji jakie tam się znajdują.
Naprzykład:

C/C++
void dodajKoniec( Lista *& lista, int liczba )
{
    Lista * nowy = new Lista;
    nowy->liczba = liczba;
    nowy->ogon = nullptr;
   
    if( lista )
         ostatni( lista )->ogon = nowy;
    else
         lista = nowy;
   
}
 Rozumiem, że do fukcji przekazujemy wskaźnik adresu ale nie wiem dlaczego i poco.

Lista * nowy = new Lista;
 tego to wogóle nie rozumiem tworzymy dynamiczny wskaźnik
na strukture?

Dalej fukcji już całkowicie nie rozumiem, oraz dalszych fukcji także.
Wiec wychodzi na to, że nic nie rozumiem mimo usilnych prób zrozumienia tych wskaźników/struktur.

Czy jest osoba która jest w stanie mi to jakoś łopatologicznie wyjaśnić?



P-172892
mateczek
» 2018-11-18 21:26:34
to jest lista elementów oparta o wskaźniki. Każdy element posiada adres sąsiada.

chcąc dodać element do listy musisz
1 stworzyć element
Lista * nowy = new Lista
2 znaleźć koniec listy  
ostatni( lista )->ogon = nowy;
 i wstawić na koniec nowo stworzony element.

Oczywiście można by pomyśleć nad lepszym nazwaniem i zorganizowaniem by było to bardziej czytelne.
może taka wersja tego programu ?? Bardziej by do ciebie przemówiła

C/C++
#include <iostream>

using namespace std;
struct elemetnt {
    int value;
    elemetnt * next; //wskaźnik na kolejny element
    elemetnt( int liczba )
        : value( liczba )
         , next( nullptr )
    { } //konstruktor
};


class lista {
    elemetnt * poczatek, * koniec = nullptr;
public:
    lista() {
       
    }
    //dodanie elementu na tył listy
    void add_onBack( int liczba ) {
        elemetnt * nowy = new elemetnt( liczba );
        if( koniec == nullptr ) {
            //gdy lista pusta
            poczatek = koniec = nowy; //ten sam element jest i początkiem i końcem
        } else {
            koniec->next = nowy;
            koniec = nowy; //nowy element staje się nowym końcem
        }
       
    }
    //dodanie elementu na początek listy
    void add_onFront( int liczba ) { //dodanie z przodu elemetnu
        elemetnt * nowy = new elemetnt( liczba );
        if( koniec == nullptr ) {
            //gdy lista pusta
            poczatek = koniec = nowy; //ten sam element jest i początkiem i końcem
        } else {
            nowy->next = poczatek;
            poczatek = nowy; //nowo stworzyony element staje się nowym początkiem listy.
        }
    }
    void wyswietl() {
        elemetnt * el = poczatek;
        while( el ) {
            cout << el->value << " ";
            el = el->next;
        }
       
    }
};

int main()
{
    lista l;
    l.add_onFront( 2 );
    l.add_onFront( 1 );
    l.add_onBack( 3 );
    l.wyswietl();
}
P-172893
pekfos
» 2018-11-18 21:31:57
Rozumiem, że do fukcji przekazujemy wskaźnik adresu
Referencję na wskaźnik.

Lista * nowy = new Lista;
 tego to wogóle nie rozumiem tworzymy dynamiczny wskaźnik
na strukture
?
Nie ma czegoś takiego jak dynamiczny wskaźnik. Jest dynamiczna alokacja pamięci. Wskaźnik jest potrzebny żeby odwoływać się do takiej pamięci. Statycznie alokowana pamięć ma nazwę w kodzie, dynamiczna nie ma.

Dalej fukcji już całkowicie nie rozumiem
C/C++
Lista * nowy = new Lista; // Utwórz nowy egzemplarz struktury Lista (węzeł listy)

nowy->liczba = liczba; // Ustaw pola w nowym węźle (liczba to dodawana liczba, ogon = pusty wskaźnik, tj brak następnego elementu)
nowy->ogon = nullptr; //

if( lista ) // Jeśli podana na wejście lista istnieje
     ostatni( lista )->ogon = nowy; // Wpisz nowo utworzony węzeł listy jako następny po aktualnym ostatnim węźle.
else
     lista = nowy; // Lista nie istnieje, niech nowy węzeł jest listą.

Pomaga narysowanie tego na kartce. Węzły listy to pudełka z liczbą, wskaźniki to strzałki które łączą węzły (lub nie - wskaźnik pusty).

może taka wersja tego programu ?? Bardziej by do ciebie przemówiła
Genialne. Nie rozumiesz struktur? Masz tu jeszcze programowanie obiektowe! I rozwiązania do zadań też łap! Brakuje mi na forum opcji "daj w łeb".
P-172894
Mr_ZuXii
Temat założony przez niniejszego użytkownika
» 2018-11-19 21:51:07
Mateczek sorry, ale twojego kodu nie rozumiem kompletnie, bo jeszcze do programowania obiektowego nie doszedłem, ale dzięki za poświęcony czas.

Pekfos dzięki za rozjaśnienie, już rozumiem jak ta funkcja, mniej więcej działa, ale nadal nie rozumiem,
jak ten program ogólnie działa.

C/C++
Lista * ostatni( Lista * lista )
{
    // Przechodzenie po liście *iteracyjnie*
    if( lista )
    while( lista->ogon )
         lista = lista->ogon;
   
    return lista;
}
Ta funkcja nie wiem, co znaczy, ale wiem, że bez niej funkcja „wypisz” wypisze tylko ostatnią podaną liczbę, ale nic poza tym nie rozumiem.

C/C++
void wypisz( Lista * lista )
{
    // Przechodzenie po liście *rekurencyjnie*
    if( lista )
    {
        std::cout << lista->liczba << ", ";
        wypisz( lista->ogon );
    }
}

Ta funkcja na mój rozum wyświetla liczbę, potem wykonuje się, funkcja wypisz i znów sprawdza warunek if i znów wypisuje liczbę ze wskaźnika lista, ale nie wiem, jak przechodzi po kolejnych wartościach, a nie wyświetla ciągle tej samej.

C/C++
void zniszcz( Lista *& lista )
{
    while( lista )
    {
        Lista * tmp = lista;
        lista = lista->ogon;
        delete tmp;
    }
   
    lista = nullptr;
}
Funkcja zwalnia pamieć, ale nie wiem, dlaczego tworzy się wskaźnik, a potem się tylko ten wskaźnik zwalnia.

A Jeżeli chodzi o zadanie do tego zadania, tonie mam pojęcia jak funkcja dodaje liczby na koniec listy a tym bardziej jak się zabrać, żeby na początek listy dodawała.

Nie wiem, może programowanie jest nie dla mnie, jak taki program co normalnemu użytkownikowi zrozumienie zajmuje 5 min, mi zajmuje tydzień.
P-172897
« 1 » 2
  Strona 1 z 2 Następna strona