2301_79991893 2023-12-13 20:48 采纳率: 40%
浏览 10

c++中运行到一般发生未经初始化的异常

类的声明.h
#pragma once
#include<iostream>
using namespace std;
class Date
{
    int Year, Month, Day;
    int JudgeYear(int Year);
    Date ChangeDate(int Days);
    int ChangeDays(int Year, int Month, int Day);
    friend void Test(int decision);
    friend ostream& operator<<(ostream& cout, Date D);
public:
    Date();
    int MonthDays(int n,int flag);
    Date(int m_Year, int m_Month, int m_Date);
    //某日期加上一个天数得到新的日期
    Date operator + (Date D)
    {
        Date D2;
        D2.Year = Year + D.Year;
        D2.Month = Month + D.Month;
        D2.Day = Day + D.Day;
        int flag = Date::JudgeYear(Year);
        if (D2.Day > MonthDays(Month, flag))
            {
                Month++;
                Day = Day % MonthDays(Month - 1, flag);
            }
        do{
            Month = Month % 12;
            D2.Year++;
        } while (D2.Month > 12);
        return D2;
    }
    //某日期减去一个天数得到新的日期
    Date &operator - (Date D)
    {
        Date D2;
        D2.Year = Year - D.Year;
        D2.Month = Month -D.Month;
        D2.Day = Day - D.Day;
        int flag = Date::JudgeYear(Year);
        if (D2.Day <0)
        {
            Month--;
            D2.Day = Day + MonthDays(Month, flag);
        }
        do {
            D2.Month += 12;
            D2.Year--;
        } while (D2.Month < 0);
        return D2;
    }
};
成员函数.cpp
#include"类的声明.h"
Date::Date()
{
    Year = 0;
    Month = 0;
    Day = 0;
}
Date::Date(int m_Year, int m_Month, int m_Day)
{
    Year = m_Year;
    Month = m_Month;
    Day = m_Day;
}
//判断年份是否是闰年
int Date::JudgeYear(int Year)
{
    if ((Year % 4 == 0 && Year % 400 != 0) || Year % 400 == 0)
        return 1;
    else return 0;
}
//返回不同月份的天数
int Date::MonthDays(int n,int flag)
{
    switch (n)
    {
    case 1:case 3:case 5:case 7:case 8:case 10:case 12:
            return 31;
            break;
    case 2:if (flag == 1)
        return 29;
          else
        return 28;
        break;
    default:return 30;
        break;
    }
}
//将指定的0年0月0日起的天数转换成对应的日期的函数
Date Date::ChangeDate(int Days)
{
    int sum = 0;
    int monthdays[2][12] = { {31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31} };
    if (Days / (365  * 3) == 0||Days%(365*3)==0)
    {
        Year = Days / 365;
        int x = Days % 365;
        int i = 0;
        for (i = 0;i < 12;i++)
        {
            sum = sum + monthdays[0][i];
            if (x < sum)
            break;
        }
        Month = i + 1;
        Day = x%(sum-monthdays[0][i]);
    }
    if (Days / (365*3) >= 1)
    {
        if (Days / (365 * 3) == 1)
        {
            Year = Days / 365+1;
            int x = Days % 365;
            int i = 0;
            for (i = 0;i < 12;i++)
            {
                sum = sum + monthdays[1][i];
                if (x < sum)
                    break;
            }
            Month = i + 1;
            Day = x % (sum - monthdays[1][i]);
        }
        else
        {
            int x = Days % (365 * 3 + 366);
            Year = Days / (365 * 3 + 366) * 4 + Days % (365 * 3 + 366) / 365+1;
            int i = 0;
            for (i = 0;i < 12;i++)
            {
                sum = sum + monthdays[0][i];
                if(x < sum)
                    break;
            }    
            Month = i + 1;
            Day = monthdays[0][i] - (sum % x);
        }
    }
    return *this;
}
//将指定日期转换成从0年0月0日起的天数的函数
int Date::ChangeDays(int Year, int Month, int Day)
{
    int days = 0;int eve = 0;
    int flag = Date::JudgeYear(Year);
    for (int i = 0;i < Month;i++)
    {
        eve = MonthDays(i, flag);
        days = days + eve;
    }
    if (Year <= 4)
    {
        days = days + Day;
    }
    if (Year > 4)
    {
        int n = Year / 4;
        int y = Year % 4;
        days = days + n * (365 * 3 + 366) + 365 * (y - 1);
    }
    return days;
}
ostream& operator<<(ostream& cout, Date D)
{
    cout << "年份:" << D.Year << "\n" << "月份:" << D.Month << "\n" << "日期:" << D.Day << endl;
    return cout;
}
主函数实现.cpp
#include "类的声明.h"

void Test(int decision)
{
    Date D;
    Date D1;
    switch (decision)
    {
        //1.某日期加上一个天数得到新的日期
    case 1:
        int Year, Month, Day, days;
        cout << "输入所要操作的日期:" << "\n" << "年份:" << endl;
        cin >> Year;
        cout << "月份:" << endl;
        cin >> Month;
        cout << "日期" << endl;
        cin >> Day;
        cout << "输入要加上的天数" << endl;
        cin >> days;
        D.Date::Date(Year, Month, Day);
        D1.Date::ChangeDate(days);
        D.operator+(D1);
        cout << "新的日期为" << D << endl;
        break;
        //2.某日期减去一个天数得到新的日期
    case 2:
        int Days;
        cout << "输入要转换的天数" << endl;
        cin >> Days;
        D.Date::ChangeDate(Days);
        D.operator+(D1);
        cout << "新的日期为" << "\t" << D;
        break;
        //3.计算两个日期的天数差
    case 3:
        Date D1, D2;
        cout << "输入要相减的两个日期的年月日:" << endl;
        int y1, m1, d1, y2, m2, d2;
        cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
        D1 = Date::Date(y1, m1, d1);
        D2 = Date::Date(y2, m2, d2);
        Date D3 = D1.operator-(D2);
        days = D3.ChangeDays(D3.Year, D3.Month, D3.Day);
        cout << "相差的天数为:" << days << endl;
    }
}

int main()
{
    Date D(0, 0, 0);
    int decision;
    cout << "输入要进行的操作:" << "\n" << "1.某日期加上一个天数得到新的日期" << "\n" << "2.某日期减去一个天数得到新的日期" << "\n"
        << "3.计算两个日期的天数差" << endl;
    cin >> decision;
    Test(decision);
}

为什么这段代码运行到一半就会显示未初始化的异常,应该怎么修改?

  • 写回答

3条回答 默认 最新

  • Loup&卡普 2023-12-13 22:11
    关注

    调用的地方 你直接 D = D + D1 就行了 不用写 operator 其他地方也是

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 12月13日