I jeszcze pytanie - jeśli będę chciał zrobić później sortowanie po każdym z elementów struktury, to czy jest jakiś sposób, żeby zrobić to na stringach, czy lepiej wprowadzić tablice char o wielkości "z zapasem pamięci"?
I jeszcze pytanie - jeśli będę chciał zrobić później sortowanie po każdym z elementów struktury, to czy jest jakiś sposób, żeby zrobić to na stringach, czy lepiej wprowadzić tablice char o wielkości "z zapasem pamięci"?
Mając do stringów zdefiniowany komparator nie wiem gdzie widzisz problem.
Wystarczy jak przekażesz wskaznik, nie potrzebujesz przekazywać referencji do wskaźnika. Przekazywanie referencji powoduje, ze kiedy przechodzisz po liście zmieniając wartość wskaznika *adres, nadpisujesz wartość oryginalnie przekazanego wskaznika. A więc najlepiej:
W funkcji wczytującej musisz jednak alokować pamięć dla kolejnych elementów na liście (Bo rozumiem, że przy wczytywaniu nie wiesz, ile masz ksiazek). Warunek na koniec listy (adress != NULL) jest więc bez sensu.
Mam jeszcze pytanie - czy w funkcjach drukuj i wczytaj powinno znajdować się na końcu zamknięcie pliku? A propos sortowania stringów to mimo gotowego komparatora nie wiem jak robić to sortowanie i wyszukiwanie wg alfabetu :/ Ani w skrypcie ani w podręczniku Praata do C++ tego nie znalazłem :/
I już ostatnia prośba, czy moglibyście zerknąć na moją funkcję drukuj i dodaj? Drukuj po wczytaniu ostatniej struktury próbuje dalej wczytywać i wywala błąd.
Mam jeszcze pytanie - czy w funkcjach drukuj i wczytaj powinno znajdować się na końcu zamknięcie pliku? A propos sortowania stringów to mimo gotowego komparatora nie wiem jak robić to sortowanie i wyszukiwanie wg alfabetu :/ Ani w skrypcie ani w podręczniku Praata do C++ tego nie znalazłem :/
Z czym masz problem? Bierzesz dowolny algorytm sortowania liczbowego jak quicksort, merge, albo głupi insertion i w miejscu porównania wykonujesz operacje komparatorem. Zapewne sprowadzi się to do jednego ifa i wsio...
ilu2112 pisze:Jeżeli chodzi o zapis do pliku tylko po to, żeby potem móc wczytać zapisaną strukturę to czemu nikt jeszcze nie wspomniał o plikach binarnych?
Widocznie nikogo nie interesuje to czy się szybko wczyta (binarnie nagłówek w którym zapisane jest ile jest wpisów przeczytać i jeden memcopy i wszystko jest wczytane w pamięci, bez marnowania czasu na analize treści tekstu), ani to, że jeśli już się uparł na tekstowe to tak wczytywać jak teraz sobie może na zaliczeniu w szkole, ale nie w realnym świecie (wystarczy, że będzie miał tytuł ze spacją jak np. Pan Tadeusz, i tytuł książki będzie miał Pan, a Tadeusz, zostanie już wczytany do imienia (nazwisko będzie miało "imie", a prawdziwego nazwiska wcale nie odczyta) - ktoś tu zapomniał, że takie wczytywanie nie wczytuje całej linijki, a do pierwszego białego znaku w tekście).
ilu2112 pisze:Jeżeli chodzi o zapis do pliku tylko po to, żeby potem móc wczytać zapisaną strukturę to czemu nikt jeszcze nie wspomniał o plikach binarnych?
Widocznie nikogo nie interesuje to czy się szybko wczyta (binarnie nagłówek w którym zapisane jest ile jest wpisów przeczytać i jeden memcopy i wszystko jest wczytane w pamięci, bez marnowania czasu na analize treści tekstu), ani to, że jeśli już się uparł na tekstowe to tak wczytywać jak teraz sobie może na zaliczeniu w szkole, ale nie w realnym świecie (wystarczy, że będzie miał tytuł ze spacją jak np. Pan Tadeusz, i tytuł książki będzie miał Pan, a Tadeusz, zostanie już wczytany do imienia (nazwisko będzie miało "imie", a prawdziwego nazwiska wcale nie odczyta) - ktoś tu zapomniał, że takie wczytywanie nie wczytuje całej linijki, a do pierwszego białego znaku w tekście).
Dokładnie o tym myślałem, gdy pisałem swoją wiadomość. Enkidu, jeżeli coś robisz nawet na zwykłe zaliczenie w szkole to zrób to dobrze. Być może w przyszłości to wykorzystasz, a na pewno nabyta wiedza Ci się przyda. Rzuć okiem na pliki binarne. Chwila (dosłownie!) lektury pozwoli Ci na szybkie wczytywanie i zapisywanie struktur do pliku. Do tego nie będziesz miał problemów z białymi znakami w nazwach, tytułach itd.
Litery większe są mniejsze niż małe (czyli trochę inaczej niż by wskazywała intuicja)
porównywanie "idzie" od lewej do prawej w danym słowie.
Inne przypadki możesz sobie sam sprawdzić, o ile uważasz to za niezbędne.
Widać więc, że porównywanie działa analogicznie jak dla liczb. Wystarczy więc, że w swojej wersji sortowania zamiast porównywania liczb wstawisz analogiczne porównywanie stringów i powinno wszystko hulać.
fraktal pisze:Dojdziemy do tego metodą prób i błędów.
Ty serio metodą prób i błędów dochodziłeś do tego czy się zgrywasz? To chyba jasne, że małe litery są większe od dużych i wynika to z przyporządkowania znaków liczbą w ASCII (np. 'a' to 97, a 'A' to 65), jednak takie porównywanie można zastosować tylko jak się jest anglikiem, nie uznającym innych języków za dopuszczalne - np. polska litera 'ą' w kodowaniu ISO ma numer 177, a w Unicode 261, więc przy takim sortowaniu jak proponujesz będziesz miał 'ą' jako późniejszą w alfabecie niż 'z'.
Pewnie że żartowałem:)
Chciałem tylko pokazać, że nawet jak się nie ma odpowiednio dużej wiedzy, to można do pewnych rzeczy dojść właśnie poprzez próby, niekoniecznie czytając całą dokumentację. A że pomaga to w kreatywnym myśleniu to chyba tylko lepiej, prawda?
PS. Nie odrzucam w tym momencie gruntownej wiedzy na dany temat, taka też powinna być zdobywana.
To tworzenie elementu na samym końcu nie jest najrozsądniejszym wyjściem... Jak się znajdzie przed EOF-em znak biały to wczytajka wejdzie do pętli i utworzy pusty obiekt (mimo że nie powinna).
Spróbuj postąpić wg poniższego schematu, jak dla siebie coś pisałem to działało:
(to już w pętli po sprawdzeniu czy można wykonywać operacje na strumieniu)
Utwórz obiekt
Wczytaj dane
Dołącz do listy
W ten sposób, gdy wczytasz ostatni element, nie utworzysz zbędnego elementu pustego.
Warto by też pomyśleć nad stworzeniem listy - klasy, stanowi to dobry trening programowania i jest dużo wygodniejsza w obsłudze (o ile się czujesz na siłach ).