logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C++ zaczątki "elektronicznego dziennika".

Ins0maniaC 26 Mar 2015 18:30 2037 23
  • #1 14563627
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 14563748
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    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.
  • #3 14563791
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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.
  • Pomocny post
    #4 14563864
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Używasz i nie wiesz?
    Kod: text
    Zaloguj się, aby zobaczyć kod
    ... tylko się dziwić.
  • #5 14563879
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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").
  • Pomocny post
    #6 14563938
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    "Surowy" to bardzo łagodnie powiedziane, stąd - "brak cierpliwości".
    Ale jak widać - sapienti sat.
  • Pomocny post
    #7 14564142
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    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.
  • #8 14564167
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 14564211
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Trochę nie kumam co ten kod robi? (Poza wyjeżdżaniem za pamięć po pętli)

    Ins0maniaC napisał:
    Kod: text
    Zaloguj się, aby zobaczyć kod


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

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tutaj masz wyjaśnienie http://www.cplusplus.com/reference/list/list/ i przykłady użycia.
  • #10 14564248
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    gaskoin napisał:
    Trochę nie kumam co ten kod robi? (Poza wyjeżdżaniem za pamięć po pętli)

    Ins0maniaC napisał:
    Kod: text
    Zaloguj się, aby zobaczyć kod


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

    Kod: text
    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ł.
  • #11 14564262
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    @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.
  • Pomocny post
    #12 14564306
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    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ą).
  • #13 14564593
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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: text
    Zaloguj się, aby zobaczyć kod


    na

    Kod: text
    Zaloguj się, aby zobaczyć kod


    przestało wywalać ten błąd.
  • #14 14564779
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    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)
  • #15 14565631
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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: text
    Zaloguj się, aby zobaczyć kod


    i destruktor

    Kod: text
    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: text
    Zaloguj się, aby zobaczyć kod
  • #16 14565797
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Zignorowałeś większość z tego co ci napisałem.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #17 14565998
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    -psiak- napisał:
    Zignorowałeś większość z tego co ci napisałem.

    Kod: text
    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: text
    Zaloguj się, aby zobaczyć kod
  • #18 14566254
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    1. Już mówiłem, żadnych wprowadzeń z klawiatury w metodach.
    2. Zapomniałeś rozszerzyć tablicę obecności.
  • #19 14566284
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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?
  • #20 14566315
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    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.
  • #21 14566385
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    -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: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #22 14569480
    BeginEnd
    Poziom 14  
    Posty: 85
    Pomógł: 10
    Ocena: 11
    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.
  • #23 14569598
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    @BeginEnd, ba dokładnie tak jest napisano w zadaniu :)
  • #24 14579377
    Ins0maniaC
    Poziom 17  
    Posty: 353
    Ocena: 10
    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.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zmaga się z zadaniem stworzenia klas w C++ dla "elektronicznego dziennika", w tym klasy Student oraz Dziennik, z dynamicznymi tablicami i metodami do zarządzania obecnością. W trakcie dyskusji pojawiają się problemy z alokacją pamięci, konstruktorami, oraz metodami dodawania studentów i sprawdzania obecności. Uczestnicy forum sugerują poprawki, takie jak unikanie wprowadzania danych w metodach, użycie wektorów zamiast dynamicznych tablic oraz poprawne zarządzanie pamięcią w destruktorach. Użytkownik stopniowo wprowadza zmiany, a na końcu informuje o akceptacji zadania i planach na dalsze przeróbki.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA