阿摩線上測驗 登入

申論題資訊

試卷:112年 - 112 關務特種考試_四等_資訊處理:程式設計概要#113937
科目:程式設計
年份:112年
排序:0

申論題內容

二、下列是 C 程式語言所撰寫的兩數對調,它使用傳址呼叫來完成,試修正下列程式錯誤的地方。程式在 main()函式中先輸入兩個整數,並印出對調前的兩數,再呼叫 swap()對調函式,最後印出對調後的兩數。輸出結果如下: (24 分)
64486e0205f1a.jpg64486e1abf4b5.jpg

詳解 (共 2 筆)

詳解 提供者:努力中(112高考上岸)

修正後的程式碼:

#include <stdio.h> 
void swap(int *, int *);

int main(  ) {
int a, b;
printf("Enter two numbers: ");
scanf("%d %d", &a, &b);
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}

void swap(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}

修正的地方如下:

  1. 在呼叫scanf函式時,需要將變數a和b的記憶體位址傳遞給scanf函式,因此修正為scanf("%d %d", &a, &b);
  2. 在swap函式的參數宣告中,需要使用指標類型的參數,因此修正為void swap(int *x, int *y)
  3. 在swap函式中,對傳入的指標進行解參考(dereference)操作,以訪問和修改所指向的變數的值,因此修正為temp = *x; *x = *y; *y = temp;
詳解 提供者:Phil(112高普雙榜)

若欲達成兩數對調,則該程式錯誤之處如下-

void swap(int &x,int &y){

   int temp;

   temp=x;

   x=y;

   y=temp;

}

int main(){
        ...
swap(*a,*b);
        ...
}

在進行call by address時,swap函數要接收的應是a和b兩個變數的記憶體位址,而非兩個變數的值,若只有傳值進入函數,就等同於將該值複製一份到函數,而函數的兩個變數x和y又有自身的記憶體位址,因此等到函數運算結束之後,其運算結果就會跟著消失(除非回傳的值是x和y),而a和b並不會因為函數運算完成後就交換,因為改變記憶體位址的是x和y,而非a和b,故原先的a和b依舊維持不變;但若傳入的值是記憶體位址,函數就會用x和y來接收a和b的記憶體位址,並進行互換,這個舉動會實際更動到a和b的記憶體位址,因此call by address會時會將兩個值進行互換。