除錯怪現象之領悟

2021-06-20 20:56:12 字數 1729 閱讀 7259

除錯可謂是程式設計師的基本功,除錯乙個程式不但需要耐心,還要不錯的邏輯推理能力,筆者在剛開始除錯時就和老師遇到乙個怪事另二人絞盡腦汁。 

起初是一題目,用c語言的自定義函式寫乙個海**式計算三角形面積的控制台程式。

乍看沒什麼問題,要驗證程式的準確性,最簡單是代乙個三角形進去,但結果卻是:

總所周知的勾股數 3 4 5卻得出奇葩結果,而程式可以執行,就是不存在語法錯誤,這時候就要用除錯的方法了。

說到除錯,先要在可以的地方設定斷點,再一一排查,筆者對自己的水平不是很自信,說以如下設定斷點:

我在輸入的scanf都設定了斷點,而除錯 是:

到第十二行的除錯結果顯示輸入是正確的,即問題不是輸入時產生的,很有可能是自定義函式 的問題了,

不出所料,這就要到函式裡看看了,我重新設定了斷點在函式體裡面:

為了驗證if判斷是否符合三角形的特點,我在28行設了斷點,有很多人不明白我在28設點而不在24(28之前)設,這是因為,假如if是個錯誤的判斷三角形方式,那麼3 4 5就很有可能跳過if的23~27行而不停在設的點上,為了觀察判斷的結果,還是設在28行,但這是一般思路,現在可知如果是判斷出錯,輸入3 4 5時可能跳出的是「不能構成三角形」,結果又進一步驗證了這說法:

可見3 4 5得出的錯誤結果應該與判斷無關(但是不能肯定判斷沒錯),下一步應該最為關鍵,在計算三角形面積公式上,

果然問題出現在29行了,29行s的值是由數學函式sqrt返回的,會不會是sqrt用法的錯誤?筆者查了一下其用法,還詢問了一下老師,筆者和老師思考了很久,有可能是p。a。b。c資料型別不同而造成賦給sqrt的引數不對而造成的,但由上圖可知,為了保險起見,我將所有資料設成了雙精度浮點型數,就應該不是資料型別的問題了,致此,我們只有懷疑偉大的海倫——秦九韶公式是否有問題,如果真是由這個程式發現了公式的問題未嘗不是偉大的發現,我們再翻閱了公式,發現:

唉~~編****的難, 看來經驗主義是不行的,太多的公式的引數都是求平均值,所以我們都以為p是求三邊的平均值(好在高考沒遇到這題,要不跪了),原來p是三邊長除以2,我改回了之後:

終於成功了,這是我除錯的第乙個程式,沒想到令我明白這麼深刻的道理,別以為什麼公式都是用平均數。。。。

std for each 的奇怪現象

直接晾 template void test std pairpair int tmain int argc,tchar argv 這個可以編譯通過,但是改一下 template void test std pair pair 加乙個引用 int tmain int argc,tchar argv ...

richedit控制項奇怪現象

在對話方塊中新增了乙個richedit控制項,對話方塊就不顯示了 鬱悶,我試圖彈出乙個對話方塊,步驟如下 1.建立了乙個對話方塊資源的模板 2.雙擊模板建立對應的類 3.包含標頭檔案 4,彈出對話方塊,如下 caddtypedlg dlg dlg.domodal 但是,卻無法彈出對話方塊?其他的對話...

中國網路2010之黑洞怪現象

圖中google trends 走勢圖 文中提到的黑洞麼?根據alexa 的統計,中國 流量排行前五位的 分別是 接著再去google trends上看看這五個 在2010年這一年中的 訪問量 由於某種未知原因google.com.hk的流量沒有顯示在我的這個頁面上,需要注意的是這個統計的是dail...