C语言题库第5章 数组.docx
《C语言题库第5章 数组.docx》由会员分享,可在线阅读,更多相关《C语言题库第5章 数组.docx(39页珍藏版)》请在冰豆网上搜索。
![C语言题库第5章 数组.docx](https://file1.bdocx.com/fileroot1/2023-7/19/e587617b-ec4a-4903-a498-1239e2bc57c6/e587617b-ec4a-4903-a498-1239e2bc57c61.gif)
C语言题库第5章数组
第五章数组
一、单项选择
1.若要定义一个具有5个元素的整型数组,以下错误的定义语句是(C)
2.下列选项中,能正确定义数组的语句是(D)
3.下面是有关C语言字符数组的描述,其中错误的是(D)
4.有以下程序,程序运行时若输入:
howareyou?
Iamfine<回车>则输出结果是(C)
#include
intmain()
{chara[30],b[30];
scanf("%s",a);
gets(b);
printf("%s\n%s\n",a,b);
return0;
}
5.以下选项中正确的语句组是(D)
6.若有定义语句:
intm[]={5,4,3,2,1},i=4;则下面对m数组元素的引用中错误的是(A)
7.以下数组定义中错误的是(A)
8.下列选项中,能够满足"若字符串s1等于字符串s2,则执行ST"要求的是(A)
9.有以下程序,程序运行后的输出结果是(C)
#include
#include
intmain()
{
charx[]="STRING";
x[0]='0';x[1]='\0';x[2]=0;
printf("%d%d\n",sizeof(x),strlen(x));
return0;
10.有以下程序,程序运行后的输出结果是(B)
#include
#include
intmain()
{
chara[20]=”ABCD\0EFG\0”,b[]=”IJK”;
strcat(a,b);printf(“%s\n”,a);
return0;
二、程序设计
1./*编写程序,实现矩阵(3行3列)的转置(即行列互换)。
例如,输入下面的矩阵:
100200300
400500600
700800900
程序输出:
100400700
200500800
300600900
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
*/
#include
voidfun(intarray[3][3])
{
/**********Begin**********/
/**********End***********/
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,
输出数据,关闭文件。
*/
inti,j;
FILE*wf,*in;
intarray[3][3]={{100,200,300},
{400,500,600},
{700,800,900}};
in=fopen("a11.in","r");
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
fscanf(in,"%d",&array[i][j]);
}
wf=fopen("a11.out","w");
fun(array);
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
fprintf(wf,"%7d\n",array[i][j]);
}
fclose(wf);
}
intmain()
{
inti,j;
intarray[3][3]={{100,200,300},
{400,500,600},
{700,800,900}};
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("\n");
}
fun(array);
printf("Convertedarray:
\n");
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("\n");
}
NONO();
return0;
}
【参考代码】
inti,j;intb[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[j][i]=array[i][j];
===========================
2./*请编写函数fun,其功能是:
将所有大于1小于等于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。
例如,输入17,则应输出46891012141516。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
#include
#include
intfun(intm,intxx[])
{
/**********Begin*******/
/*********End*********/
}
intmain()
{
FILE*wf,*in;
intm,n,zz[100];
printf("\nPleaseenteranintegernumberbetween10and100:
");
scanf("%d",&n);
m=fun(n,zz);
printf("\n\nThereare%dnon-primenumberslessthan%d:
",m,n);
for(n=0;nprintf("\n%4d",zz[n]);
/******************************/
wf=fopen("1.out","w");
in=fopen("1.in","r");
fscanf(in,"%d",&n);
m=fun(n,zz);
for(n=0;nfprintf(wf,"%d\n",zz[n]);
fclose(wf);
fclose(in);
/*****************************/
return0;
}
【参考代码】
inti,j,n=0;
for(i=4;i<=m;i++)
{
for(j=2;j
if(i%j==0)break;
if(j
}
returnn;
===============
3./*编写函数intfun(intlim,intaa[MAX]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求出的素数的个数。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
#include
#defineMAX100
intfun(intlim,intaa[MAX])
{
/*********Begin********/
/*********End*********/
}
intmain()
{
FILE*wf,*in;
intlimit,i,sum;
intaa[MAX];
printf("输入一个整数");
scanf("%d",&limit);
sum=fun(limit,aa);
for(i=0;i{
if(i%10==0&&i!
=0)/*每行输出10个数*/
printf("\n");
printf("%5d",aa[i]);
}
/******************************/
in=fopen("2.in","r");
fscanf(in,"%d",&limit);
wf=fopen("2.out","w");
sum=fun(limit,aa);
for(i=0;i{
fprintf(wf,"%d\n",aa[i]);
}
fclose(wf);
fclose(in);
/*****************************/
return0;
}
【参考代码】
inti,j,k=0;
for(i=2;i<=lim;i++)
{
for(j=2;j
if(i%j==0)break;
if(j>=i)
aa[k++]=i;
}
returnk;
===============
4./*请编写函数fun,该函数的功能是:
移动一维数组中的内容,若数组中有n个整数,要求把下标从0到p(p<=n-1)的数组元素平移到数组的最后。
例如,一维数组中的原始内容为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,p的值为3。
移动后,一维数组中的内容应为5,6,7,8,9,10,11,12,13,14,15,1,2,3,4。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号注释语句中填入所编写的若干语句。
试题程序:
*/
#include
#defineN80
voidfun(intw[],intp,intn)
{
/************Begin**************/
/************End**************/
}
intmain()
{
FILE*wf,*in;
inta[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
inti,p,n=15;
printf("Theoriginaldata:
\n");
for(i=0;iprintf("%3d",a[i]);
printf("\n\nEnterp:
");
scanf("%d",&p);
fun(a,p,n);
printf("\nThedataaftermoving:
\n");
for(i=0;iprintf("%3d",a[i]);
printf("\n\n");
/******************************/
in=fopen("in49.dat","r");
wf=fopen("out49.dat","w");
fscanf(in,"%d%d",&n,&p);
for(i=0;ifscanf(in,"%d",&a[i]);
for(i=0;iprintf("%3d",a[i]);
fun(a,p,n);
for(i=0;ifprintf(wf,"%3d",a[i]);
fclose(wf);
fclose(in);
/*****************************/
return0;
}
*【参考代码】
inti,j=0,b[N];
for(i=p+1;ifor((i=0);i<=p;i++)
b[j++]=w[i];
for(i=0;iw[i]=b[i];
===============
5./*请编写一个函数fun,它的功能是:
将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转为整数的函数)。
例如,若输入字符串"-1234",则函数把它转换为整数值-1234。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
longfun(charp[])
{
/***************Begin************/
/***************End************/
}
intmain()
{
FILE*wf,*in;
chars[6];
longn;
printf("Enterastring:
\n");
gets(s);
n=fun(s);
printf("%ld\n",n);
/******************************/
in=fopen("in13.dat","r");
wf=fopen("out13.dat","w");
fscanf(in,"%s",s);
fprintf(wf,"%ld",fun(s));
fclose(wf);
/*****************************/
return0;
}
【参考代码】
longn=0,i=0;
intflag=1;
if(p[i]=='-')/*负数时置flag为-1*/
{i++;flag=-1;}
elseif(p[i]=='+')/*正数时置flag为1*/
i++;
while(p[i]!
='\0')
{n=n*10+p[i]-'0';/*将字符串转成相应的整数*/
i++;
}
returnn*flag;
===============
6./*请编写一个函数fun,它的功能是:
求出1到m(含m)之内能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。
例如,若传给m的值为50,则程序输出:
711142122283335424449
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
#defineM100
intfun(intm,inta[])
{
/***************Begin************/
/***************End************/
}
intmain()
{
FILE*wf,*in;
intaa[M],n,k,i;
n=fun(50,aa);
for(k=0;kif((k+1)%20==0)/*每行输出20个数*/
{printf("%4d",aa[k]);
printf("\n");
}
else
printf("%4d",aa[k]);
printf("\n");
/******************************/
in=fopen("in4.dat","r");
wf=fopen("out4.dat","w");
fscanf(in,"%d",&k);
n=fun(k,aa);
for(i=0;ifprintf(wf,"%d\n",aa[i]);
fclose(wf);
/*****************************/
return0;
}
【参考代码】
inti,j=0;
for(i=1;i<=m;i++)
if(i%7==0||i%11==0)
a[j++]=i;
returnj;/*返回这些数的个数*/
=====================
7./*请编写函数fun,函数的功能是:
求出二维数组周边元素之和,作为函数值返回。
二维数组中的值在主函数中赋予。
例如,若二维数组中的值为
13579
29994
69998
13570
则函数值为61。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
*/
#include
#include
#defineM4
#defineN5
intfun(inta[M][N])
{
/***************Begin************/
/***************End************/
}
voidmain()
{
FILE*wf,*in;
intaa[M][N]={{1,3,5,7,9},{2,9,9,9,4},{6,9,9,9,8},{1,3,5,7,10}};
inti,j,y;
printf("Theoriginaldatais:
\n");
for(i=0;i{for(j=0;jprintf("%6d",aa[i][j]);
printf("\n");
}
y=fun(aa);
printf("\nThesun:
%d\n",y);
printf("\n");
/******************************/
in=fopen("in10.dat","r");
wf=fopen("out10.dat","w");
for(i=0;ifor(j=0;jfscanf(in,"%d",&aa[i][j]);
y=fun(aa);
fprintf(wf,"%d",y);
fclose(wf);
/*****************************/
}
【参考代码】
inti,j,sum=0;
for(i=0;ifor(j=0;jif(i==0||i==M-1||j==0||j==N-1)
sum=sum+a[i][j];
returnsum;
===============
8./*下列程序定义了NXN的二维数组,并在主函数中赋值。
请编写函数fun,函数的功能是:
求出数组周边元素的平均值并作为函数值返回给主函数中的s。
例如,若a数组中的值为:
01279
19745
23831
45682
59141
则返回主程序后s的值应为3.375000。
注意:
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号注释语句中填入所编写的若干语句。
试题程序:
*/
#include
#include
#defineN5
doublefun(intw[][N])
{
/************Begin**************/
/************End**************/
}
intmain()
{
FILE*wf,*in;
inta[N][N]={0,1,2,7,9,1,9,7,4,5,2,3,8,3,1,4,5,6,8,2,5,9,1,4,1};
inti,j;
doubles;
printf("*****Thearray*****\n");
for(i=0;i{for(j=0;j{printf("%4d",a[i][j]);}
printf("\n");
}
s=fun(a);
printf("*****THERESULT*****\n");
printf("Thesumis:
%lf\n",s);
/******************************/
in=fopen("in45.dat","r");
for(i=0;ifor(j=0;jfscanf(in,"%d",&a[i][j]);
wf=fopen("out45.dat","w");
s=fun(a);
fprintf(wf,"%lf",s);
fclose(wf);
fclose(in);
/*****************************/
return0;
}
*【参考答案】
inti,j,k=0;
doubleav=0.0;
for(i=0;ifor(j=0;jif(i==0||i==N-1||j==0||j==N-1)
{av=av+w[i][j];
k++;
}
returnav/k;
===============
三、程序改错
1./*N个有序整数数列已放在一维数组中,给定下列程序中,函数fun的功能是:
利用折半查找算法查找整数m在数组中的位置。
若找到,则返回其下标值;反之,则返回-1。
折半查找的基本算法是:
每次查找前先确定数组中待查的范围:
low和high(low然后把m与中间位置(mid)中元素的值进行比较。
如果m的值大于中间位置元素中的值,
则下一次的查找范围放在中间位置之后的元素中;反之,下次查找范围落在中间位置之前的元素中。
直到low>high,查找结束。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
*/
#include
#defineN10
/**********ERROR**********/
voidfun(inta[],intm)
{intlow=0,high=N-1,mid;
while(low<=high)
{mid=(low+high)/2;
if(mhigh=mid-1;
/**********ERROR**********/
elseif(m>=a[mid])
low=mid+1;
elsereturn(mid);
}
return(-1);
}
intmain()
{inti,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m;
printf("a数组中的数据如下:
");
for(i=0;iprintf("%d",a[i]);
printf("Enterm:
");
scanf("%d",&m);
k=fun(a,m);
if(k>=0)
printf("m=%d,index=%d\n",m,k);
else
printf("Notbefound!
\n");
return0;
}
【参考答案】
intfun(inta[],intm)
m>a[mid]
2./*下列给定程序中,函数fun的功能是:
输出M行、M列整数方阵,然后求两条对角线上的各元素之和,返回此和数。
请改正程序中的错误