全国计算机等级考试二级C语言练习题(八)
1.程序填空题
请补充main函数,该函数的功能是:把1~100间的所有素数保存在数组aa中,然后输出这些素数并计算它们的和。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
main()
{
int n,I,j,k,flag,sum;
int aa[50];
sum=0; k=0;
system("cls");
for(i=2;i<100;i++)
{
/**********found**********/
___1___;
for(j=2;j<i&&flag;j++)
if(i%j==0)
{
/**********found**********/
___2___;
}
if(flag)
{
sum+=I;
/**********found**********/
___3___;
}
}
printf("\n*** prime number ***\n");
for(i=0;i<k;i++)
{
if(i%10==0) printf("\n");
printf("%4d",aa[i]);
}
printf("\nsum=%d",sum);
}
【答案】
(1)flag=1 (2)flag=0 (3)aa[k++]=i
2.程序修改题
下列给定程序中,函数fun()的功能是:根据输入的3个边长(整型值),判断能否构成三角形?若能构成等边三角形,则返回3;若是等腰三角形,则返回2;若能构成三角形则返回1;若不能,则返回0。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <math.h>
int fun(int a,int b,int c)
{
if(a+b>c&&b+c>a&&a+c>b)
{
if(a==b&&b==c)
/**********found**********/
return 1;
else if(a==b||b==c||a==c)
return 2;
/**********found**********/
else return 3;
}
else return 0;
}
main()
{
int a,b,c,shape;
printf("Input a,b,c: ");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d, b=%d, c=%d\n",a,b,c);
shape=fun(a,b,c);
printf("The shape :%d\n",shape);
}
【答案】
(1)将 return 1; 改为:return 3;
(2)将 else return 3; 改为:else return 1;
3.程序设计题
请编写函数fun(),该函数的功能是:移动字符串中的内容,移动的规则是把第1~m个字符平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。
例如,字符串中原有的内容为ABCDEFGHIJK,m的值为3,移动后字符串中的内容应该是DEFGHI JKABC。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <string.h>
#define N 80
void fun(char *w,int m)
{
}
main()
{
char a[N]="ABCDEFGHIJK";
int m;
printf("The origina string :\n");
puts(a);
printf("\nEnter m: ");
scanf("%d",&m);
fun(a,m);
printf("The string after moving :\n");
puts(a);
printf("\n\n");
}
【答案】
void fun(char *w,int m)
{
int i,j;
char t;
for(i=1;i<=m;i++)
{
t=w[0];
for(j=1;w[j]!='\0';j++)
w[j-1]=w[j];
w[j-1]=t; /*将第1个字符放到
最后一个字符中*/
}
}
1.程序填空题
请补充main函数,该函数的功能是:计算三名学生学科的平均成绩。
例如,当score[N][M]={{83.5,82,86,65,67},{80,91.5,84,99,95},{90,95,86,95,97}}时,五门学科的平均分为:84.5 89.5 85.3 86.3 86.3。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 3
#define M 5
main()
{
int I,j;
static float score[N][M]={{83.5,82,86,65,67},{80,91.5,84,99,95},{90,95,86,95,97}};
static float bb[N];
system("cls");
for(i=0;i<M;i++)
bb[i]=0.0;
/**********found**********/
for(i=0;i<___1___;i++)
{
/**********found**********/
for(j=0;j<___2___;j++)
bb[j]+=score[i][j];
}
for(i=0;i<M;i++)
/**********found**********/
printf("subject%d\taver age=%5.1f",i+1, ___3___);
return 0;
}
【答案】
(1)N (2)M (3)bb[i]/N
2.程序修改题
在给定程序中,函数fun()的功能是:求k!(k<12),所有阶乘的值作为函数值返回。例如:若k=10,则应输出3628800。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
long fun(int k)
{
/**********found**********/
if k>0
return(k*fun(k-1));
/**********found**********/
else if(k=0)
return 1;
}
main()
{
int k=10;
system("cls");
printf("%d!=%ld\n ",k,fun(k));
}
【答案】
(1)将 if k>0 改为:if (k>0)
(2)将 else if(k=0) 改为:else if(k==0)
3.程序设计题
请编写函数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 <stdio.h>
#define N 80
void fun(int *w,int p,int n)
{
}
main()
{
int a[N]={1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15};
int I,p,n=15;
printf("The original data:\n");
for(I=0;I<n;I++) printf("%3d",a[I]);
printf("\nEnter p: ");
scanf("%d",&p);
fun(a,p,n);
printf("The data after moving:\n");
for(I=0;I<n;I++) printf("%3d",a[I]);
printf("\n\n");
}
【答案】
void fun(int *w, int p, int n)
{
int i,j,t;
for(i=0;i<=p;i++) /*循环左移p+1次*/
{
t=w[0];
for(j=1;j<n;j++) /*实现循环左移*/
w[j-1]=w[j];
w[j-1]=t;
}
}
1.程序填空题
请补充main函数,该函数的功能是:输出一个N×N矩阵,要求对角线元素赋值为1,非对角线上的元素赋值为0。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#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**********/
___1___;
if(i==j)
/**********found**********/
bb[i][j]=___2___;
/**********found**********/
if(___3___)
bb[i][j]=1;
}
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)bb[i][j]=0 (2)1 (3)j==n-1-i
2.程序修改题
假定整数不重复数列{97,2,7,1,2,4,-1}中的数存放在数组s中。下列给定程序中,函数fun的功能是:删除数列中值为a的元素,同时将其他元素前移。Sum中存放的是数列中元素的个数。
请改正程序中的错误,使其能得到正确的结果。
注意:不要改动main函数,不能增行或删行,也不得更改程序的结构。
#include <stdio.h>
#define M 100
fun(int *x,int sum,int a)
{
int temp=0,j;
x[sum]=a;
while(a!=x[temp])
temp=temp+1;
if(temp==sum)
{
return-1;
}
else
{
/*******found*********/
for(j=temp;j<sum;j++)
x[j+1]=x[j];
return sum-1;
}
}
main()
{
int s[M]={97,2,7,1,2,4,-1},a,sum,j;
sum=8;
printf("The array:\n");
for(j=0;j<sum;j++)
printf("%5d",s[j]);
printf("\nPlease insert data want to deleted:");
scanf("%d",&a);
printf("Delete :%d\n",a);
sum=fun(s,sum,a);
if(sum==-1)
{
printf("***Not be found!***\n\n");
}
else
{
printf("The array after delete :\n");
for(j=0;j<sum;j++)
printf("%5d",s[j]);
printf("\n\n");
}
}
【答案】
void fun(STREC *p)
{
int i;
(*p).ave =0.0;
for(i=0;i<N;i++)
(*p).ave =(*p).ave +(*p).s[i];
(*p).ave =(*p).ave /N;
}
3.程序设计题
某学生的记录由学号、8门课成绩和平均分组成,学号和8门课的成绩已在主函数中给出。请编写fun()函数,它的功能是:求出该学生的平均分并放在记录的ave成员中。
例如,学生的成绩是85.5、76、69.5、85、91、72、64.5、87.5,则他的平均分应当是78.875。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#define N 8
typedef struct
{ char num[10];
double s[N];
double ave;
}STREC;
void fun(STREC *p )
{
}
main()
{
STREC s={"GA005",85.5,76,69.5,85,91,
72,64.5,87.5};
int I;
fun(&s);
printf("The %s's student data:\n",
s.num); /*输出学号*/
for(i=0;i<N;i++)
printf("%4.1f\n",s.s[i]);
printf("\nave=%7.3f\n", s.ave);
}
【答案】
void fun(STREC *p)
{
int i;
(*p).ave =0.0;
for(i=0;i<N;i++)
(*p).ave =(*p).ave +(*p).s[i];
(*p).ave =(*p).ave /N;
}
1.程序填空题
请补充main函数,该函数的功能是:输入两个正整数m和n,求这两个数的最大公约和最小公倍数。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
main()
{
int a,b,n,m,t;
system("cls");
printf("Input two numbers:\n");
scanf ("%d,%d",&n,&m);
if(n<m) { a=m; b=n; }
else { a=n; b=m; }
/**********found**********/
while(___1___)
{
/**********found**********/
t=___2___
a=b;
b=t;
}
printf("greatest common divisor:%d\n",a);
/**********found**********/
printf("least common multiple:%d\n",___3___);
}
【答案】
(1)b!=0 (2)a%b; (3)n*m/a
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++)
/**********found**********/
{
c=aa[i]; j=i-1;
while((j>=0)&&(ch<aa[j]))
{ aa[j+1]=aa[j]; j--; }
aa[j+1]=ch;
}
}
main()
{
char a[N]="QWERTYUIOPASDFGHJKLMNBVCXZ";
int I;
printf("The original string: %s\n",a);
insert(a);
printf("The string after sorting:
%s\n\n",a);
}
【答案】
将c=aa[i]; 改为:ch=aa[i];
3.程序设计题
请编写一个函数int fun(char *str),用来删除字符串中的所有空格。
例如:输入asd af aa z67,则输出为asdafaaz67。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <windows.h>
int fun(char *str)
{
}
main()
{
char str[81];
int n;
system("cls");
printf("Input a string : ");
gets(str);
puts(str);
fun(str);
printf("***str: %s\n",str);
}
【答案】
int fun (char *str)
{
int i,j=0;
for(i=0;str[i]!='\0';i++)
if(str[i]!=' ')
str[j++]=str[i];
str[j]='\0';
}
1.程序填空题
请补充main函数,该函数的功能是:求1+2!+ 3!+…+N!的和。
例如,1+2!+3!+…+5! +6!的和为873。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
main()
{
int I, n;
long s=0, t=1;
system("cls");
printf("Input n:\n");
/**********found**********/
scanf("%d",___1___);
for(i=1;i<=n;i++)
{
/**********found**********/
t=___2___;
/**********found**********/
s=___3___;
}
printf("1!+2!+3!...+%d!=%ld\n",n,s);
}
【答案】
(1)&n (2)t*i (3)s+t
2.程序修改题
下列给定程序中,函数fun()的功能是:输出M行N列整数方阵,然后求两条对角线上的各元素之和,返回此和数。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#define M 5
/**********found**********/
int fun(int n,int xx[ ][ ])
{
int I,j,sum=0;
printf("The %d x %d matrix:\n",M,M);
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
/**********found**********/
printf("%4f",xx[i][j]);
printf("\n");
}
for(i=0;i<n;i++)
sum+=xx[i][i]+xx[i][n-i-1];
return(sum);
}
main()
{
int aa[M][M]={{1,2,3,4,5},{4,3,2,1,0},
{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
system("cls");
printf("The sum of all elements on 2
diagnals is %d",fun(M,aa));
}
【答案】
(1)将fun(double b,double x0)改为:
double fun(double b,double x0)
(2)将if(abs(x1-x0)>=1e-6)改为:
if(fabs(x1-x0)>=1e-6)
3.程序设计题
请编一个函数float fun(double h),函数的功能是对变量h中的值保留两位小数,并对第三位进行四舍五入(规定h中的值为正数)。
例如:若h值为8.32433,则函数返回8.32;若h值为8.32533,则函数返回8.33。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <conio.h>
#include <windows.h>
float fun(float h )
{
}
main()
{
float a;
system("cls");
printf("Enter a: ");
scanf("%f",&a);
printf("The original data is : ");
printf("%f\n\n", a);
printf("The result : %f\n", fun(a));
}
【答案】
float fun(float h )
{
long t;
t=(h*1000+5)/10;
return (float)t/100;
}
1.程序填空题
请补充函数fun(),该函数的功能是:把字符串str中的字符按字符的ASCII码降序排列,处理后的字符串仍然保存在原串中,字符串及其长度作为函数参数传入。
例如,如果输入“cdefgh”,则输出为“hgfedc”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 80
void fun(char s[],int n)
{
int I, j;
char ch;
for(i=0;i<n;i++)
/**********found**********/
for(j=___1___;j<n;j++)
if(s[i]<s[j])
{
ch=s[j];
/**********found**********/
___2___;
s[i]=ch;
}
}
main()
{
int i=0,strlen=0;
char str[N];
system("cls");
printf("Input a string:\n");
gets(str);
while(str[i]!='\0')
{ strlen++; i++; }
fun(str,strlen);
printf("\n***display string***\n");
puts(str);
}
【答案】
(1)i (2)s[j]=s[i]
2.程序修改题
在给定程序中,函数fun()的功能是:将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为87653142时,t中的数为8642。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
void fun(long s,long *t)
/**********found**********/
{
int d;
long s1=1;
*t=0;
while(s>0)
{
d=s%10;
/**********found**********/
if(d%2=0)
{ *t=d*s1+*t; s1*=10; }
/**********found**********/
s\=10;
}
}
main()
{
long s,t;
system("cls");
printf("\nPlease enter s: ");
scanf("%ld",&s);
fun(s,&t);
printf("The result is :%ld\n",t);
}
【答案】
(1)将 int d;改为:long d;
(2)将 if(d%2=0)改为:if(d%2==0)
(3)将 s\=10;改为:s/=10;
3.程序设计题
请编写函数fun,它的功能是:求Fibonacci数列中大于a(a>3)的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(m-1)+F(m-2)
例如,当a=500时,函数值为610。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <conio.h>
#include <math.h>
#include <stdio.h>
int fun(int a)
{
}
main()
{
int m;
FILE *out;
m=500;
printf("m=%d,F=%d\n",m,fun(m));
out=fopen ("outfile.dat","w");
for(m=500;m<3000;m+=500)
fprintf(out,"%d\n",fun(m));
fclose (out);
}
【答案】
int x=1,y=1,z=0,i;
for(i=4;i<=a;i++)
{
if(z<a)
{
z=x+y;
x=y;
y=z;
}
else
break;
}
return z;
1.程序填空题
请补充main函数,该函数的功能是:如果数组aa的前一个元素比后一个元素小,则把它保存在数组bb中并输出。
例如:输入“40,51,62,33,35,52,48,95,66,73”,则结果输出“40,51,33,35,48,66”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 10
main()
{
int I,n=0;
int aa[N]={40,51,62,33,35,52,48,95,66,73};
int bb[N];
system("cls");
/**********found**********/
for(i=0;i<___1___;i++)
if(aa[i]<aa[i+1])
/**********found**********/
___2___;
printf("\n***display bb***\n");
for(i=0;i<n;i++)
/**********found**********/
printf("bb[%d]=%2d ", ___3___);
}
}
【答案】
(1)N-1 (2)bb[n++]=aa[i] (3)i,bb[i]
2.程序修改题
给定程序中,函数fun()的功能是:删除字符串s中所有空白字符(包括Tab字符、回车符及换行符)。输入字符串时用'#'结束输入。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <string.h>
#include <stdio.h>
#include <ctype.h>
fun(char *p)
{
int I,t;
char c[80];
for(I=0,t=0;p[I];I++)
if(!isspace(*(p+I))) c[t++]=p[I];
/**********found**********/
c[t]='\0';
strcpy(p,c);
}
main()
{
char c,s[80];
int I=0;
printf("Input a string: ");
c=getchar();
while(c!='#')
{
s[I]=c;I++;c=getchar();
}
s[I]='\0';
fun(s);
puts(s);
}
【答案】
将c[t]= "\0"; 改为:c[t]= '\0';
3.程序设计题
请编写函数fun(),该函数的功能是计算并输出:
S=1+(1+20.5)+(1+20.5+30.5)+…+(1+20.5+30.5+…+N0.5)
例如,若主函数从键盘给n输入20后,则输出为s=534.188884。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <math.h>
#include <stdio.h>
double fun(int n)
{
}
main()
{
int n;
double s;
printf("\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("s=%f\n",s);
}
【答案】
double fun(int n)
{
int i;
double s=0.0,s1=0.0;
for(i=1;i<=n;i++)
{
s1=s1+pow(i,0.5);
s=s+s1;
}
return s;
}
1.程序填空题
请补充main函数,该函数的功能是:从键盘输入一个长整数,如果这个数是负数,则取它的绝对值,并显示出来。例如,输入:-333,结果为:333。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <conio.h>
main()
{
long int a;
printf("Enter the data:\n");
scanf(___1___);
printf("The origial data is %ld\n",a);
if(a<0)
___2___;
printf("\n");
printf(___3___);
}
【答案】
(1)将k=n; 改为:k=i;
(2)将s[j]=i; 改为:s[j++]=i;
2.程序修改题
在给定程序中,函数fun的功能是找出100~n(不大于1000)之间百位数字加十位数字等于个位数字的所有整数,把这些整数放在s所指的数组中,其个数作为函数值返回。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#define N 100
int fun(int *s,int n)
{
int I,j,k,a,b,c;
j=0;
for(i=100;i<n;i++)
{
/**********found**********/
k=n;
a=k%10;
k/=10;
b=k%10;
c=k/10;
if(a==b+c)
/**********found**********/
s[j]=I;
}
return j;
}
main()
{
int a[N],n,num=0,I;
do
{
printf("\nEnter n(<=1000):");
scanf("%d",&n);
}
while(n>1000);
num= fun(a,n);
printf("\n\nThe result :\n");
for(i=0;i<num;i++)
printf("%5d",a[i]);
printf("\n\n");
}
【答案】
(1)将k=n; 改为:k=i;
(2)将s[j]=i; 改为:s[j++]=i;
3.程序设计题
假定输入的字符串中只包含字母和*号。请编写函数fun(),它的功能是:使字符串中前部的*号不得多余n个;若多余n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。
例如,字符串中的内容为****A*BC*DEF*G** *****,若n的值为2,删除后,字符串中的内容则应当是**A*BC*DEF*G*******;若n的值为4,则字符串中的内容仍为****A*BC*DEF*G*******。N的值在主函数中输入。在编写函数时,不得使用C语言提供的字符串函数。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <conio.h>
void fun(char *a,int n)
{
}
main()
{
char s[81];int n;
printf("Enter a string :\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted :\n");
puts(s);}
【答案】
void fun(char *a,int n)
{
int i=0, k=0;
char *p, *t;
p=t=a;
while(*t=='*')
{ k++; t++; }
if(k>n)
{
while(*p)
{ a[i]=*(p+k-n); i++; p++; }
a[i]='\0';
}
}