期末將至,希望同學們能好好復習,成績理想,在此寫下一些本學期的學習體會,希望能幫到大家,
文章目錄
- 寫程式前的準備
- 程式錯誤
- 代碼風格
- 資料型別
- 運算子和運算式
寫程式前的準備
我們這門課程的核心能力就是寫程式,但是寫一個程式不僅僅是敲幾行代碼這么簡單,寫程式是一個綜合的程序需要我們分析問題、設計演算法、撰寫程式、編譯程式、除錯程式、日后我們還需要撰寫程式檔案,這些步驟缺一不可,而且都很重要,
有的同學看見一道題目想了想就直接開始在電腦上敲了,其實這是不對的,對于我們而言,在敲代碼之前,首先要審題,把題目要求看懂,比方說【判斷點是否在圓上】這一題,之前我就看見有同學判斷的是點是否在園內,這樣犯錯得不到分是很冤的,

其次一定要有全域思考的程序,要非常清楚整個程式的思路流程,我的個人建議是:最好把程式思路寫一遍,哪里需要注意的,哪里是實作演算法的關鍵地方,哪里容易忽略的,都應該在草稿紙上呈現出來,因為當你思考整個程式的時候,一些細節就可以注意到,這樣你在打代碼的時候就不會疏漏,倘若是一邊打代碼,一邊思考,很容易就會忽略重要的東西,最糟糕的是,當你把代碼全部寫好后,一編譯,全是錯誤,辛辛苦苦把錯誤改正好后,一運行,結果跟自己想的不同,然后又重新開始看自己的代碼哪里有問題(當然有時候這個環節不可避免,改程式會在后面講到),
在紙上把流程寫好后,把代碼打好,對于我們來說就是一個不難的事情了,從這點看來,我們實際上就是工程師,把我們已掌握的知識進行組合,再用程式這個工具加以實作,對于工程師來所,圖紙是最重要的東西,有了圖紙,萬丈高樓才能搭建起來,
當然了,之前講到,程式有錯誤是難以避免的,我們盡可能在準備階段減少問題發生的可能性,但一旦問題發生了,我們還得去改正,
程式錯誤
程式錯誤無非就是三類,一是語法錯誤,這個是很容易改正的,因為編譯器會報錯,但有的語法在codeblocks上沒問題,但是在OJ系統上是過不了的,暫時發現了幾個,跟大家分享下:
1、 gets函式和puts函式在現在codeblocks的版本中是包含在stdio.h中的,一些數學函式如abs等在stdio.h中也是有的,這時后如果你沒有寫 <string.h>或<math.h>,OJ系統是判定你錯誤的,
2、 在寫多個函式時最好現在main函式前宣告,然后再在main函式下方寫已宣告的函式,否者的話,OJ系統有可能報錯,
3、 定義結構體時,應該在main函式前定義,如果在main函式里面定義結構體,OJ系統會現實編譯錯誤,
4、 沒有return 0;有超時的可能性
第二類的錯誤是運行錯誤,即由于編譯成功了,但是由于程式中的不合理操作,導致無法繼續正常運行的錯誤,例如:
1、 死回圈,
2、 用scanf陳述句輸入時變數前沒有取地址“&”.
3、 鏈表“斷開”了(上一個結點的指標域不能指向下一個結點)
第三類錯誤是邏輯錯誤,這類錯誤往往比較難以發現和改正.
有時候表現為自己的結果和預期結果不同,這種可通過跟蹤變數來改錯,也就是Debug,當然也可以直接在程式的不同位置輸出資料來跟蹤變數的變化情況,
有的時候,表現為自己測驗的資料正確,提交到OJ上判定為錯,這時候情況呢比較棘手,需要通過自己設計資料來判斷發現錯誤,一般可以設計邊界值,特殊值,例如尋找鞍點這一道題,有沒有可能鞍點在第一個位置但是程式判斷不到呢,有沒有可能鞍點有兩個呢,有沒有可能有重復資料呢,這些資料都是可以自己輸入判斷的,如果在設計最開始沒有考慮到這些問題,就要在改程式的時候去驗證,去改正,
代碼風格
回到寫代碼這個問題上,首先希望大家能有一個好的代碼風格,雖然C語言對源代碼的格式沒有特別規定,可以將幾條陳述句寫在一行,也可以換行不縮進,但是這樣的程式可讀性差,不易于理解,一方面不方便自己查改,另一方面不方便與人交流,再者當以后我們的程式寫的很長的時候,不好的代碼風格可能會影響你的思路開展,我們可以參照下課本的代碼,或者我們寫的題解的代碼風格也基本和書本上是一致的,大家可以參照下面的例子:【學生資訊管理】,
#include <stdio.h>
struct student
{
int screo[11];
};
typedef struct student DEG;
int main()
{
DEG stu[1005],t;
int i,j,n,m,sum[20],t1; //變數取名盡量望名知意
double ave[20];
scanf("%d%d",&n,&m);
//一個較為完整的功能塊結束后可以適當換行
for (i=0;i<n;i++)
{ //用大括號后縮進一個Tab
for(j=0;j<m;j++) //讀入資料(做適當的注釋,方便自己和他人的理解)
{
scanf("%d",&stu[i].screo[j]); //注意結構體的使用
sum[i]+=stu[i].screo[j];
}
}
for (i=0;i<m;i++) //注意m,n的使用
{
for (j=0;j<n;j++)
{
ave[i]+=stu[j].screo[i];
}
ave[i]/=n; //算出平均分
}
for (i=0;i<n-1;i++) //冒泡排序
{
for (j=0;j<n-1-i;j++)
{
if (sum[j]<sum[j+1]) //交換學生資訊的同時還要交換總分
{
t=stu[j];
stu[j]=stu[j+1];
stu[j+1]=t;
t1=sum[j];
sum[j]=sum[j+1];
sum[j+1]=t1;
}
}
}
for (i=0;i<n;i++) //輸出資料
{
for (j=0;j<m;j++)
{
printf("%d ",stu[i].screo[j]);
}
printf("\n");
}
for (i=0;i<m;i++)
printf("%.1lf ",ave[i]);
return 0;
}
資料型別
關于資料型別,分為基本型別,構造型別,指標型別,和空型別(void),基本型別的大類是整型、浮點型、字符型,只是在此基礎上還可以細分,如有無符號,精度是單精度還是雙精度等,基本使用上我們都懂,只是我們應該注重細節,加深理解,
整型的運用大家都比較熟練,浮點型大家記住沒有特別要求就用double型別就好了,用float的話,某些情況下OJ有可能會判錯,但是用double的話也要記得輸入時要用“lf”的格式字符,這里要注意1.23e3是浮點型資料的一種表示方法,代表1.23*10^3,關于字符型的使用,大家要記得轉義字符的使用,我們比較常用的是‘\n’、‘\0’,但還又其他的一些轉義字符的使用,大家翻課本回憶下,
講到資料型別就不得不提及資料存盤的問題了,大家得清楚資料在記憶體中存盤的原理,例如,宣告了整型資料型別a后(int a),系統就為其開辟了一個4個位元組(不同型別位元組數不同)的空間,專門用于存放資料(以二進制的形式),并且給這4個位元組命名為a,當你要使用這個資料是,通過變數名a就可以直接呼叫,亦或者你取a的地址,知道了這個資料所在的位置,你就可以通過地址直接定位到資料的位置使用,通過改動記憶體中這4個位元組中存盤的內容,就可以實作改變資料,理解清楚這一點后,對后面指標和鏈表的學習非常有幫助,
資料的存盤,比較特別的是字符型的存盤,在記憶體中是以ASCII碼的形式存盤的,其實也可以理解為用特定的一些數字代表特定的字符,這就意味著,字符型是可以做運算的,
對于不同資料型別之間的運算和資料型別資料的轉換,大家也要注意,自動型別轉化,浮點型和整型之間的計算,字符型和整型之間,都是一個怎么樣的運算關系,強制型別轉換,在判斷整數如何使用,這里設計的細節比較多,而且課上都講過,大家看看書,回憶一下,回憶不起來也沒有關系,看書也可以看懂,
運算子和運算式
就運算子和運算式來說,值得注意的是資料的運算規則,尤其是一些比較細的地方,例如整型相除向0取整的規則,求模結果的符號與被除數的相同,自加自減運算(i++、++i)中,是先計算結果還是先運算的問題,還有各種運算子的優先級,結合性,大家都要搞清楚,在書本208頁,有“運算子及其特征的表格”內容比較詳細,大家可以稍加記憶,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/244330.html
標籤:其他
上一篇:(六)DSP28335基礎教程——SPI通信實驗(TFT顯示控制)
下一篇:飛機大戰——圖文詳解
