przeciążenie opereratora +=

przeciążenie opereratora +=
TAXIarz
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad rok
0

Witam,

Mam takie zadanie. "Napisać klasę Data, która posiada dzień, miesiąc, rok. Napisać dwa konstruktory. Konstruktor domyślny ma ustawić datę na 1 stycznia 2006 roku, inny konstruktor ma mieć parametry określające datę" oraz "Przeciążyć operator '+=' dodający do daty określoną liczbę dni".

Napisałem tyle:

Kopiuj
 
#include <iostream>
#include <string>
using namespace std;

class Data
{
public:
    // pola
    int dzien;
    string miesiac;
    int rok;

    // konstruktor
    Data();
    // konstruktor param
    Data(int dzien, string miesiac, int rok);

    // przeladowany operator
    Data operator+=(int liczba);
};

// definicja konstruktora domyslnego
Data::Data()
{
    dzien = 1;
    miesiac = "styczen";
    rok = 2006;
}

// def konstruktora param
Data::Data(int aDzien, string aMiesiac, int aRok)
{
    dzien = aDzien;
    miesiac = aMiesiac;
    rok = aRok;
}

// def operatora ++
 Data Data::operator+=(int liczba)
{
	Data rezultat;
    rezultat.dzien = this->dzien + liczba;

    return rezultat;
}

// deklaracja
void pokaz(Data ddd);

int main()
{
    Data data, data2;

    data = dzien+=5;
    pokaz(data);

    return 0;
}

void pokaz(Data ddd)
{
    cout << "dzien " << ddd.dzien
        << " miesiac " << ddd.miesiac
        << " rok " << ddd.rok << endl;
}

Wywala mi errora w GCC
In function 'int main()':
error: 'dzien' was not declared in this scope

edytowany 1x, ostatnio: TAXIarz
0

W funkcji main masz błąd, jak zresztą kompilator wyraźnie stwierdza. Dokładnie tu:

Kopiuj
data = dzien+=5;

Co to za zmienna dzien? Deklarowałeś ją gdziekolwiek?

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
  • Postów:2514
0

data +=5;


░█░█░█░█░█░█░█░█░█░█░█░
M4
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
1

data = dzien+=5;

Co to za twór w ogóle? Umiesz używać języka w ogóle?

Angielskiego też nie umiesz? Szkoda... bo taki ładny, prosty komunikat dostałeś.

Dodajesz "dzien" ktory nie jest w ogole zdefiniowany. Poza tym klasa mega brzydka, zrób sobie miesiac za pomoca cyfry i wtedy bedziesz mogl dodawac dwie daty do siebie, a nie tylko dni. Poza tym dodanie daty nie polega tylko na dodaniu liczb, musisz sprawdzic czy ilosc dni nie przekroczyla limitu i wtedy dodac jeden do miesiaca, jesli zas miesiace przekroczyly limit, musisz dodac jeden do roku :)

TAXIarz
Fakt. Klasę należy poprawić.
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
  • Postów:2512
0

poza tym

Kopiuj
Data::operator+=

moim zdaniem nie powinien nic zwracać.

TAXIarz
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad rok
0

Poprawiłem tak:

Kopiuj
 
...
int main()
{
    Data data;

    data.dzien+=5;
    pokaz(data);

    return 0;
}
...
edytowany 2x, ostatnio: TAXIarz
trocha
powinno być data+=5 To co zrobiłeś używa += dla typu int, a nie twojego przeciążonego
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
  • Postów:2512
0

W ten sposób nie używasz swojego przeciążonego operatora. Poza tym co będzie jak będziesz mieć 30 września? Dodasz 5 i będzie 35 września. Chyba nie za bardzo poprawnie :P

TAXIarz
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad rok
0

Poprawiłem klasę Data na int miesiac, poprawiłem przeciążony operator +=. Jednak kod nie działa jak powinien.
Dla += 32 dostaje: dzień 3, miesiac 11, rok 2011. Jednak przy += 62 dostaje: 33 dzień, miesiąc 11, rok 2011.
Nie podoba mi się tak linijka: rezultat.dzien = dzien + liczba;

Kopiuj
 
#include <iostream>
#include <string>
using namespace std;

class Data
{
public:
    // pola
    int dzien, miesiac, rok;

    // konstruktor
    Data();
    // konstruktor param
    Data(int dzien, int miesiac, int rok);

    // przeladowany operator
    Data operator+=(int liczba);
};

// definicja konstruktora domyslnego
Data::Data()
{
    dzien = 1;
    miesiac = 10;
    rok = 2011;
}

// def konstruktora param
Data::Data(int aDzien, int aMiesiac, int aRok)
{
    dzien = aDzien;
    miesiac = aMiesiac;
    rok = aRok;
}

// def operatora +=
Data Data::operator+=(int liczba)
{
	Data rezultat;

    if (liczba == 0)
        return rezultat;

    rezultat.dzien = dzien + liczba;

    if (rezultat.dzien > 30)
    {
        rezultat.miesiac = miesiac + 1;
        rezultat.dzien -= 30;
    }

    if (rezultat.miesiac > 12)
    {
        rezultat.rok = rok + 1;
        rezultat.miesiac = miesiac++ - 12;
    }

     return rezultat;
}

// deklaracja
void pokaz(Data ddd);

int main()
{
    Data data;

    data = data += 32;
    pokaz(data);

    return 0;
}

void pokaz(Data ddd)
{
    cout << "dzien " << ddd.dzien
        << " miesiac " << ddd.miesiac
        << " rok " << ddd.rok << endl;
}


byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
0

Zamiast tych zmień te if na while(zawartość i warunek zostaw).
Po co przeciążać operator += skoro musisz i tak używać go w ten bezsensowny sposób: data = data += 32;? Zamiast na zmiennej lokalnej operuj w tym operatorze na this - wtedy będzie działał sensownie.


XR
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:24
0

Przeanalizuj po kolei co się dzieje podczas wykonywania kodu. Popatrz. Załóżmy, że w zmiennej dzień jest 1, a Ty dodajesz 65. W rezultat.dzien masz razem 66. Wchodzimy do if, bo (rezultat.dzien>30). Zmieniamy miesiąc i odejmujemy 30 (btw to też jest trochę naciągane). Ile nam zostaje?

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
  • Postów:2512
0

Musisz uwzględnić jeszcze liczbę dni danego miesiąca i czy nie jest to rok przestępny na dodatek (luty!). Czyli podsumowując:

  1. Zmień ify na while
  2. Zamiast rezultat użyj this
  3. Zwracany typ zmień na void
  4. Weź pod uwagę liczbę dni danego miesiąca
TAXIarz
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad rok
0

Napisałem taki kawałek kodu, jednak dalej nie jest idealnie.
Jak użyje += 29 dla 1.2.2011 zwróci mi 2.3.2011. Jednak jak dam +=64, to dostaję 6.3.2011

Kopiuj
 
#include <iostream>
using namespace std;

class Data
{
public:
    // pola
    int dzien, miesiac, rok;

    // konstruktor
    Data();
    // konstruktor param
    Data(int dzien, int miesiac, int rok);

    // przeladowany operator
    Data operator+=(int liczba);
    bool operator<(Data d);
};

// definicja konstruktora domyslnego
Data::Data()
{
    dzien = 1;
    miesiac = 2;
    rok = 2011;
}

// def konstruktora param
Data::Data(int aDzien, int aMiesiac, int aRok)
{
    dzien = aDzien;
    miesiac = aMiesiac;
    rok = aRok;
}

// def operatora +=
Data Data::operator+=(int liczba)
{
	Data rezultat;

    const   int styczen = 1;
            int luty = 2;
            int marzec = 3;
            int kwiecien = 4;
            int maj = 5;
            int czerwiec = 6;
            int lipiec = 7;
            int sierpien = 8;
            int wrzesien = 9;
            int pazdziernik = 10;
            int listopad = 11;
            int grudzien = 12;

    while (liczba == 0)
        return rezultat;

    rezultat.dzien = this->dzien + liczba;

    /*
    while (rezultat.dzien > 30)
    {
        rezultat.miesiac = this->miesiac++ + 1;
        rezultat.dzien -= 30;
    }
    */

    /*
    while (rezultat.miesiac > 12)
    {
        rezultat.rok = this->rok + 1;
        rezultat.miesiac = this->miesiac++ - 12;
    }
    */

    if (rezultat.rok == 0)
    {
        rezultat.rok += 1900;
    }

    while (rezultat.miesiac == styczen && rezultat.dzien > 31)
    {
        rezultat.dzien -= 31;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == luty && rezultat.dzien > 28)
    {
        rezultat.dzien -= 28;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == marzec && rezultat.dzien > 31)
    {
        rezultat.dzien -= 31;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == kwiecien && rezultat.dzien > 30)
    {
        rezultat.dzien -= 30;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == maj && rezultat.dzien > 31)
    {
        rezultat.dzien -= 31;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == czerwiec && rezultat.dzien > 30)
    {
        rezultat.dzien -= 30;
        rezultat.miesiac = this->miesiac + 1;
    }


    while (rezultat.miesiac == lipiec && rezultat.dzien > 31)
    {
        rezultat.dzien -= 31;
        rezultat.miesiac = this->miesiac + 1;
    }


    while (rezultat.miesiac == sierpien && rezultat.dzien > 31)
    {
        rezultat.dzien -= 31;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == wrzesien && rezultat.dzien > 30)
    {
        rezultat.dzien -= 30;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == pazdziernik && rezultat.dzien > 31)
    {
        rezultat.dzien -= 31;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == listopad && rezultat.dzien > 30)
    {
        rezultat.dzien -= 30;
        rezultat.miesiac = this->miesiac + 1;
    }

    while (rezultat.miesiac == grudzien && rezultat.dzien > 31)
    {
        rezultat.dzien -= 31;
        rezultat.miesiac = this->miesiac + 1;
    }

    return rezultat;
}

/*
 ostream & operator<<(ostream & ekran, Data & d)
 {
    ekran << "dzien: " << d.dzien;
    ekran << " miesiac: " << d.miesiac;
    ekran << " rok: " << d.rok;
    return ekran;
 }
*/
/*
bool Data::operator<(Data d)
{
    Data rezultat;

    if (rezultat.rok != d.rok)
        return  false;
    if (rezultat.miesiac!=d.miesiac)
        return false;
    if (rezultat.dzien != d.dzien)
        return false;
    return true;
}
*/

// deklaracja
void pokaz(Data ddd);

int main()
{
    Data data, data2(1,9,2011);

    /*
    if (data < data2)
        cout << "wczesniejsza";
    else
        cout << "pozniejsza";
    */

    /*
    operator << (cout, (data = (data += 95)));
    */

    data = (data += 64);
    pokaz(data);

    return 0;
}

void pokaz(Data ddd)
{
    cout << "dzien " << ddd.dzien
        << " miesiac " << ddd.miesiac
        << " rok " << ddd.rok << endl;
}

edytowany 1x, ostatnio: TAXIarz
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
  • Postów:2512
0

Nie mam teraz jak dokładniej Ci tego wyłożyć więc napiszę tylko wskazówkii:
Do określenia liczby dni danego miesiąca użyj tablicy zamiast stałych. Nie będziesz potrzebować sprawdzać za każdym razem który to miesiąc:

Kopiuj
 ileDni = tab[miesiac-1]
Azarien
lata przestępne!
Sarrus
No tak z lutym zawsze jest problem :P
TAXIarz
Lata przestępne będę rzeźbił.
XR
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:24
0
Kopiuj
 rezultat.miesiac > 30

eee? Czy tu nie powinno być rezultat.dzien>30

Kopiuj
?
Tak przy okazji, czy tworzenie 12 zmiennych przy każdym użyciu oeratora "+=" jest na pewno dobrym pomysłem?
edytowany 1x, ostatnio: xrisx
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 7 godzin
0

ale kombinujecie. nie macie w c++ biblioteki/klasy będącej odpowiednikiem DateTime z c#?


TAXIarz
Autorowi zadań chodzi, żeby napisać ręcznie Datę. Wzorem jest książka Symfonia C++ J. Grębosza. A tam nie bardzo korzysta się z bibliotek.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 19 godzin
1

należy przeliczyć datę na Julian Day, dodać liczbę dni i przeliczyć z powrotem na datę.

TAXIarz
Czy nie byłoby to zbyt proste przeliczając tak?
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)