Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obiektowe C++ Problem z zabezpieczaniem programu przed podaniem liczb nie będące w przedziale

Ostatnio zmodyfikowano 2019-04-14 11:25
Autor Wiadomość
matikwe12
Temat założony przez niniejszego użytkownika
Obiektowe C++ Problem z zabezpieczaniem programu przed podaniem liczb nie będące w przedziale
» 2019-04-13 11:37:44
Proszę o pomoc, piszę program w, którym chcę zrobić by dla każdego miesiąca przyjmował poprawne dni i rok nie był większy niż 10 tysięcy. Co robię źle, program wyświetla złe dane.
C/C++
#include <iostream>
#include <conio.h>
using namespace std;

class Date
{
private:
    int dzien, miesiac, rok;
public:
    int getdzien() const;
    int getmiesiac() const;
    int getrok() const;
    Date();
    Date( int, int, int );
    void setall( int dzien, int miesiac, int rok );
    void wyswietl()
    {
        cout << dzien << "." << miesiac << "." << rok;
    }
};

int Date::getdzien() const
{
    return this->dzien;
}
int Date::getmiesiac() const
{
    return this->miesiac;
}
int Date::getrok() const
{
    return this->rok;
}
Date::Date()
{
    dzien = 1;
    miesiac = 1;
    rok = 1970;
}

Date::Date( int dzien, int miesiac, int rok )
{
    this->dzien = dzien;
    this->miesiac = miesiac;
    this->rok = rok;
}

void Date::setall( int dzien, int miesiac, int rok )
{
    if( this->miesiac <= 12 && this->miesiac >= 1 )
    {
        this->miesiac = miesiac;
       
        switch( this->miesiac )
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            {
                if( this->dzien >= 31 && this->dzien <= 0 )
                {
                    cout << "Podaj prawidlowy przedzial dniowy";
                }
                else
                {
                    this->dzien = dzien;
                }
            }
            break;
        case 2:
            {
                if( this->dzien >= 29 && this->dzien <= 0 )
                {
                    cout << "Podaj prawidlowy przedzial dniowy";
                }
                else
                {
                    this->dzien = dzien;
                }
            }
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            {
                if( this->dzien >= 30 && this->dzien <= 0 )
                {
                    cout << "Podaj prawidlowy przedzial dniowy";
                }
                else
                {
                    this->dzien = dzien;
                }
            }
            break;
           
        }
       
    }
   
    if( this->rok < 10000 && this->rok > 0 )
    {
        this->rok = rok;
    }
   
}

int main()
{
    Date op_1;
    op_1.setall( 31, 13, 1000 );
    op_1.wyswietl();
    _getch();
    return 0;
}
P-174386
pekfos
» 2019-04-13 11:42:17
Testujesz this->rok, nie rok.
P-174387
matikwe12
Temat założony przez niniejszego użytkownika
» 2019-04-13 13:19:48
Możesz dokładnie, nie wiem o co chodzi.
P-174389
pekfos
» 2019-04-13 14:11:13
Jest tak dokładnie, jak tylko się da. Testujesz wartość this->rok (aktualną w obiekcie), a nie rok (nową wartość).
C/C++
if( this->rok < 10000 && this->rok > 0 )
{
    this->rok = rok;
}
I to samo ze wszystkimi innymi argumentami Date::setall().
P-174391
matikwe12
Temat założony przez niniejszego użytkownika
» 2019-04-14 11:25:56
Dziękuję bardzo teraz dopiero zrozumiałem poprawne zastosowanie this. Jeszcze raz dziękuję :)
Niżej daję poprawny kod jakby komuś się przydał.
C/C++
int Date::getdzien() const
{
    return this->dzien;
}
int Date::getmiesiac() const
{
    return this->miesiac;
}
int Date::getrok() const
{
    return this->rok;
}
Date::Date()
{
    dzien = 1;
    miesiac = 1;
    rok = 1970;
}

Date::Date( int dzien, int miesiac, int rok )
{
    this->dzien = dzien;
    this->miesiac = miesiac;
    this->rok = rok;
}

void Date::setall( int dzien, int miesiac, int rok )
{
    bool ok_miesiac = true;
    if( miesiac <= 12 && miesiac >= 1 )
    {
        this->miesiac = miesiac;
    }
    else
    {
        cout << " podaj dobry miesiac ";
        ok_miesiac = false;
    }
   
    if( ok_miesiac == true )
    {
        switch( this->miesiac )
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            {
                if( dzien <= 31 && dzien > 0 )
                {
                    this->dzien = dzien;
                }
                else
                {
                    cout << " Podaj prawidlowy przedzial dniowy ";
                }
            }
            break;
        case 2:
            {
                if( dzien <= 29 && dzien > 0 )
                {
                    this->dzien = dzien;
                }
                else
                {
                    cout << " Podaj prawidlowy przedzial dniowy ";
                }
            }
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            {
                if( dzien <= 30 && dzien > 0 )
                {
                    this->dzien = dzien;
                }
                else
                {
                    cout << " Podaj prawidlowy przedzial dniowy ";
                }
            }
            break;
           
        }
    }
    else
    {
        cout << " podales zly dzien w danym miesiacu ";
    }
   
    if( rok < 10000 && rok > 0 )
    {
        this->rok = rok;
    }
    else
    {
        cout << " podaj dobry przedzial roku ";
    }
   
}
P-174416
« 1 »
  Strona 1 z 1