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.

C++ zaczątki "elektronicznego dziennika".

Ins0maniaC 26 Mar 2015 18:30 1197 23
  • #1 26 Mar 2015 18:30
    Ins0maniaC
    Poziom 17  

    Witam. Zmagam się z zadaniem, które zaraz opiszę. Jednak jestem nowy w obiektówce i mam problemy. Proszę Was o pomoc w poprawieniu błędów i zastosowaniu dobrych rozwiązań.
    Muszę zrobić klasę student z nazwiskiem i indeksem. Potem klasę dziennik z kodem grupy, dynamiczną tablicą studentów i dwuwymiarową tablicę dynamiczną bool obecności[iloscstudentow * 15], metoda void dodajucznia(student s), void obecnosc(int nr.zajec) + konstuktory/destruktory, pamiętać o zwalnianiu pamięci i enkapsulacji. Wstawiam kodzik, bo moja wiedza i pomysły się kończą :D Wiem, że zrobiłem parę głupich błędów, ale proszę o ich wykazanie bo to mój pierwszy taki projekt i nie wiem z czym to ma się jeść.

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    0 23
  • Pomocny post
    #2 26 Mar 2015 19:10
    -psiak-
    Poziom 32  

    Skoro bool od int nie odróżniasz to nic innego jak rozpocząć od podstaw nie da się poradzić na serio.
    Poza tym, kod bezpośrednio w klasie, poza jakąkolwiek metodą - WTF?
    Zacząć od czytania o podstawach.

    -1
  • #3 26 Mar 2015 19:20
    Ins0maniaC
    Poziom 17  

    Dałem "+" mimo niepotrzebnych złośliwych komentarzy. Wystarczyło Twoje 2 sekundowe spojrzenie na kod i odpowiedz w stylu "tworzenie tab. wsadź do metody + mylisz bool z int", ale i tak dziękuje i biorę się za robotę. Na usprawiedliwienie mogę tylko powiedzieć, że kod pisałem wcześnie rano, zmęczony po siłowni :D


    @EDIT:

    Staram się czytać, szczególnie o konstruktorach, bo z tym mam największy problem, ale nie mam za cholerę pojęcia jak stworzyć konstruktor w klasie z innej klasy.

    0
  • Pomocny post
    #4 26 Mar 2015 19:40
    -psiak-
    Poziom 32  

    Używasz i nie wiesz?

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    ... tylko się dziwić.

    0
  • #5 26 Mar 2015 19:45
    Ins0maniaC
    Poziom 17  

    Kolejny "+" mimo braku cierpliwości. Teraz widzę, że wstawiłem tu kompletnie surowy program i wiem chyba co robię nie tak. Jak przerobie to wstawię dla oceny, jeśli będą babole (w liczbie "mało").

    0
  • Pomocny post
    #6 26 Mar 2015 20:03
    -psiak-
    Poziom 32  

    "Surowy" to bardzo łagodnie powiedziane, stąd - "brak cierpliwości".
    Ale jak widać - sapienti sat.

    0
  • Pomocny post
    #7 26 Mar 2015 21:01
    gaskoin
    Poziom 38  

    Kwiatów jest jeszcze więcej. Zamiast używać jakiejś skomplikowanej logiki przy sprawdzaniu obecności studentów, gnąc się i tnąc, używając dwóch for-ów z dynamiczną tablicą, prościej byłoby użyć mapy. Kod sprawdzania obecności skróciłby się do jednej linijki. Podobnie z dodawaniem i inicjalizacją tych wszystkich tablic.

    1
  • #8 26 Mar 2015 21:07
    Ins0maniaC
    Poziom 17  

    Po 2 godzinach czytania o konstruktorach i klasach wychodzi coś takiego. W destruktorze chciałbym usunąć tablicę studentów, ale domyślam się, że nie jest to możliwe, bo tablicę tworzę w metodzie. Jakiś pomysł jak to rozwiązać/ewentualnie co wsadzić do destruktora? Po drugie nie miałem pomysłu co wykładowca miał na myśli mówiąc, żeby stworzyć metodę void dodaj_studenta(Student s), więc dałem dodaj_studenta(int iloscs). To co chciałbym zmienić, ale program na teraz nadal ma babola. (sam kompilator nie pokazuje) Mam wrażenie, że to coś związanego z alokacją pamięci, ale prosiłbym o potwierdzenie.



    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #9 26 Mar 2015 21:17
    gaskoin
    Poziom 38  

    Trochę nie kumam co ten kod robi? (Poza wyjeżdżaniem za pamięć po pętli)

    Ins0maniaC napisał:
    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod


    Nauczycielowi pewnie chodziło o to, żeby ta metoda wyglądała tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Tutaj masz wyjaśnienie http://www.cplusplus.com/reference/list/list/ i przykłady użycia.

    0
  • #10 26 Mar 2015 21:27
    Ins0maniaC
    Poziom 17  

    gaskoin napisał:
    Trochę nie kumam co ten kod robi? (Poza wyjeżdżaniem za pamięć po pętli)

    Ins0maniaC napisał:
    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod


    Nauczycielowi pewnie chodziło o to, żeby ta metoda wyglądała tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod



    Staram się zwiększyć ilość, stworzyć nową tablice o większym rozmiarze- zapisać tam wartości ze starej tablicy, potem dopisać na koniec nowy element, usunąć pamięć i podmienić do oryginalnej. I mam wrażenie, że o coś podobnego chodzi z tego co nauczyciel mówił.

    0
  • #11 26 Mar 2015 21:31
    -psiak-
    Poziom 32  

    @Ins0maniaC, powiedz czy chcesz zrobić kod wg założeń:

    Ins0maniaC napisał:
    Muszę zrobić klasę student z nazwiskiem i indeksem. Potem klasę dziennik z kodem grupy, dynamiczną tablicą studentów i dwuwymiarową tablicę dynamiczną bool obecności[iloscstudentow * 15], metoda void dodajucznia(student s), void obecnosc(int nr.zajec) + konstuktory/destruktory, pamiętać o zwalnianiu pamięci i enkapsulacji.
    czy po ludzku?

    Ins0maniaC napisał:
    Nauczycielowi pewnie chodziło o to, żeby ta metoda wyglądała tak: ...
    Jeżeli przytoczone zadanie nie zmieniłeś zbyt mocno to z całą pewnością nauczyciel chce aby powtórzyłeś to co jest wewnątrz tej push_back() ale to nie jest po ludzku.

    Ins0maniaC napisał:
    Staram się zwiększyć ilość, stworzyć nową tablice o większym rozmiarze- zapisać tam wartości ze starej tablicy, potem dopisać na koniec nowy element, usunąć pamięć i podmienić do oryginalnej. I mam wrażenie, że o coś podobnego chodzi z tego co nauczyciel mówił.

    Czy zdajesz sobie sprawę ze po zakończeniu funkcji żadna zmienna zadeklarowana wewnątrz funkcji już nie istnieje, no może za wyjątkiem tych z klauzulą static - która to (klauzula) akurat w tym przypadku cię nie uratuje.

    -1
  • Pomocny post
    #12 26 Mar 2015 21:40
    gaskoin
    Poziom 38  

    Zapisujesz nie na końcu, tylko poza nim.

    Załóżmy, że ilość studentów = 10. Tworzysz wtedy tablicę nowa, która ma 11 elementów i po pętli zapisujesz pod 12.

    W rzeczywistości ilość studentów = 0. Tworzysz więc tablicę o zerowym rozmiarze i po przeleceniu całej tej tablicy, zapisujesz nowego studenta pod pierwszy jej element (który jest de facto poza nią).

    0
  • #13 26 Mar 2015 22:54
    Ins0maniaC
    Poziom 17  

    Niestety muszę to zrobić wg. założeń- nauczyciel baaardzo czepia się wszelkich odchyleń od polecenia i każe zmieniać program. Zaraz postaram się przenieść zmienne ponad funkcję, kompletnie o tym zapomniałem. Co do zapisu ponad rozmiar- zmieniając

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod


    na

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod


    przestało wywalać ten błąd.

    0
  • #14 27 Mar 2015 00:32
    -psiak-
    Poziom 32  

    To że przestało wywalać błąd wcale nie oznacza że działa poprawnie a nawet nie oznacza że można doprowadzić do stanu działania.

    Czytaj uważnie, masz w zadaniu:
    dynamiczną tablicą studentów - nie masz
    dwuwymiarową tablicę dynamiczną bool obecności[iloscstudentow * 15] - nie masz
    • metoda void dodajucznia(student s) - zrób tak jak podano zamiast wydziwiać: - void dodaj_studenta(int iloscs)
    void obecnosc(int nr.zajec) - nie masz

    ilość przechowuj jako składową klasy, niech konstruktor tą ilość wyzeruje.
    Nie rób żadnych wprowadzeń wewnątrz metod - bo to już zupełnie wbrew wszelkim zasadom.
    przyda się dodatkowe metody do sprawdzenia/zmiany obecności:
    • bool obecnosc(int nrzajec,int nrucznia)
    • void obecnosc(int nrzajec,int nrucznia,bool obecny)

    0
  • #15 27 Mar 2015 12:46
    Ins0maniaC
    Poziom 17  

    Z tym problemem, że musiałbym wszystko przerobić na wektory, jeśli używałbym waszego sposobu z dodaniemucznia? Bo o ile chyba powoli klaruje mi się pomysł z resztą, czyli konstruktor:

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod


    i destruktor

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod


    to przyznam szczerze, że nie wiem co miałbym przekazać do metody void dodajucznia(student s) skoro tablicę studentów tworzę w klasie, a w mainie tworzę obiekt klasy Dziennik, więc nie przekażę czegoś z klasy student.

    I na ten moment MAM WRAŻENIE, że wszystko oprócz oczywiście metody dodaj_studenta, której nie ruszałem bo nie wiem w końcu jak się za to zabrać jest ok? Aaa i co do sprawdzania obecności to ma być tylko wpisanie, nie musimy robić wyświetlenia czy tam zmiany osobnych studentów.

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    0
  • #16 27 Mar 2015 14:12
    -psiak-
    Poziom 32  

    Zignorowałeś większość z tego co ci napisałem.

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    0
  • #17 27 Mar 2015 15:30
    Ins0maniaC
    Poziom 17  

    -psiak- napisał:
    Zignorowałeś większość z tego co ci napisałem.

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod


    Dzięki za tą odpowiedź. Jednak nadal potrzebowałbym pomocy z funkcją dodajucznia. Za cholerę nie wiem jak ma ona wyglądać niestety. Zapis dodajucznia(Student s) jest dla mnie bezsensowny, bo tworzę obiekt klasy dziennik a nie student dobrze rozumuję?



    EDIT:
    Wygląda na to, że dodawanie studentów już działa. Indeksowanie ilości według debuggera ok, dane zapisują się jak powinny. Teraz przy sprawdzaniu obecności jest błąd w linijce cin>>obecnosc[i][j];. Jakiś pomysł co tam jest skopane?

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    0
  • #18 27 Mar 2015 17:23
    -psiak-
    Poziom 32  

    1. Już mówiłem, żadnych wprowadzeń z klawiatury w metodach.
    2. Zapomniałeś rozszerzyć tablicę obecności.

    0
  • #19 27 Mar 2015 17:36
    Ins0maniaC
    Poziom 17  

    Co to znaczy żadnych wprowadzeń z klawiatury w metodach? Mam w ogóle nie używać cinów? Zapomniałem rozszerzyć? Nie ma od razu wielkości 15xilosc_studentow, czyli jak się doda 2 to nie będzie 15x2?

    0
  • #20 27 Mar 2015 17:52
    -psiak-
    Poziom 32  

    W metodach nie używać cin'ów.
    Przecież ilosc_studentow na początku jest 0.

    Ins0maniaC napisał:
    ... czyli jak się doda 2 to nie będzie 15x2?
    na ile mi wiadomo zdolności wróżbity nie zostały wmontowany w żaden ze znanych mi kompilatorów.

    0
  • #21 27 Mar 2015 18:15
    Ins0maniaC
    Poziom 17  

    -psiak- napisał:
    W metodach nie używać cin'ów.
    Przecież ilosc_studentow na początku jest 0.
    Ins0maniaC napisał:
    ... czyli jak się doda 2 to nie będzie 15x2?
    na ile mi wiadomo zdolności wróżbity nie zostały wmontowany w żaden ze znanych mi kompilatorów.


    Tak, ale z każdym wywołaniem funkcji dodaj_studenta iloscstudentow zwiększa się o 1. Sprawdziłem coutem i wyświetla odpowiednią ilość (tzn. jak dodam 3 studentów to w funkcji sprawdz_obecnosc pokazuje właśnie 3). A co do cina- jak to w takim razie rozwiązać i dlaczego to jest nieprawidłowe?

    @EDIT:
    Rozumiem, nie utworzyłem tej tablicy w konstruktorze. Koniec końców zostaje taka funkcja i (chyba) działa:

    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #22 28 Mar 2015 20:23
    BeginEnd
    Poziom 14  

    Psiakowi chodzi o to żebyś nie miksował pobierania danych z tworzeniem nowego studenta. Grupuj części programu w logiczna całość. Najpierw pobierz dane potem wywołaj dodawanie studenta przekazując wszystkie potrzebne dane. A jeszcze lepiej jakbyś rozdzielił tworzenie studenta od dodawania go. Czyli tak:

    W case '2':
    1. pobierasz wszystkie dane
    2. s=new Student(nazwisko, nr_indeksu)
    3. dziennik.dodaj_studenta(s)

    Oczywiście musisz dopisać konstruktor dla studenta.

    1
  • #23 28 Mar 2015 20:59
    -psiak-
    Poziom 32  

    @BeginEnd, ba dokładnie tak jest napisano w zadaniu :)

    0
  • #24 01 Kwi 2015 12:19
    Ins0maniaC
    Poziom 17  

    Case 2 w zasadzie było dodatkowe, tylko żeby sprawdzić czy działa :D zadanie, wygląda na to, że zostało zaakceptowane, teraz będę przerabiał ten program, żeby działał na innej zasadzie. Narazie zamykam i w przypadku problemów otworzę nowy wątek. Dzięki za pomoc.

    0