程式設計體會 有效的流程很關鍵

2021-09-16 22:46:03 字數 3011 閱讀 4739

寫程式的時候,正確合適的工作流程能夠確保高效地完成工作目標,這篇文章將主要介紹從頭到尾解決程式設計問題的策略,與各位在程式設計之路上共勉。應用這一結構化的流程能盡可能地縮減令人沮喪地除錯過程,在更少的時間裡寫成更清晰更正確的**。

給出乙個示例練習題用來說明。

問題:給定兩個字串sourcestring和searchstring,返回searchstring出現在sourcestring中的第乙個索引。如果searchstring未在sourcestring**現,則返回-1。

直接從寫**開始實際上是乙個荒謬又懶惰的思路。在寫一篇文章之前,你首先會搞清楚你的假設和證據,以確保你的論證是合理的。如果你不這樣做,後面當你發現寫的內容整體無法合適地組織起來時,你又要重新開始,這就浪費了很多時間。寫**也是這樣,甚至可能更糟,就像把洗髮水揉進眼睛裡。

通常而言,乙個問題的解決方案並不是淺顯直觀的,即使乍看起來很簡單。在紙上琢磨一下能讓你找到解決方案並驗證該方案在一些不同場景中的效果。所有這些工作都應該在寫下任何一行**之前完成。

所以,先不要寫**。甚至不要去想**。後面會有足夠的時間去新增分號和括號。現在你只需要搞清楚你作為一台人體計算機,會如何解決這個問題。

畫圖。使用箭頭。在小方框裡填寫數字。只要能讓你視覺化這個問題,那就去做吧。你的目標是解決問題,你能用紙張和筆去盡情發揮,而不受限於鍵盤。

首先找一些簡單的輸入。例如,假設你的函式是取乙個字串:abc。搞清楚正確的結果是什麼,然後去想如何解決這個問題以及所涉及到的步驟。

我們假設我們的字串有以下值:

sourcestring =

"sahjfansjd"

searchstring =

"fan"

我的想法是像下面這樣展開的:

好吧,我看到sourcestring包含searchstring。但我是怎麼看出來的呢?額,首先我從sourcestring的開頭開始閱讀,檢查每3個字元構成的片段是否與詞fan匹配,直到結束。比如,我看到了sah、ahj、hjf等組合,當我看到索引4時,我找到了fan,所以我確定找到了匹配並且是從索引4開始。

當我們寫下我們的演算法時,需要確保我們表達了一切並能夠處理所有可能的情況。當我們確實找到匹配時,返回正確的答案當然很好,當我們也需要在沒找到匹配的時候同樣能返回正確答案。

我們再以另一對字串為例:

sourcestring =

"sahjfasjd"

searchstring =

"fan"

這裡,我們同樣首先從sourcestring的開頭開始閱讀,檢查每3個字元構成的片段是否與詞fan匹配,直到結束,字串末尾,最後我們確定其中沒有匹配,因此返回==-1==。

我們已經確定了解決這個問題的一系列步驟(在程式設計領域,我們稱之為演算法),也已經嘗試了一些不同的場景,每一步都得到了正確的結果。現在,我們已經相信我們的演算法有效了,是時候形式化這個演算法了,這就是下乙個步驟。

想想第一步確定的演算法,然後用平實易懂的語言把它寫下來。這能使這些步驟顯得具體,讓我們在寫**時能夠回顧參考。

從字串開頭開始檢查

檢查每3個字元構成的片段

如果其中有任何片段等於searchstring,就返回當前索引

如果直到該字串結束也沒找到任何匹配,就返回== -1==

看起來,還不錯喲!

偽**並不是真正的**,但卻模仿了**的結構。下面是為上面的演算法寫的偽**:

for each index in sourcestring:

n =len(searchstring)

match = sourcestring[index, index + n]

if match == searchstring:

return index

return

-1

偽**與**的接近程度完全由我們自己決定,慢慢地練習,會發現最適合自己的風格。

對於更簡單的問題,這個步驟可以和上一步一起完成。

這是整個流程中,我們第一次必須考慮句法、函式引數和語法規則。也許沒法寫出所有的一切,但沒有關係,把我們能寫出來的部分先寫出來。

def

myfunc

(sourcestring, searchstring)

: n =

len(searchstring)

for index in

range

(len

(sourcestring)):

match = sourcestring[index: index + n]

if match == searchstring:

return index

return-1

myfunc(sourcestring, searchstring)

在寫下上面這段**的時候,我們已經開始調動我們的程式設計知識,將能執行的**寫出來了,中間肯定會有報錯和除錯的過程。

**新人常會犯乙個錯誤:在網際網路上找一下寫著可能有效的東西,然後不加測試地將其插入到自己地程式中。你的程式中你不理解地片段越多,就越不可能得到最後正確的解決方案。

每增加乙個你不確定的東西,你的程式可能出錯的方式都會翻一倍。對某事不確定?ok—如果**無效,那麼這裡可能就是問題所在。

你的程式可能出錯的方式遵循梅森序列:a(n

)=2n

−1

a(n)=2

n−1

首先測試你的新**。在網上找東西是可以的,但是在將其插入你的程式之前應該在另乙個單獨的小空間裡測試一下它,以確保其工作方式和你所想的一樣。

在前一步寫正式**的時候,我忘記字元切片是怎麼做的了,所以第一次執行的時候報了錯,好在找到了想起來怎麼做了,把問題解決了就ok了。

如果你讀到了這裡,我現在只想說:試試這種策略。回到你上週因為受挫而擱置一旁的程式設計問題。保證你能立馬看到效果。祝好運,程式設計快樂。

關於程式設計風格的體會

學習程式設計有半年了,有的只是暈暈的頭和到處的問題,好幾次都要放棄了!也許是高中的班主任的那句話 性格決定命運 吧,我挺過來了,現在在努力 的學習c 和資料結構,沒有籃球場上的霸氣,沒有籃球場上的傲視群雄!有 的只是一顆嚮往it的心,那種感覺是莫名的,是沒有理由的。名字的合理選擇可以幫助讀者理解程式...

怎樣有效的學習程式設計

很多想學程式設計的朋友都說,進入it行業是一件很困難的事情。認為這門專業很有發展前景,但是卻很高深,因而望而卻步,致使很多計算機專業的學生也放棄了。學程式設計和學其他技術一樣只要用功學沒有什麼難的 1.樹立信心 認為自己基礎差,學歷低,學了也沒什麼用處。要知道,任何公司都是要贏利的,任何公司用人都是...

個人對結對程式設計的體會

1.結對程式設計 首先,拜讀了 構建之法 結對程式設計是指倆人肩並肩,使用同一臺電腦,同乙個滑鼠,鍵盤的程式設計。這樣的話,就可以進行互補的開發工作,這樣進行,會使編輯 的效率增高很多,大大減少開發時間和效力。1 首先,旁觀者清,旁觀者可以很容易找出程式設計者的錯誤,這大大降低了出錯的概率。2 其次...