计算机二级C语言考试编程题.docx
《计算机二级C语言考试编程题.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言考试编程题.docx(174页珍藏版)》请在冰点文库上搜索。
计算机二级C语言考试编程题
编程题
1.请编一个函数fun(char*s),函数的功能是把字符串中的内容逆置。
例如:
字符串中原有的内容为:
abcdefg,则调用该函数后,串中的内容为:
gfedcba。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#include
#defineN81
/*本题的考核点是C语言中的for循环语句的使用。
解题思路:
对于本题,我们给出的参考函数采取的算法是:
将第一个元素与最后一个元素互换,第二个元素与倒数第二个互换…的方式进行倒排序。
因为我们一次互换两个元素,所以for循环语句执行length/2次(length是字符串的长度)就可以把全部元素互换一遍。
*/
voidfun(char*s)
{
inti,length;
chartmp;
length=strlen(s);/*统计字符串s中字符的个数*/
for(i=0;i{/*以下三行即将s中的第i个字符与第length-i个字符进行交互*/
tmp=s[i];
s[i]=s[length-i-1];
s[length-i-1]=tmp;
}
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。
*/
inti;
chara[N];
FILE*rf,*wf;
rf=fopen("bc8.in","r");
wf=fopen("bc8.out","w");
for(i=0;i<9;i++){
fscanf(rf,"%s",a);
fun(a);
fprintf(wf,"%s\n",a);
}
fclose(rf);
fclose(wf);
}
main()
{chara[N];
system("cls");
printf("Enterastring:
");gets(a);
printf("Theoriginalstringis:
");puts(a);
fun(a);
printf("\n");
printf("Thestringaftermodified:
");
puts(a);NONO();
}
2.编写程序,实现矩阵(3行3列)的转置(即行列互换)。
例如,输入下面的矩阵:
100200300
400500600
700800900
程序输出:
100400700
200500800
300600900
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
/*本题的考核点是3行3列矩阵转置算法。
解题思路:
通过两重循环和一个中间数组完成转置。
方法是通过循环将原数组中的i行j列上的数赋值给中间数组的j行i列,最后再将中间数组的值赋给原数组,形成转置后的矩阵。
*/
voidfun(intarray[3][3])
{inti,j;intb[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[j][i]=array[i][j];/*将矩阵行列互换*/
for(i=0;i<3;i++)
for(j=0;j<3;j++)
array[i][j]=b[i][j];/*将b数组中的数据原封不动的保存在array数组中*/
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。
*/
inti,j;
FILE*wf;
intarray[3][3]={{100,200,300},
{400,500,600},
{700,800,900}};
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);
}
main()
{
inti,j;
intarray[3][3]={{100,200,300},
{400,500,600},
{700,800,900}};
system("cls");
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();
}
3.编写函数intfun(intlim,intaa[MAX]),该函数的功能是求出小于lim的所有素数并放在aa数组中,该函数返回求出素数的个数。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#defineMAX200
/*本题的考核点是找出小于指定数的所有素数的算法。
解题思路:
从2到指定数lim,找出所有的素数,素数的判断方法是:
只能被1和其自身整除,而不能被其它任何数整除的数。
*/
intfun(intlim,intaa[MAX])
{inti,j=0,k=0;
for(i=2;i{for(j=2;j
if(i%j==0)break;/*假如i能被整除,则退出该层循环*/
if(j==i)aa[k++]=i;/*假如i不能被比它小的整数整除,则将i存入aa数组中*/
}
returnk;
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,
输出数据,关闭文件。
*/
inti,j,limit,sum;
intaa[MAX];
FILE*rf,*wf;
rf=fopen("b14.in","r");
wf=fopen("a14.out","w");
for(j=0;j<4;j++)
{fscanf(rf,"%d",&limit);
sum=fun(limit,aa);
for(i=0;ifprintf(wf,"%d\n",aa[i]);
}
fclose(rf);
fclose(wf);
}
main()
{
intlimit,i,sum;
intaa[MAX];
system("cls");
printf("输入一个整数:
");
scanf("%d",&limit);
sum=fun(limit,aa);
for(i=0;iif(i%10==0&&i!
=0)printf("\n");
printf("%5d",aa[i]);
}
NONO();
}
4.请编写函数fun,函数的功能是求出二维数组周边元素之和,作为函数值返回。
二维数组中的值在主函数中赋予。
例如:
二维数组中的值为
13579
29994
69998
13570
则函数值为61。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#defineM4
#defineN5
/*本题的考核点是c语言中嵌套循环语句和条件判断语句的使用。
解题思路:
二维数组的周边元素的特点是:
它有一个下标为0或为数组上界。
所以我们只需判断数组的下标是否为0或数组上界即可。
按行、列进行循环可以保证符合条件的元素只被运算一次。
*/
intfun(inta[M][N])
{
inti,j,sum=0;
for(i=0;ifor(j=0;jif((i==0)||(i==M-1)||(j==0)||(j==N-1))/*判断a[i][j]是否为数组中的第一行或最后一行或第一列或最后一列*/
sum+=a[i][j];/*对a数组的周边元素求和*/
returnsum;
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,
输出数据,关闭文件。
*/
inti,j,y,k,aa[M][N];
FILE*rf,*wf;
rf=fopen("bc4.in","r");
wf=fopen("bc4.out","w");
for(k=0;k<10;k++){
for(i=0;ifor(j=0;jy=fun(aa);
fprintf(wf,"%d\n",y);
}
fclose(rf);
fclose(wf);
}
main()
{intaa[M][N]={{1,3,5,7,9},
{2,9,9,9,4},
{6,9,9,9,8},
{1,3,5,7,0}};
inti,j,y;
system("cls");
printf("Theoriginaldatais:
\n");
for(i=0;i{for(j=0;jprintf("\n");
}
y=fun(aa);
printf("\nThesum:
%d\n",y);
printf("\n");
NONO();
}
5.请编写函数fun,对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按降序排列。
例如,原来的字符串为CEAedca,排序输出为CedcEAa。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#include
/*本题的考核点是对除首、尾字符外的其它字符按降序排列的算法。
解题思路:
只对除首、尾字符外的字符排序,排序可用多种方法来实现,本题用的是选择法,通过一变量来记录大数的下标,再与前面的数交换,从而实现降序排序。
*/
intfun(char*s,intnum)
{inti,j,h,t;
for(i=1;i{h=i;
for(j=i;jif(s[h]
if(h!
=i)/*判断找到的最大字符的下标是否为第i个字符*/
{t=s[h];s[h]=s[i];s[i]=t;}/*将s[h]与s[i]中的字符进行交换*/
}
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。
*/
chars[10];
intj;
FILE*rf,*wf;
rf=fopen("b15.in","r");
wf=fopen("a15.out","w");
for(j=0;j<4;j++)
{fscanf(rf,"%s",s);
fun(s,7);
fprintf(wf,"%s\n",s);
}
fclose(rf);
fclose(wf);
}
main()
{
chars[10];
system("cls");
printf("输入7个字符的字符串:
");
gets(s);
fun(s,7);
printf("\n%s",s);
NONO();
}
6.请编一个函数voidfun(inttt[M][N],intpp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。
二维数组中的数已在主函数中赋予。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#defineM3
#defineN4
voidfun(inttt[M][N],intpp[N])
{
inti,j,min;
for(i=0;i<4;i++)
{
min=tt[0][i];/*将每列的第一个数赋值给min*/
for(j=0;j<3;j++)/*将min与该列中的每个数进行比较,并把最大的那个数赋值给min*/
if(min>tt[j][i])
min=tt[j][i];
pp[i]=min;
}
/*本题的考核点是C语言中循环嵌套语句的使用。
解题思路:
从题目的要求来看,我们应建立一个两重循环来按行、列寻找最小元素。
因为题目要求出每列中的最小元素,所以列循环应放在外面,行循环放在里面。
我们给出的参考函数中,定义了一个变量min来保存最小元素,在行循环中比较出最小元素,并在行循环结束时赋给数组pp的相应元素。
*/
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,
输出数据,关闭文件。
*/
inti,j,k,m,t[M][N],p[N];
FILE*rf,*wf;
rf=fopen("bc3.in","r");
wf=fopen("bc3.out","w");
for(m=0;m<10;m++){
for(i=0;ifor(j=0;jfscanf(rf,"%6d",&t[i][j]);
}
fun(t,p);
for(k=0;kfprintf(wf,"\n");
}
fclose(rf);
fclose(wf);
}
main()
{intt[M][N]={{22,45,56,30},
{19,33,45,38},
{20,22,66,40}};
intp[N],i,j,k;
system("cls");
printf("Theoriginaldatais:
\n");
for(i=0;ifor(j=0;jprintf("%6d",t[i][j]);
printf("\n");
}
fun(t,p);
printf("\nTheresultis:
\n");
for(k=0;kprintf("\n");
NONO();
}
7.编写一个函数,从传入的num个字符串找出最长的一个字符串,并通过形参指针max传回该串地址。
(注意:
用****作为结束输入的标志。
)
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#include
/*本题的考核点是从一组字符串中找出最长串的算法。
解题思路:
通过求字符串长度函数对一组字符串的字符进行比较,并将地址赋给一指针变量。
*/
fun(char(*a)[81],intnum,char**max)
{inti;
*max=a[0];/*将第一个字符串赋值给max指针*/
for(i=1;i<=num;i++)
if(strlen(a[i])>strlen(*max))*max=a[i];/*假如字符串a[i]的长度比指针max中的字符串的长度长,则将a[i]字符串赋值给max指针*/
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,
输出数据,关闭文件。
*/
charss[10][81],*ps;
intn,i,j;
FILE*rf,*wf;
rf=fopen("b16.in","r");
wf=fopen("a16.out","w");
for(j=0;j<4;j++)
{i=0;fscanf(rf,"%s",ss[i]);
while(!
strcmp(ss[i],"****")==0)
{i++;
fscanf(rf,"%s",ss[i]);
}
n=i;
fun(ss,n,&ps);
fprintf(wf,"max=%s\n",ps);
}
fclose(rf);
fclose(wf);
}
main()
{
charss[10][81],*ps;
intn,i=0;
system("cls");
printf("输入若干个字符串:
");
gets(ss[i]);
puts(ss[i]);
while(!
strcmp(ss[i],"****")==0)
{
i++;
gets(ss[i]);
puts(ss[i]);
}
n=i;
fun(ss,n,&ps);
printf("\nmax=%s\n",ps);
NONO();
}
8.编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。
例如,假定输入的字符串为:
asdasasdfgasdaszx67askmklo,子字符串为:
as,则应输出6。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#include
/*本题的考核点是统计子串在主串中出现次数的算法。
解题思路:
将主串中的字符从第一个位置开始逐个与子串中的字符作比较,若子串出现在主串中,次数加1,主串中的指针移动到下一个位置继续与子串比较,反之,主串中的指针也同样移动到下个位置,直至主串中的字符全部比较结束。
*/
intfun(char*str,char*substr)
{unsignedinti=0;
intj,k=0,add;
while(i{j=0;add=i;
while((str[add]==substr[j])&&(substr[j]!
='\0'))
{add++;j++;}
if(substr[j]=='\0')k++;
i++;
}
returnk;
}
NONO()
{/*请在此函数内打开文件,输入测试数据,调用fun函数,
输出数据,关闭文件。
*/
charstr[81],substr[3];
intn,j;
FILE*rf,*wf;
rf=fopen("b17.in","r");
wf=fopen("b17.out","w");
for(j=0;j<4;j++)
{
fscanf(rf,"%s",str);
fscanf(rf,"%s",substr);
n=fun(str,substr);
fprintf(wf,"n=%d\n",n);
}
fclose(rf);
fclose(wf);
}
main()
{
charstr[81],substr[3];
intn;
system("cls");
printf("输入主字符串:
");
gets(str);
printf("输入子字符串:
");
gets(substr);
puts(str);
puts(substr);
n=fun(str,substr);
printf("n=%d\n",n);
NONO();
}
9.程序定义了N×N的二维数组,并在主函数中赋值。
请编写函数fun,函数的功能是:
求出数组周边元素的平均值并作为函数值返回给主函数中的s。
例如:
a数组中的值为
|01279|
|19745|
a=|23831|
|45682|
|59141|
则返回主程序后s的输出结果为:
3.375000。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#include
#include
#defineN5
/*本题的考核点是二维数组、循环语句和