高效備考方法-程式修改題

  • 2020 年 2 月 25 日
  • 筆記

程式修改題

一、程式修改題解題技巧

1. 程式修改題佔18分,一般有3個地方有錯誤,題型簡單 2. /***************found***************/稱為錯誤欄,每道題的錯誤處就在這個錯誤欄的下面。 3. 做改錯題時先看出錯的地方,分析語法錯誤,如果能用C語言的語法判斷出錯誤,改之即可 4. 沒有語法錯誤即分析邏輯錯誤,邏輯錯誤可以從幾個方面分析: (1) 從題目的要求中找到錯誤,例如:題目要求計算s=1+1/2+1/3+,……,+1/n,那麼循環的範圍就應該是for(i=0;i<=n;i++),但是考試中經常將其寫為:for(i=0;i<n;i++) (2) 根據題目中的關鍵字改錯,例如:題目中要求從小到大排序,則「從小到大」就是關鍵字 (3) 重點注意函數的調用、函數的返回值類型,函數的形參,這個是上機考試中的重點 (4) 注意細節,請參考以下為考生總結的知識 5.多練習,多思考,多總結

二、程式修改題總結

1.關鍵字出錯 指的是C語言中的關鍵字出錯。C語言的關鍵字都是小寫字母,並且在VC++6.0中以藍色字體顯示,如果常見的關鍵字是黑色字體,可以斷定關鍵字出錯; 例如:If(substr[k+1]=='') 2.格式出錯

(1)C語言中的語句、基本結構、函數等都有相應的規範格式,程式中將這些格式書寫錯誤,將導致編譯器無法識別程式,因此導致出錯; (2)語句末尾少分號 (3)for結構格式出錯 for結構的格式:for(表達式1;表達式2;表達式3){ 循環體語句},for結構體中表達式必須以分號隔開,改錯題中經常出現將for結構中分號錯寫為逗號的情況; (4)if結構格式出錯 if結構的格式:if(表達式),if後面必須加上小括弧。 (5) 數組格式出錯 一維數組的定義形式:類型名 數組名[常量表達式],謹記[]是數組的獨有特徵 (6) 函數格式出錯 記住函數名後面一定是小括弧,不能是方括弧,方括弧只有在數組下標中用到 (7) 命令行格式錯誤 #include 「stdio.h」,include和define前面都必須有# 3. 使用了未定義的變數:變數必須先定義後執行

(1) 0(零)和o(字母歐)的區別 區別:零像雞蛋,字母歐像乒乓球 (2) P(大)和p(小)的區別 區別:一般在定義時候p為小寫,但是在使用的時候變為大寫P,做題時候一定要細心。 (3) 普通變數大小寫的區別 定義時候和使用時候變數的大小寫不一致,違背了變數必須「先定義後執行」的原則。

三、 改錯題之邏輯錯誤

1. 運算符號出錯:

(1) C語言中除號是「/」不是「」 (2) 賦值號(=)和等號(= =)混淆 記住在if語句中出現賦值號(=)一般是講它改為等號(= =)。 2. 表達式的取值範圍出錯

當遇到計算表達式的累加或是累減時,一定用到循環來完成相應的操作。 3. C語言中的除法運算

這個考點同樣考查表達式的相關知識。 記住:1/2的值為零,只有1.0/2或是1.0/2.0的值為0.54. 找最大值和排序問題

遇到這種題目在改錯題中最容易考查的是大於(>)、小於(<)等符號的變化,當你查找出錯的地方沒有語法錯誤,也沒有使用了未定義的變數時,記住這個口訣:將大於改為小於,將小於改為大於! 5. 函數的返回值及其參數:重點

int  fun(int  x,int  y)  {    if(x>y)return  x;     else  return  y;  }  main()  {    int a,b,c;    scanf(「%d%d」,&a,&b);    c=fun(a,b);    printf(「最大值為:%d」,c);  }

(1) 函數的返回類型: 在上面的例子中fun函數的返回值是int,如果將int改為double,很明顯是錯誤的。從兩個地方來看,首先return x;中x的類型必須和fun函數中的返回值相同,x是整型。其次c=fun(a,b);中fun函數將一個返回值賦值給了變數c,說明函數返回的值一定是整型。 記住:函數調用、函數的返回值和return中數據類型必須一致! (2) 函數傳遞的參數:

int  fun(int  *x,int  *y)  {    if(*x>*y)return  *x;    else  return  *y;  }  main()  {    int a,b,c;    scanf(「%d%d」,&a,&b);    c=fun(&a,&b);    printf(「最大值為:%d」,c);  }

一定注意:傳遞的是值還是地址。比較上面兩個例子大家很容易區別傳遞的是值還是地址,第一個例子調用函數的時候傳遞的是值,因此在fun函數的形參中x和y僅僅是普通的變數,而第二個例子中調用函數的時候傳遞的是地址,因此在fun函數的形參中x和y就是兩個指針變數。 (3) 指針的使用:

 int  fun(int  *x,int  *y)  {    if(*x>*y)return  *x;    else  return  *y;   }

在此例中fun函數的形參是x和y,它們的類型是整型的指針,那麼在fun函數的函數體中使用到x和y的值時一定要區分:x>y比較的是x和y所存變數地址的大小,*x>*y才是比較值的大小。如果存在*x=x+y;的類似情況一定是錯誤的,必須要將賦值號的左右兩邊的類型變 為一致。 6. 數組

(1)數組下標的初始值:數組下標從零開始,到長度減1結束。 考試技巧:當出錯行在定義部分時,先檢查該定義語句有沒有語法錯誤,再看定義語句中的變數有沒有賦初始值,最後看變數賦的初始值有沒有正確。定義初始值有竅門,遇到累加時,用來存放累加和的變數一般賦值為零,遇到求階乘時,用來存放階乘值的變數一般賦值為1。 (2) 普通變數的初始值: 依照上面的技巧,我們同樣可以將它延伸到普通變數中。 (3) 數組和字元串長度減1: 當使用數組中的元素時,最大值只能到數組長度減1。字元串以』』作為字元串的結束標誌,因此取值最大也只能到字元串長度減1。 (4) 數組下標往後走 當題目要求將一個數組中的元素直接賦值或是以某種方式複製到另一個數組中時,接受數據的數組中的下標要自增。 7. 素數

(1) 判斷一個數是否是素數的方法很多,掌握一種即可,首先掌握判斷一個素數的方法; (2) 素數的定義:是自然數;只能被1和本身整除,2到本身減1之間的數不能整除該數。 (3) 判斷m是否為素數的格式: for(i=2;i<m;i++) if(m%i= =0) break; if(m==i)表明m是素數; (4) 素數只能被1和m,那麼用2到m-1之間的數除m,如果有一個數能整除m,說明m不是一個素數,就不用再判斷後面的數值了,用一條break語句提前結束函數;如果一直都不能整除,則說明m是一個素數。那麼用循環語句表示2到m-1之間的數的語句為:for(i=2;i<m;i++),如果在這個範圍內的數值有一個數值能整除m,說明m不是一個素數,則可以提前結束循環,break;那麼結束之後這個循環中的變數i的值小於m,如果m是一個素數的時候,則一直都不執行break語句;則循環語句結束的時候是在i==m的時候退出循環。結束循環以後,進行i和m的比較,如果i小於m,則表明m不是一個素數;如果i等於m,則表明m是一個素數。 (5) 求素數的題目只要把格式給帶進去就可以了。 8. 鏈表

(1) 鏈表的題目分為帶頭結點的和不帶頭結點的鏈表; (2) 帶頭結點的鏈表:帶頭結點的鏈表的第一個空的改為:p=h->next;第二個空改為:p=p->next; (3) 不帶頭結點的鏈表:不帶頭結點的鏈表的第一個空的改為:p=h;第二個空改為:p=p->next;