Problem ze zrozumieniem klas - prośba o pomoc :/

0

Witam,
Dostałem takie zadanie:

Waszym zadaniem jest napisanie programu służącego do generowania miesięcznego zestawienia płac w firmie. W tym celu musicie opracować następujące klasy:

  • Pracownik
  • ListaPlac

Do ListyPlac dodajemy pracowników, następnie wywołujemy dla niej metodę zestawienie(), która powinna wygenerować tabelkę o postaci: no i tutaj tabelka gdzie jest wszystko ładnie poformatowane - to jest najmniejszy problem.

O co mi dokładnie chodzi i w czym problem? Już tłumaczę:

Nie za bardzo rozumiem co i gdzie ma być w tym programie. Zaznaczę, że bez wprowadzania danych - ja sam definiuje tych pracowników. U mnie program skończył się na:

#include <iostream>
#include <string>

using namespace std;

class Pracownik

{

private:
string imie;
string nazwisko;
string stanowisko;
string data_urodzenia;
int wiek;
int pensja;
int staz;

public:

};

class ListaPlac

{

void dodaj_pracownika();
void zestawienie();

};

void ListaPlac::zestawienie()

{

}

void ListaPlac::dodaj_pracownika()

{

}

int main()
{
Pracownik p1, p2, p3;

return 0;

}

I teraz nie za bardzo wiem jak ruszyć dalej. Skoro dane pracowników są private to nie mogę się do nich przecież odwołać w klasie "zestawienie". Musiałbym napisać funkcję publiczną np "wypisz" w klasie pracownik aby można było ją wywołać w metodzie "zestawienie"?? Poza tym jak za pomocą klasy ListaPlac mam dodawać pracowników do klasy pracownik? Czy ktoś może mi wytłumaczyć o co w tym chodzi??

0

albo wrzucasz te dane do public albo klase listaplac ustawiasz jako zaprzyjazniona albo robisz cos na wzor tego:

class test
{
private:
  Typ PoleADoOdczytuIZapisu;
public:
  const Typ& PoleATylkoDoOdczytu;
  test(): PoleATylkoDoOdczytu(PoleADoOdczytuIZapisu) {}
};

lub po prostu publiczną metodę, która zwraca kopie tego pola lub stałą referencję na ten obiekt/pole

0

Można też zrobić metodę w klasie Pracownik, która wygeneruje zestawienie dla pojedynczego pracownika np. jako string.
Co do przechowywania pracowników to metoda w klasie ListaPlac dodaj_pracownika powinna przyjmować najlepiej stałą referencję do obiektów typu pracownik, i w tej klasie musisz mieć jakiś kontener, który przechowa tych pracowników, np. std::vector.

0

Hmm a da się jakoś inaczej dodać tego pracownika? Wektorów nie znam i musiałbym pewnie o nich trochę poczytać a nie będę ukrywał, że szukam najprostszego rozwiązania. Po prostu nie za bardzo rozumiem zdania "Do ListyPlac dodajemy pracowników" skoro np w klasie pracownik napiszę sobie metodę "nowy_pracownik(string...)" i potem po prostu w mainie mogę sobie utworzyć kilka obiektow klasy pracownik i przekazać argumenty które potem sobie normalnie wywołam za pomocą np pracownik1.wypisz(), pracownik2.wypisz(); etc etc.

krótko mówiąc - o co chodzi z tym dodaniem pracownika bo jest to dla mnie czarna magia :/.

0

Przyjmuj w CListaPlac::dodaj_pracownika( ... ) referencję na obiekt klasy CPpracownik. Zapisuj tę referencję do wektora, albo listy.

CListaPlac::dodaj_pracownika( CPracownik& _pracownik ) { 
   this->kontener_pracownikow.push_back( _pracownik ); 
}
CListaPlac::wypisz () const {
   for_each ( pracownik, kontener ) // or something... pseudokod
      std::cout << pracownik; // or something... możesz przeciążyć operator std::string albo operator<< dla pracownika, żeby to działało
} 
0
zaboleqqq napisał(a):

Hmm a da się jakoś inaczej dodać tego pracownika? Wektorów nie znam i musiałbym pewnie o nich trochę poczytać a nie będę ukrywał, że szukam najprostszego rozwiązania. Po prostu nie za bardzo rozumiem zdania "Do ListyPlac dodajemy pracowników" skoro np w klasie pracownik napiszę sobie metodę "nowy_pracownik(string...)" i potem po prostu w mainie mogę sobie utworzyć kilka obiektow klasy pracownik i przekazać argumenty które potem sobie normalnie wywołam za pomocą np pracownik1.wypisz(), pracownik2.wypisz(); etc etc.

krótko mówiąc - o co chodzi z tym dodaniem pracownika bo jest to dla mnie czarna magia :/.

Metoda nowy_pracownik w klasie pracownik jest po prostu bez sensu. vector jako składowa klasy ListaPlac jest tutaj najprostszym rozwiązaniem. Musisz o tym poczytać, bo aktualnie masz za mało wiedzy, żeby zrobić to zadanie. Wbrew pozorom nie jest trudno nauczyć się z tego korzystać(trochę ciężej byłoby Ci zrozumieć jak to dokładnie działa, ale na tym etapie nie musisz tego wiedzieć).
Skoro obiekt klasy ListaPlac ma przechowywać obiekty klasy Pracownik to gdzieś je musi trzymać, czyli musisz mieć jakiś kontener który się tym zajmie. Możesz go sam napisać, ale zdecydowanie prościej będzie wykorzystać to co jest w bibliotece standardowej. W tym wypadku najprostszy będzie właśnie vector, może być też lista, w pewnych warunkach pewnie nawet mapa by się sprawdziła(ale nie w tym konkretnym zadaniu).

0

Hmm sorry, że truje ale skoro nie miałem vectorów ani list to musi być jakiś sposób aby móc "dodawać" tych pracowników. W klasie pracownik mają być dane pracowników ale lista płac ma generować ich zestawienie. Mogę w pracowniku utworzyć konstruktor i potem sobie tych pracowników wywować za pomocą metody "zestawienie" aczkolwiek nadal nie wiem jak dodawać tych pracowników.

0

Jeszcze powiedz, że jesteś na studiach... Nie ma czegoś takiego "nie miałem". Możesz zrobić tablicę, tablicę wskaźników, whatever i samemu oprogramować to co robi vector.

0

Nie, nie jestem studentem. To co robię to zadania wyłowione z neta/książek/kursów. Mam z tym problem i prosiłem o pomoc.
Dopiero teraz miałem czas do tego wrócić i zastanawia mnie jedna rzecz - czy mogę do tego użyć np tablicy obiektów? A nawet jeśli mogę to takiej tablicy nie mogę chyba powołać do życia w samej klasie tylko w funkcji main, wiec jednocześnie nie jestem w stanie za pomocą funkcji zestawienie i pętli for wyświetlić elementów tej tablicy.
Naskrobałem taki kod, który zapewne nie jest prawidłowy pod wieloma względami i do tego się nie kompiluje bo są 2 błedy (jeden w pętli for, gdzie nie jest znany "pracownik" i drugi na zakończenie tablicy obiektów). Jeśli tego nie da się zrobić tablicami obiektów to pozostaje zapoznanie się z wektorami...

#include <iostream>
#include <string>

using namespace std;

class Pracownik

{

friend class ListaPlac;
public:
string imie;
string nazwisko;
Pracownik(string im, string nazwisko);
};

Pracownik::Pracownik(string im, string na)
{
im=imie;
na=nazwisko;
}

class ListaPlac

{

friend class Pracownik;

public:
    void zestawienie();

};

void ListaPlac::zestawienie()

{
for (int i=0 ; i <= 3 ; i++)
{
cout<<"Imie " <<"Nazwisko "
<<pracownicy[i];
}

}

int main()

{

Pracownik pierwszy("Adam", "Kowalski");
Pracownik drugi("Piotr", "Nowak");
Pracownik trzeci("Jas", "Zly");

const int ile_prac=3;
ListaPlac pracownicy[ile_prac] =
{
    Pracownik("Adam", "Kowalski"),
    Pracownik("Piotr", "Nowak"),
    Pracownik("Jas", "Zly")

};

}

0

Sposób użycia:

  1. przeczytać dokładnie książkę
  2. kodować
  3. usunąć błędy
  4. CZYNNOŚĆ POWTÓRZYĆ ;)

Twój kod bez obrazy (bo dopiero się uczysz) to prawdziwe ciasteczko.

0

Spodziewałem się szczerych odpowiedzi ale nie aż takich ;). Kurs nie jest taki zły tylko ja niestety poświęcałem mu zdecydowanie za mało czasu co postanawiam zmienić od dzisiaj:).
Kursów w necie sporo ale zapewne lepsza zawsze będzie dobra książka. Czy tutaj symfonia C++ standard jest jedynym słusznym tytułem czy jesteście w stanie polecić coś innego jeszcze?

0

Lepsza bo nowsza będzie Thinking in C++ (jak dla ciebie starczy 1 tom), oryginalna angielska językowa jest za darmochę w formie elektronicznej tutaj http://mindview.net/Books/TICPP/ThinkingInCPP2e.html (legalnie żeby nie było), obawiam się jednak że po polsku tylko odpłatnie papierowa.

0

Hmm w sumie symfonia C++ Standard jest z 2008 albo z 2009 roku a ta Eckella z 2009 - to nie jest jakimś problemem? Rozumiem, że tylko te 2 książki są warte uwagi? I pozwolę sobie spytać jeszcze pod jakim względem Eckel jest lepszy od "osławionego" Grębosza :)??

0

wydaje mi się, że grębosz jest lepszy dla początkujących a eckel dla tych co już mieli wcześniej styczność z programowaniem

0

Zależy jaki jest Twój obecny poziom. Ja zaczynałem od http://helion.pl/ksiazki/c-cwiczenia-praktyczne-wydanie-iii-andrzej-stasiewicz,cwcpp3.htm z tym, że widzę, iż jest to już trzecie wydanie (zapewne poprawione błędy), ja mam pierwsze :) Jeśli chodzi o inne, to później miałem sporą przerwę, po której zabrałem się do "C++ dla każdego". Dobra książka, omawia fajnie podstawy, jest też o STL. O ile pierwsze rozdziały nie sprawiają kłopotów, o tyle późniejsze zagadnienia mogą trochę namieszać, ale nie warto się zniechęcać. Teraz czytam "Thinking in C++" - I tom. Rzeczywiście bez wcześniejszego "ogarnięcia z grubsza", miałbym problemy. Książka zaczyna się od omówienia zagadnień obiektowości, nawiązań do języka C.

"Słynnego" Grębosza nie widziałem na oczy, więc się nie wypowiem na jego temat. Zastanawiam się czy warto, go przerobić.

A najważniejsze to kodzić. Ja sam mam problemy - niby potrafię napisać coś bardziej złożonego niż popularny "kalkulator", ale zdarzają mi się problemy z prostymi rzeczami, np. zapomnę, że tablicę indeksuje się od 0 (http://4programmers.net/Forum/Newbie/197134-tablica_dwuwymiarowa_-_petle_for_-_wypelnianie_-_problem :D ).

0

W książce Grębosza w 10 rozdziale są dopiero klasy, Eckel zaczyna od rozdziału "Wprowadzenie do obiektów". Ogólnie Symfonia jest bardziej "nauką programowania przy użyciu C++", a TiC++ "nauką programowania obiektowego i C++". Jak przeglądałem, to u Grębosza wszystko jest napisane łopatologiczne, gdzie Eckel wymaga więcej własnego zaangażowania. Ze względu na to w 600 stronicowym 1 tomie Thinking jest więcej wiedzy niż w prawie dwa razy większej symfonii (razem ze sporą częścią pasji). W drugim tomie Eckel w skrócie opisuje nawet wzorce projektowe i współbieżność. Dodatkowo w spisie treści u Grębosza nigdzie nie znalazłem funktorów, a jest to jednak ważne zagadnienie w C++, z biblioteką standardową bardzo pod nie pisaną. Jeżeli nie ma tego opisanego w Symfonii, to może być to dużym powodem do nieuczenia się z niej C++, szczególnie w obliczu C++11. Ogólnie jak umiesz trochę programować, to ucząc się z TiC++ poznasz ten język lepiej i dokładniej niż z Symfonii oraz nabędziesz lepszych praktyk.

Edit: jednak obiekty funkcyjne są opisane w Pasji, się nie doczytałem.

0

Ja polecam symfonie, jest tak prosto napisana ze czasem nie trzeba przepisywać programu do IDE żeby dobrze zrozumieć omawiane zagadnienie na nim. Co do funktorów to są one w Pasji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1