南开二级C语言上机100题改错题1
下列给定程序的功能是:读入一个整数(2<=k《=10000》,打印它的所有质因子(即所有为素数的因子)。例如,若输入整数2310,则应输出2、3、5、7、11。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<conio.h>
#include<stdio.h>
*******************************
IsPrime(int?n);——————去掉分号
{int?i,m;
m=1;
for?(?i=2;?i<n;?i++)
******************************
if?!(n%i)——————if?(!(n%i))
{?m=0;?break;?}
return?(m);
}
main()
{?int?j,k;
clrscr();
printf("nPlease?enter?an?integer?number?between?2?and?10000:");scanf("%d",&k);
printf("nnThe?prime?factor(s)?of?%d?is?(are):",k);
for?(j=2;j<=k;j++)
if?((!(k%j))&&(IsPrime(j))?printf("n?%4d",j);
printf("n");
)
编程题1
m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值行会,将低于平均分的分数放在below所指的数组中。
例如,但score数组的数据为10、20、30、40、50、60、70、80、90时,函数返回的人数应该时4,below中的数据应为10、20、30、40。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include?<conio.h>
#include?<stdio.h>
#include?<string.h>
int?fun?(int?score[],int?m,?int?below[])
{
——————int?i,k=0;float?aver=0;
for(i=0;i<m;i++)
aver+=(score[i]);
aver/=m;
for?(i=0;i<m;i++)
if?(score[i]<aver)
{below[k]=score[i];
k++;
retern(k);}
}
main()
{int?i,?n,?below[9];
int?score?[9]={10,20,30,40,50,60,70,80,90};
clrscr();
n=fun(score,9,below);
printf("nBelow?the?average?score?are:");
for?(i=0;i<n;i++)?printf?("%d",below[i]);
}
改错2
下列给定程序中,函数fun的功能是:逐个比较a、b两个字符串对应位置中的字符,把ASCII值大或等于的字符一次存放到c数组中,形成一个新的字符串。例如,若a中的字符串为aBCDeFgH,b中的字符串为:ABcd,则c中的字符串为:aBcdeFgh。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<studio.h>
#include?<string.h>
****************************************
void;?fun(char?*p,char?*q,char?*c)——去分号
***************************************
{int?k=1;——1改为0
***************************************
while(*p!=*q)——!=改为||
***************************************
{if?(*p<*q)?c[k]=*q;——小于号改为小于等于
elsec[k]=*p;
if?(*p)?p++;
if?(*q)?q++;
k++;
}
}
main()
{char?a[10]="aBCDeFgh",b[10]="ABcd",c[80]={''};
fun(a,b,c);
printf("The?string?a:");?puts(a);
printf("The?string?b:");?puts?(b);
printf("The?result:");?puts(c);
}
改错3
下列给定程序中,函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<stdio.h>
#include?<conio.h>
void?fun?(char?*s)
{int?i,j;
for?(i=0,j=0;s[i]!='\0';i++)
****************************************
if?(s[i]>='0'?&&?s[i]<='9')
s[j]=s[i];——————j改为j++
***************************************
s[j]="\0";——————s[j]='\0'
}
main()
{char?item[80];
clrscr();
printf("\nEnter?a?string:");gets(item);
printf("\n\nThe?string?is?:\%s\n",item);
fun?(item);
printf("\n\nThe?string?of?changing?is?:\%s\n",item);
}
改错4
下列给定程序中,函数fun的功能是:分别铜级字符串中大写字母和小写字母的个数。例如,给字符串s输入:AAaaBBb123CCccccd,则应该输出结果:upper=6,lower=8。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<conio.h>
#include?<stdio.h>
**********************************
void?fun?(char?*s,int?a,?int?b)————a应为*a,b应为*b
{?while(*s)
{?if?(*s>='A'?&&?*s<='Z')
***********************************
a++;————(*a)++;
if?(*s>='a'?&&?*s<='z')
************************************
b++;————(*b)++;
s++;
}
}
main()
{?char?s[100];int?upper=0,lower=0;
clrscr();
printf("nPlease?a?string:");gets(s);
fun(s,&upper,?&lower);
printf("n?upper=%d?lower=%dn",upper,lower);
}
改错5
假定整数数列中的数不重复,并存放在数组中。下列给定程序中,函数fun的功能是:删除数列中值为x的元素。n中存放的是数列中元素的个数。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<stdio.h>
#define?N?20
fun?(int?*a,int?n,?int?x)
{int?p=0,i;
a[n]=x;
while?(x!=a[p])
p=p+1;
if?(p==n)?return?-1;
else
{for?(i=p;i<n;i++)
******************************************
a[i+1]=a[i];————a[i]=a[i+1];
return?n-1;
}
}
main()
{int?w[N]={-3,0,1,5,7,99,10,15,30,90},x,n,i;
n=10;
printf("The?original?data:n");
for?(i=0;i<n;i++)?printf("%5d",w[i]);
printf("nInput?x?(to?delete):");scanf("%d",&x);
printf("Delete:%dn",x);
n=fun(w,n,x);
if?(n==-1)?printf("***Nor?be?found!***nn");
else
{printf("The?data?after?deleted:n");
for?(i=0,i<n;i++)?printf("%5d",w[i]);printf("nn");
}
}
改错6
下列给定程序中,函数fun的功能是:根据整型形参m的值,计算如下公式的值。t=1-1/2×2-1/3×3-…-1/m×m
例如,若m中的值为5,则应输出:0.536389。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include?<conio.h>
#include?<stdio.h>
double?fun?(int?m)
{?double?y=1.0;
int?i;
***************************************
for?(i=2;i<m;i++)————“<”改为“<=”
***************************************
y-=1/(i*i);————“1”改为“1.0”
return(y);
}
main?()
{int?n=5;
clrscr();
printf("\nRhe?result?is?%1f\n",fun(n));
}
改错7
下列给定程序中,函数fun的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include?<stdio.h>
#define?N?20
void?fun(int?a[],int?n)
{?int?i,j,t,p;
for?(j=0;j<n-1;j++)
***************************
{p=j——加上“;”
for?(i=j;i,n;i++)——j改为j+1
if?(a[i]<a[p])
*********************************
p=j;——j改为i
t=a[p];a[p]=a[j];a[j]=t;
}
}
main()
{
int?a[N]={9,6,8,3,-1},i,m=5;
printf("排序前的数据:");
for?(i=0;i<m;i++)?printf("%d",a[i]);printf("\n");
fun(a,m);
printf("排序后的数据:");
for?(i=0;i<m;i++)?printf("%d",a[i]);printf("\n");
}
改错8(2004.7.27)
下列给定程序中,函数fun的功能是:在字符串str中找出ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。例如,调用fun函数之前给字符串输入:ABCDeFGH,调用后字符串中的内容为eABCDFGH。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include?<stdio.h>
fun(char?*p)
{?char?max,*q;int?i=0;
max=p[i];
while(p[i]!=0)
{if(max<p[i])
{max=p[i];
*******************************
p=q+i;——改为q=p+i;
}
i++;
}
******************************
while(q<p)——q<p改为q>p
{*q=*(q-1);
q--;
}
p[0]=max;
}
main()
{char?str[80];
printf("Enter?a?string:");gets(Str);
printf("\nThe?original?string:");puts(Str);
fun(str);
printf("\nThe?string?agter?moving:");puts?(str);ptintf("\n\n");
}
改错9(2004.7.27)
下列给定程序中,函数fun的功能是:从n个学生的成绩中统计出低于平均分的学生人数,此人数由函数值返回,平均分存放在形参aver所指的存储单元中。例如,若输入8名学生的成绩:
80.5607290.59851.58864
则低于平均分的学生人数为4(平均分为:75.5625)。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include?<conio.h>
#include?<stdio.h>
#define?N?20
int?fun?(float?*s,int?n,float?*aver)
{float?ave,t=0.0;
int?count=0,k,i;
for?(k=0;k<n;k++)
*******************************
t=s[k];——t+=s[k];
ave=t/n;
for?(i=0;i<n;i++)
if?(s[i]<ave)?count++;
******************************
*aver=&ave;——去掉&
return?count;
}
main()
{float?s[30],aver;
int?m,i;
clrscr();
printf("nPlease?enter?m:";scanf("%d",&m);
printf("nPlease?enter?%d?mark:n",m);
for?(i=0;i<m;i++)?scanf("%f",s+i);
printf("nThe?number?of?students:%dn",fun(s,m,&aver));
printf("Ave=%fn",aver);
)
改错10(2004.8.1)
下列给定程序中,函数fun的功能是:将s所指字符串中出现的t1所指子串全部替换成t2所指子字符串,所形成的新串放在w所指的数组中。在此处,要求t1和t2所指字符串的长度相同。例如,当s所指字符产中的内容为abcdabfab,t1所指子串中的内容为ab,t2所指子串中的内容为99时,结果,在2
所指的数组中内容应为99cd99f99。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<conio.h>
#include<stdio.h>
#include<string.h>
int?fun?(char?*s,?char?*t1,char*t2,char*w)
{
int?i;char?*p,*r,*a;
strcpy(w,s);
while(*w)
{p=w;r=t1;
********************************************
while(r)——r改为*r
if(*r==*p){r++;p++}
else?break;
if(*r=='')
{a=w;r=t2;
*******************************************
while(*r){*a=*r;a++;r++}——改为while(*r){*a=*r;a++;r++;}
w+=strlen(t2);
}
else?w++;
}
}
main()
{
char?s[100],t1[100],t2[100],w[100];
clrscr();
printf("nPlease?enter?string?S:");scanf("%s",s);
printf("nPlease?enter?string?t1:");scanf("%s",t1);
printf("nPlease?enter?string?t2:");scanf("%s",t2);
if?(strlen(t1)==strlen(t2))
{?
printf("nThe?result?is?:%sn",w);
}
else?printf("Error:strlen(t1)!=strlen(t2)n");
}
改错11(2004.8.1)
给定程序MODI1.C中,fun函数的功能是:先从键盘上输入一个3行3列矩阵的各个元素的值,然后输出主对角线元素之积。
请改正程序中的错误,或在横线处填上适当的内容并把横线删除,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include?<stdio.h>
int?fun?()
{
int?a?[3]?[3],?sum;
int?i,?j;
***********************************
_____;——sum?=?1;
for?(i=0;i<3;i++)
{?for?(j=0;j<3;j++)
*****************************************
scanf?(〃%d〃?a?[i]?[j]);——scanf("%d",?&a[i][j]);
}
for?(i=0;?i<3;?i++)
sum=sum*a[i]?[i];
printf?(〃Sum=%dn〃,?sum);
}
main?()?
{fun?();}
改错12(8.1)
下列程序的功能是:读入一个整数?k(2≤k≤10000),打印它的所有质因子(即所有为素数的因子)。例如,若输入整数:2310,则应输出:2、3、5、7、11。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include〃conio.h〃
#include〃stdio.h〃
************************************************
IsPrime(?intn?);——IsPrime(int?n)
{inti,m;
m?=?1;
for?(?i?=?2;?i?<?n/?i++?)
*********************************************
if!(?n%i?)——if(!(n%i))
{m=0;?break?;}
return?(?m?);
}
main?()
{intj,?k;
clrscr?();
printf?(〃nPease?enter?an?integer?number?between?2?and?10000:〃);?scanf?(〃%d〃,&k);
printf?(?〃nn?The?prime?factor?(s)?of?%?d?is?(?are?):〃,?k?);
for?(j?=?2;?j?<=k;?j++?)
if?((?!?k%j?)?)?&&?(IsPrime?(?j?))}printf?(?〃n?%?4d〃,?j?);
printf?(〃n〃);
}
改错13(8.4)
下列程序中,fun函数的功能是:根据形参m,计算如下公式的值。
t=1+?1/2?+?1/3?+?1/4?+?…?+?1/m
例如,若输入5,则应输出2.283333。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<conio.h>
#include<stdio.h>
double?fun(int?m)
{
double?t=1.0;
int?i;
for(i=2;i<=m;i++)
*******************************************
t+=1.0/k;——k改为i
*********************************************
____________;——填return?t;
}
main()
{
int?m;
clrscr();
printf(“nPlease?enter?1?integer?number:”);
scanf(“%d”,&m);
printf(“nThe?result?is?%1fn”,fun(m));
}
改错14(8.4)
下列程序中,fun和funx函数的功能是:
用二分法求方程2x×x×x-4x×x+3x-6=0的一个根,并要求绝对误差不超过0.001。例如,若给m输入-100,给n输入90,则函数求得的一个根为2.000。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<stdio.h>
#include<math.h>
double?funx(double?x)
{
return(2*x*x*x-4*x*x+3*x-6);
}
double?fun(double?m,?double?n)
{
**************************************
int?r;——改为double?r;
r=(m+n)/2;
**********************************
while(fabs(n-m)<0.001)——?"<"?改为"?>=?"
{if(funx(r)*funx(n)<0?m=r;
else?n=r;
r=(m+n)/2;
)
return?r;
)
main()
{
double?m,n,root;
printf("Enter?m?n:n");scanf("%1f%1f",&m,&n);
root=fun(m,n);
printf("root=%6.3fn",root);
}
改错15(8.5)
下列给定程序中,函数fun的功能是:判断字符ch是否与str所指串中的某个字符相同;若相同,则什么也不做,若不同,则将器插在串的最后。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<conio.h>
#include?<stdio.h>
#include?<string.h>
**********************************
void?fun(char?str,?char?ch)------------------------1
{?while(*str?&&?*str!=ch)?str++;
**********************************
if?(*str==ch)------------------------------------2
{?str[0]=ch;
*********************************
str[1]='0';------------------------------------3
}
}
main()
{char?s[81],c;
clrscr();
printf("nPlease?enter?a?string:n");gets(s)
printf("nPlease?enter?the?character?to?search:");
c=getchar();
fun(s,c);
printf("nThe?result?is?%sn",s);
}
15?题Answer:
1.void?fun(char?*str,?char?ch)
2.if?(*str=='
改错16(8.5)
下列给定程序中,函数Creatlink的功能是:创建带头结点的单项链表,并为各结点数据域赋0到m-1的值。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<conio.h>
#include?<stdio.h>
#include?<stdlib.h>
typedef?struct?aa
{?int?data;
struct?aa?*next;
}NODE;
NODE?*Creatlink(int?n,?int?m)
{NODE?*h=Null,?*p,*s;
int?i;
s=(NODE?*)malloc(sizeof(NODE));
********************************************
h=p;-------------------------------------1
p->next=NULL;
for?(i=1;i<=n;i++)
{s=(NODE?*)malloc(sizeof(NODE));
********************************************
s->data=rand()%m;-----------------------2
s->next=p->next;
p->next=s;
p=p->next;
}
********************************************
return?p;--------------------------------3
}
outlink(NODE?*h)
{NODE?*p;
p=h->next;
printf("nnTHE?LIST:nn?HEAD");
while(p)
{printf("->%d",p->data);
p=p->next;
}
printf("n");
}?
main()
{?NODE?*head;
clrscr();
head=Creatlink(8,22);
outlink(head);
}
16?题Answer:
1.h=p=s;
2.s->data=rand()%(m-1);
3.return?h;
改错17(8.5)
下列给定程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。k的值由主函数传入,若k的值为500,则函数值为4622。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<conio.h>
#include?<stdio.h>
int?fun(int?k)
{int?m=0,?mc=0,j;
while?((k>=2)&&(mc<10))
*********************************
{if?((k%13=0)||(k%17=0))-------------------1
{m=m+k;mc++;}
k--;
}
return?m;
**********************************
_____________-------------------------------2
main()
{clrscr();
printf("%dn",fun(500));
}
17?题Answer:
1.if?((k%13==0)||(k%17==0))
2.}
改错18(8.5)
下列给定程序中,函数fun的功能是:实现两个整数的交换。例如给a和b分别输入60和65,输出为:a=65b=60
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<conio.h>
#include?<stdio.h>
********************************
void?fun?(int?a,b)--------------------------1
{int?t;
*******************************
t=b;b=a;a=t;-------------------------------2
}
main()
{int?a,b;
clrscr();
printf("Enter?a,b:");scanf("%d%d",&a,&b);
fun(&a,&b);
printf("a=%d?b=%dn",a,b);
}
18?题Answer:
1.void?fun?(int?*a,int?*b)
2.t=*b;*b=*a;*a=t;
改错19(8.5)
下列给定程序中,函数fun的功能是:从低位开始取出长整型变量s中偶数位上的数,一次构成一个新数放在t中。例如,当s中的数为7654321时,t是的数为642。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<conio.h>
#include?<stdio.h>
********************************
void?fun?(long?s,?long?t)--------------------------1
{long?sl=10;
s/=10;
*t=s%10;
****************************
while?(s<0)--------------------------------------2
{s=s/100;
*t=s%10*sl+*t;
sl=sl*10;
}
}
main()
{long?s,t;
clrscr();
printf("nPlease?enter?s:");scanf("%ld",&s);
fun(s,&t);
printf("The?result?is?:?%ldn",t);
}
19?题Answer:
1.void?fun?(long?s,?long?*t)
2.while?(s>0)
改错20(8.5)
N个有序整数数列已放在一堆数组中,下列给定程序中,函数fun的功能是:利用折半查找算法找整数m再数组中的位置。若找到,则返回其下标值;反之,则返回-1。
折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和high(low<high),然后把m与中间位置(mid)中元素的值进行比较。如果m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之后的元素中;反之,下一次的查找范围落在中间位置之前的元素中。直到low>high,查找结束。
请改正程序中的错误,使程序能得出正确的结果。
注意,不要改多main函数,不得增行或删行,也不得更改程序的结构!
试题程序
#include?<stdio.h>
#define?N?10
************************************
void?fun(int?a[],int?m)--------------------------1
{int?low=0,high=N-1,mid;
while(low<=high)
{mid=(low+high)/2;
if?(m<a[mid])
high=mid-1;
***************************************
else?if?(m>=a[mid])----------------------------2
low=mid+1;
else?return(mid);
}
return(-1);
}
main()
{int?i,a[N]={-3,4,7,9,13,45,67,89,100,180},k,m;
printf("a数组中的数据如下:");
for(i=0;i<N;i++)?printf("%d",a[i]);
printf("Enter?m:");scanf("%d",&m);
k=fun(a,m);
if(k>=0)?printf("m=%d,index=%d\n",m,k);
else?printf("Not?be?found!\n");
}
20?题Answer:
1.int?fun(int?a[],int?m)
2.else?if?(m>a[mid])