У меня проблема с получением желаемых результатов.

Я много времени пробовал поджарить себе мозг, но это не сработало ... Я думаю, проблема в сбоях в работе функций void в классе Date, а также в некоторых ошибках указателя и функциях advanceTime в классе Clock, но я сам не понимаю, как для дальнейшего продвижения на этом этапе.

Я постарался описать проблему как можно лучше, не могли бы вы мне помочь?

Ожидаемые результаты такие:

Setting the clock to 2:03:04 using normal setters
02:03:04
Advancing the clock one hour with a value parameter
02:03:04
Advancing the clock one hour with a pointer parameter
03:03:04
Advancing the clock one hour with a reference parameter
04:03:04
Setting the clock to 8:09:10 with cascading setters returning an instance
08:03:04
Setting the clock to 5:06:07 with cascading setters returning a pointer
05:06:07
Setting the clock to 11:12:13 with cascading setters returning a reference
11:12:13
Setting the clock to 23:59:59
23:59:59
Advancing the clock one second
00:00:00

Однако я получаю:

Setting the clock to 2:03:04 using normal setters
02:03:04
Advancing the clock one hour with a value parameter
02:03:04
Advancing the clock one hour with a pointer parameter
03:03:04
Advancing the clock one hour with a reference parameter
04:03:04
Setting the clock to 8:09:10 with cascading setters returning an instance
08:03:04
Setting the clock to 5:06:07 with cascading setters returning a pointer
05:03:04
Setting the clock to 11:12:13 with cascading setters returning a reference
11:03:04
Setting the clock to 23:59:59
23:59:59
Advancing the clock one second
23:59:00

Я попытался провести некоторую оценку оставшегося за час, минуту и ​​секунду.

Ну, я запутался в способах получения 00:00:00 от 59 маргиналов, а также некоторые часы с опережением работают, но что-то не работает.

Я действительно запутался.

Clock.h

// Clock.h
// This class describes a Clock.

class Clock {
    private:
        int hour;
        int minute;
        int second;
    public:
        // Constructor
        Clock();

        // Normal Setters
        void setHour(int newHour);
        void setMinute(int newMinute);
        void setSecond(int newSecond);

        // Cascading Setters returning an instance
        Clock setHourIns(int newHour);
        Clock setMinuteIns(int newMinute);
        Clock setSecondIns(int newSecond);

        // Cascading Setters returning a pointer
        Clock * setHourPtr(int newHour);
        Clock * setMinutePtr(int newMinute);
        Clock * setSecondPtr(int newSecond);

        // Cascading Setters returning a reference
        Clock & setHourRef(int newHour);
        Clock & setMinuteRef(int newMinute);
        Clock & setSecondRef(int newSecond);

        // Getters
        int getHour() const;
        int getMinute() const;
        int getSecond() const;

        // Advance one hour
        void advanceOneHour();
        void advanceOneMinute();
        void advanceOneSecond();

        // Printing Methods
        void printTwoDigits(int number) const;
        void printTime() const;
};

Clock.cpp

// Clock.cpp
// This class describes a Clock.

#include <iostream>
#include <iomanip>
#include "Clock.h"

using namespace std;

// Constructor for Clock
Clock::Clock() {
    hour = 0;
    minute = 0;
    second = 0;
}

// Normal Setters
void Clock::setHour(int newHour) {
    hour = newHour;
}

void Clock::setMinute(int newMinute) {
    minute = newMinute;
}

void Clock::setSecond(int newSecond) {
    second = newSecond;
}

// Cascading Setters which return an instance
Clock Clock::setHourIns(int newHour) {
    hour = newHour;
    return (*this);
}

Clock Clock::setMinuteIns(int newMinute) {
    minute = newMinute;
    return (*this);
}

Clock Clock::setSecondIns(int newSecond) {
    second = newSecond;
    return (*this);
}

// Cascading Setters which return an pointer
Clock * Clock::setHourPtr(int newHour) {
    hour = newHour;
    return this;
}

Clock * Clock::setMinutePtr(int newMinute) {
    minute = newMinute;
    return this;
}

Clock * Clock::setSecondPtr(int newSecond) {
    second = newSecond;
    return this;
}

// Cascading Setters which return a reference
Clock & Clock::setHourRef(int newHour) {
    hour = newHour;
    return (*this);
}

Clock & Clock::setMinuteRef(int newMinute) {
    minute = newMinute;
    return (*this);
}

Clock & Clock::setSecondRef(int newSecond) {
    second = newSecond;
    return (*this);
}

// Getters
int Clock::getHour() const {
    return hour;
}

int Clock::getMinute() const {
    return minute;
}

int Clock::getSecond() const {
    return second;
}

// Advance one hour
void Clock::advanceOneHour() {
    if((hour + 1) >= 24) {
        hour = 0;
    }
    hour = (hour + 1) % 24;
}

void Clock::advanceOneMinute() {
    if((minute + 1) >= 60) {
        minute = 0;
        hour++;
    }
    minute = (minute + 1) % 60;
}

void Clock::advanceOneSecond() {
    if((second + 1) >= 60) {
        second = 0;
        minute++;
    }
    second = (second + 1) % 60;
}

// Printing methods
void Clock::printTwoDigits(int number) const {
    cout << setw(2) << setfill('0') << number;
}

void Clock::printTime() const {
    printTwoDigits(hour); cout << ":";
    printTwoDigits(minute); cout << ":";
    printTwoDigits(second); cout << endl;
}

ClockMain.cpp

// ClockMain.cpp

#include <iostream>
#include "Clock.h"

using namespace std;

// Advance the clock by one hour with a value parameter
void advanceOneHourVal(Clock myClock) {
    myClock.advanceOneHour();
}

// Advance the clock by one hour with a pointer parameter
void advanceOneHourPtr(Clock * myClock) {
    myClock->advanceOneHour();
}

// Advance the clock by one hour with a reference parameter
void advanceOneHourRef(Clock & myClock) {
    myClock.advanceOneHour();
}

int main() {
    Clock c1;

    cout << "Setting the clock to 2:03:04 using normal setters" << endl;
    c1.setHour(2); c1.setMinute(3); c1.setSecond(4); c1.printTime();

    cout << "Advancing the clock one hour with a value parameter" << endl;
    advanceOneHourVal(c1);
    c1.printTime();

    cout << "Advancing the clock one hour with a pointer parameter" << endl;
    advanceOneHourPtr(&c1);
    c1.printTime();

    cout << "Advancing the clock one hour with a reference parameter" << endl;
    advanceOneHourRef(c1);
    c1.printTime();

    cout << "Setting the clock to 8:09:10 with cascading setters returning an instance" << endl;
    c1.setHourIns(8).setMinuteIns(9).setSecondIns(10);
    c1.printTime();

    cout << "Setting the clock to 5:06:07 with cascading setters returning a pointer" << endl;
    c1.setHourIns(5).setMinuteIns(6).setSecondIns(7);
    c1.printTime();

    cout << "Setting the clock to 11:12:13 with cascading setters returning a reference" << endl;
    c1.setHourIns(11).setMinuteIns(12).setSecondIns(13);
    c1.printTime();

    cout << "Setting the clock to 23:59:59" << endl;
    c1.setHourRef(23).setMinuteRef(59).setSecondRef(59);
    c1.printTime();
    c1.advanceOneSecond();
    cout << "Advancing the clock one second" << endl;
    c1.printTime();
}

Точно так же я получаю аналогичные ошибки в классе Date. Ошибка указывает на неправильный возврат функций void при продвижении.

Date.cpp

// Date.cpp
// This class describes a Date.

#include <iostream>
#include <iomanip>
#include "Date.h"

using namespace std;

// Constructor for Clock
Date::Date() {
    year = 0;
    month = 0;
    day = 0;
}

// Normal Setters
void Date::setYear(int newYear) {
    year = newYear;
}

void Date::setMonth(int newMonth) {
    month = newMonth;
}

void Date::setDay(int newDay) {
    day = newDay;
}

// Cascading Setters which return an instance
Date Date::setYearIns(int newYear) {
    year = newYear;
    return (*this);
}

Date Date::setMonthIns(int newMonth) {
    month = newMonth;
    return (*this);
}

Date Date::setDayIns(int newDay) {
    day = newDay;
    return (*this);
}

// Cascading Setters which return an pointer
Date * Date::setYearPtr(int newYear) {
    year = newYear;
    return this;
}

Date * Date::setMonthPtr(int newMonth) {
    month = newMonth;
    return this;
}

Date * Date::setDayPtr(int newDay) {
    day = newDay;
    return this;
}

// Cascading Setters which return a reference
Date & Date::setYearRef(int newYear) {
    year = newYear;
    return (*this);
}

Date & Date::setMonthRef(int newMonth) {
    month = newMonth;
    return (*this);
}

Date & Date::setDayRef(int newDay) {
    day = newDay;
    return (*this);
}

// Getters
int Date::getYear() const {
    return year;
}

int Date::getMonth() const {
    return month;
}

int Date::getDay() const {
    return day;
}

// Advance one date
void Date::advanceOneYear() {
    year = year + 1;
}

void Date::advanceOneMonth() {
    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 9 || month == 11) {
        month = (month + 1) % 31;
    } else if (month == 2) {
        month = (month + 1) % 28;
    } else {
        month = (month + 1) % 30;
    }
}

void Date::advanceOneDay() {
    day = (day + 1) % 365;
}

// Printing methods
void Date::printTwoDigits(int number) const {
    cout << setw(2) << setfill('0') << number;
}

void Date::printDate() const {
    printTwoDigits(year); cout << ":";
    printTwoDigits(month); cout << ":";
    printTwoDigits(day); cout << endl;
}

Date.h

// Date.h
// This class describes a Clock.

class Date {
    private:
        int day;
        int month;
        int year;
    public:
        // Constructor
        Date();

        // Normal Setters
        void setYear(int newYear);
        void setMonth(int newMonth);
        void setDay(int newDate);

        // Cascading Setters returning an instance
        Date setYearIns(int newYear);
        Date setMonthIns(int newMonth);
        Date setDayIns(int newDate);

        // Cascading Setters returning a pointer
        Date * setYearPtr(int newYear);
        Date * setMonthPtr(int newMonth);
        Date * setDayPtr(int newDate);

        // Cascading Setters returning a reference
        Date & setYearRef(int newYear);
        Date & setMonthRef(int newMonth);
        Date & setDayRef(int newDate);

        // Getters
        int getYear() const;
        int getMonth() const;
        int getDay() const;

        // Advance one hour
        void advanceOneYear();
        void advanceOneMonth();
        void advanceOneDay();

        // Printing Methods
        void printTwoDigits(int number) const;
        void printDate() const;
};

DateMain.cpp

// DateMain.cpp

#include <iostream>
#include "Date.h"

using namespace std;

int main() {
    Date d1;

    cout << "Setting the date to 2018/02/17 using cascading setters" << endl;
    d1.setYear(2018).setMonth(2).setDay(17);
    d1.printDate();

    cout << "Advancing the date one month" << endl;
    advanceOneMonth(d1);
    d1.printDate();

    cout << "Happy St. Patrick's Day!!" << endl << endl;

    cout << "Setting the date to 12/31/2018 (US Style) using cascading setters" << endl;
    d1.setMonth(12).setDay(31).setYear(2018);
    d1.printDate();

    cout << "Advancing the date one day" << endl;
    advanceOneDay(d1);
    d1.printDate();

    cout << "Happy New Year!!" << endl;
}
c++
1
Daniel Maguire 11 Окт 2019 в 23:00
Я бы удалил все варианты *Ins, *Ptr, *Ref и реализовал одну версию, которая возвращает ссылку для связывания.
 – 
Josh Wilson
11 Окт 2019 в 23:12
1
Задавая вопрос, удалите из него все, не относящееся к делу. Не заставляйте людей, в том числе себя, копаться в 500 строках кода на предмет ошибки в одной функции. Уменьшение шума из-за ненужного кода часто помогает обнаружить ошибку. Дополнительные сведения см. В минимальном воспроизводимом примере.
 – 
user4581301
11 Окт 2019 в 23:17

2 ответа

Проблема в том, что вы смотрите только на переменную seconds. Вам нужно проверить, нет ли переполнения. Что-то вроде этого:

if((seconds +1) >= 60) {
    //advance one minute...
}

Вам нужно будет делать то же самое и в остальные часы (минуты, часы и т. Д.).

1
Chipster 11 Окт 2019 в 23:11
Я обновил код, но получаю неожиданные, немного разные результаты :(
 – 
Daniel Maguire
11 Окт 2019 в 23:19
Поместите if перед сбросом числа.
 – 
Chipster
11 Окт 2019 в 23:27
Другой совет профессионала: используйте вместо этого свою функцию для продвижения. Так будет проще заставить его работать правильно.
 – 
Chipster
11 Окт 2019 в 23:31

Давайте рассмотрим эту функцию.

void Clock::advanceOneMinute() {
    minute = (minute + 1) % 60;
    if((minute + 1) >= 60) {
        hour++;
    }
}

В псевдокоде:

1. Add 1 to minute, divide by 60 and store the remain into minute.
2. If minute is greater or equal than 59, then add 1 to hour

Перед звонком: минута = 58, час = 5.

После звонка: минута = 59, час = 6.

Исправлено: изменение и сравнение подкачки

void Clock::advanceOneMinute() {
    if((minute + 1) >= 60) {
        hour++;
    }
    minute = (minute + 1) % 60;
}

Обратите внимание, что у Clock :: advanceOneMinute () такая же проблема.

0
JL. Sanchez 12 Окт 2019 в 02:40
Привет, я исправил код часа, минуты и секунды в этом посте, но дал мне все еще не ожидаемые результаты ...
 – 
Daniel Maguire
12 Окт 2019 в 05:56
Обратите внимание, что в моем предложении не было ни «минута = 0», ни «секунда = 0», и на это есть веская причина. Удалите эти строки и попробуйте еще раз ... Попробуйте следовать логике вашего кода!
 – 
JL. Sanchez
15 Окт 2019 в 15:10