全国计算机等级考试二级C语言练习题(七)
1.程序填空题
请补充main函数,该函数的功能是:输出一个3×3的矩阵,要求必须使用行指针表示输出变量。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
main()
{
static int array[3][3]={{9,8,7},{6,5,4},{3,2,1}};
int (*p)[3],j,I;
/**********found**********/
p=___1___;
system("cls");
for(i=0;i<3;i++)
{
printf("\n\n");
for(j=0;j<3;j++)
/**********found**********/
printf("%4d",___2___);
}
}
【答案】
(1)array (2)*(*(p+i)+j)
2.程序修改题
下列给定程序中,函数fun()的功能是:首先把b所指字符串中的字符按逆序存放,然后将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指数组的尾部。
例如,当a所指字符串中的内容为abcdefg,b所指字符串中的内容为1234时,c所指数组中的内容应该为a4b3c2d1efg;而当a所指字符串中的内容为1234,b所指字符串中的内容为abcdefg时,c所指数组中的内容应该为1g2f3e4dcba。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
void fun(char *a,char *b,char *c)
{
int I,j; char ch;
i=0; j=strlen(b)-1;
/**********found**********/
while(i>j)
{
ch=b[i];b[i]=b[j];b[j]=ch;
i++;j--;
}
while(*a||*b)
{
if(*a){*c=*a; c++; a++;}
if(*b){*c=*b; c++; b++;}
}
/**********found**********/
*c=o;
}
main()
{
char s1[100],s2[100],t[200];
system("cls");
printf("Enter s1 string: ");
scanf("%s",s1);
printf("Enter s2 string: ");
scanf("%s",s2);
fun(s1,s2,t);
printf("The result is :%s\n",t);
}
【答案】
(1)将while(i>j) 改为:while(i<j)
(2)将*c=o; 改为:*c='\0';
3.程序设计题
请编写函数fun(),该函数的功能是:实现B=A+A′,即把矩阵A加上A的转置,存放在矩阵B中。计算结果在main()函数中输出。
例如,输入下面矩阵:
1 2 3
4 5 6
7 8 9
其转置矩阵为:
1 4 7
2 5 8
3 6 9
则程序输出:
2 6 10
6 10 14
10 14 18
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <conio.h>
#include <windows.h>
void fun(int a[3][3],int b[3][3])
{
}
main()
{
int a[3][3]={{1,2,3},{4,5,6},
{7,8,9}},t[3][3];
int I, j;
system("cls");
fun(a,t);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%7d",t[i][j]);
printf("\n");
}
}
【答案】
void fun(int a[3][3],int b[3][3])
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[i][j]=a[i][j]+a[j][i];
}
1.程序填空题
请补充main函数,该函数的功能是:把字符串str1中的非空格字符拷贝到字符串str2中。
例如,若str1=“glad to see you!”,则str2=“gladto seeyou!”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 80
main()
{
static char str1[N]="glad to see you!";
char str2[N];
int i=0,j=0;
system("cls");
printf("\n***** str1*****\n ");
puts(str1);
while(str1[i])
{
/**********found**********/
if(___1___)
str2[j++]=str1[i];
/**********found**********/
___2___;
}
printf("\n***** str2 *****\n ");
for(i=0;i<j;i++)
printf("%c",str2[i]);
}
【答案】
(1)str1[i]!=' ' (2)i++
2.程序修改题
在给定程序中,函数fun()的功能是:利用插入排序法对字符串中的字符按从大到小的顺序进行排序。插入法的基本方法是:先对字符串中的头两个元素进行排序,然后把第3个字符插入到前两个字符中,插入后前3个字符依然有序;再把第4个字符插入到前3个字符中,待排序的字符串已在主函数中赋予。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <string.h>
#include <stdio.h>
#define N 80
void insert(char *aa)
{
int I,j,n; char ch;
n=strlen(aa);
for(i=1;i<n;i++)
{
ch=aa[i];
j=i-1;
/**********found**********/
while((j>=0)||(ch>aa[j]))
{
aa[j+1]=aa[j];
j--;
}
/**********found**********/
aa[j]=ch;
}
}
main()
{
char a[N]="JRTYDFKLIOPQWEGHMNBVCUASXZ";
int I;
printf("The original string: %s\n",a);
insert(a);
printf("The string after sorting: %s\n",
a);
}
【答案】
(1)将while((j>=0)||(ch>aa[j])) 改为:
while((j>=0)&&(ch>aa[j]))
(2)将aa[j]=ch; 改为:aa[j+1]=ch;
3.程序设计题
请编写一个函数void fun(char orig[],char result[],int flg),其功能是:删除一个字符串中指定下标的字符。其中,orig指向原字符串,删除后的字符串存放在result所指的数组中,flg中存放指定的下标。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <conio.h>
#define NUM 100
void fun(char orig[],char result[],int flg)
{
}
main()
{
char s1[NUM],s2[NUM];
int flg;
FILE *out;
printf("Please Input s1:\n");
gets(s1);
printf("Input want to deleted:");
scanf("%d",&flg);
fun(s1,s2,flg);
printf("The result is:%s\n",s2);
fun("test String",s2,9);
out=fopen("outfile.dat","w");
fprintf(out,"%s",s2);
fclose(out);
}
【答案】
int n,m=0;
for(n=0;n<NUM;n++)
if(n!=flg)
{
result[m]=orig[n];
m++;
}
result[m]='\0';
1.程序填空题
请补充main函数,该函数的功能是:输出一个N×N矩阵,要求非周边元素赋值0,周边元素赋值1。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 10
main()
{
int bb[N][N];
int I,j,n;
system("cls");
printf("Input n:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
/**********found**********/
if(___1___)
bb[i][j]=1;
else
/**********found**********/
___2___;
}
printf("\n*** the result ***\n");
for(i=0;i<n;i++)
{
printf(" \n\n");
for(j=0;j<n;j++)
printf("%4d",bb[i][j]);
}
}
【答案】
(1)i==0||i==n-1||j==0||j==n-1
或 i==0||j==0||i==n-1||j==n-1
或 j==0||i==0||j==n-1||i==n-1
(2)bb[i][j]=0
2.程序修改题
给定程序中,函数fun()的功能是:找出一个大于给定整数m且紧随m的素数,并作为函数值返回。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
int fun(int m)
{
int I,k;
for(I=m+1; ;I++)
{ for(k=2;k<I;k++)
/**********found**********/
if(I%k!=0)
break;
/**********found**********/
if(k<I)
return(I);
}
}
main()
{
int n;
system("cls");
printf("Please enter n: ");
scanf("%d",&n);
printf("%d\n",fun(n));
}
【答案】
(1)将if(i%k!=0) 改为:if(i%k==0)
(2)将if(k<i) 改为:if(k>=i)
3.程序设计题
已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun(),该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分)。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define N 10
typedef struct ss /*定义结构体*/
{ char num[10];
int s;
}STU;
fun(STU a[],STU *s)
{
}
main()
{ STU a[N]={{"A01",81},{"A02",89},
{"A03",66},{"A04",87},{"A05",77},
{"A06",90},{"A07",79},{"A08",61},
{"A09",80},{ "A10",71}},m;
int I;
system("cls");
printf("*****The original data*****");
for(i=0;i<N;i++)
printf("No=%sMark=%d\n",a[i].num,
a[i].s);
fun(a,&m);
printf("***THE RESULT***\n");
printf("The top :%s, %d\n",m.num,m.s);
}
【答案】
fun(STU a[],STU *s)
{
int i;
*s=a[0];
for(i=0;i<N;i++)/*找出成绩最高的学生记录*/
if(s->s<a[i].s)
*s=a[i];
}
1.程序填空题
请补充main函数,该函数的功能是:把一个整数插入到一个已经按从小到大排序的数组中。插入后,数组仍然有序。
例如,在数组bb[N]={12,23,31,44,51,63,71,79,85,95}中插入93,结果为bb[N]={11,21,31,41,51,61,71,79,81,93,95}
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 10
main()
{
int I,j;
int n;
int bb[N+1]={12,23,31,44,51,63,71,79,85,95};
system("cls");
printf("Input n \n");
scanf("%d",&n);
printf("\nn=%d ",n);
printf("\n*** original list ***\n");
for(i=0;i<N;i++)
printf("%4d ",bb[i]);
for(i=0;i<N;i++)
{
if(n<=bb[i])
{
/**********found**********/
for(j=N;___1___;j--)
/**********found**********/
___2___;
bb[j]=n;
/**********found**********/
___3___;
}
}
if(i==N)
bb[i]=n;
printf("\n*** new list ***\n");
for(i=0;i<N+1;i++)
printf("%4d ",bb[i]);
}
【答案】
(1)j>i (2)bb[j]=bb[j-1] (3)break
2.程序修改题
下列给定程序中,函数fun()的功能是:根据整型参数m,计算如下公式的值:
y=1/(100×100)+1/(200×200)+1/(300×300)+…
+1/(m×m)
例如,若m=2000,则应输出0.000160。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
/**********found**********/
fun(int m)
{ double y=0,d;
int I;
/**********found**********/
for(I=100,I<=m,I+=100)
{
d=(double)I*(double)I;
y+=1.0/d;
}
return(y);
}
main()
{
int n=2000;
system("cls");
printf("The result is %1f\n",fun(n));
}
【答案】
(1)将fun(int m) 改为:double fun(int m)
(2)将for(i=100,i<=m,i+=100) 改为:
for(i=100;i<=m;i+=100)
3.程序设计题
请编写函数fun(),其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。
例如,输入17,则应输出4 6 8 9 10 12 14 15 16。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
void fun(int m,int *k,int xx[])
{
}
main()
{
int m,n,zz[100];
system("cls");
printf("Please enter an integer number
between 10 and 100: ");
scanf("%d",&n);
fun(n,&m,zz);
printf("There are %d non-prime numbers
less than %d: ",m,n);
for(n=0;n<m;n++)
printf("\n %4d",zz[n]);
}
【答案】
void fun(int m,int *k,int xx[])
{
int i,j,n=0;
for(i=2;i<m;i++)
{
for(j=2;j<i;j++)
if(i%j==0) break;
if(j<i) xx[n++]=i;
}
*k=n;
}
1.程序填空题
请补充main函数,该函数的功能是:把一个二维字符数组每行字符串最大的字符拷贝到字符数组s中。
例如,如果str[3]={"efjh","efknls","owys"},则s="jsy"。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
main()
{
int i=0;
char *str[3]={"efjh","efknls","owys"};
char **p;
char s[8];
system("cls");
/**********found**********/
___1___;
for(i=0;i<3;i++)
{
s[i]=*p[i];
while(*p[i])
{
if(s[i]<*p[i])
s[i]=*p[i];
/**********found**********/
___2___;
}
}
/**********found**********/
___3___;
printf(" new string \n");
puts(s);
}
【答案】
(1)p=str (2)p[i]++ (3)s[i]='\0'
2.程序修改题
下列给定程序中,函数fun()的功能是:将字符串p中所有字符复制到字符串b中,要求每复制3个字符之后插入一个空格。例如,在调用fun()函数之前给字符串a输入ABCDEFGHIJK,调用函数之后,字符串b中的内容则为ABC DEF GHI JK。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
void fun(char *p,char *b)
{
int I,k=0;
while(*p)
/**********found**********/
{ i=1;
/**********found**********/
while(i<3||*p)
{
b[k]=*p;
k++;p++;i++;
}
if(*p)
/**********found**********/
{ b[k]=' '; }
}
b[k]='\0';
}
main()
{
char a[80],b[80];
printf("Enter a string: "); gets(a);
printf("The original string: ");
puts(a);
fun(a,b);
printf("The string after insert space:");
puts(b); printf("\n\n ");
}
【答案】
(1)将i=1; 改为:i=0;
(2)将while(i<3||*p) 改为:while(i<3&&*p)
(3)将b[k]= ' '; 改为:b[k++]=' ';
3.程序设计题
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是:按分数的高低排列学生的记录,高分在前。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s ;
}STREC;
int fun(STREC a[])
{
}
main()
{
STREC s[N]={{"GA005",85},{"GA003",76},
{"GA002",69},{"GA004",85},{"GA001",91},
{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",91},{"GA012",64},
{"GA011",66},{"GA017",64},{"GA018",64},
{"GA016",72}};
int I;
FILE *out;
fun(s);
printf("The data after sorted :\n");
for(i=0;i<N;i++)
{
if((i)%4==0) /*每行输出4个学生记录*/
printf("\n");
printf("%s %4d",s[i].num,s[i].s);
}
printf("\n");
out=fopen("out47.dat", "w");
for(i=0;i<N;i++);
{
if((i)%4==0&&i)
fprintf(out,"\n");
fprintf(out,"%4d",s[i].s);
}
fprintf(out,"\n");
fclose(out);
}
【答案】
int fun(STREC a[])
{
int i,j;
STREC t;
for(i=1;i<N;i++)
for(j=0;j<N-1;j++)
if(a[j].s<a[j+1].s)
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
1.程序填空题
请补充main函数,该函数的功能是:从键盘输入若干字符放到一个字符数组中,当按回车键时结束输入,最后输出这个字符数组中的所有字符。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <ctype.h>
#include <windows.h>
main()
{
int i=0;
char s[81];
char *p=s;
system("cls");
printf("Input a string \n");
for(i=0;i<80;i++)
{
s[i]=getchar();
if(s[i]=='\n')
/**********found**********/
___1___;
}
/**********found**********/
s[i]=___2___;
printf("display the string \n");
while(*p)
/**********found**********/
putchar(___3___);
}
【答案】
(1)break (2)′\0′ (3)*p++
2.程序修改题
在给定程序中,函数fun()的功能是:输入的两个数中较小的数。
例如:输入5、10,结果为min is 5。
请改正fun()程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#include <conio.h>
/**********found**********/
int fun(int x,y)
{
int z;
z=x<y?x:y;
return(z);
}
main()
{
int a,b,c;
scanf("%d,%d\n",&a,&b);
c=fun(a,b);
printf("min is %d",c);
}
【答案】
将int fun(int x, y) 改为:
int fun(int x,int y)
3.程序设计题
编写函数fun,其功能是统计一个长度为2的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为asdasasdfgasdaszx67asdmklo,子字符串为as,则应当输出6。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
int fun(char *str,char *substr)
{
}
main()
{
char str[81],substr[3];
int n;
system("cls");
printf("输入主字符串: ");
gets(str);
printf("输入子字符串: ");
gets(substr);
puts(str);
puts(substr);
n=fun(str,substr);
printf("n=%d\n ",n);
}
【答案】
int fun(char *str, char *substr)
{
int i,j=0;
for(i=0;str[i+1]!='\0';i++)
if(str[i]==substr[0]&&
str[i+1]==substr[1])
j++;
return j;
}
1.程序填空题
请补充main函数,该函数的功能是:从键盘输入两上字符串并分别保存在字符数组str1和str2中,用字符串str2替换字符串str1前面的所有字符。注意str2的长度不大于str1,否则需要重新输入。
例如,如果输入str1=“abced”,str2=“fk”,则输出“fkced”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#include <windows.h>
main()
{
char str1[81],str2[81];
char *p1=str1,*p2=str2;
system("cls");
do
{
printf("Input str1 \n");
gets(str1);
printf("Input str2 \n");
gets(str2);
/**********found**********/
}while(___1___ );
/**********found**********/
while(___2___)
*p1++=*p2++;
printf("Display str1 \n");
/**********found**********/
puts(___3___);
}
【答案】
(1)strlen(str1)<strlen(str2) (2)*p2 (3)str1
2.程序修改题
下列给定程序中,函数fun()的功能是:应用递归算法求某数a的平方根。求平方根的迭代公式如下:
例如,2的平方根为1.414214。
请改正程序中的错误,使其能得出正
Chapter_5
确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <math.h>
#include <stdio.h>
/**********found**********/
fun(double a,double x0)
{
double x1,y;
x1=(x0+a/x0)/2.0;
/**********found**********/
if(fabs(x1-x0)>0.00001)
y=fun(a,x1);
else y=x1;
return y;
}
main()
{
double x;
printf("Enter x: "); scanf("%lf",&x);
printf("The square root of %lf is %1f\n",
x, fun(x,1.0));
}
【答案】
(1)将 fun(double a,double x0) 改为:
double fun(double a,double x0)
(2)将 if(fabs(x1-x0)>0.00001) 改为:
if(fabs(x1-x0)>=0.00001)
3.程序设计题
下列程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(),功能为:使数字右上半三角元素中的值乘以m。
例如,若m的值为2,a数组中的值为
a=1 9
2 7
则返回主程序后a数组的值应为
2 18
2 14
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 5
int fun(int a[][N], int m)
{
}
main()
{
int a[N][N],m, I, j;
system("cls");
printf("*****The array*****\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
a[i][j]=rand()%20;
printf("%4d",a[i][j]);
}
printf("\n");
}
do
m=rand()%10;
while(m>=3); /*产生一个小于3的随机数*/
printf("m=%4d\n",m);
fun(a,m);
printf("THE RESULT\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
【答案】
int fun(int a[][N], int m)
{
int i,j;
for(i=0;i<N;i++)
for(j=i;j<N;j++)
a[i][j]=a[i][j]*m;
}