軟體水平考試模擬練習題及解析
設函式的功能是交換X和y的值,且透過正確呼叫返回交換結果。不能正確執行此功能的函式是( )
① funa(int *x, int *y)
{
int * p;
* p=*x; *x=*y; *y=*p;
}
② funb(int x, int y)
{
int t;
t=x;x=y;y=t;
}
③ func(int *x, int *y)
{
int p;
p=*x; *x=*y; * y=p;
}
④fund( int *x,int *y)
{
*x=*x+ *y;*y=*x- *y;*x= *x- *y;
}
【解】設計實現交換兩個變數值的函式。希望函式呼叫能改變呼叫環境中的變數,方法之一是讓函式設定指標型別的形參,實參傳送給形參的是希望交換值的兩個變數的指標。函式的兩個形參得到這兩個變數的指標後,函式就能透過形參間接引用要交換值的變數,或引用它們的值,或改變它們的值。從而實現從函式傳回資訊存於呼叫環境的變數中。以上所述是設計交換變數值函式的一般原則,具體編寫函式時還需注意對上述原則的正確應用。
對於函式funa,該函式的定義滿足設定指標形參,並透過指標形參間接引用環境變數的要求。但是在函式體中定義了指標變數p,並在p宋明確設定它所指向的變數下,程式碼*p=* x企圖將值存入它所指的變數中,這是初學者經常出現的一種嚴重的錯誤。該函式因有錯,不能實現交換變數值的功能。
對於函式funb,該函式不定義指標形參,函式體也沒有可用的指標間接引用呼叫環境中的變數,所以該函式也不能實現交換變數值的功能。
對於函式func,該函式正確定義了指標形參,函式體也正確透過指標形參間接引用環境中的變數,並正確定義了自己的區域性變數。該函式能實現交換變數值的功能。
對於函式fund,該函式也正確定義指標形參和函式體透過形參間接引用環境變數。特別要指出的`是,該函式是利用*x和*y的;日值與新值之間的關係實現問題要求的。其中第一個賦值使。x存有原來未交換之前的*x與*y之和;第二個賦值從這個和中減去原來的*y,並將差賦給*y,使*y的值是交換之前的*x的值;第三個賦值再次從和中減去新的*y,即減去交換之前的*x,這個差就是交換之前的*y,並將差賦給*x。經以上三個賦值,實現兩變數之間的值交換。所以不能正確執行交換變數值的函式是funa和funb,即正確選擇是①②。