Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Domowa wideoteka - program w C

natia1212 05 Sty 2015 14:42 1014 10
  • #1 05 Sty 2015 14:42
    natia1212
    Poziom 5  

    Witam!

    Mam do napisania program przechowujący informacje o domowej kolekcji filmów (filmy można dodawać, edytować i usuwać). Informacje o filmach to co najmniej: tytuł, reżyser, rok produkcji, czas trwania, wytwórnia, główni aktorzy (co najmniej jeden, maksymalnie trzech) oraz gatunek. Program ma umożliwiać przeszukiwanie bazy (wg tytułu, roku w zadanym zakresie, gatunku oraz reżysera), jak również wygenerowania zestawienia filmów dla każdego aktora oraz reżysera. Dane mają być przechowywane w plikach binarnych.

    Nie byłoby to takie trudne gdybym nie musiała dodatkowo wykorzystywać list jednokierunkowych, w czym jestem kompletnie zielona.

    Czy znalazłby się ktoś kto by mi pomógł?

    Z góry bardzo dziękuję i pozdrawiam!

    0 10
  • #2 05 Sty 2015 15:17
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    Postaram się pomóc Ci z tymi listami. Na początek dodawanie do listy. Najprościej jest dodawać elementy na początek listy.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 05 Sty 2015 17:35
    natia1212
    Poziom 5  

    na razie dzięki, czekam na więcej :)

    0
  • #4 05 Sty 2015 22:12
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    Dostałem "przerwanie niemaskowalne" od Żony ale już je obsłużyłem i mogę działać dalej.
    Dopisywanie na początek listy jednokierunkowej jest najprostszym sposobem tworzenia listy. Jednakże wynikowy porządek elementów jest odwrotnością do porządku "ich pojawiania się". W niektórych zastosowaniach jest to niewskazane. W konsekwencji czasami elementy należy dopisywać:
    - na koniec listy. Koniec listy można łatwo odnaleźć przeglądając listę od początku, ale takie nieco "naiwne" podejście skutkuje zwiększonym nakładem pracy, którą można zaoszczędzić wprowadzając drugą zmienną np KONIEC wskazującą zawsze na ostatni element listy. Ale jest to bardziej skomplikowane (trzeba inaczej traktować pierwszy element) zatem póki co pozostań przy tym "naiwnym". Wrócimy do tego później.
    - w środek listy, pomiędzy dwoma elementami. Przyjmijmy, że wstawiany element ma być wstawiany do listy po elemencie wskazanym przez "element" (łatwiejsze). Funkcję realizującą to zadanie przedstawiono poniżej.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    UWAGA! Zwróc uwage na kolejność przypisań.
    W przypadku wstawiania elementu przed wskazanym to ze względu na brak powiązań z elementem poprzednim (w liście jednokierunkowej nie można się w prosty sposób cofnąć o jeden element) wydaje się to trudne, ale prosty trick załatwia sprawę. Trick ten polega na wstawieniu elementu PO wskazanym elemencie listy a nastepnie zamianie miejscami zawartości elementów wstawionego i poprzedzającego (z wyjątkiem pola next).

    Przeszukiwanie listy. Operacja bardzo często wykonywana na listach. Jest to przeszukiwanie czysto sekwencyjne, podobnie jak czytanie plików. Przeszukanie kończy się po znalezieniu elementu odpowiadającego kryterium lub osiągnięciu końca listy.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    W przypadku znalezienia zwraca wskaźnik do tego elementu, w przeciwnym przypadku zwraca NULL.

    0
  • #5 07 Sty 2015 12:01
    natia1212
    Poziom 5  

    No dobra, powoli zaczynam rozumieć, ale jeszcze nie rozumiem jak połączyć listy z plikami. Gdyby chodziło o same pliki to wiem, że użytkownik może podać dane, które zostają zapisane w pliku. Następnie może wyświetlić dane, które są odczytywane z tego pliku. Ale jak to połączyć z listami? O co w tym chodzi?

    0
  • #6 07 Sty 2015 12:56
    Krzysztof Gustaw
    Poziom 23  

    Witam!

    Co do plików to sprawa trywialna, zwłaszcza, że chodzi o pliki binarne. Robi się to tak:
    Otwieramy plik w trybie do zapisu binarnego

    Kod: c
    Zaloguj się, aby zobaczyć kod


    zapisuje do niego kolejne rekordy funkcją:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a wczytuje się następująco:

    Otwiera się plik w trybie do czytania binarnego:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    po czym odczytuje kolejno rekordy funkcją

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oczywiście po zaokńczeniu operacji na plikach nie należy zapominać o ich zamknięciu funkcją fclose

    Ale żeby móc operować na plikach należy najpierw wprowadzić jakoś te dane :)

    Poprawka: zmieniłem 1 parametr w funkcji fread i fwrite (niestety tak działa kopiuj/wklej na chybcika...) Na początku miałem zamiar je rozbić ale tuż przed wysłaniem scaliłem zapominając o modyfikacji ww parametru...

    0
  • #7 07 Sty 2015 12:57
    mpier
    Poziom 16  

    Witam,
    nie wiem co Ty chcesz łączyć. Pokaż co masz i napisz z czym konkretnie sobie nie radzisz. Informacje możesz trzymać gdzie Ci pasuje i jak Ci wygodnie. W zmiennych, w pliku, w bazie danych (domyślasz się, gdzie może trzymać je baza?) - to wszystko zależy tylko od... prowadzącego.
    Pozdrawiam.

    0
  • #8 07 Sty 2015 13:29
    natia1212
    Poziom 5  

    @mpier, chodzi o to, że muszę napisać w/w program z wykorzystaniem plików i list jednokierunkowych (bez tego będę miał odejmowane punkty). No i mój problem polega na tym że wiem jak zapisywać i odczytywać dane do/z plików, ale nie rozumiem w jaki sposób mam tu wykorzystać te listy. Na szczęście już powoli zaczynam to ogarniać :)

    0
  • #9 07 Sty 2015 13:51
    mpier
    Poziom 16  

    Ok, można spróbować tak: pliki wykorzystujesz do przechowywania danych "offline". Twój program musi wczytać dane z pliku do pamięci na czas działania. Na danych w pamięci wykonujesz operacje szukania, dodawania, zmiany itp. Po udanej aktualizacji, zapisujesz dane do pliku (bo gdzie inaczej byś je trzymał?). Listę filmów dobrze będzie trzymać w liście. Podobnie możesz trzymać dane aktorów w filmie itd. Lista siedzie w pamięci, nie w pliku.

    0
  • #10 07 Sty 2015 13:56
    natia1212
    Poziom 5  

    Oooo, właśnie o to chodzi. Jeszcze mam problem w związku z funkcją Krzysztofa do zapisu/odczytu. Jak jest "fwrite(struct lista *rec, sizeof (struct lista), 1, fp);" to przy próbie odpalenia programu pokazuje błąd "expected expression before 'struct'". Druga sprawa to wywołanie funkcji Zapis/Odczyt. Bo drugi parametr to ścieżka do pliku i tryb. A pierwszy?

    PS. i skąd wzięło się to rec w funkcji fwrite?

    0
  • #11 07 Sty 2015 15:25
    Krzysztof Gustaw
    Poziom 23  

    Witam!

    Podam Ci przykład jak możesz zdefiniować strukturę danych i w oparciu o nią tworzyć plik binarny zawierający elementy potrzebne do utworzenia listy:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    P.S. To rec w funkcji fwrite jest wskaźnikiem do rekordu który ma zostać zapisany do pliku

    0