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

C++ zapisywanie do pliku i odczytywanie danych z klas

Werpet 22 Sie 2017 13:45 1725 7
REKLAMA
  • #1 16656590
    Werpet
    Poziom 6  
    Posty: 37
    Ocena: 1
    Witam, borykam się z problemem. Wykonuję na zaliczenie ćwiczenie (zdjęcie 1). Mam problem z dodawaniem szkoleń i trenerów. Ktoś jest w stanie pomóc lub nakierować? Od razu zaznaczam, że wybitnym programistą nie jestem, co za pewne widać, ale próbuję.

    Kod pliku:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod klas:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Załączniki:
    • C++ zapisywanie do pliku i odczytywanie danych z klas 21013907_1403344323112400_8643339237600879383_o.jpg (398.16 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 16657156
    lukg36
    Poziom 9  
    Posty: 10
    Pomógł: 1
    Ocena: 1
    Hejka,

    masz troche bledow w kodzie .... raczej Ci sie to nie kompiluje nawet .... ogolnie pisanie ile wlezie a potem proba naprawy ciezko dziala (z mojego doswiadczenia). Oczyscilem Ci troche klasy - w duzej mierze usuwajac i tak nie dzialajaca funkcjonalnosc i pozostawiajac kompilujacy sie kod. Np plik z mainem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w powyzszym wywalilem conio.h (dziwne tak uzywac strumieni i wracac do starych metod - jakos tak troche bez ladu). Zmienne musisz zadeklarowac w mainie. Szkolenie, Trener i Przydzial to klasy a nie obiekty klasy string (zakladam przynajmniej ze taki miales zamiar) i tez musisz je wrzucic do maina jesli chcesz ich uzywac. Ja je wyrzucilem dla uproszczenia. W switchu po kazdym case jest na koncu zazwyczaj break, chyba ze chcesz wykonac tez ze znajdujacego sie nizej case-a (tutaj zakladam ze tego nie chcesz).

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w klasie szkolenia tylko doprowadzilem ja do kompilowania. Rob przyrostowo funkcjonalnosc. Piszesz kawalek - testujesz i idziesz dalej rozbudowujac funkcjonalnosc. Jak masz blad masz bardzo maly kawalek kodu do analizy i szukania co skopales.

    szkolenie::dodaj() - tak bys zadeklarowal metode jakby byla ona pisana poza zasiegiem klamer od deklaracji class (nie mowiac ze klasa ma nazwe Szkolenie - rozmiar liter ma znaczenie).

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    podobna sytuacja z metoda dodaj w klasie Trener.

    Zadanie swoja droga jest nieprecyzyjne - niby chce zapisywac do pliku dane (ale jakie dane skad ? nie ma mowy ze program ma umozliwiac wprowadzanie nowych danych z consoli .... tylko ze ma zapisywac dane do pliku i odczytywac z niego, ale to pewnie ja sie czepiam) .... mam nadzieje ze moje uwagi Ci pomoga. Skup sie na jednej funkcjonalnosci na raz (np dodawanie nowego trenera). Pisz, testuj a jak dziala idz do kolejnej funkcjonalnosci.
  • REKLAMA
  • #3 16658448
    Werpet
    Poziom 6  
    Posty: 37
    Ocena: 1
    Jak wywołam szkolenie w pliku main.cpp?

    case '3':
    #include "szkolenie.h"
    void dodaj();
    break;

    ?
  • #4 16658575
    lukg36
    Poziom 9  
    Posty: 10
    Pomógł: 1
    Ocena: 1
    #includy zawsze wrzucasz przed kodem (czyli tam gdzie inne, na gorze).

    dodaj() jest metoda niestatyczna wiec musisz ja wywolac na obiekcie klasy. W tym przypadku tworzysz obiekt klasy Szkolenie i wywolujesz metode dodaj() na nim. Zastanow sie jednak czy metoda ta powinna byc w szkoleniu. Moze wrzuc ja do innej klasy albo chociaz do pliku z mainem. Niech ona wczyta dane z konsoli (jesli masz takie zyczenie) a potem przekaze konstruktorowi klasy Szkolenie i utworzy obiekt szolenie z ustawionymi polami.
  • REKLAMA
  • #5 16660598
    Werpet
    Poziom 6  
    Posty: 37
    Ocena: 1
    Pogubiłem się :(
    Mam case 3, w którym jest dodawanie szkoleń.
    Co tam wpisać?
  • REKLAMA
  • #6 16661008
    lukg36
    Poziom 9  
    Posty: 10
    Pomógł: 1
    Ocena: 1
    Werpet napisał:
    Co tam wpisać?


    w przypadku programowania jest wiele sposobów rozwiązania problemu i wszystkie mogą działać. Jedne lepsze inne gorsze. Na to pytanie co tam wpisać musisz pomyśleć jak i gdzie będziesz przechowywał wszystkie obiekty które utworzysz .... w tym casie dodawania mozesz wywołać np metode zawartą w pliku z mainem która zwróci Ci utworzony obiekt np:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    teraz to rozwiazanie nie ustawia żadnych pól obiektu, po prostu tworzy pusty obiekt i nic z nim nie robi. Ten obiekt moze zostac przechowany w tablicy czy gdzie tam bedziesz chcial trzymac. Ma one Ci tylko pokazać jak można tworzyć obiekty własnej klasy.

    Musisz zastanowić się jak chcesz inicjować taki obiekt (czy przez konstruktor i parametry do niego) czy za pomoca setterów, gdzie przechowywać obiekty klas (tablice, listy itp). Na tym bedzie sie opieraly wszystkie inne funkcjonalnosci jakie bedziesz dopisywał.

    //sry za brak wciec - wklejałem z nimi - wcięcia sa ważne dla czytelności
  • #7 16663533
    Werpet
    Poziom 6  
    Posty: 37
    Ocena: 1
    main.cpp

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    trener.h

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W dobrym kierunku idę?
  • #8 16663622
    lukg36
    Poziom 9  
    Posty: 10
    Pomógł: 1
    Ocena: 1
    trener,szkolenie: wyglada w chyba dobrze (tak rzucilem szybko okiem), choc nie moge sie przyzwyczaic do polskich nazw (ja zawsze uzywalem ang). Nie chce sie czepiac tez nazw plikow ale pliki *.h sa tylko deklaracjami (tak mnie uczyli .... mi kazali rozdzielac deklaracje do plikow *.h a definicje do plikow *.cpp).

    main.cpp - tutaj mi sie wydaje ze ciut za duzo wszystko chcesz wrzucic w maina .... moglbys w miare ladnie zrobic funkcje ktora wczytuje Ci z pliku w niej i nie masz zmiennych walajacych sie po mainie ale to raczej estetyka kodu, jesli Ci wszystko dziala (nie odpalalem Twojego kodu) i Ci to nie przeszkadza .... z wiekiem czlowiek widzi ze czas wlozony w czytelnosc kodu oplaca sie jesli chcesz do niego powracac albo latwiej szukac bledu.

    uwaga co do for (;;) .... masz te petle co wczytuja obiekty ze strumienia, a co jesli bedziesz mial np 51 Szkolen ? wywali sie ..... albo musisz zrobic zabezpieczenie albo strukture z dynamicznym rozmiarem
    uwaga co do plikow i strumieni .... dobrym zwyczajem jest ich zamykanie gdy juz nie potrzebujesz ....
    uwaga co do case '3' to zwroc uwage ze zapisujesz bezposrednio do pliku ale tablica wczytana wczesniej nie ma tego obiektu (moze Ci to sprawic klopot w przyszlosci).

    Skoro piszesz strumieniami moze poczytaj sobie o przeciazaniu operatorow << i >>

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zmaga się z problemem dodawania szkoleń i trenerów w programie C++. W odpowiedziach wskazano na błędy w kodzie, sugerując poprawki, takie jak użycie odpowiednich nagłówków oraz wywoływanie metod na obiektach klas. Zasugerowano również, aby funkcje związane z dodawaniem szkoleń były umieszczone w osobnych plikach, a nie w funkcji main. Wskazano na potrzebę przemyślenia struktury kodu, aby uniknąć problemów z przechowywaniem obiektów oraz zapewnienia czytelności kodu. Użytkownik został również ostrzeżony przed potencjalnymi problemami z przekroczeniem limitu obiektów w tablicy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA