C程序上机改错题60道Word文件下载.docx
《C程序上机改错题60道Word文件下载.docx》由会员分享,可在线阅读,更多相关《C程序上机改错题60道Word文件下载.docx(107页珍藏版)》请在冰豆网上搜索。
gc02.out"
w"
for(i=0;
i<
10;
i++){
fscanf(rf,"
%d,"
&
k);
fprintf(wf,"
}
fclose(rf);
fclose(wf);
试题解析:
在给定的程序中有二个标识行,因此本题共有二个错误。
本题要求考生根据题目要求和程序,找出错误行所在位置并修改。
错误点1:
第一个错误标识下一行。
错误点说明:
C语言中,If语句后的逻辑表达式需要用括号括起来,而本题的语句:
不符合该要求。
即该语句应改为:
“if(k>
0)”;
参考答案:
if(k>
0)
错误点2:
第二个错误标识下一行。
题目要求计算k!
,在程序的fun函数中,使用递归的算法来求k!
,并利用if块语句来判断k的值,当k为0时,则递归计算结束。
因此函数的语句:
elseif(k=0)
是判断当k的值等于0就结束递归;
在C语言中,“=”表示赋值运算,要判断两变量是否相等,应该用“==”运算符,因此该语句应改为“elseif(k==0)”;
elseif(k==0)或其他等效语句
2.
给定程序MODI1.C中fun函数的功能是:
将p所指字符串中每个单词的最后一个字母改成大写。
(这里的“单词”是指由空格隔开的字符串)。
例如,若输入"
Iamastudenttotaketheexamination."
,则应输出"
IaMAstudenTtOtakEthEexamination."
。
请修改程序中的错误之处,使它能得出正确的结果。
注意:
不要改动main函数,不得删行,也不得更改程序的结构!
ctype.h>
voidfun(char*p)
intk=0;
for(;
*p;
p++)
if(k)
{
/**********found***********/
if(p=='
'
)
k=0;
*(p-1)=toupper(*(p-1))
else
k=1;
charchrstr[64];
intd;
clrscr();
printf("
\nPleaseenteranEnglishsentencewithin63letters:
"
);
gets(chrstr);
d=strlen(chrstr);
chrstr[d]='
;
chrstr[d+1]=0;
\n\nBeforechanging:
\n%s"
chrstr);
fun(chrstr);
\nAfterchanging:
NONO();
/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。
chars1[81];
g05.in"
g05.out"
fgets(s1,80,rf);
fun(s1);
fprintf(wf,"
%s"
s1);
题目已经说明,各单词之间使用空格分隔,在程序中使用语句:
if(k){}
进行当到字符串结束后的判断,如果其后一个字符为空格的话,则该单词结束。
程序中使用:
语句来判断指针变量p所指向的存储单元内容是否为空格,要取指针p所指向的存储单元内容应该用“*p”,因此该语句应改为“if(*p=='
)”;
if(*p=='
)或其他等效语句。
C语言中,每个语句的最后必须有一个分号,因此应该在该语句后加一个分号“;
”,即该语句应改为“*(p-1)=toupper(*(p-1));
”。
*(p-1)=toupper(*(p-1));
3
给定程序MODI1.C中函数fun的功能是:
求出s所指字符串中最后一次出现的t所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;
若未找到,则函数值为NULL。
例如,当字符串中的内容为:
"
abcdabfabcdx"
,t中的内容为:
ab"
时,输出结果应是:
abcdx。
当字符串中的内容为:
abd"
时,则程序输出未找到信息:
notbefound!
不要改动main函数,不得增行或删行,也不得更改程序的结构!
string.h>
char*fun(char*s,char*t)
char*p,*r,*a;
a=Null;
while(*s)
{p=s;
r=t;
while(*r)
if(r==p){r++;
p++;
elsebreak;
if(*r=='
\0'
)a=s;
s++;
returna;
chars[100],t[100],*p;
\nPleaseenterstringS:
scanf("
s);
\nPleaseentersubstringt:
t);
p=fun(s,t);
if(p)printf("
\nTheresultis:
%s\n"
p);
elseprintf("
\nNotfound!
\n"
);
C语言中,要使一个指针变量指向空,应将其赋为“NULL”而不是“Null”(因为在c语言中,区分大小写),因此该语句应改为“a=NULL;
a=NULL;
本题fun函数的内层while循环中,是用if语句判断指针r、p所指向的内存单元的内容是否相同,若相同,再判断r、p所指向内存单元的下一个单元的内容是否相同,直到r指向字符串的结束(即*r='
);
而不是判断指针r、p所指向的内存单元的地址是否相同,因此该语句应改为“if(*r==*p){r++;
}”。
if(*r==*p){r++;
}或其他等效语句
4.
由形参给定n个实数,输出平均值,并统计在平均值以上(含平均值)的实数个数。
例如,n=8时,输入:
193.199,195.673,195.757,196.051,196.092,196.596,196.579,196.763
所得平均值为:
195.838745,在平均值以上的实数个数应为:
5
请改正程序中的错误,使程序能输出正确的结果。
intfun(floatx[],intn)
intj,c=0;
floatxa=0.0;
for(j=0;
j<
n;
j++)
xa+=x[j]/n;
ave=%f\n"
xa);
if(x[j]=>
xa)
c++;
returnc;
main()
{floatx[100]={193.199,195.673,195.757,196.051,196.092,196.596,196.579,196.763};
clrscr();
%d\n"
fun(x,8));
C语言中,在定义函数时,函数体应该用大括号“{}”括起来,因此该语句的最开始处缺少“{”,即该语句应改为“{intj,c=0;
”;
{intj,c=0;
该语句是判断当x[j]的值大于等于xa时,计数变量就加1;
C语言中,表示“大于等于”的运算符是“>
=”,而不是“=>
”,因此该语句应改为“if(x[j]>
=xa)”;
if(x[j]>
=xa)或其他等效语句
5.
将tt所指字符串中的小写字母都改为对应的大写字母,其他字符不变。
例如,若输入"
Ab,cD"
,则输出"
AB,CD"
请改正程序中的错误,使它能统计出正确的结果。
char*fun(chartt[])
inti;
for(i=0;
tt[i];
i++)
if(('
a'
<
=tt[i])||(tt[i]<
='
z'
))
tt[i]+=32;
return(tt);
main()
chartt[81];
\nPleaseenterastring:
gets(tt);
\nTheresultstringis:
\n%s"
fun(tt));
/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。
chartt[81],ch;
g10.in"
g10.out"
fgets(tt,80,rf);
fun(tt);
tt);
根据题意知道,该if语句的条件表达式是“tt[i]>
'
”且“tt[i]<
”(注意其中的“且”),因此,该语句中的“||”(或)运算符应改为“&
&
”(与),即该语句应改为“if(('
=tt[i])&
(tt[i]<
))”;
if(('
ASCII码表中,小写字母的ASCII值比大写字母大,如'
的ASCII值是97,'
A'
的ASCII值是65,因此将一字符串中小写字母改为对应的大写字母,应将其ASCII值减去32,即该语句应改为“tt[i]-=32;
tt[i]-=32;
6.
给定程序MODI1.C中函数fun的功能是:
将s所指字符串中位于奇数位置的字符或ASCII码为偶数的字符放入t所指数组中(规定第一个字符放在第0位中)。
例如,字符串中的数据为:
AABBCCDDEEFF,
则输出应当是:
ABBCDDEFF。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#defineN80
voidfun(char*s,chart[])
{inti,j=0;
for(i=0;
i<
strlen(s);
i++)
/***********found**********/
if(i%2&
s[i]%2==0)
t[j++]=s[i];
t[i]='
;
{chars[N],t[N];
\nPleaseenterstrings:
gets(s);
fun(s,t);
t);
题面中要求的是:
“将s所指字符串中位于奇数位置的字符或ASCII码为偶数的字符放入t所指数组中”,注意其中的“或”,因此该if语句条件表达式中的“&
”应改为“||”,即该语句应改为“if(i%2||s[i]%2==0)”;
if(i%2||s[i]%2==0)或其它等效语句
本题中,变量j中记录的是t所指数组中最后一个字符的下标,因此在t所指向数组的末尾加上‘\0’,应该用“t[j]='
”语句;
t[j]='
或其他等效语句
7.
从s所指字符串中删除所有小写字母c。
请改正程序中的错误,使它能计算出正确的结果。
voidfun(char*s)
{inti,j;
for(i=j=0;
s[i]!
='
if(s[i]!
c'
)
s[j]=s[i];
s[i]='
{chars[80];
Enterastring:
Theoriginalstring:
puts(s);
fun(s);
Thestringafterdeleted:
printf("
\n\n"
for循环中,变量j记录的是删除c后形成的新字符串最后一个字符在新数组中的下标,因此,当用“s[j]=s[i]”语句对s[j]赋值后,应该使该索引加1,以使再对s[j]赋值不是覆盖当前s[j]元素的值;
故“s[j]=s[i]”后应该新增语句“j++”,且两语句应用“{}”括起来,即改为“{s[j]=s[i];
j++;
}”,而且根据要求这两条语句必须写在同一行。
另一种简便的答案是“s[j++]=s[i];
{s[j]=s[i];
}或其它等效语句
for循环中,变量j记录的是删除c后形成的新字符串最后一个字符在新数组中的下标,因此在新字符串最后加上'
,应是对s[j]赋值,即该语句应改为“s[j]='
s[j]='
或其它等效语句
8.
计算n的5次方的值(规定n的值大于2、小于8),通过形参指针传回主函数;
并计算该值的个位、十位、百位上数字之和作为函数值返回。
例如,7的5次方是16807,其低3位数的和值是15。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
不要改动main函数,不得增行或删行,也不得更改程序的结构!
math.h>
intfun(intn,int*value)
{intd,s,i;
/**************found**************/
d=0;
s=0;
for(i=1;
=5;
i++)d=d*n;
*value=d;
=3;
{s=s+d%10;
d=d\10;
returns;
{intn,sum,v;
do
{printf("
\nEntern(2<
n<
8):
scanf("
%d"
&
n);
while(n<
=2||n>
=8);
sum=fun(n,&
v);
\n\nTheresult:
\nvalue=%dsum=%d\n\n"
v,sum);
本题是用for循环计算n的5次方,通过累乘的办法将结果保存在变量d中,因此变量d的初始值应为1而不是0,即该语句应改为“d=1;
d=1;
该语句的作用是:
在for循环中,通过除法运算求得n的5次方除以10后的商,而在C语言中,除法运算符是“/”而不是“\”,即该语句应改为“d=d/10;
d=d/10;
9.
从整数1到55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。
规定,函数中a1放个位数,a2放十位数。
请改正程序中的错误,使它能得出正确结果。
不要改动main函数,不得增行或删行,也不得更改程序的结构。
fun(int*b)
{intk,a1,a2,i=0;
for(k=10;
k<
=55;
k++)
{a2=k/1O;
a1=k-a2*10;
if((k%3==0&
a2==5)||(k%3==0&
a1==5))
{b[i]=k;
i++;
returnk;
{inta[100],k,m;
m=fun(a);
Theresultis:
for(k=0;
m;
k++)printf("
%4d"
a[k]);
该语句的功能是将k除以10求得k的十位数,注意这里是“除以10”而不是“除以1O(O这里为字母)”,因此该语句应改为“a2=k/10;
a2=k/10;
本题fun函数的for循环中,k是循环变量,记录符合条件数的个数的变量是