iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Software Development

C++ 三十天學習紀錄系列 第 15

【Day 15】Function - Practice 1

  • 分享至 

  • xImage
  •  

前言
其實分享我寫題目的過程也算是一種自我檢討,所以使用的方法可能不會是最完美的,還請各讀者多多包涵...

題目


輸入輸出格式

sol.
這題題目有點難用文字看懂,我寫的時候想超久,不過可以畫成一個表格來看,例如我們輸入


此為n=2的情況,每一次輸入都要判斷 n = 2、3、4、5、6 等五種情況的 MAPE 並選出最小值。

pseudocode
輸入periodCutsale表示一期的資料
建立陣列sales存取各期資料、MAPEarray存取n = 2、3、4、5、6時的 MAPE、ansArray存取最後要輸出的答案。

我在這邊使用的方法為建立一個函數判斷完各種情況的MAPE後再回到main function,不過我認為這不是最好的方法。 // 註1

void MAPE(int windowSize, int periodCut, const int sales[], int MAPEarray[], int ansArray[]);

宣告變數 total、now、min,分別代表 https://chart.googleapis.com/chart?cht=tx&chl=%5CSigma%20%5Cfrac%7BXt-ft%7D%20%7BXt%7D 、現在的加總、目前為止的最小 MAPE 值。

for i in range n
    total = 0.0    // 初始化
        for j in range j=i ~ periodCut
            now = 0.0    // 初始化
                for k in range j-i ~ k<j
                    now += 第k期的資料 / float(i)    // 將i轉換為小數型態,除出來才會是小數
                    now += (第j期的資料 – now) / 第j期的資料
                    now 取絕對值
                    total += now

    將 (total/(periodCut – i) * 100) 轉換為int,並插入 MAPEarray
    if 新加進去MAPEarray的這個數值 > min
        min = 新加進的數
        WindowSize = i
        並將widowSize, min加入ansArray

接著回到main function中直接輸出答案

註1:

float MAPE(int indowSize, int PeriodCut, const int sales[]);

此函數所回傳的值為 n = 2 ~ 6 各情況的 MAPE,這個函數的工作基本上與前面void MAPE函數無異,不過將最後比 MAPE 大小的部分移至 main function 中做。

在 main function 中跑一個 for 迴圈:

for n = 2 ~ 6
    呼叫MAPE函數
    回傳值有沒有 > 目前最小的MAPE

最後輸出答案

上一篇
【Day 14】Function 函數
下一篇
【Day 16】Function - Practice 2
系列文
C++ 三十天學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言