9396C语言试题.docx
《9396C语言试题.docx》由会员分享,可在线阅读,更多相关《9396C语言试题.docx(17页珍藏版)》请在冰豆网上搜索。
9396C语言试题
第93套
1.填空题
请补充main函数,该函数的功能是:
求n!
。
例如7!
=5040。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
main()
{
inti,n;
longf=1;
clrscr();
printf("Inputn:
");
scanf("%d",【1】);
for(【2】;i<=n;i++)
【3】;
printf("%d!
=%ld\n",n,f);
}
【1】&n【2】i=1或i=2【3】f*=i
【解析】填空1:
本题考查对调用标准输入函数scanf()的掌握,地址列表中都是地址值,所以在变量名前要加上取址运算符&。
填空2:
n的阶乘是将1、2、3……n累积相乘,所以for循环中i从1开始取数。
但因为1乘以任何数都等于这个数本身,所以i也可以从2开始取数。
填空3:
掌握了阶乘的算法,这空就非常简单了。
2.改错题
下列给定程序中,函数fun()的功能是:
从3个红球,5个白球,6个黑球中任意取出8个作为一组,进行输出。
在每组中,可以没有黑球,但必须要有红球和白球。
组合数作为函数值返回。
正确的组合数应该是15。
程序中i的值代表红球数,j的值代表白球数,k的值代表黑球数。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
intfun()
{inti,j,k,sum=0;
printf("\nTheresult:
\n\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:
%4dwhite:
%4dblack:
%4d\n",i,j,k);
}
}
}
returnsum;
}
main()
{intsum;
sum=fun();
printf("sum=%4d\n\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))
【解析】该题是一道教材习题的变体,如果单纯从数学的排列组合角度来分析,实在简单不过,那怎么才能用C语言实现题目中的要求呢?
这就需要我们有一个清晰的编程思想。
红球数i的总数为3,但最小值为1,循环条件中,i的值是从0开始的,所以不应该是for(i=0;i<=3;i++),而是for(i=1;i<=3;i++),另外,在if(k>=1&&k<=6)中,程序旨在说明题干中的"在每组中,可以没有黑球,但必须要有红球和白球"信息,一一满足后,正确的条件应该是if((k>=1&&k<=6)&&(i!
=0)&&(j!
=0)||(k==0))。
3.编程题
请编写函数fun(),它的功能是计算下列级数和,和值由函数值返回。
S=1+x+x2/2!
+x3/3!
+…+xn/n!
例如,当n=10,x=0.3时,函数值为1.349859。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
doublefun(doublex,intn)
{
}
main()
{
clrscr();
printf("%f",fun(0.3,10));
}
【解析】本程序中用s1来表示每项的分母(即各项中的阶乘),要注意本程序中s和s1的初值都为1。
doublefun(doublex,intn)
{
inti;
doubles=1.0,s1=1.0;
for(i=1;i<=n;i++)
{s1=s1*i;/*各项中的阶乘*/
s=s+pow(x,i)/s1;/*按公式求出*/
}
returns;
}
第94套
1.填空题
数组xx[N]保存着一组4位无符号整数,其元素的个数通过变量num传入函数fun()。
请补充函数fun(),该函数的功能是:
从数组xx中找出个位和百位的数字相等的所有无符号整数,结果保存在数组yy中,其个数由函数fun()返回。
例如:
当xx[8]={1111,2413,2321,2222,4245,3333,1414,
5335}时,bb[6]={11112321,2222,4245,3333,1414}。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN1000
intfun(intxx[],intbb[],intnum)
{
inti,n=0;
intg,b;
for(i=0;i{
g=【1】;
b=xx[i]/100%10;
if(g==b)
【2】;
}
return【3】;
}
main()
{
intxx[8]={1111,2413,2321,2222,4245,
3333,1414,5335};
intyy[N];
intnum=0,n=0,i=0;
num=8;
clrscr();
printf("*****originaldata******\n");
for(i=0;iprintf("%u",xx[i]);
printf("\n\n\n");
n=fun(xx,yy,num);
printf("\nyy=");
for(i=0;iprintf("%u",yy[i]);
}
【1】xx[i]%10【2】bb[n++]=xx[i]【3】n
【解析】填空1:
变量b存放了4位数的百位数字,所以变量g应该存放4位数的个位数字,将这个4位数对10求余,则得到这个数的个位数字。
填空2:
将个位数字与百位数字相等的整数存于数组bb中。
填空3:
变量n记录了个位数字等于百位数字的整数的个数,题目要求个数由函数fun()返回,所以应返回n。
2.改错题
下列给定程序中,函数fun()的功能是:
求整数x的y次方的低3位值。
例如,整数5的6次方为15625,此值的低3位值为625。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
longfun(intx,inty,long*p)
{inti;
longt=1;
/**********************found***********************/
for(i=1;it=t*x;
*p=t;
/**********************found***********************/
t=t/1000;
returnt;
}
main()
{longt,r;intx,y;
printf("\nInputxandy:
");scanf("%1d%1d",&x,&y);
t=fun(x,y,&r);
printf("\n\nx=%d,y=%d,r=%ld,last=%ld\n\n",x,y,r,t);
}
(1)错误:
for(i=1;i正确:
for(i=1;i<=y;i++)
(2)错误:
t=t/1000;
正确:
t=t%1000;
【解析】我们先用简单的思想理解一下该程序,如果当x=y=1时,程序的问题出在哪儿?
很简单吧,所以for(i=1;i
3.编程题
假定输入的字符串中只包含字母和*号。
请编写函数fun(),它的功能是:
将字符串中的前导*号全部删除,中间和后面的*号不删除。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是A*BC*DEF*G*******。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
voidfun(char*a)
{
}
main()
{
chars[81];
printf("Enterastring:
\n");
gets(s);
fun(s);
printf("Thestringafterdeleted:
\n");puts(s);
【解析】在前面的改错题和编程题中,相关试题已经出现好多次了,我们在此提供另一种解答方法。
#include
voidfun(char*a)
{char*p=a;
while(*p=='*')p++;
strcpy(a,p);
}
}
voidfun(char*a)
{
char*p=a;
while(*p=='*')p++;/*指针p指向字符串第一个字母*/
for(;*p!
='\0';p++,a++)
*a=*p;/*从第一个字母开始,其后的字符都放入指针a所指的字符串中*/
*a='\0';/*在字符串最后加上结束标记符*/
}
第95套
1.填空题
请补充main函数,该函数的功能是:
把文本文件B中的内容追加到文本文件A的内容之后。
例如,文件B的内容为"I'mten.",文件A的内容为"I'mastudent!
",追加之后文件A的内容为"I'mastudent!
I'mten."
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数main的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN80
main()
{
FILE*fp,*fp1,*fp2;
inti;
charc[N],t,ch;
clrscr();
if((fp=fopen("A.dat","r"))==NULL)
{
printf("fileAcannotbeopened\n");
exit(0);
}
printf("\nAcontentsare:
\n\n");
for(i=0;(ch=fgetc(fp))!
=EOF;i++)
{
c[i]=ch;
putchar(c[i]);
}
fclose(fp);
if((fp=fopen("B.dat","r"))==NULL)
{
printf("fileBcannotbeopened\n");
exit(0);
}
printf("\n\n\nBcontentsare:
\n\n");
for(i=0;(ch=fgetc(fp))!
=EOF;i++)
{
c[i]=ch;
putchar(c[i]);
}
fclose(fp);
if((fp1=fopen("A.dat","a"))【1】(fp2
=fopen("B.dat","r")))
{
while((ch=fgetc(fp2))!
=EOF)
【2】;
}
else
{
printf("CannotopenAB!
\n");
}
fclose(fp2);
fclose(fp1);
printf("\n***newAcontents***\n\n");
if((fp=fopen("A.dat","r"))==NULL)
{
printf("fileAcannotbeopened\n");
exit(0);
}
for(i=0;(ch=fgetc(fp))!
=EOF;i++)
{
c[i]=ch;
putchar(c[i]);
}
【3】;
}
【1】&&【2】fputc(ch,fp1)【3】fclose(fp)
【解析】填空1:
当两个文件都被成功打开时,才能将文件B中的内容追加到文件A中,所以应该用"与"运算符--"&&"。
填空2:
fputc()函数用于将一个字符写到磁盘文件上去,调用形式为:
fputc(要输出的字符,文件指针);。
填空3:
对一个文件进行操作后,应该关闭它,以防它再被误用。
调用形式为:
fclose(文件指针);。
2.改错题
下列给定程序中,函数fun()的功能是:
用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止。
π/4≈1-1/3+1/5-1/7+…
例如,程序运行后,输入0.0001,则程序输出3.1414。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
floatfun(floatnum)
{ints;
floatn,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;
returnpi;
}
main()
{floatn1,n2;
clrscr();
printf("Enterafloatnumber:
");
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;
【解析】函数fun()中while语句的含义是,当新的一项大于给定参数时,循环累计,计算s的值。
而题目要求是最后一项的绝对值小于给定参数,因此循环条件应当为while(fabs(t)>=num),而非while(t>=num)。
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
#include
voidfun(char*a,intn)
{
}
main()
{chars[81];intn;
printf("Enterastring:
\n");gets(s);
printf("Entern:
");scanf("%d",&n);
fun(s,n);
printf("Thestringafterdeleted:
\n");puts(s);
}
【解析】while()循环的作用是计算出前部星号的个数;if()的作用是判断星号个数是否多于n个,若是则只保留n个星号,即从字符串前部的倒数第n个星号开始,到最后一个字符都存入数组a中,最后记得在字符串最后加上结束标志位。
voidfun(char*a,intn)
{
inti=0,k=0;
char*p,*t;
p=t=a;/*开始时,p与t同时指向数组的首地址*/
while(*t=='*')/*用k来统计前部星号的个数*/
{k++;t++;}
if(k>n)/*如果k大于n,则使p的前部保留n个星号,其后的字符依次存入数组a中*/
{while(*p)
{a[i]=*(p+k-n);
i++;
p++;
}
a[i]='\0';/*在字符串最后加上结束标志位*/
}
}
第96套
1.填空题
请补充函数fun(),该函数的功能是:
寻找两个整数之间的的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。
例如,输入6和21,则输出为:
71113171921。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN1000
intfun(intn,intm,intbb[N])
{
inti,j,k=0,flag;
for(j=n;j<=m;j++)
{
【1】;
for(i=2;iif(【2】)
{
flag=0;
break;
}
if(【3】)
bb[k++]=j;
}
returnk;
}
main()
{
intn=0,m=0,i,k;
intbb[N];
clrscr();
printf("Inputn\n");
scanf("%d",&n);
printf("Inputm\n");
scanf("%d",&m);
for(i=0;ibb[i]=0;
k=fun(n,m,bb);
for(i=0;iprintf("%4d",bb[i]);
}
【1】flag=1【2】j%i==0【3】flag==1
【解析】填空1:
由flag决定当前判断的数是否为素数,先置flag为1,如果判断出当前数不是素数,则将flag清零。
填空2:
如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。
填空3:
如果flag等于1,则说明当前数是素数,则把它存入数组bb中。
2.改错题
下列给定程序中,函数fun()的功能是:
计算并输出下列级数的前N项之和SN,直到SN+1大于q为止,q的值通过形参传入。
SN=2/1+3/2+4/3+(N+1)/N
例如,若q的值为50.0,则函数值为49.394948。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
/**********************found***********************/
doublefun(doubleq)
{intn;doubles,t;
n=2;
s=2.0;
while(s<=q)
{
t=s;
/**********************found***********************/
s=s+(n+1)/n;
n++;
}
printf("n=%d\n",n);
/**********************found***********************/
returns;
}
main()
{clrscr();
printf("%f\n",fun(50));
}
(1)错误:
doublefun(doubleq)
正确:
doublefun(intq)
(2)错误:
s=s+(n+1)/n;
正确:
s=s+(double)(n+1)/n;
(3)错误:
returns;
正确:
returnt;
【解析】该程序中多次出现了函数调用过程中定义混乱的错误,关于类似问题,我们在前面的试题中已经做过比较详细的解释,主要是对基础知识的把握。
在这里我们再对函数调用规则做一简单说明。
C语言规定,在以下几种情况下可以不在调用函数前对被调用函数做类型说明。
(1)如果函数的值(函数的返回值)是整型或字符型,可以不必进行说明,系统对它们自动按整型说明。
但为清晰起见,建议都加以说明为好。
(2)如果被调用函数的定义出现在主调函数之前,可以不必加以说明。
因为编译系统已经先知道了已定义的函数类型,会自动处理的。
也就是说,将被调用的函数的定义放在主调函数之前,就可以不必另加类型说明。
(3)如果已在所有函数定义之前,在文件的开头,在函数的外部已说明了函数类型,则在各个主调函数中不必对所调用的函数再做类型说明。
除了以上3种情况外,都应该按上述介绍的方法对所调用函数的返回值做类型说明,否则编译时就会出现错误。
3.编程题
请编写函数fun(),其功能是:
计算并输出下列多项式的值。
S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)
例如,若主函数从键盘给n输入50后,则输出为S=1.960784。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
doublefun(intn)
{
}
main()
{
intn;
doubles;
printf("\nInputn:
");
scanf("%d",&n);
s=fun(n);
print