1、給定程序MODI1.C中,函數(shù)fun的功能是:通過某種方式實(shí)現(xiàn)兩個變量值的交換,規(guī)定不允許增加任何語句和表達(dá)式。例如變量a中的值原為10,b中的值原為20,程序運(yùn)行后a中的值為20,b中的值為10。
請改正程序中的錯誤,使它能得出正確的結(jié)果。
注意:不要改動main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
#include<stdio.h>
/**********found***********/
void fun(int x,int y)
{ int t;
/**********found***********/
t=x; x=y;
/**********found***********/
retum y;
}
main()
{ int a,b;
printf("Enter a,b: ");scanf("%d%d",&a,&b);
printf("a=%d b=%d\n\n",a,b);
b=fun(&a,b);
printf("a=%d b=%d\n\n",a,b);
}分析1)當(dāng)對以上程序進(jìn)行編譯時,給出的第一個出錯信息是:void function may not return avalue。指出void類型的函數(shù)不可能返回一個函數(shù)值。從主函數(shù)可知,函數(shù)將返回值賦給整型變量b,因此,fun函數(shù)應(yīng)當(dāng)是int類型,在fun之前的void應(yīng)改為int或刪除void。
(2)改正以上錯誤的同時,考生會發(fā)現(xiàn)主函數(shù)中調(diào)用fun函數(shù)時,第一個實(shí)參和形參的類型不匹配,實(shí)參的類型是int變量的地址值,形參的類型是int類型變量,因此應(yīng)該在fun函數(shù)的第一個形參x之前加一個*號,把x定義成一個能接受地址的指針。
(3)進(jìn)行修改后的程序編譯不再出錯,運(yùn)行程序時給a和b輸入數(shù)據(jù)(注意輸入的數(shù)據(jù)用空格隔開)。若給a輸入10,給b輸入20,從輸出的結(jié)果看a和b的值都沒有變,也就是說,在fun函數(shù)中并沒有進(jìn)行指定的交換操作,這就要求對fun函數(shù)中的語句進(jìn)行檢查。
(4)在函數(shù)內(nèi)可以發(fā)現(xiàn)語句t=x;把地址值賦給了整型變量,這是不允許的,按題義應(yīng)當(dāng)把指針x所指a的值賦給t,因此語句應(yīng)該是t=*x;同樣語句x=y;應(yīng)該改成*x=y;,這樣就把主函數(shù)中變量b的值賦給了變量a;改變后再運(yùn)行程序并給a和b分別輸入10和20,觀察輸出結(jié)果可以看到a和b的值都為20,也就是說b的值已給了a,而b本身并沒有改變。
(5)再審查程序應(yīng)當(dāng)看到在主函數(shù)中,b最后的值是通過fun函數(shù)的返回值賦給的,觀察函數(shù)的return語句,返回的是函數(shù)中y的值,而這是主函數(shù)中b的原值,因此在邏輯上存在錯誤,按題義應(yīng)該返回a的原值,而此時,a的原值已通過t=*x放在了fun函數(shù)的t中,所以return語句應(yīng)改成:retum t;。再次運(yùn)行程序,就的到了正確的結(jié)果。
(6)提示:
①首先檢查被調(diào)用函數(shù)的類型和形參的類型是否與主函數(shù)中的調(diào)用函數(shù)和實(shí)參類型一致,如果不一致,應(yīng)按主函數(shù)中的調(diào)用來進(jìn)行修改。例如,實(shí)參為指針或數(shù)組名時,對應(yīng)的形參一定應(yīng)定義成基類型相同的指針。在主函數(shù)中返回的函數(shù)值賦給一個指針時,則函數(shù)的類型也一定是基類型相同的地址值?BR> ②若函數(shù)有返回值,應(yīng)檢查return語句中的表達(dá)式的類型是否與函數(shù)的類型一致。
③若形參是指針類型,則在函數(shù)中應(yīng)通過間址符(*)來引用主函數(shù)中的變量。
請改正程序中的錯誤,使它能得出正確的結(jié)果。
注意:不要改動main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
#include<stdio.h>
/**********found***********/
void fun(int x,int y)
{ int t;
/**********found***********/
t=x; x=y;
/**********found***********/
retum y;
}
main()
{ int a,b;
printf("Enter a,b: ");scanf("%d%d",&a,&b);
printf("a=%d b=%d\n\n",a,b);
b=fun(&a,b);
printf("a=%d b=%d\n\n",a,b);
}分析1)當(dāng)對以上程序進(jìn)行編譯時,給出的第一個出錯信息是:void function may not return avalue。指出void類型的函數(shù)不可能返回一個函數(shù)值。從主函數(shù)可知,函數(shù)將返回值賦給整型變量b,因此,fun函數(shù)應(yīng)當(dāng)是int類型,在fun之前的void應(yīng)改為int或刪除void。
(2)改正以上錯誤的同時,考生會發(fā)現(xiàn)主函數(shù)中調(diào)用fun函數(shù)時,第一個實(shí)參和形參的類型不匹配,實(shí)參的類型是int變量的地址值,形參的類型是int類型變量,因此應(yīng)該在fun函數(shù)的第一個形參x之前加一個*號,把x定義成一個能接受地址的指針。
(3)進(jìn)行修改后的程序編譯不再出錯,運(yùn)行程序時給a和b輸入數(shù)據(jù)(注意輸入的數(shù)據(jù)用空格隔開)。若給a輸入10,給b輸入20,從輸出的結(jié)果看a和b的值都沒有變,也就是說,在fun函數(shù)中并沒有進(jìn)行指定的交換操作,這就要求對fun函數(shù)中的語句進(jìn)行檢查。
(4)在函數(shù)內(nèi)可以發(fā)現(xiàn)語句t=x;把地址值賦給了整型變量,這是不允許的,按題義應(yīng)當(dāng)把指針x所指a的值賦給t,因此語句應(yīng)該是t=*x;同樣語句x=y;應(yīng)該改成*x=y;,這樣就把主函數(shù)中變量b的值賦給了變量a;改變后再運(yùn)行程序并給a和b分別輸入10和20,觀察輸出結(jié)果可以看到a和b的值都為20,也就是說b的值已給了a,而b本身并沒有改變。
(5)再審查程序應(yīng)當(dāng)看到在主函數(shù)中,b最后的值是通過fun函數(shù)的返回值賦給的,觀察函數(shù)的return語句,返回的是函數(shù)中y的值,而這是主函數(shù)中b的原值,因此在邏輯上存在錯誤,按題義應(yīng)該返回a的原值,而此時,a的原值已通過t=*x放在了fun函數(shù)的t中,所以return語句應(yīng)改成:retum t;。再次運(yùn)行程序,就的到了正確的結(jié)果。
(6)提示:
①首先檢查被調(diào)用函數(shù)的類型和形參的類型是否與主函數(shù)中的調(diào)用函數(shù)和實(shí)參類型一致,如果不一致,應(yīng)按主函數(shù)中的調(diào)用來進(jìn)行修改。例如,實(shí)參為指針或數(shù)組名時,對應(yīng)的形參一定應(yīng)定義成基類型相同的指針。在主函數(shù)中返回的函數(shù)值賦給一個指針時,則函數(shù)的類型也一定是基類型相同的地址值?BR> ②若函數(shù)有返回值,應(yīng)檢查return語句中的表達(dá)式的類型是否與函數(shù)的類型一致。
③若形參是指針類型,則在函數(shù)中應(yīng)通過間址符(*)來引用主函數(shù)中的變量。