97100C语言试题.docx
《97100C语言试题.docx》由会员分享,可在线阅读,更多相关《97100C语言试题.docx(21页珍藏版)》请在冰点文库上搜索。
![97100C语言试题.docx](https://file1.bingdoc.com/fileroot1/2023-5/28/029279ba-3fcd-47d8-97d8-e4ef022d4f8b/029279ba-3fcd-47d8-97d8-e4ef022d4f8b1.gif)
97100C语言试题
第97套
1.填空题
请补充函数fun,该函数的功能是比较字符串str1和str2的大小,并返回比较的结果。
例如:
当str1="cdef",str2="cde"时,函数fun()返回">"。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN80
char*fun(char*str1,char*str2)
{
char*p1=str1,*p2=str2;
while(*p1&&*p2)
{
if(【1】)
return"<";
if(【2】)
return">";
p1++;
p2++;
}
if(*p1==*p2)
return"==";
if(*p1==【3】)
return"<";
else
return">";
}
main()
{
charstr1[N],str2[N];
clrscr();
printf("Inputstr1:
\n");
gets(str1);
printf("Inputstr2:
\n");
gets(str2);
printf("\n*****theresult*****\n");
printf("\nstr1%sstr2",fun(str1,str2));
}
【1】*p1<*p2【2】*p1>*p2【3】′\0′
【解析】填空1:
比较两个字符串的大小,是从第一个字符开始比较,如果两字符不相等,则由字符的大小决定字符串的大小;如果两字符相等,则继续比较下一个字符,如果所有字符都相等,则两字符串相等。
指针P1指向字符串str1,指针P2指向字符串str2,如果p1所指的字符小于p2所指的字符,则字符串str1小于字符串str2。
填空2:
如果p1所指的字符大于p2所指的字符,则字符串str1大于字符串str2。
填空3:
如果str1是str2的前一部分,则str1的所有字符都等于str2中的对应字符,而字符串结束标记符'\0'小于其他字符,所以,这里如果p1所指的字符等于'\0',则表示字符串str1小于字符串str2。
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
#include
#include
/**********************found***********************/
fun(intk)
{intn;floats,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***********************/
returns
}
main()
{clrscr();
printf("%f\n",fun(10));
}
(1)错误:
fun(intk)
正确:
doublefun(intk)
(2)错误:
returns
正确:
returns;
【解析】这样一道数学题要是用C程序来实现,真的挺简单,但我们还是需要注意细节问题上出的错误,该题便是如此。
一个是简单的函数调用的定义,另一个是语法错误。
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
#include
doublefun(intn)
{
}
main()
{
intn;
doubles;
printf("\n\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
}
【解析】我们先用数学的思路读懂该程序,并用1个字符表示"()"内的值。
在本程序中用s1来表示题中每个小括号内的值,第1项相当于有1个10.5次方(它还是1),第2项相当于第1项的值加上20.5次方,第3项相当于第2项的值加上30.5次方,…,依次类推。
函数pow(x,y)的功能是求出x的y次方,该函数已在库函数中定义(即可直接使用)。
要程序中用s来表示总的结果,每1次循环加1次s1即加1项。
doublefun(intn)
{
inti;
doubles=0.0,s1=0.0;
for(i=1;i<=n;i++)
{s1=s1+pow(i,0.5);/*求每一项*/
s=s+s1;/*按公式求出s*/
}
returns;
}
第98套
1.填空题
请补充函数fun(),该函数的功能是建立一个带头结点的单向链表并输出到文件"out98.dat"和屏幕上,各结点的值为对应的下标,链表的结点数及输出的文件名作为参数传入。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#include
typedefstructss
{
intdata;
structss*next;
}NODE;
voidfun(intn,char*filename)
{
NODE*h,*p,*s;
FILE*pf;
inti;
h=p=(NODE*)malloc(sizeof(NODE));
h->data=0;
for(i=1;i{
s=(NODE*)malloc(sizeof(NODE));
s->data=【1】;
【2】;
p=【3】;
}
p->next=NULL;
if((pf=fopen(filename,"w"))==NULL)
{
printf("Cannotopenout98.dat!
");
exit(0);
}
p=h;
fprintf(pf,"\n***THELIST***\n");
printf("\n***THELIST***\n");
while(p)
{
fprintf(pf,"%3d",p->data);
printf("%3d",p->data);
if(p->next!
=NULL)
{
fprintf(pf,"->");
printf("->");
}
p=p->next;
}
fprintf(pf,"\n");
printf("\n");
fclose(pf);
p=h;
while(p)
{
s=p;
p=p->next;
free(s);
}
}
main()
{
char*filename="out98.dat";
intn;
clrscr();
printf("\nInputn:
");
scanf("%d",&n);
fun(n,filename);
}
【1】i【2】p->next=s【3】p->next
【解析】填空1:
题目要求各结点的值为对应的下标,头结点的值为0,其他结点的值从1开始,所以此空应填i。
填空2:
为了将结点p和结点s连接起来,应将结点p的next指针指向结点s。
填空3:
为了通过for循环形成链表,每执行完一次循环操作,都要将指针p指向下一个结点。
2.改错题
下列给定程序中,函数fun()的功能是:
计算
S=f(-n)+f(-n+1)+…+f(0)+f
(1)+f
(2)+…f(n)
的值。
例如,当n为5时,函数值应为10.407143。
f(x)函数定义如下:
(x+1)/(x-2)x>0
f(x)=0x=0或x=2
(x-1)/(x-2)x<0
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
/**********************found***********************/
f(doublex)
{
if(x==0.0||x==2.0)
return0.0;
elseif(x<0.0)
return(x-1)/(x-2);
else
return(x+1)/(x-2);
}
doublefun(intn)
{
inti;doubles=0.0,y;
for(i=-n;i<=n;i++)
{y=f(1.0*i);s+=y;}
/**********************found***********************/
returns
}
main()
{clrscr();
printf("%f\n",fun(5));
}
(1)错误:
f(doublex)
正确:
doublef(doublex)
(2)错误:
returns
正确:
returns;
【解析】该程序的流程是,fun()程序对f(n)项循环累加,fun()程序采用条件选择语句计算函数f(x)的值。
本题错误在于未定义函数f(doublex)的返回值类型。
C语言规定,在未显式声明的情况下,函数返回值默认为int型。
3.编程题
请编写一个函数voidfun(chara[],charb[],intn),其功能是:
删除一个字符串中指定下标的字符。
其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。
例如,输入一个字符串world,然后输入3,则调用该函数后的结果为word。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#defineLEN20
voidfun(chara[],charb[],intn)
{
}
main()
{
charstrl[LEN],str2[LEN];
intn;
clrscr();
printf("Enterthestring:
\n");
gets(strl);
printf("Enterthepositionofthestringdeleted:
");
scanf("%d",&n);
fun(strl,str2,n);
printf("Thenewstringis:
%s\n",str2);
}
【解析】本题要求删除字符串中指定下标的字符,即相当于把不是指定下标的字符留下。
所以要用if(i!
=n),注意不能写成"=="运算。
voidfun(chara[],charb[],intn)
{
inti,k=0;
for(i=0;a[i]!
='\0';i++)
if(i!
=n)/*将不是指定下标的字符存入数组b中*/
b[k++]=a[i];
b[k]='\0';/*在字符串最后加上结束标记*/
}
第99套
1.填空题
请补充main函数,该函数的功能是:
先以只写方式打开文件"out99.dat",再把字符串str中的字符保存到这个磁盘文件中。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include"stdio.h"
#include"conio.h"
#defineN80
main()
{
FILE*fp;
inti=0;
charch;
charstr[N]="I'mastudent!
";
clrscr();
if((fp=fopen(【1】))==NULL)
{
printf("cannotopenout99.dat\n");
exit(0);
}
while(str[i])
{
ch=str[i];
【2】;
putchar(ch);
i++;
}
【3】;
}
【1】″out99.dat″,″w″【2】fputc(ch,fp)【3】fclose(fp)
【解析】填空1:
本题考查对文件操作的掌握。
打开一个文件的调用方式是,fp=fopen(文件名,使用文件方式);,题目要求以只写的方式打开文件"out99.dat",所以文件使用方式为"w"。
填空2:
fputc()函数用于将一个字符写到磁盘文件上去,调用形式为:
fputc(要输出的字符,文件指针)。
填空3:
对一个文件进行操作后,应该关闭它,以防它再被误用。
调用形式为:
fclose(文件指针);。
2.改错题
下列给定程序中,函数fun()的功能是:
计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。
其中x和y不相等,z和y不等。
例如,当x的值为9,y的值为11,z的值为15时,函数值为-3.50。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
/**********************found***********************/
#defineFU(m,n)(m/n)
floatfun(floata,floatb,floatc)
{floatvalue;
value=FU(a+b,a-b)+FU(c+b,c-b);
/**********************found***********************/
return(Value);
}
main()
{floatx,y,z,sum;
printf("Inputxyz:
:
");
scanf("%f%f%f",&x,&y,&z);
printf("x=%f,y=%f,z=%f\n",x,y,z);
if(x==y||y==z){printf("Dataerror!
\n");exit(0);}
sum=fun(x,y,z);
printf("Theresultis:
%5.2f\n",sum);
}
(1)错误:
#defineFU(m,n)(m/n)
正确:
#defineFU(m,n)(m)/(n)
(2)错误:
return(Value);
正确:
return(value);
【解析】如果从数学思想来说,这是一道简单的小学数学题,当然,用C语言的别的办法实现的话,也用不了三两句的程序,但是,这道题的考查点在C语言的宏定义上(这样的问题比较隐蔽),它的格式为#define标识符 字符串,中间要用空格分开,在该题中,标识符为FU(m,n),而字符串则是(m/n),由题干信息易知,应该是#defineFU(m,n)(m)/(n)。
3.编程题
请编写一个函数unsignedfun(unsignedw),w是一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w的后n-1位的数作为函数值返回。
例如:
w值为5923,则函数返回923;若w值为923,则函数返回23。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
unsignedfun(unsignedw)
{
}
main()
{
unsignedx;
clrscr();
printf("Enteraunsignedintegernumber:
");
scanf("%u",&x);
printf("Theoriginaldatais:
%u\n",x);
if(x<10)
printf("Dataerror!
");
else
printf("Theresult:
%u\n",fun(x));
}
【解析】我们首先应该明白无符号整数的定义形式,若它大于10000(5位)时,将10000对它求余则结果为后4位;当它大于1000(4位)时,将1000对它求余则结果为后3位,依此类推。
特别注意这里所有if()的顺序不能颠倒。
unsignedfun(unsignedw)
{
if(w>=10000)
returnw%10000;/*求出n位整数w的后n-1位的数*/
if(w>=1000)
returnw%1000;
if(w>=100)
returnw%100;
if(w>=10)
returnw%10;
}
第100套
1.填空题
请补充函数fun(),该函数的功能是:
把从键盘输入的3个整数按从小到大输出。
例如:
输入"337825",结果输出"253378"。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
main()
{
intx,y,z,t;
clrscr();
printf("Inputx,y,z\n");
scanf("%d%d%d",&x,&y,&z);
if(【1】)
{
t=x;
x=y;
y=t;
}/*交换x,y的值*/
if(【2】)
{
t=z;
z=x;
x=t;
}/*交换x,z的值*/
if(【3】)
{
t=y;
y=z;
z=t;
}/*交换z,y的值*/
printf("******theresult*******\n");
printf("fromsmalltobig:
%d%d%d\n",
x,y,z);
}
【1】x>y【2】x>z【3】y>z
【解析】填空1:
由最后的输出函数printf()可以推测,变量x中存放最小的数,变量y中其次,变量z中存放最大的数。
如果x大于y,则将两数进行交换。
填空2:
如果x大于z,则将两数进行交换。
填空3:
如果y大于z,则将两数进行交换。
2.改错题
数列中,第一项为3,后一项都比前一项的值增5。
下列给定程序中,函数fun()的功能是:
计算前n(4≤n≤50)项的累计和。
在累加过程中把那些被4除后余2的当前累加值放入数组中,符合此条件的累加值的个数作为函数值返回主函数里。
如,当n的值为20时,该数列为3,8,13,18,23,28,…,93,98。
符合此条件的累加值应为42,126,366,570,1010。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#defineN20
intfun(intn,int*a)
/**********************found***********************/
{inti,j,k,sum;
sum=0;
for(k=3,i=0;i{sum=sum+k;
/**********************found***********************/
if(sum%4=2)
a[j++]=sum;
}
/**********************found***********************/
returnj;
}
main()
{inta[N],d,n,i;
printf("\nEntern(4<=n<=50):
");
scanf("%d",&n);
d=fun(n,a);
printf("\n\nTheresult:
\n");
for(i=0;i}
(1)错误:
inti,j,k,sum;
正确:
inti,j=0,k,sum;
(2)错误:
if(sum%4=2)
正确:
if(sum%4==2)
(3)错误:
returnj;
正确:
returnj++;
【解析】按照老办法,我们先看数学思路,该题是一个公差为5的等差数列,简单吧,要是用数学的办法解决也就是一个公式两个符号,迎刃而解,所以这样很有规律的等差数列前n项和用C语言来求的话,也相当简单,关键看细节!
i,k,sum都分别定义了,那么j呢?
所以,正确的应该是inti,j=0,k,sum;,再往下看,if(sum%4=2)是在说明题干中"在累加过程中把那些被4除后余2的当前累加值放入数组中,符合此条件的累加值的个数作为函数值返回主函数",那么"余2"的表示方法呢?
不用看就知道应该是if(sum%4==2),后面的返回错误就不提了吧,看看a[j++]=sum;语句,难道还能返回给j吗?
3.编程题
请编一个函数floatfun(doubleh),函数的功能是对变量h中的值保留两位小数,并对第三位进行四舍五入(规定h中的值为正数)。
例如:
若h值为8.32433,则函数返回8.32;若h值为8.32533,则函数返回8.33。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干