全国计算机等级考试二级C语言练习题(九)
1.程序填空题
请补充函数fun(),该函数的功能是把数组aa中的偶数元素按原来的先后顺序放在原数组后面。
例如,输入“33、67、42、58、25、76、85、16、41、56”,输出结果“33、67、25、85、41、42、58、76、16、56”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 10
void fun(int aa[])
{
int I,j=0,k=0;
int bb[N];
for(i=0;i<N; i++)
{
/**********found**********/
if(___1___)
bb[k++]=aa[i];
else
aa[j++]=aa[i];
}
/**********found**********/
for(i=0;___2___;i++,j++)
aa[j]=bb[i];
}
main()
{
int I;
int aa[N]={33,67,42,58,25,76,85,
16,41,56};
system("cls");
printf("\n***original list***\n");
for(i=0;i<N;i++) printf("%4d",aa[i]);
fun(aa);
printf("\n***new list***\n ");
for(i=0;i<N;i++) printf("%4d",aa[i]);
}
【答案】
(1)aa[i]%2==0 (2)i<k
2.程序修改题
下列给定程序中,函数fun()的功能是根据整型形参n,计算如下公式的值:
A1=1,A2=1/(1+A1),A3=1/(1+A2),…,
An=1/(1+A(n-1))
例如,若n=10,则应输出0.617977。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
/**********found**********/
int fun(int n)
{
float A=1; int I;
/**********found**********/
for(i=2;i<n;i++)
A=1.0/(1+A);
return A;
}
main()
{
int n;
system("cls");
printf("Please enter n: ");
scanf("%d",&n);
printf("A%d=%lf\n",n,fun(n));
}
【答案】
(1)将 int fun(int n) 改为:
float fun(int n)
(2)将 for(i=2;i<n;i++) 改为:
for(i=2;i<=n;i++)
3.程序设计题
N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun(),它的功能是:求出平均分,由函数值返回。
例如,若学生的成绩是85、76、69、91、72、64、87,则平均分应当是78.625。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdlib.h>
#include <stdio.h>
#define N 8
struct slist
{double s;
struct slist *next;
};
typedef struct slist STREC;
double fun(STREC *h)
{
}
STREC *creat(double *s) /*创建链表*/
{
STREC *h,*p,*q;
int i=0;
h=p=( STREC*)malloc(sizeof(STREC));
p->s=0;
while(i<N)
{
q=( STREC*)malloc(sizeof(STREC));
q->s=s[i];i++;p->next=q;p=q;
}
p->next=0;
return h;
}
outlist(STREC *h)
{
STREC *p;
p=h->next;
printf("head");
do
{
printf("->%4.1f",p->s);
p=p->next; /*输出各成绩*/
}
while(p!=0);
}
main()
{
double s[N]={85,76,69,85,91,72,64,87},
ave;
STREC *h;
h=creat(s);
outlist(h);
ave=fun(h);
printf("ave=%6.3f\n",ave);
}
【答案】
double fun(STREC *h)
{
double av=0.0;
STREC *p=h->next;
while(p!=NULL)
{
av=av+p->s;
p=p->next;
}
return av/N;
1.程序填空题
请补充main函数,该函数的功能是:把一维数组中的元素逆置。结果仍然保存在原数组中。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 10
main()
{
int I,j,t;
int bb[N];
system("cls");
for(i=0;i<N;i++) bb[i]=I;
printf("\n***original list***\n");
for(i=0;i<N; i++)
printf("%4d",bb[i]);
/**********found**********/
for(___1___;j<=I;___2___)
{ t=bb[j]; bb[j]=bb[i]; bb[i]=t; }
printf("\n*** new list ***\n");
for(i=0;i<N;i++) printf("%4d",bb[i]);
}
【答案】
(1)j=0,--i (2)j++,i--
2.程序修改题
下列给定程序中,函数fun()的功能是:计算整数n的阶乘。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#include <windows.h>
double fun(int n)
{
double result=1.0;
while(n>1&&n<170)
/**********found**********/
result*=--n;
/**********found**********/
return;
}
main()
{
int n;
system("cls");
printf("Enter an integer: ");
scanf("%d",&n);
printf("\n%d!=%1g\n",n,fun(n));
}
【答案】
(1)将 result*=--n; 改为:result*=n--;
(2)将 return; 改为:return result;
3.程序设计题
假定输入的字符串中只包含字母和*号。请编写函数fun(),它的功能是:将字符串尾部的*号全部删除,前面和中间的*号不删除。
例如,若字符串中的内容为****A*BC*DEF*G* ******,删除后,字符串中的内容则应当是****A*B C*DEF*G。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <conio.h>
void fun(char *a)
{
}
main()
{
char s[81];
printf("Enter a string :\n");
gets(s);
fun(s);
printf("The string after deleted:\n");
puts(s);
}
【答案】
void fun (char *a)
{
while(*a!='\0')
a++;
a--;
while(*a=='*')
a--;
*(a+1)='\0';
}
1.程序填空题
请补充函数fun(),该函数的功能是:把数组aa中元素下标为偶数的元素按从小到大重新保存在原数组中,其他元素位置不变。
例如,输入“33、67、42、58、25、76、85、16、41、56”,则输出“25、67、33、58、41、76、42、16、85、56”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 10
void fun(int aa[])
{
int I,j,t;
for(i=0;i<N;i=i+2)
{
/**********found**********/
for(___1___;j<N;j=j+2)
/**********found**********/
if(___2___)
{ t=aa[j]; aa[j]=aa[i]; aa[i]=t; }
}
}
main()
{
int I;
int aa[N]={33,67,42,58,25,76,85,16,41,56};
system("cls");
printf("\n***original list***\n");
for(i=0;i<N;i++)
printf("%4d",aa[i]);
fun(aa);
printf("\n***new list***\n");
for(i=0; i<N; i++)
printf("%4d",aa[i]);
}
【答案】
(1)j=i或j=i+2 (2)aa[i]>aa[j]
2.程序修改题
给定程序中,函数fun()的功能是:使数组中的元素的值增加10倍。
改正其中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#include <conio.h>
int m[10];
void fun(void)
{
int j;
printf("In subfunc after calling\n");
for(j=0;j<10;j++)
{
/**********found**********/
printf("%3d",m[j]*10);
}
}
main()
{
int I;
printf("In main before calling\n");
for(i=0;i<10;i++)
{ m[i]=I; printf("%3d",m[i]); }
fun();
printf("In main after calling\n");
for(i=0;i<10;i++)
printf("%3d",m[i]);
getch();
}
【答案】
将 printf("%3d",m[j]*10); 改为:
printf("%3d",m[j]=m[j]*10);
3.程序设计题
函数fun的功能是:将形参b所指数组中的前半部分元素的值和后半部分元素的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。
例如,若a所指数组中的数据依次为:11 22 33 1 44 55 66,则调换后为:44 55 66 1 11 22 33。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <stdio.h>
#define M 7
void fun(int b[],int n)
{
}
main()
{
int x[M]={11,22,33,1,44,55,66},I;
printf("\nThe original data :\n");
for(i=0;i<M;i++)
printf("%4d ",x[i]);
printf("\n");
fun(x,M);
printf("\nThe data after moving :\n");
for(i=0;i<M;i++)
printf("%4d ",x[i]);
printf("\n");
}
【答案】
int j,temp,p;
p=(n%2==0) ? n/2:n/2+1;
for(j=0;j<n/2;j++)
{
temp=b[j];
b[j]=b[p+j];
b[p+j]=temp;
}
1.程序填空题
请补充main函数,该函数的功能是:打印出1~1000中满足个位数字的立方等于其本身的数。本题的结果为:1 64 125 216 729
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
main()
{
int I,g;
system("cls");
for(I=1;I<1000;I++)
{
/**********found**********/
g=___1___;
/**********found**********/
if(___2___)
printf("%4d",I);
}
}
【答案】
(1)i%10 (2)g*g*g==i
2.程序修改题
在给定程序中,函数fun()的功能是:从3个红球、5个白球、6个黑球中任意取出8个作为一组进行输出。在每组中,可以没有黑球,但必须要有红球和白球。组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红球数,j的值代表白球数,k的值代表黑球数。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
int fun()
{
int I,j,k,sum=0;
printf("The result :\n");
/**********found**********/
for(i=0;i<=3;i++)
{
for(j=1;j<=5;j++)
{
k=8-i-j;
/**********found**********/
if(k>=1&&k<=6)
{
sum=sum+1;
printf("red:%4d white:%4d
black:%4d\n ",I,j,k);
}
}
}
return sum;
}
main()
{
int sum;
sum=fun();
printf("sum=%4d\n",sum);
}
【答案】
(1)将for(i=0;i<=3;i++) 改为:
for(i=1;i<=3;i++)
(2)将if(k>=1&&k<=6) 改为:
if((k>=1&&k<=6)&&(i!=0)&&(j!=0)||(k==0))
3.程序设计题
请编写函数fun(),其功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成的新串放在t所指数组中。
例如,当s所指字符串中的内容为ABCDEFGHI JK,则在t所指数组中的内容应是BDFHJ。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
void fun(char *s,char t[])
{
}
main()
{
char s[100],t[100];
system("cls");
printf("Please enter string S: ");
scanf("%s",s);
fun(s,t);
printf("The result is:%s\n ",t);
}
【答案】
void fun(char *s,char t[])
{
int i,j=0,k=strlen(s);
for(i=1;i<k;i=i+2)
t[j++]=s[i];
t[j]='\0';
}
1.程序填空题
请补充main函数,该函数的功能是:从键盘输入一个字符串及一个指定字符,然后把这个字符及其后面的所有字符全部删除。结果仍然保存在原串中。
例如,输入“abcdef”,指定字符为“e”,则输出“abcd”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 80
main()
{
int i=0;
char str[N];
char ch;
system("cls");
printf("Input a string:\n");
gets(str);
printf("Input a charator;\n");
scanf("%c",&ch);
while(str[i]!='\0')
{
if(str[i]==ch)
/**********found**********/
___1___;
/**********found**********/
___2___;
}
/**********found**********/
str[i]=___3___;
printf("\n***display string***\n");
puts(str);
}
【答案】
(1)break; (2)i++ (3)‘\0’
2.程序修改题
下列给定程序中,函数fun的功能是:从整数1到50之间,选出能被3整除且有一位上的数是5的数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。
请改正程序中的错误,使其能得到正确的结果。
注意:不要改动main函数,不能增行或删行,也不得更改程序的结构。
#include <stdio.h>
/********found********/
int fun(int *b);
{
int j,a1,a2,i=0;
/*******found*********/
for(j=10;j<=50;j++)
{
a2=j/10;
a1=j-a2*10;
if((j%3==0 && a2==5) || (j%3==0 && a1==5))
{
b[i]=j;
i++;
}
}
/*******found********/
return j;
}
main()
{
int a[50],I,n;
n=fun(a);
printf("The result is:\n");
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
}
【答案】
(1)将fun(int *b);改为:int fun(int *b)
(2)将for(j=10;j<=50;j++)改为:
for(j=1;j<=50;j++)
(3)将return j;改为:return i;
3.程序设计题
编写函数fun(),它的功能是计算并输出下列级数的和:
S=1/(1×2)+1/(2×3)+…+1/(n×(n+1))例如,当n=10时,函数值为0.909091。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
double fun(int n)
{
}
main()
{
system("cls");
printf("%f\n",fun(10));
}
【答案】
double fun(int n)
{
int i;
double s=0.0;
for(i=1;i<=n;i++)
s=s+1.0/(i*(i+1));
return s;
}
1.程序填空题
请补充main函数,该函数的功能是:输出方程组“A+B=56,A+2B=72”的一组正整数解。本题的结果是:A=40,B=16。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
main()
{
int I,j;
system("cls");
for(i=0;i<100;i++)
for(j=0;j<100;j++)
/**********found**********/
if(___1___)
/**********found**********/
printf("A=%2d,B=%2d",___2___);
}
【答案】
(1)i+j==56&&i+2*j==72 (2)i,j
2.程序修改题
在给定程序中,函数fun()的功能是,用下面的式子求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止:
π/4≈1-1/3+1/5-1/7+…
例如,程序运行后,输入0.0001,则程序输出3.1414。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <math.h>
#include <stdio.h>
#include <windows.h>
float fun(float num)
{
int s;
float n,t,pi;
t=1;pi=0;n=1;s=1;
/**********found**********/
while(t>=num)
{
pi=pi+t;
n=n+2;
s=-s;
/**********found**********/
t=s%n;
}
pi=pi*4;
return pi;
}
Chapter_6
main()
{
float n1,n2;
system("cls");
printf("Enter a float number: ");
scanf("%f",&n1);
n2=fun(n1);
printf("%6.4f\n",n2);
}
【答案】
(1)将while(t>=num)改为:
while(fabs(t)>=num)
(2)将t=s%n; 改为:t=s/n;
3.程序设计题
假定输入的字符串中只包含字母和*号。请编写函数fun(),它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言中提供的字符串函数。
例如,若字符串中的内容为****A*BC*DEF*G*** ****,删除后,字符串中的内容则应当是ABCDEFG。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
void fun(char *a)
{
}
main()
{
char s[81];
printf("Enter a string:\n");
gets(s);
fun(s);
printf("The string after deleted:\n");
puts(s);
}
【答案】
void fun(char *a)
{
int i,j=0;
for(i=0;a[i]!='\0';i++)
if(a[i]!='*')
a[j++]=a[i];
a[j]='\0';
}
1.程序填空题
请补充函数fun(),该函数的功能是把数组aa中的奇数元素按原来的先后顺序放在原数组后面。
例如,输入“33、67、42、58、25、76、85、16、41、56”,输出结果“42、58、76、16、56、33、67、25、85、41”。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 10
void fun(int aa[])
{
int I,j=0,k=0;
int bb[N];
for(i=0;i<N;i++)
{
/**********found**********/
if(___1___)
bb[k++]=aa[i];
else
aa[j++]=aa[i];
}
/**********found**********/
for(i=0;i<k;___2___)
aa[j]=bb[i];
}
main()
{
int I;
int aa[N]={33,67,42,58,25,76,85,16,41,56};
system("cls");
printf("\n***original list***\n");
for(i=0;i<N;i++)
printf("%4d",aa[i]);
fun(aa);
printf("\n***new list***\n");
for(i=0;i<N;i++)
printf("%4d",aa[i]);
}
【答案】
(1)aa[i]%2!=0或aa[i]%2==1 (2)i++,j++
2.程序修改题
给定程序中,函数fun()的功能是:求S的值。设
S=(22/(1*3))*(42/(3*5))*(62/(5*7))*…*(2k)2/
((2k-1)*(2k+1))
例如,当k为10时,函数的值应为1.533852。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <windows.h>
/**********found**********/
fun(int k)
{
int n; float s,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++;
}
/**********found**********/
return s
}
main()
{
【答案】
(1)将 fun(int k) 改为:double fun(int k)
(2)将 return s 改为:return s ;
3.程序设计题
请编写函数fun,其功能是:计算并输出给定10个数的方差:
例如,给定的10个数为75.0、66.0、73.0、84.0、57.0、67.0、45.0、92.0、44.0、58.0,则输出为F=14.982990。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <math.h>
double fun(double y[10])
{
}
main()
{
double f,y[10]={75.0,66.0,73.0,84.0, 57.0,67.0,45.0,92.0,44.0,58.0};
int I;
FILE *out;
printf("\nThe original data is :\n");
for(i=0;i<10;i++)
printf("%6.1f",y[i]);
printf("\n\n");
f=fun(y);
printf("f=%f\n\n",f);
out=fopen ("outfile.dat","w");
fprintf(out,"%f",f);
fclose (out);
}
【答案】
int i,j;
double f=0.0,f1=0.0;
for(i=0;i<10;i++)
f1+=y[i];
f1/=10;
for(j=0;j<10;j++)
f+=(y[j]-f1)*(y[j]-f1);
f/=10;
f=pow(f,0.5);
return f;
1.程序填空题
请补充函数fun(),该函数的功能是:返回字符数组中指定字符的个数,指定字符从键盘输入。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 80
int fun(char s[],char ch)
{
int i=0,n=0;
/**********found**********/
while(___1___)
{
/**********found**********/
if(___2___)
n++;
i++;
}
/**********found**********/
___3___;
}
main()
{
int n;
char str[N], ch;
system("cls");
printf("Input a string:\n");
gets(str);
printf("Input a character:\n");
scanf("%c",&ch);
n=fun(str,ch);
printf("\nnumber of %c:%d",ch,n);
}
【答案】
(1)s[i]或s[i]!='\0'
(2)s[i]==ch
(3)return n
2.程序修改题
下列给定程序中函数fun的功能是:传入一个整数n,计算如下公式的值:
例如,若输入5,则应输出-0.283333。
请改正程序中的错误,使其能得到正确的结果。
注意:不要改动main函数,不能增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
double fun(int n)
{
double s=1.0;
int I;
/*******found*********/
for(i=2;i<=n;i++)
s=1.0-1/I;
/*******found*******/
return n;
}
main()
{
int n;
printf("\nPlease enter 1 integer numbers:\n");
scanf("%d",&n);
printf("\n\nThe result is %lf\n",
fun(n);
}
【答案】
(1)将s=1.0-1/i;改为:s=s-1.0/i;
或:s-=1.0/i;或:s-=(double)1/i
(2)return s;
3.程序设计题
请编写函数fun(),它的功能是计算下列级数和,和值由函数值返回:
S=1+x+x2/2!+x3/3!+…+xn/n!
例如,当n=10、x=0.3时,函数值为1.349859。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <windows.h>
double fun(double x,int n)
{
}
main()
{
system("cls");
printf("%f",fun(0.3,10));
}
【答案】
double fun(double x,int n)
{
int i;
double s=1.0,s1=1.0;
for(i=1; i<=n; i++)
{
s1=s1*i;
s=s+pow(x,i)/s1;
}
return s;
}