C语言程序改错及填空题.docx
《C语言程序改错及填空题.docx》由会员分享,可在线阅读,更多相关《C语言程序改错及填空题.docx(77页珍藏版)》请在冰豆网上搜索。
C语言程序改错及填空题
gc23.c下列程序是建立一个包含学生有关数据的单向链表。
但该程序有2个错误,错误出现在
每个注释行附近,请调试改正。
调试改正中,不得改变程序结构,也不得增删语句。
#defineNULL0
structstud
{
longnum;
charname[10];
floatscore;
structstud*next;
};
/*……………comment……………*/
intn;
structstudcreate()////////structstud*create(void)
{
structstud*head,*p1,*p2;
n=0;
p1=p2=(structstud*)malloc(sizeof(structstud));
scanf("%ld,%s,%f",&p1->num,p1->name,&p1->score);
/*……………comment……………*/
head=NULL;
while(p1!
=0)//////////while(p1->num!
=0)
{
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p1=(structstud*)malloc(size(structstud));
scanf("%ld,%s,%f",&p1->num,p1->name,&p1->score);
}
p2->next=NULL;
return(head);
}
gc57.c的功能是互换给定数组中的最大数和最小数。
如将下面8个数:
5,3,1,4,2,8,9,6
变成:
5,3,9,4,2,8,1,6
程序中,最大数与最小数的互换操作通过函数调用来实现,让指针max和min分别指向最大数和最小数。
程序有二处错误,请改正。
注意:
不得增行和删行,也不得修改程序的结构。
main()
{
inti;
staticinta[8]={5,3,1,4,2,8,9,6};
voidjhmaxmin();
printf("Originalarray:
\n");
for(i=0;i<8;i++)
printf("%5d",a[i]);
printf("\n");
jhmaxmin(a,8);
printf("Arrayafterswapingmaxandmin:
\n");
for(i=0;i<8;i++)
printf("%5d",a[i]);
printf("\n");
}
//注意:
voidjhmaxmin(p,n)
intp,n;这是一种老的函数形式,现在一般这样写voidjhmaxmin(intp,intn)
voidjhmaxmin(p,n)
intp,n;////////int*p,n;
{
intt,*max,*min,*end,*q;
end=p+n;
max=min=p;
for(q=p+1;q{if(*q>*max)max=q;
if(*q}
t=*max;*max=*min;*min=t;
}
gc101.c的功能为:
输入8个整数,使用指针以选择法对其进行排序(从小到大).程序中有两处错误代码,请改正.注意,不得改变程序结构。
#include
main()
{
inta[8],*p=a;
inti,j;
inttempmin,tempcode;
printf("\ninputthenumbers:
\n");
for(i=0;i<8;i++)
scanf("%d",p+i);
tempmin=*p;
for(i=0;i<7;i++)
{
for(j=i;j<8;j++)
if(j==i||*(p+j){tempmin=*(p+i);//////////tempmin=*(p+j);
tempcode=j;
};
if(tempcode!
=i)
{*(p+tempcode)=*(p+i);
*(p+j)=tempcode;/////////////*(p+i)=tempmin;
}
}
for(i=0;i<8;i++)
printf("%d,",*(p+i));
return
(1);
}
gc137.c中的sub函数的功能是:
将s所指字符串的反序和正序进行连接形成一个新串放在t所指的数组中。
例如,当s所指字符串的内容为“ABCD”时,t所指数组中的内容为“DCBAABCD”。
请改正函数sub中的两个错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得修改程序的结构。
#include"stdio.h"
#include"conio.h"
#include"string.h"
voidsub(char*s,char*t)
{
inti,d;
d=strlen(s);
for(i=1;it[i]=s[d-1-i];
for(i=0;it[d+i]=s[i];
t[2*d]='/0';/////////t[2*d]='\0';
}
main()
{
chars[100],t[100];
clrscr();
printf("\nPleaseenterstringS:
");
scanf("%s",s);
sub(s,t);
printf("\nTheresultis:
%s\n",t);
}
gc163.c的功能是实现求1000以内的自然数中的完数及其个数(所谓完数,指它恰好等于除它本身之外的因子之和,如:
6=1+2+3,28=1+2+4+7+14),并显示结果。
但该程序中有3处错误,请调试并改正。
不允许改变程序结构和增删语句。
#include
voidmain(void)
{
inti,k,m,n,s,p;//////////////////p=0
inta[100];
printf("\n10000以内的自然数中的完数有:
");
for(i=2;i<=10000;i++)
{s=0;
m=0;
for(k=1;k<=i/2;k++)
{if(i%k==0)
{s=s+k;
a[m]=k;
m=m+1;
}
}
if(s=i)////////if(s==i)
{p=p-1;//////////p=p+1
printf("\n%d=%d",s,a[0]);
n=1;
while(n{printf("+%d",a[n]);n=n+1;}
}
}
printf("\n总个数为:
%d\n",p);
}
gc165.c程序中的函数find_str()用来返回字符串s2在字符串s1中第一次出现的首地址;如果字符串s2不是s1的子串,则该函数返回空指针NULL。
现在程序中发现有两个错误,错误就出现在那些注释行的附近,请你找出错误并将它们改正过来,要求在调试过程中不允许改变程序结构,更不得增删语句。
include
#include
char*find_str(char*s1,char*s2)
{
inti,j,ls2;
ls2=strlen(s2);
for(i=0;i<=strlen(s1)-ls2;i++)
{
for(j=0;j=s2[j])break;
/*..............commentone..............*/
if(j==ls2)return(s1+j);//////return(s1+i)
}
returnNULL;
}
voidmain()
{
char*a="dos6.22windows98office2000",*b="windows",c;///////*c
/*..............commenttwo..............*/
c=find_str(a,b);
if(c!
=NULL)printf("%s\n",c);
elseprintf("未找到字符串%s\n",b);
}
gc166.c程序的功能是:
计算并输出从键盘输入的任一正整数的各位数字之和s以及各位数字之积t。
例如,当输入的正整数为237时,
s的值为12,t的值为42。
请改正程序中的两个错误,使它能得出正确的结果。
注意:
不得增行或删行,也不得修改程序的
结构。
#include"stdio.h"
main()
{
intn,yw,s=0,t=0;/////////t=1
scanf("%d",&n);
while(n!
=0)
{
yw=n%10;
s=s+yw;
t=t*yw;
n=n%10;////////////n=n/10
}
printf("s=%d,t=%d\n",s,t);
}
gc228.c代码功能为:
使用指针将数组a中10个整数按相反的顺序存放。
程序中有3处错误代码,请指出并改正之.
voidinv(x,n)
int*x,n;
{int*p,t,*i,*j,m=(n-1)/2;
i=x;
j=n;///////////j=x+n-1;
p=x+m;
for(;i<=p;i++,j--)
{t=*i;*i=*j;*j=t;}
return;
}
main()
{inta[10],i;
printf("input10number");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("Theoriginalarray:
\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,n);/////////////////inv(a,10);
printf("Thearrayhasbeeninverted:
\n");
for(i=0;i<10;i--)/////////////////for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
gc234.c中函数fun的功能是:
求S的值。
设S=((2*2)/3)*((4*4)/(3*5))*...*((2*k*2*k)/((2*k-1)*(2*k+1)))
请改正函数fun中的两个错误,使程序能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include"stdio.h"
#include"dos.h"
fun(intk)////////////////floatfun(intk)
{intn;
floats,w,p,q;
n=1;s=1.0;
while(n<=k)
{
w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
returns/////////////returns;
}
main()
{clrscr();
printf("%f\n",fun(10));
}
gc273.c功能是:
一个偶数总能表示为两个素数之和。
请改正程序的两个错误,使程序能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include"stdio.h"
#include"math.h"
main()
{inta,b,c,d;
scanf("%d",a);///////////scanf("%d",&a);
for(b=3;b<=a/2;b+=2)
{for(c=2;c<=sqrt(b);c++)
if(b%c==0)break;
if(c>sqrt(b))
d=a+b;////////////d=a-b;
else
break;
for(c=2;c<=sqrt(d);c++)
if(d%c==0)break;
if(c>sqrt(d))
printf("%d=%d+%d\n",a,b,d);
}
}
gc274.c本程序用于输出如下所示的图形。
请将源程序文件中的两个错误改正过来,注意在答题过程中不得对源程序增行或删行,也不得更改程序的结构。
1
121
12321
1234321
123454321
12345654321
1234567654321
123456787654321
12345678987654321
1234567890987654321
12345678987654321
123456787654321
1234567654321
12345654321
123454321
1234321
12321
121
1
#include
#include
main()
{
inti,j,n;
chars[20]="1234567890987654321";
printf("\n\n");
/*ment1................*/
n=10;//////////////////////n=19;
for(i=-n/2;i<=n/2;i++)
{
for(j=0;j<=15+abs(i);j++)printf("%c",'');
/*ment2................*/
for(j=0;j<=n/2-abs(i);j++)printf("%c",s[j]);
for(j=n/2-abs(i);j<19;j++)printf("%c",s[j]);///////////j=n/2+abs(i)+1
printf("\n");
}
}
gc279.c的功能:
函数prn_star(m,left)输出正菱形图案,其中参数m代表图案的行数(为一奇数),left代表图案距屏幕左边的列数。
函数prt_str(m,left)中有3处错误代码,请指出并改正之。
#include
voidprn_star(m,left)
intm,left;
{inti,j,p;
for(i=1;i{if(i<=m)p=i;////////if(i<=m/2)
elsep=m+1+i;/////////p=m+1-i;
for(j=1;j<=left+(m-(2*p-1))/2;j++)
printf("");
for(j=1;j<=2*p-1;j++)
printf("o");
printf("\n");
}
}
main()
{intm,left;
printf("请输入正菱形图案的行数:
");
scanf("%d",&m);
printf("请输入正菱形图案距屏幕左边的列数:
");
scanf("%d",&left);
prn_star(m,left);
}
gc280.c功能为:
M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时,此人出圈,直到圈中只剩下一个人为止。
请按退出次序输出出圈人原来的编号以及留在圈中的最后一个人原来的编号。
程序中有3处错误代码,请指出并改正之。
#include
#defineM10/*numberofperson*/
#defineN2/*eliminateapersonforNcompartment*/
voidmain(){
inti,j,k,n;
statica[M];
intb[M];
/*eliminatepersonsfromarrayatoarrayb*/
for(n=0,j=k=M-1;n{
for(i=0;iwhile
(1){
if(++j>k)
j=0;
if(!
a[j])
continue;/////////continue;改成break;
}
b[n]=j-1;////////////////b[n]=j+1;
a[j]=-1;
}
/*output*/
for(i=0;iprintf("%d",b[i]);
for(i=0;iif(!
a[i])
printf("%d\n",i+1);
}
gc304.c中的函数fun()的功能是:
先将在字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面。
例如:
当s中的字符串为:
"abc12"时,则t中的字符串应为:
"abc1221cba"。
现在程序中发现有两个错误,错误就出现在那些注释行的附近,请你找出错误并将它们改正过来,要求在调试过程中不允许改变程序结构,更不得增删语句。
#include
#include
voidfun(char*s,char*t)
{
inti,st;
st=strlen(s);
/*..............commentone..............*/
for(i=0;it[st]=s[i];//////////////t[i]=s[i];
for(i=0;it[st+i]=s[st-i-1];
/*..............commenttwo..............*/
t[st]='\0';/////////////t[2*st]='\0';
}
voidmain()
{
chars[100],t[100];
printf("\nPleaseenterstrings:
");
gets(s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
gc305.c程序的功能是:
对由n个一位数数字组成的数字串,使其前面各数顺序向后移n-m个位置,最后m个数变成最前面的m个数。
请改正程序中的两个错误,使程序能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
main()
{
intnumber[20],n,m,i;
printf("thenumberlenthis:
");
scanf("%d",&n);
printf("backm:
");
scanf("%d",&m);
for(i=0;iscanf("%d",&number[i]);
scanf("%d",&number[n-1]);
move(number,n,m);
for(i=0;iprintf("%d,",number[i]);
printf("%d",number[n-1]);
}
move(array,n,m)
intn,m,array[20];
{
int*p,array_end;
array_end=*(array+n-1);
for(p=array+n-1;p>array;p--)
*p=*(p+1);////////*p=*(p-1);
array=array_end;///////*array=array_end;
m--;
if(m>0)move(array,n,m);
}
gc307.c功能为:
使用指针将数组中元素按升序排序。
程序中有3处错误代码,请指出并改正之。
#include
main()
{
intk,m,change,a[10];
int*p1;
int**p2=p1;////////////int**p2=&p1
p1=a;
printf("Pleaseinputdatasonebyone:
\n");
for(k=0;k<10;k++)
scanf("%d",p1+k);
for(k=0;k<9;k++)
{
for(m=0;m<9+k;m++)//////for(m=0;m<9-k;m++)
{
if((*p2)[m]>(*p2)[m+1])
{
change=(*p2)[m];
(*p2)[m]=(*p2)[m-1];/////////(*p2)[m]=(*p2)[m+1]
(*p2)[m+1]=change;
}
}
}
for(k=0;k<10;k++)
printf("%d",*(*p2+k));
return
(1);
}
gc342.c的功能是:
计算字符串中子串出现的次数
请改正程序中的两个错误,使程序能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include"string.h"
#include"stdio.h"
main()
{charstr1[20],str2[20],*p1,*p2;
intsum=0;
printf("pleaseinputtwostrings\n");
scanf("%s%s",str1,str2);
p1=str1;p2=str2;
while(*p1!
='\0')
{
if(*p1==*p2)
{while(*p1==*p2||*p2!
='\0')////////////////while(*p1==*