97100C语言试题.docx
- 文档编号:10903924
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:21
- 大小:21.48KB
97100C语言试题.docx
《97100C语言试题.docx》由会员分享,可在线阅读,更多相关《97100C语言试题.docx(21页珍藏版)》请在冰点文库上搜索。
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的花括号中填入所编写的若干
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 97100 语言 试题
![提示](https://static.bingdoc.com/images/bang_tan.gif)