9396C语言试题.docx
- 文档编号:3812121
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:17
- 大小:21.35KB
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;i printf("%u",xx[i]); printf("\n\n\n"); n=fun(xx,yy,num); printf("\nyy="); for(i=0;i printf("%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;i t=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;i if(【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;i bb[i]=0; k=fun(n,m,bb); for(i=0;i printf("%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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 9396 语言 试题