2017年4月4日 星期二

[ORID 筆記法] 演算法作業2_找出最長迴文_C語言實作議題

Objective 客觀來說

繼上次只能夠處理演算法改良,這次時間上稍微充裕一些,多花一些時間研究I/O 和 pointer 的議題。

I/O 的部份:
認識到新的I/O的分別是:
輸入:比 scanf()更快的 getline() (API 說明文件: getline(3) - Linux man page
輸出:比 printf()更快的 putchar()

Pointer的部份:
將指標傳入遞迴函式的時候,發生錯誤怎辦?
解決方法:  c passing pointer to recursive function

怎麽直接讀取一行: getline()的部份:
How to read a line from the console in C?

注意:
getline()
ssize_t getline(char **lineptr, size_t *n, FILE *stream);

文件中提到
If *lineptr is NULL, then getline() will allocate a buffer for storing the line, which should be freed by the user program. (In this case, the value in *n is ignored.)
也就是說放入 getline() 的 *lineptr 為空的情況底下,getline()會自動幫程式動態配置一個緩存的空間

Alternatively, before calling getline(), *lineptr can contain a pointer to a malloc(3)-allocated buffer *n bytes in size. If the buffer is not large enough to hold the line, getline() resizes it with realloc(3), updating *lineptr and *n as necessary.
如果緩存不夠大,有必要的話,getline()會使用 realloc() 來重新分配緩存資源

最後一項 FILE *stream 是 input file handle

速度上的比較可以參考這篇 Fastest way to output a 2D array of char in C
Elapsed times are: 
0:09.46 with printf,
0:07.75 with putchar,
0:05.06 with putchar_unlocked.

Reflective 感受

你要如何形容今天的情绪:
自己獨立完成作業並通過,比起上次提交多次還不過的心情完全不同


Interpretive 解釋反思

發現上次可以改進的地方:
1. 由於上次過於想要一次就把架構在腦袋中實現,但是程式實做能力還跟不上,加上時間壓力讓自己的恐懼感壓垮理智。恐慌的時候讓我嚴重降低思考判斷能力。像是YEF的一階淘汰、分手失戀的時候那種腦袋瞬間當機的感覺,我想自己痛到骨髓的那種感覺,比別人都清楚

這次改採用一個步驟一個步驟的測試,每個步驟的輸出都完全正確之後,再前進到下一步,雖然笨,但是有效。

額外發現,再思考問題的時候,有注意到系統一(詳參快思慢想)潛意識的思維幫助我檢查了一些問題,並告訴我答案,當下我的系統二並沒有四思考,覺得有點特別,想要讓自己的系統二能夠跟上系統一個思考速度(另一個時刻是閱讀的時候,突然感覺自己的理解力視窗突然放大,但是幾秒候又回復平常的速度)。

2. 上次忘記補上程式碼的解說,這次有記得,避免疏忽冤枉失分(莫非定律,"以為"不會是大問題,結果真的發生的慘痛經歷)

3.  太急著想要完成一件需要深入思考的任務,往往都是失敗收場。所以,再解決一個問題以及嘗試實做的過程,耐著性子把說明文件、網路上的資料吸收,基礎觀念搞懂(ex pointer ),下次就不用還要重新理解一次


Decisional 修正行動

有哪些工作需要明天继续努力:
將基本功 I/O、pointer、array這些打磨清楚,比起這次將作業做出來,但有些實作細節還停留在知其然而不知其所以然的階段。

這個階段如果已經搞清楚,有助於降低日後的恐慌感


沒有留言:

張貼留言

/* 載入prettify的autoloader */ /* 載入JQuery */