4、給定程序MODI1.C中,函數(shù)fun的功能是:從字符串s中刪除所有小寫(xiě)字母c。主函數(shù)中已給s賦字符串:cabcdabcdabcxccc,輸出結(jié)果應(yīng)該是:abdabdabx。
請(qǐng)改正函數(shù)fun中的錯(cuò)誤,使它能得出正確的結(jié)果。
注意:不要改動(dòng)main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
/**********found**********/
include "stdio.a";
void fun(char s)
{ int i,j;
for(i=j=0;s[i];i++)
if(s[i]!='c')
/**********found**********/
s[j]=s[i];
/**********found**********/
s[i]=0;
}
main()
{ char s[80]="cabcdabcdabcxccc";
printf("The original string:");puts(s);
fun(s);
printf("The string after deleted:");puts(s);printf("\n\n");
}分析:(1)當(dāng)對(duì)以上程序進(jìn)行編譯時(shí),給出的第一個(gè)出錯(cuò)信息是:Declaration syntax error,指出在include行有語(yǔ)法錯(cuò)。觀察此行首先可以發(fā)現(xiàn)在include之前沒(méi)有"#"號(hào),在此行的末尾多了分號(hào),對(duì)此進(jìn)行修正。再進(jìn)行編譯,給出出錯(cuò)信息:Unable to open include file'STDIO.A',指出打不開(kāi)名為'STDIO.A'的include文件??梢园l(fā)現(xiàn)在此錯(cuò)把stdio.h文件的后綴寫(xiě)成了".a",進(jìn)行改正。
(2)再次進(jìn)行編譯時(shí)給出了出錯(cuò)信息:Invalid indirection,指出for語(yǔ)句中的s[i]為非法的標(biāo)識(shí)符。在此s[i]以帶下標(biāo)的形式表示字符串中的某個(gè)元素,并作為循環(huán)結(jié)束標(biāo)志,當(dāng)s[i]中的值為0時(shí)循環(huán)結(jié)束,也就是說(shuō),遇到字符串結(jié)束標(biāo)志時(shí)循環(huán)結(jié)束;觀察形參s,僅說(shuō)明它是一個(gè)字符變量,當(dāng)然不可以使用s[i]的形式,而對(duì)應(yīng)的實(shí)參卻是一個(gè)字符數(shù)組名,顯然,形參應(yīng)定義成:char*s,進(jìn)行修改后編譯不再有錯(cuò)。
(3)運(yùn)行程序,輸出結(jié)果是:xabcdabcdabcxccc,與預(yù)定的結(jié)果不符。應(yīng)進(jìn)一步檢查函數(shù)fun中的邏輯結(jié)構(gòu)。檢查程序可知在for循環(huán)中,通過(guò)下標(biāo)i用if語(yǔ)句來(lái)逐個(gè)檢查s所指字符串中的每個(gè)字符是否為小寫(xiě)的字母c,若不是,就重新放回s所指字符數(shù)組中,所放位置由下標(biāo)j來(lái)指定;i由for循環(huán)變量來(lái)控制變化,而j除了賦過(guò)初值外,沒(méi)有改變過(guò),因此,只要不是小寫(xiě)字母c就不斷重復(fù)放在s[0](因?yàn)閖一直為0)中,只有s[0]中的字符改變,其他位置上的內(nèi)容都沒(méi)有改變。應(yīng)該每在s[j]中放入一個(gè)非小寫(xiě)字母c之后,使j增1,if子句中的s[j]=s[i];應(yīng)改寫(xiě)為:s[j++]=s[i];,或改寫(xiě)為:{s[j]=s[i];j++;}。
(4)改正后,再次運(yùn)行程序,輸出的字符串為:abdabdabxabcxccc,與預(yù)定的結(jié)果也不相同。但可以看到字符串的前部分是正確的,應(yīng)當(dāng)考慮字符串結(jié)束標(biāo)志是否放錯(cuò)了位置;檢查函數(shù)中最后的語(yǔ)句s[i]=0;可見(jiàn),字符串結(jié)束標(biāo)志沒(méi)有放在由j所指的字符串的最后,而是仍放在原串的最后了,因此,此語(yǔ)句應(yīng)該成s[j]=0;。
(5)改正后,再次運(yùn)行程序,得到了正確的結(jié)果:abdabdabx。
(6)提示:本題中出現(xiàn)的錯(cuò)誤基本是邏輯錯(cuò),對(duì)于這樣的試題,要求考生能夠讀懂程序,分析算法方面的錯(cuò)誤進(jìn)行改正。
請(qǐng)改正函數(shù)fun中的錯(cuò)誤,使它能得出正確的結(jié)果。
注意:不要改動(dòng)main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
/**********found**********/
include "stdio.a";
void fun(char s)
{ int i,j;
for(i=j=0;s[i];i++)
if(s[i]!='c')
/**********found**********/
s[j]=s[i];
/**********found**********/
s[i]=0;
}
main()
{ char s[80]="cabcdabcdabcxccc";
printf("The original string:");puts(s);
fun(s);
printf("The string after deleted:");puts(s);printf("\n\n");
}分析:(1)當(dāng)對(duì)以上程序進(jìn)行編譯時(shí),給出的第一個(gè)出錯(cuò)信息是:Declaration syntax error,指出在include行有語(yǔ)法錯(cuò)。觀察此行首先可以發(fā)現(xiàn)在include之前沒(méi)有"#"號(hào),在此行的末尾多了分號(hào),對(duì)此進(jìn)行修正。再進(jìn)行編譯,給出出錯(cuò)信息:Unable to open include file'STDIO.A',指出打不開(kāi)名為'STDIO.A'的include文件??梢园l(fā)現(xiàn)在此錯(cuò)把stdio.h文件的后綴寫(xiě)成了".a",進(jìn)行改正。
(2)再次進(jìn)行編譯時(shí)給出了出錯(cuò)信息:Invalid indirection,指出for語(yǔ)句中的s[i]為非法的標(biāo)識(shí)符。在此s[i]以帶下標(biāo)的形式表示字符串中的某個(gè)元素,并作為循環(huán)結(jié)束標(biāo)志,當(dāng)s[i]中的值為0時(shí)循環(huán)結(jié)束,也就是說(shuō),遇到字符串結(jié)束標(biāo)志時(shí)循環(huán)結(jié)束;觀察形參s,僅說(shuō)明它是一個(gè)字符變量,當(dāng)然不可以使用s[i]的形式,而對(duì)應(yīng)的實(shí)參卻是一個(gè)字符數(shù)組名,顯然,形參應(yīng)定義成:char*s,進(jìn)行修改后編譯不再有錯(cuò)。
(3)運(yùn)行程序,輸出結(jié)果是:xabcdabcdabcxccc,與預(yù)定的結(jié)果不符。應(yīng)進(jìn)一步檢查函數(shù)fun中的邏輯結(jié)構(gòu)。檢查程序可知在for循環(huán)中,通過(guò)下標(biāo)i用if語(yǔ)句來(lái)逐個(gè)檢查s所指字符串中的每個(gè)字符是否為小寫(xiě)的字母c,若不是,就重新放回s所指字符數(shù)組中,所放位置由下標(biāo)j來(lái)指定;i由for循環(huán)變量來(lái)控制變化,而j除了賦過(guò)初值外,沒(méi)有改變過(guò),因此,只要不是小寫(xiě)字母c就不斷重復(fù)放在s[0](因?yàn)閖一直為0)中,只有s[0]中的字符改變,其他位置上的內(nèi)容都沒(méi)有改變。應(yīng)該每在s[j]中放入一個(gè)非小寫(xiě)字母c之后,使j增1,if子句中的s[j]=s[i];應(yīng)改寫(xiě)為:s[j++]=s[i];,或改寫(xiě)為:{s[j]=s[i];j++;}。
(4)改正后,再次運(yùn)行程序,輸出的字符串為:abdabdabxabcxccc,與預(yù)定的結(jié)果也不相同。但可以看到字符串的前部分是正確的,應(yīng)當(dāng)考慮字符串結(jié)束標(biāo)志是否放錯(cuò)了位置;檢查函數(shù)中最后的語(yǔ)句s[i]=0;可見(jiàn),字符串結(jié)束標(biāo)志沒(méi)有放在由j所指的字符串的最后,而是仍放在原串的最后了,因此,此語(yǔ)句應(yīng)該成s[j]=0;。
(5)改正后,再次運(yùn)行程序,得到了正確的結(jié)果:abdabdabx。
(6)提示:本題中出現(xiàn)的錯(cuò)誤基本是邏輯錯(cuò),對(duì)于這樣的試題,要求考生能夠讀懂程序,分析算法方面的錯(cuò)誤進(jìn)行改正。