改错题.docx
《改错题.docx》由会员分享,可在线阅读,更多相关《改错题.docx(17页珍藏版)》请在冰点文库上搜索。
![改错题.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/7ed34b9f-487a-490b-bd72-c310e59f8613/7ed34b9f-487a-490b-bd72-c310e59f86131.gif)
改错题
改错题要求:
1.程序录入到XXXX.CPP中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。
(程序中的注解可以不输入)
2.改错时,可以修改语句的一部分内容,调整语句次序,增加少量的变量说明、函数原型说明或编译预处理命令,但不能增加其它语句,也不能删除整条语句。
1.设计一程序求f(n,k)=1k+2k+3k+…+nk,另有辅助函数power(m,n)用于求mn。
在主函数中输入n和k的值,并输出结果。
若n=6,k=2,则程序正确的运行结果是:
result=91。
#include
voidmain()
{intf(int,int);
intk,n;
cout<<"Pleaseinputn,k:
";
cin>>n>>k;
cout<<"result="<}
intf(intn,k)
{intsum=0;
for(inti=1;i<=n;++i)
sum=sum+power(k,i);
returnsum;
}
intpower(intm,intn)
{intproduct=1;
for(inti=1;iproduct=product*m;
returnproduct;
}
2.数学家把相差为2的素数称为“孪生素数”。
100以内的孪生素数有8对,他们是(3,5),(5,7),(11,13),(17,19),(29,31),(41,43),(59,61),(71,73)。
编写程序求出1000以内的孪生素数以及孪生素数的对数。
算法是:
先求出1000以内的素数并存入数组a,再扫描数组a,若相邻两个元素的差为2,则将该相邻的两个素数存入数组b的一行,数组b的每一行有两个元素。
程序正确的运行结果如下:
(3,5)(5,7)(11,13)(17,19)(29,31)
……
(809,811)(821,823)(827,829)(857,859)(881,883)
count=35
#include
#include
intisprime(intx)//判断x是否为素数,若是返回1,否则返回0
{intk,i;
k=sqrt(x);
for(i=2;i<=k;i++)
if(x%i)return0;
return1;
}
voidmain()
{inta[500],count,k=0;
intb[][2];
for(inti=3;i<1000;i+=2)//求出1000以内全部素数,存于a数组
if(isprime(i))a[k++]=i;
count=0;
for(i=0;i{if(a[i+1]-a[i]==2)
{b[count++][0]=a[i];
b[count++][1]=a[i+1];
}
}
for(i=0;i{if(i%5==0)cout<cout<<'('<}
cout<}
3.以下程序验证一个猜想:
任意一个十进制整数与其反序数相加后,得到一个新的正整数,对该新的正整数重复上述处理后,最终可以得到一个回文数。
所谓反序数是指将原数的数字次序颠倒而得到的数值,如4361的反序数为1634。
所谓回文数是指,正向和反向读的数字序列是一样的。
例如,12321和23455432都是回文数。
程序同时统计出重复处理的次数c。
例如,对整数639,程序运行状况如下:
Pleaseinputanumber:
639<回车>
639,99099,5
含有错误的原程序如下:
#include
voidinvert(longx)//求出并返回x的反序数
{longs;
for(s=0;x>0;x/=10)
s=s*10+x/10;
return(s);
}
longfun(longn,long&c)//不允许修改此行
{//函数功能为:
返回求出的回文数.同时记录处理次数c
while(n==invert(n))
{n=n+invert(n);
c++;
}
returnn;
}
voidmain()
{longn,r,c=0;
cout<<"Pleaseinputanumber:
";
cin>>n;
r=fun(n,&c);
cout<}
4.以下程序验证下列命题:
若一个三位数是37的倍数,则将这个三位数的三个数字分别循环左移一位、左移两位后得到的两个新的三位数也是37的倍数。
例如,185是37的倍数,则851和518也是37的倍数。
以下程序对三位数中的所有37倍数的数进行验证。
输出时,每组数据占一行(例如:
185,851,518,OK!
),OK表示对当前数值,该命题成立。
最终,若对所有满足条件的数该命题正确时,输出True,否则输出False。
程序的运行结果应为:
111,111,111,OK!
148,481,841,OK!
185,851,518,OK!
……
962,692,296,OK!
999,999,999,OK!
含有错误的源程序如下:
#include
voidnextnum(intx)//将x循环左移一位,得到新数,返回该数
{return(x/100+x%100);}
voidmain()
{intcount=0;//count用于记录不满足命题的数值个数
intx1,x2,x3;
for(i=111;i<1000;i+=37)//3位数的37倍数的数中,最小的是111
{x1=i;
x2=nextnum(x1);
if(x2%37==0)
{x3=nextnum(x2);
if(x3%37==0)
cout<"<else
{cout<count++;
}
}
}
if(count=0)
cout<<"\nTrue!
\n";
else
cout<<"False!
\n";
}
5.将一维数组中的最小值与第0个元素交换,最大值与最后一个元素交换。
假设该数组中的最小值和最大值都是唯一的。
例如,若数组中原来的数据为:
1962760438
则交换后的结果为:
0862761439
含有错误的源程序如下:
#include
voidoutput(int*p,intn)
{for(i=0;icout<<*p++<<'\t';
cout<<'\n';
}
voidchange(inta[10],intn)
{intt,*pend,*p,*maxp,*minp;//maxp最终指向最大元素,minp最终指向最小元素
minp=a;
pend=a+n;
for(p=a+1;pif(*p<*minp)*minp=*p;
if(minp!
=a)
{t=*minp;*minp=*a;*a=t;}
maxp=a;
for(p=a+1;pif(*p>*maxp)maxp=p;
if(maxp!
=a+n-1)
{t=*maxp;*maxp=*(a+n);*(a+n)=t;}
}
voidmain()
{inta[10]={1,9,6,2,7,6,0,4,3,8};
output(a[10],10);//输出原数组
change(a[10],10);
output(a[10],10);//输出调换后的数组
}
6.下面程序用于验证哥德巴赫猜想:
任何大于4的偶数均可以分解成两个素数的和。
程序中的函数prime用于判断一个数是否为素数,若是则返回1,否则返回0。
主程序中不断接收键盘输入的数,如果输入的数为0,则结束验证,程序退出;若输入的数不是大于4的偶数,则要求重新输入。
#include
#include
voidprime(floatm)
{for(inti=2;i<=(int)sqrt(m);i++)
if(m%i==0)return0;//不是素数返回0
return1;//是素数返回1
}
voidmain(void)
{inti,yes;
intn;
do{cout<<"Inputanumber:
";
cin>>n;
if(n=0)break;//结束输入新数
if(n%2=0||n<5)
{cout<<"WRONGNUMBER!
"<for(i=3,yes=0;iif(prime(i)||prime(n-i)){
cout<<"n="<
yes=1;
break;
}
}
if(!
yes)cout<<"Can'tfind!
"<}while
(1);
}
7.设x=5m,y=5n,其中m和n均为小于10的正整数。
求同时满足下述三个条件的m、n、x、y的值:
①x与y的最后三位数相同,如53=125,59=1953125后三位相同;②m≠n;③m+n之和为最小。
若无解,则输出“NoSolution!
”。
此程序正确的运行结果如下:
m=3,x=125
n=5,y=3125
含有错误的源程序如下:
#include
voidmain()
{intm,n,mi=10,ni=10,flag=0;
intx,y;
for(m=3;m<10;m++)
for(n=3;n<10;n++)
if((m!
=n)||(m+n)<(mi+ni))
{x=poww(5,m);
y=poww(5,n);
if(x%1000=y%1000)
{flag=1;mi=m;ni=n;}
}
if(flag&&mi!
=10&&ni!
=10)
{x=poww(5,mi);
y=poww(5,ni);
cout<<"m="<cout<<"n="<}
elsecout<<"NoSolution!
\n";
}
intpoww(inte,intk)//求e的k次方
{inty=0;
for(inti=0;ireturny;
}
8.在一个字符串(主串)中查找另一个字符串(子串)第一次出现的位置,在查找过程中忽略字符的大小写。
例如:
主串是“ThisBOOKisveryGOODBOOK”,子串“this”在主串中第一次出现的位置为1(不是0)。
子串“Book”在主串中第一次出现的位置为6。
程序要求输出子串在主串中第一次出现的位置。
含有错误的源程序为:
#include
intequal(chara,charb)//比较两个字符是否相同(字母不分大小写)
{//若相同,返回真;若不相同,返回假
if(a>='A'&&a<='Z')a+='a'-'A';//将大写字母转换成小写字母
if(b>='A'&&b<='Z')b+='b'-'A';//将大写字母转换成小写字母
returna==b;
}
char*substr(char*s,char*sub)//s是主串,sub是子串
{//若找到子串,则返回子串第一次出现的位置,否则返回0
char*p,*q;
while(*s)
{for(p=s,q=sub;*q&&equal(p,q);p++,q++);
if(*q=='\0')returns;
s++;
}
return0;
}
voidmain()
{charstr[80]="ThisBOOKisaVeryGoodBOOK.",s2[20],*p;
cin>>s2;//可输入Book或very进行验证
if((p=substr(str,s2))!
=0)
cout<<"找不到子串"<else
cout<<"子串开始于第"<}
9.本程序的功能是先将两个字符串连接,然后将连接后的字符串排成升序。
例如,字符串s1的值为“student”,字符串s2的值为“teacher”,将s1与s2连接后得到字符串“studenteacher”,存入字符数组s3,排序后得到“acdeeehnrstttu”。
含有错误的源程序如下:
#include
voidconsort(char*s1,char*s2,char*s3)
{//合并字符串后,再对其中的字符排升序
inti,j,n,p;
charc;
strcpy(s3,s1);
strcat(s3,s2);
n=strlen(s3)-1;
for(i=0;i{p=i;
for(j=i+1;jif(s3[j]>s3[p])p=j;
if(p!
=i)
{c=s3[i];s3[i]=s3[p];s3[p]=c;}
}
}
voidmain()
{chars1[80],s2[80],s3[160];
cin.getline(s1,80);
cin.getline(s2,80);
consort(s1[80],s2[80],s3[160]);
cout<}
10.计算电视歌手大奖赛的得分。
设共有N个评委,每个评委给歌手一个评分。
最后歌手得分为:
去掉两个最高分,去掉两个最低分,求出其余评委给分的平均分。
下述程序正确的运行结果如下:
9.8,9.9,9.6,9.85,9.66,9.7,9.78,9.8,9.6,9.8
averscore=9.75667
#include
#defineN10
doublegetscore(doublescore)
{//pstart指向数组的第一个元素,pend指向数组的最后一个元素
double*pstart,*pend;
doublemax1,max2;//max1存放最大数,max2存放次大数
doublemin1,min2;//min1存放最小数,min2存放次小数
pstart=score;
pend=score+N-1;
max1=max2=min1=min2=*score;
for(score++;score{if(max1<*score)
{max2=max1;max1=*score;}
elseif(max2<*score)
max2=*score;
elseif(min1>*score)
{min2=min1;min1=*score;}
elseif(min2>*score)
min2=*score;
}
doubleaver=0;
for(score--;score>=pstart;score--)
aver=aver+*score;
aver=(aver-max1-max2-min1-min2)/N-4;
returnaver;
}
voidmain()
{doublescr[N]={9.8,9.9,9.6,9.85,9.66,9.7,9.78,9.8,9.6,9.8};
for(inti=0;icout<<*scr[i]<<'\t';
cout<cout<<"averscore="<}
11.找出一个二维数组的鞍点,即该位置上的元素在该行元素中最大,在该列元素中最小.二维数组也可能没有鞍点.函数find判断数组b是否具有鞍点.如果有,则输出鞍点的坐标及鞍点上元素的值;若没有,则输出”No!
”.
含有错误的源程序如下:
#include
voidfind(int*a,intn)
{intj,i,k,maxj,flag;
for(i=0;i{
max=a[i][0];
maxj=0;
for(j=1;j<4;j++)//查找第i行中的最大值
if(a[i][j]{max=a[i][j];maxj=j;}
for(k=0;kif(max>a[k][maxj])
continue;
if(k>=n)//是鞍点
{
cout<<”a[“<
flag=1;
}
}
if(!
flag)//没有鞍点
cout<<”No!
\n”;
}
voidmain()
{intb[3][4]={{4,5,5,6},{1,2,3,4},{3,5,6,7}};
find(b,3);
}
12.一个字符串若正向拼写与反向拼写都一样,则称之为“回文”。
如“madam”是一个回文。
判断时忽略大小写字母的区别、空格及标点符号等,即“Madam,I’mAdam”也是回文。
下面的程序用于判断输入的字符串是否为“回文”,若是,输出Yes;若不是,输出No。
请输入“Ma,,dam”和“A**dam”两个字符串用以验证。
含有错误的源程序如下:
#include
#include
int*palin(char*s)//若s指向的字符串是回文,则返回1,否则返回0
{charc,*p1,*p2;
inti,j,n;
for(i=0,j=0;c=s[i];i++)//删除字符串中的其它字符,仅保留字母
if('a'<=c&&c<='z')
s[j++]=s[i];
elseif('A'<=c&&c<='Z')//将大写字母转换成对应的小写字母
s[j++]=s[i]+32;
s[i]='\0';
n=strlen(s);
p1=s;
p2=s+n-1;
while(p1{if(*p1!
=*p2)break;
else
{p1++;p2--;}
}
if(p1>p2)return0;
elsereturn1;
}
voidmain()
{chars[80];
cout<<"Pleaseinputastring:
";
cin.getline(s,80);