przeciążenie opereratora +=

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:

 
#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

0

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

data = dzien+=5;

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

0

data +=5;

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 :)

0

poza tym

Data::operator+=

moim zdaniem nie powinien nic zwracać.

0

Poprawiłem tak:

 
...
int main()
{
    Data data;

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

    return 0;
}
...
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

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;

 
#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;
}


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.

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?

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
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

 
#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;
}

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:

 ileDni = tab[miesiac-1]
0
 rezultat.miesiac > 30

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

?
Tak przy okazji, czy tworzenie 12 zmiennych przy każdym użyciu oeratora "+=" jest na pewno dobrym pomysłem?
0

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

1

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

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