Witam, zastanawiam się jak dobrze zapisać drzewo do pliku i je potem bez problemow odczytać. Już omawiam problem: wklepuje do drzewa jedno słowo i równocześnie zapisuje to do pliku, potem kolejne itd(słowa szereguje alfabetycznie) - tak być musi. Potem chciałbym aby z tego pliku wczytać te słowa do drzewa - i tu pojawia się problem z ich uszeregowaniem, bo do pliku zapisywało mi się zawsze po kolei jak się je wpisywało... Czy ma ktoś jakiś pomysł?
Zapis dzewa do pliku i jego ponowny odczyt
- Rejestracja: dni
- Ostatnio: dni
Zapisuj w preorder same dane.
Przy odczycie normalnie dodawaj do drzewa - zostaną dodane dokładnie jak było.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Tuchów
- Postów: 12269
Czy ma ktoś jakiś pomysł?
Tak - podać kod, który zapisuje drzewo do pliku :]
A tak na poważnie - nie wiem dlaczego każdorazowo aktualizujesz plik po dodaniu nowego słowa do drzewa; Nie możesz zapisać go na koniec? Poza tym zapis drzewa do pliku nie jest taki prosty, jak w przypadku list (jednokierunkowych czy dwukierunkowych);
Napisz jeszcze z jakich plików obecnie korzystasz i pokaż kod, który zajmuje się aktualizowaniem pliku.
- Rejestracja: dni
- Ostatnio: dni
W sumie na dobrą sprawe zapisywać się może to drzewo przy wyłączaniu programu. Na pewno to jest dobry pomysł.
procedure add(var root:Pnode; thing:string);
begin
if root = nil then
begin
new(root);
root^.name:=thing;
{tu chcialem zrobic zapis 'thing'a do pliku}
root^.left:=nil;
root^.right:=nil;
end
else
if ord(root^.name[1]) > ord(thing[1]) then
begin
add(root^.left, thing);
end
else
add(root^.right, thing);
end;
Jak macie jakis lepszy pomysł to byłoby super :)
Do tego chciałbym aby każda rzecz w tym drzewie miała swoją liste(np byłby tam: kolor, kształt, wielkość, waga) - i do tego "kolor" był kolejną listą, z której mógłbym wybrać odpowiedni kolor dla przedmiotu(niestety mam takie wymagania na studiach :( )
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Tuchów
- Postów: 12269
if ord(root^.name[1]) > ord(thing[1]) then
Możesz skrócić do:
if Root^.Name[1] > Thing[1] then
użycie funkcji Ord nie jest konieczne;
W sumie na dobrą sprawe zapisywać się może to drzewo przy wyłączaniu programu. Na pewno to jest dobry pomysł.
Dobrym pomysłem było by opakowanie tego drzewa w klasę, w której była by przewidziana do tego metoda; Tę metodę wywoływałbyś w dowolnym momencie - np. przed zwolnieniem instancji klasy z pamięci;
Do tego chciałbym aby każda rzecz w tym drzewie miała swoją liste(np byłby tam: kolor, kształt, wielkość, waga) - i do tego "kolor" był kolejną listą, z której mógłbym wybrać odpowiedni kolor dla przedmiotu
W takim razie każdy węzeł powinien posiadać np. strukturę zamiast pojedynczego łańcucha, której zawartość zależy tylko i wyłącznie od tego jakie dane musi przechowywać i jakiego typu.
- Rejestracja: dni
- Ostatnio: dni
W takim razie każdy węzeł powinien posiadać np. strukturę zamiast pojedynczego łańcucha
Jeszcze myslałem nad tym, zeby zrobić coś takiego:
każdej rzeczy przyporządkować numer i tak samo zrobić z cechami(cechy mogą być na stale wpisane- tak będzie łatwiej:P)
i łączyć je na zasadzie takiej tabeli
[1][1]
[1][3]
[2][5]
[2][8]
[3][1]
[3][2]
Tylko nie wiem jak sie za to zabrać, jeśli macie jakieś pomysły to byłbym wdzięczny.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 36
Nadanie indeksu w drzewie mogłoby mieć sens, ale nie było by to ani prostsze, ani bardziej intuicyjne. Po prostu zamiast stringa przechowuj sobie na każdym wierzchołku drzewa jakiś rekord, z polami, które Ci odpowiadają.
W ostateczności, jeśli jesteś taki przywiązany do tego pomysłu z tablicami, to możesz sobie przechowywać na każdym wierzchołku indeks elementu tablicy, w którym przechowujesz dane.
Zdecydowanie skłaniałbym się w stronę rozwiązania nr 1, bo również łatwiej byłoby dodawać nowe elementy.
- Rejestracja: dni
- Ostatnio: dni
Po to wymyślono struktury aby nie zapisywać mnóstwa tablic.
- Rejestracja: dni
- Ostatnio: dni
Właśnie pojawił mi się problem... Jak dodać rekord do drzewa? (preorder) Chodzi mi dokladnie o to, co zadeklarować w sekcji type w moim drzewie a co w osobnym rekordzie zeby to smigalo i do tego jak je szeregowac (ten rekord mniejszy, a ten wiekszy), bo to juz nie są stringi :/
- Rejestracja: dni
- Ostatnio: dni
Głowę na ramiona zaś guzik do koszulki.
Czy myślisz że jak guzik na ramiona zaś głowę do koszulki będzie lepiej?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 36
Szeregować możesz na podstawie dowolnego elementu tego przechowywanego rekordu.
Pomijając fakt, że nie rozumiem stwierdzenia 'w osobnym rekordzie'.
Jak chcesz przechowywać coś w drzewie to możesz tak zadeklarować typy i możesz nadal układać drzewo według nazwy
type
dane=record
name:string;
{jakies dodatkowe dane, które chcesz przechowywac}
end;
Pdrzewo=^drzewo;
drzewo=record
informacje:dane;
lewy,prawy:Pdrzewo;
end;
- Rejestracja: dni
- Ostatnio: dni
Tak, to rozumiem. Tylko problem u mnie pojawił się wtedy gdy chcialem dodać ten record do drzewa
procedure add(var root:Pnode; thing:dane);
begin
if root = nil then
begin
new(root);
root^.name:=thing;
root^.left:=nil;
root^.right:=nil;
end
else
if ord(root^.name[1]) > ord(thing[1]) then {to nie chce dzialac}
begin
add(root^.left, thing);
end
else
add(root^.right, thing);
end;
Mógłby ktoś coś podpowiedzieć?
- Rejestracja: dni
- Ostatnio: dni
Patrz na swoje struktury i na wiersz w którym masz błąd.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Tuchów
- Postów: 12269
if ord(root^.name[1]) > ord(thing[1]) then {to nie chce dzialac}
@Groza - może zamiast ręcznie sprawdzać tylko pierwsze znaki, wykorzystasz gotową do tego celu funkcję, jak AnsiCompareStr? No i to jest dziwne:
ord(thing[1])
thing jest parametrem typu dane - czym jest ten dane? Pokaż jakieś deklaracje - nikomu raczej nie chce się zgadywać.
- Rejestracja: dni
- Ostatnio: dni
Oparłem się na deklaracjach kolegi wyżej
dane=record
name:string;
model:string;
price:real;
amount:byte;
do tego mam tablice tych recordów
r:array[1..100] of dane;
ReadLn(r[licznik].model);
Drzewo będzie posiadało rekordy (dane) z modelami tych rzeczy, czyli pobieram od użytkownika to
ReadLn(r[licznik].model);
i wrzucam do procedury
add(root, r[licznik].model);
tylko nie wiem jak mam potem tą procedure przerobić, bo na stringach działało dobrze:(
dodanie nowych znaczników <code class="delphi"> i poprawienie istniejących + połączenie postów - fp
- Rejestracja: dni
- Ostatnio: dni
- Postów: 36
Skoro użyłeś tak sformułowanych typów to:
- Name jest polem rekordu dane. Więc jak chcesz się odwołać name w roocie to robisz to tak:
root^.informacje.name
- W takim razie zamiast
root^.name:=thing
powinno być root^.informacje.name:=thing
Jak poprawisz te błędy powinno być ok
- Rejestracja: dni
- Ostatnio: dni
Dzięki, ale to mi nie pomogło :(
Czy byłby ktoś w stanie spróbować napisać jak powinna wygladac procedura wstawiania takiego recordu do drzewa?
- Rejestracja: dni
- Ostatnio: dni
O Zgrozo!
Masz trzy warianty:
- Poczytać pierwsze kilka stron pierwszego lepszego kursu po czym w godzinę zrobić to sam
- Dalej kontynuować tego tasemca dopóki cały nie wyląduje w koszu kiedy moderatorzy upewnią się że nic oprócz gotowca do ciebie nie przemawia.
- Zamówić wykonanie gotowca u fachowca.