九八寒露 C C 初學者《程式設計改錯總結》

2021-09-10 12:47:56 字數 3243 閱讀 9463

總是不accepted不要氣餒,去看看ranklist排名,有的大佬比你失敗次數還多。程式設計完全考察你思維的縝密性,符合題目限定的所有種型別情況都要考慮到。大佬們經過大量練習,縝密性比我們強,故會少犯很多錯誤。我們要做的是靜下心,一點一點去排查每乙個錯誤

(1)除非輸出語句要輸出漢字、中文符號(一般不會要求這樣做),**的所有字元(字母、數字、標點符號等)全都是在英文輸入法狀態下輸入的,檢查是否輸入了中文狀態下的單、雙引號『』「」逗號,分號;等等

(2)檢查字母大小寫,c/c++大、小寫字母是區分開的。例如:前面定義c,後面用c是不可以的

(3)除編譯預處理語句外,每個語句後面是否都加上了; 不加叫表示式,不叫語句

(4)程式語言講究對稱,前面有  ]  )  「  『  */等符號,檢查每乙個等符號

(5)檢查每個表示式、條件語句、迴圈語句、陣列、函式、結構體等等是否符合語法,例如:if-else、多重if-else語句是否寫了else(...) 這種錯誤形式;數學上的250<=s<500應該寫成250<=s&&s<500的形式……

(口訣:英文狀態,大小寫;分號,對稱,合語法。)

(1)在程式設計軟體上寫好程式後執行,輸入,符合題目限定的所有種型別情況(例如:題給的最大數,最小數;正數,零,負數;整數,小數;多組資料前一組比後一組輸入的資料長,短等等)尤其是極端情況都要輸入測試,根據輸出情況推測**出了問題。若輸入多個資料,可以採用控制變數的方法,每次輸入只改變乙個引數的值,比較每組資料的輸出之間的差異

(2)當發現一組輸入資料得到的是錯誤答案時,拿出紙筆,將這組輸入資料代入程式手算檢驗。記住,按照你寫的程式一句一句走,不能跳任何一步。當你讀到定義了乙個變數/陣列/指標等時,將它在紙上記下來,所有的記成一行(列)。當你讀到給某個變數賦值時,在紙上這個變數下(右)方記下資料,下一次時再在資料的下(右)方繼續記,以此類推,直到你發現推算出的資料與預期不符為止。(也可以用程式設計軟體除錯程式)改好程式後再次執行程式,若仍錯誤,再次用紙手算;若正確,輸入其他資料繼續檢驗

(3)檢查資料型別,定義的變數等的資料型別精度是否符合題目要求。例如:大的整數或其乘積不能用int型而要用long long型;float型儲存小數點後7位,double型儲存小數點後15位,故不建議用float型,容易丟失精度算出錯誤答案;整數/整數=整數,商的小數點後的會丟失,可在前補上1.0*將資料先變成double型再計算;long long對應%lld,int對應%d,double對應%lf,char對應%c,char a[105]對應%s,不同型別的格式控制符不能隨意混用

(4)檢查語句在程式中的位置,尤其是相對於{}的位置。例如:乙個輸入/輸出/賦值語句在迴圈內執行多次,如果不小心寫在了迴圈的{}符號外就只執行一次,兩者失之毫釐謬之千里;引用乙個變數前需要初始化為0或1,這個初始化語句寫在**執行才是對的需要認真考慮

(5)檢查每個變數/陣列等是否有賦值,賦值的位置是否正確,有沒有未賦值的變數或關於其的表示式賦值給了別的變數。例如:前面int a,c;int b=a;後面a=10;c=含有b的表示式;這樣是不行的,因為這不是指標,a和b不是繫結關係,不能認為前面寫個b=a,後面a的值一變,b就跟著變了。b=a;只是在執行到這個語句時給b賦一次a的值,後面b的值並不會再變化,除非又寫一條b的賦值語句,或者這是在乙個迴圈裡,下次迴圈時給b再賦予a的值

(6)不要輸出提示資訊(please input n:)和讓程式按任意鍵退出(在程式末尾加上system(" pause");或getchar();)oj系統的輸入是自動完成的,沒有人手動輸入檢驗你提交的程式。所以,題目讓你做什麼你就做什麼,沒有讓你做的不要多做,做了算你錯

(口訣:輸,算,查,改;查,型位值)

(1)仔細對照樣例輸入(sample input)、樣例輸出(sample output)檢查是否多/少輸出了空格 換行\n製表符\t等。

例如:對於x x x x這種輸出可以用下面這一種方法控制:

for(int m=0;m這樣可避免行首/末多輸出空格。但實際運用中不能照抄,可能需要更改。

(1)程式陷入了死迴圈,迴圈的終止判斷條件沒有/寬泛/無法達到。解決辦法參照2(2)

(2)程式可以正常結束但是用時超出oj系統限制(一般1000ms)。優化演算法,用更簡捷的演算法重新寫程式。例如:有的題是找規律題,試寫出前若干項以探索其規律(這種題需平常多練以積累經驗);有的題資料很多,那就嘗試改用高階的容器存放和檢索資料而非暴力的遍歷求解;有的題不能用函式遞迴呼叫以防超時

(1)陣列等容器開闢的太大。減少開闢數量或優化演算法

(2)遞迴呼叫占用太多記憶體。優化演算法

(3)容器忘記清空

(1)為除錯而新增的輸出語句未刪去/注釋掉或遞迴遍歷而多輸出了內容

(2)資料型別不合理等問題致輸入測試資料後儲存不合理資料而無限輸出

hdoj的faq總結的比較好,我就直接複製過來了:執行時錯誤,這個一般是程式在執行期間執行了非法的操作造成的。以下列出常見的錯誤型別:

(1)access_violation

您的程式想從一些非法的位址空間讀取或向其中寫入內容。一般例如指標、陣列下標越界都會造成這個錯誤的

(2)array_bounds_exceeded

您的程式試圖訪問乙個超出硬體支援範圍的陣列單元

(3)float_denormal_operand

進行了乙個非正常的浮點操作。一般是由於乙個非正常的浮點數參與了浮點操作所引起的,比如這個數的浮點格式不正確

(4)float_divide_by_zero

浮點數除法出現除數為零的異常

(5)float_overflow

浮點溢位。要表示的數太大,超出了浮點數的表示範圍

(6)float_underflow

浮點下溢。要表示的數太小,超出了浮點數的表示範圍

(7)integer_divide_by_zero

在進行整數除法的時候出現了除數為零的異常

(8)integer_overflow

整數溢位。要表示的數值太大,超出了整數變數的範圍

(9)stack_overflow

棧溢位。一般是由於無限遞迴或者在函式裡使用了太大的陣列變數的原因

(10)......

其他錯誤,包括c++標準庫/stl執行時庫錯誤等,這裡不再舉例

經過不停的錘煉,相信你一定會成為合格的程式猿/程式媛,加油!小凡

2023年10月06日23:29

css總結 初學者

position absolute 絕對定位 position relative 相對定位 position static 靜態定位 position sticky是乙個新的css3屬性,它的表現類似position relative和position fixed的合體,在目標區域在螢幕中可見時,它...

來自初學者的vector容器總結 C C

vector 常被稱為向量容器,是 stl 中最常用的容器之一,vector容器簡單的說 vector是乙個能夠存放任意型別的動態單端陣列,能夠增加和壓縮資料。使用vector容器必須包含標頭檔案 include vector屬於std命名域的內容,因此需要通過命名限定 using std vect...

程式設計初學者入門之我見

如今大學計算機教育為人們詬病所不少,自己在高校也有若干年份了,所謂一流高校,二流高校也都泡過,帶了不少課程,也知道不少學生總覺得在學校裡面學不到什麼東西,總想參加it培訓之類。自己也帶過不少有潛質的學生,在一些交流中,有不少學生參加了不止一次的培訓,有一些人覺得有收穫,也有一些覺得自己學的只是一些皮...