DS博客做業01--日期抽象數據類型設計與實驗

1.思惟導圖及學習體會

1.1第一張緒論知識點思惟導圖

1.2學習體會

一開學就是大做業,我方了。學習數據結構呢其實跟以前學習C的時候感受沒多大差異,最主要的就是從C換成了C++,雖然並無學過C++,可是還有百度(可還行)。不會就查,查多了,也就懂得多了,畢竟C++跟C差很少。最主要得是,C++真的比C要少寫好多行代碼。目前學的知識呢,還比較簡單,不過接下來要更加努力,別再像上學期那樣到課設的時候,還有知識點不會去查書。

2.大做業做業內容

2.1設計日期的ADT類型

ADT Date{
數據對象:D={year,month,day|year,month,day屬於ElemType類型}
數據關係:R={<year,month>,<month,day>}
數據操做:
Status InitDate(Date &date, ElemType year, ElemType month,ElemType day);
    //初始化日期
    //操做結果:構造三元組date,元素year、month、day分別爲年、月、日
string ExpDate(Date date);
    //初始條件:三元組date存在
    //操做結果:以字符串的形式輸出日期
Status IsLeapyear(ElemType year);
    //初始條件:三元組date存在
    //操做結果:如果閏年則返回TRUE,不然返回FALSE
string Week(Date date);
    //初始條件:三元組date存在
    //操做結果:返回這個日期是星期幾
string MonthInEnglish(Date date);
    //初始條件:三元組date存在
    //操做結果:返回月份英文名
void AddDate(Date &date, ElemType days);
    //初始條件:三元組date存在
    //操做結果:返回當前日期增長days天的日期
char CompareDate(Date date,Date OtherDate);
    //初始條件:三元組date存在
    //操做結果:比較當前日期與OtherDate的邏輯關係
}ADT Date

2.2數據抽象:頭文件

Common.h

Date.h

2.3數據封裝說明

(1)構造三元組函數

分配動態內存,構造三元組,並判斷日期是否合法
ios

(2)格式化日期函數

以字符串的形式輸出日期
數據結構

(3)判斷閏年函數

按照公式判斷該日期是年份否是閏年,是返回TRUE,反之返回FALSE
函數

(4)返回星期函數

根據公式判斷該日期所在的星期,並返回該星期
學習

(5)返回月份英文函數

(6)增長日期函數

輸入所加的天數,並返回增長改天數以後的日期
設計

(7)比較函數

判斷輸入日期與原日期之間的邏輯關係
3d

(8)主函數

int main()
{
    Date date;//定義一個date的三元組
    int year, month, day;
    int days;
    string newDate;         //增長days天后的日期
    Date otherDate;
    string strDate;
    string strWeek;
    string str;
    char op;
    ifstream infile;
    infile.open("input.txt", ios::in);
    ofstream outfile;
    outfile.open("output.txt", ios::out);
    while (!infile.eof())
    {
        infile >> year >> month >> day;
        if (!InitDate(date, year, month, day))
        {
            strDate = ExpDate(date);
            cout << strDate << "不是合法日期" << endl << endl;
            outfile << strDate << "不是合法日期" << endl << endl;
            continue;
        }
        strDate = ExpDate(date);
        cout << strDate << endl;
        outfile << strDate  << endl;
        if (IsLeapyear(year))
        {
            cout << year << "是閏年" << endl;
            outfile << year << "是閏年" << endl;
        }
        else
        {
            cout << year << "不是閏年" << endl;
            outfile << year << "不是閏年" << endl;
        }
        strWeek = Week(date);
        cout << strDate << strWeek << endl;
        outfile << strDate << strWeek << endl;
        str = MonthInEnglish(date);
        cout << strDate << "月份是" << str << endl;
        outfile << strDate << "月份是" << str << endl;
        cout << "請輸入增長天數:";
        cin >> days;
        AddDate(date, days);
        newDate = ExpDate(date);
        cout << strDate << '+' << days << "是" << newDate << endl;
        outfile << strDate << '+' << days << "是" << newDate << endl;
        cout << "請輸入與當前日期相比較的日期:";
        /*cin >> year >> month >> day;
        while (!InitDate(otherDate, year, month, day));
        {
            cout << "請輸入正確的日期:" << endl;
            cin >> year >> month >> day;
        }*/
        while (1)
        {
            cin >> year >> month >> day;
            if (!InitDate(otherDate, year, month, day))
            {
                cout << "請輸入正確的日期:" << endl;
                continue;
            }
            else
                break;
        }
        newDate = ExpDate(otherDate);
        op = CompareDate(date, otherDate);
        cout << strDate << op << newDate << endl<<endl;
        outfile << strDate << op << newDate << endl<<endl;
    }
    infile.close();
    outfile.close();
    system("pause");
}

3.結果展現

輸入數據

輸出結果

4.調試碰到問題

  • 一開始的時候,輸出英文月份的那個函數沒法運行,致使整個函數都崩了。去找了一下我函數中的邏輯關係,發現並無問題,可是一到那個地方程序就崩了,以後又差很少找了半個多小時的代碼問題(由於vs那會不太會調試,就沒一步步調試了),後來忽然get到vs的調試方法,而後從頭調試,而後發現就算三元組傳遞到函數的時候沒有&取地址符也會改變三元組中數據的值,就把每一個函數都添加了一些臨時變量,來存放三元組中的值。而後程序就正確運行了。
相關文章
相關標籤/搜索