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

R. 45 - zadanie domowe - ppkt b

Ostatnio zmodyfikowano 2019-07-03 22:07
Autor Wiadomość
oriv
Temat założony przez niniejszego użytkownika
R. 45 - zadanie domowe - ppkt b
» 2019-06-28 23:01:47
Witam, fajny i wciągający kurs cpp .. aż do R. 45 dawałem rade sam, jednak zadanie 45 b, mnie już przerosło..
Pytanie: czy w funkcji main jest konieczna zmiana następującego fragmentu kodu by je poprawnie rozwiązać?

        while( std::cin >> liczba && liczba )
        dodajKoniec( lista, liczba );

Z góry dziękuje za podpowiedzi..
P-174850
pekfos
» 2019-06-28 23:14:03
Da się wykonać zadanie modyfikując tylko tą linię w funkcji main():
C/C++
int main()
{
    int liczba;
    Lista * lista = nullptr; // <--
    std::cout << "Podaj liczby, 0 lub blad konczy:\n";
   
    while( std::cin >> liczba && liczba )
         dodajKoniec( lista, liczba );
   
    std::cout << "Koniec, oto liczby:\n";
    wypisz( lista );
    zniszcz( lista );
}
gdzie przez modyfikację rozumiem wyrzucenie tej linii i napisanie tam czegoś innego, potencjalnie więcej niż jednej linii. Oczywiście pozostałe funkcje trzeba też jakoś zmodyfikować.
P-174851
oriv
Temat założony przez niniejszego użytkownika
» 2019-06-29 15:35:50
Wskazówka do zadania sugeruje "Podpowiedź: Możesz potrzebować drugiego struct.", oznacza to wiec ze będę potrzebować również nowego obiektu na nowa structure np.:
C/C++
struct Wezel
{
    Wezel * ogon;
    int liczba;
};
struct Lista
{
    Wezel * poczatek;
    Wezel * koniec;
};

dla struct Wezel np. wezel(nowy-z przykładu) oraz dla struct Lista np. lista ?
P-174855
pekfos
» 2019-06-30 19:56:45
Jakie ma znaczenie, czego jeszcze będziesz potrzebować? Jak będziesz potrzebować, to użyj.
P-174863
oriv
Temat założony przez niniejszego użytkownika
» 2019-06-30 22:04:48
w sumie to już nic wiem, chyba nie końca opanowałem wskaźniki lub nie zrozumiałem autora o co chodzi w tym zadaniu. Kombinuje na rożne sposoby i nic nie wychodzi poza błędami konwersji itd. Dzięki pekfos za fatygę ale nie chce cie więcej wkurzać moją niewiedzą.
P-174864
pekfos
» 2019-06-30 22:30:06
Jak masz problem z konkretnym rozwiązaniem, to podaj to co masz. Znacznie łatwiej pomóc przy problemie, niż odpowiedzieć na niejasne pytanie, które z problemu w jakiś sposób wynika.
P-174865
oriv
Temat założony przez niniejszego użytkownika
» 2019-07-02 22:59:06

C/C++
#include <iostream>


struct Wezel
{
    Wezel * ogon;
    int liczba;
};
struct Lista
{
    Wezel * poczatek;
    Wezel * koniec;
};

//Inicjowanie listy

void utworz( Lista & lista )
{
    lista.poczatek = NULL;
    lista.koniec = NULL;
}

// Wypisywanie listy  --- 1.Problem - Nie wiem czy program ma wypisać wszystkie wpisane liczby czy tylko 1 i ostatnia?
void wypisz( Lista & lista )
{
    // Wyswietlenie listy
   
    std::cout << lista.poczatek << ", ";
    std::cout << lista.koniec << ", ";
   
}

// Dodawanie elementu na koniec listy
void dodajKoniec( Lista & lista, Wezel *& wezel, int liczba )
{
    // Tworzenie na stosie wezel , nie alokowane dynamicznie
    wezel->liczba = liczba;
    wezel->ogon = lista.poczatek;
   
    // Dopisuje na koniec --- 2.Problem - Czy to ma sens? Program wypisuje tylko 1 wpisana cyfrę i się sypie
    if( lista.poczatek ) {
        lista.koniec = wezel;
        lista.poczatek = wezel->ogon;
    }
    else
         lista.poczatek = wezel;
   
   
}
// Usuwanie wskaznikow --- 3.Problem - Nie wiem czy muszę je w ogóle usuwać? Czy to sie odnosi tylko do dynamicznej alokacji?
void zniszcz( Lista & lista )
{
    while( & lista )
    {
        Wezel * tmp = lista.poczatek;
        delete tmp;
        Wezel * tmp1 = lista.koniec;
        delete tmp1;
    }
   
    lista.poczatek = NULL;
    lista.koniec = NULL;
}
int main()
{
    int liczba;
    Lista lista;
    Wezel * wezel = NULL;
    utworz( lista );
    std::cout << "Podaj liczby, 0 lub blad konczy:\n";
   
    while( std::cin >> liczba && liczba )
         dodajKoniec( lista, wezel, liczba );
   
    std::cout << "Koniec, oto liczby:\n";
    wypisz( lista );
    zniszcz( lista );
}
Mile widziane wskazówki i sugestie...bez dobrego mentora tego nie łyknę...
Jestem odporny na krytykę...
P-174877
pekfos
» 2019-07-02 23:49:23
1.Problem - Nie wiem czy program ma wypisać wszystkie wpisane liczby czy tylko 1 i ostatnia?
Dlaczego miałoby się to zmienić? Wcześniej były wypisywane wszystkie.

C/C++
void dodajKoniec( Lista & lista, Wezel *& wezel, int liczba )
{
    // Tworzenie na stosie wezel , nie alokowane dynamicznie
    wezel->liczba = liczba;
    wezel->ogon = lista.poczatek;
Dlaczego nie dynamicznie? W tym kodzie nie ma ani jednej alokacji, a masz dealokacje. wezel jest na start pustym wskaźnikiem, więc te przypisania są błędne. Gdzieś po drodze straciłeś całkiem funkcjonalność listy. Węzły powinny być alokowane dynamicznie. Argument wezel jest niepotrzebny, jego rolę przejmuje argument lista.

C/C++
// Usuwanie wskaznikow --- 3.Problem - Nie wiem czy muszę je w ogóle usuwać? Czy to sie odnosi tylko do dynamicznej alokacji?
void zniszcz( Lista & lista )
{
    while( & lista )
    {
        Wezel * tmp = lista.poczatek;
        delete tmp;
        Wezel * tmp1 = lista.koniec;
        delete tmp1;
    }
   
    lista.poczatek = NULL;
    lista.koniec = NULL;
}
Usuwanie dotyczy tylko dynamicznie zaalokowanej pamięci, która musi być zwolniona dokładnie raz, niezależnie od ilości wskaźników, które na nią wskazują. Wskaźnik na początek jest wystarczający do zniszczenia listy, a wskaźnik na koniec jest stricte pomocniczy, wystarczy że go wyzerujesz. Pamiętaj też że lista nie jest już wskaźnikiem na węzeł listy, więc pętla iterująca po liście musi ulec zmianie. Warunek &lista jest tu niewłaściwy, bo jest zawsze prawdziwy. Te zmienne tmp nie są tu potrzebne,  wystarczy delete lista.poczatek.
P-174879
« 1 » 2
  Strona 1 z 2 Następna strona