2023年河南省安阳市全国计算机等级考试C语言程序设计真题(含答案)_第1页
2023年河南省安阳市全国计算机等级考试C语言程序设计真题(含答案)_第2页
2023年河南省安阳市全国计算机等级考试C语言程序设计真题(含答案)_第3页
2023年河南省安阳市全国计算机等级考试C语言程序设计真题(含答案)_第4页
2023年河南省安阳市全国计算机等级考试C语言程序设计真题(含答案)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023年河南省安阳市全国计算机等级考试C语言程序设计真题(含答案)学校:________班级:________姓名:________考号:________

一、2.填空题(10题)1.语句"int(*ptr)();"的含义是______是指向函数的指针,该函数返回一个int型数据。

2.开发软件所需要的高成本和产品的低质量之间有着尖锐的矛盾,这种现象被人们称之为【】。

3.若有定义inta=10,b=9,c=8;,接着顺序执行下列语句,变量b中的值是【】。

c=(a-=(b-5));

c=(a%11)+(b=3);

4.算法执行过程中所需要的基本运算次数称为算法的______。

5.若x和y都是double型变量,且x的初值为3.0,y的初值为2.0,则表达式pow(y,fabs(x))的值为【】。

6.以下函数的功能是【】。

floatav(a,n)

floata[];

intn;

{inti;floats;

for(i=0,s=0;i<n;i++)s=s+a[i];

returns/n;}

7.数据结构分为逻辑结构与存储结构,线性链表属于【】。

8.以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文件末尾,然后调用删函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。

FILE*myf;longfl;

myf=【】("test.t","rb");

fseek(myf,(),SEEK_END);fl+ftell(myf);

fclose(myf);

printf("%d\n",fl);

9.以下程序的功能是输出如下形式的方阵:

13141516

9101112

5678

1234

请填空。

#include<stdio.h>

main()

{inti,j,x;

for(j=4;j【】;j--)

{for(i=1;i<=4;i++)

[x=(j-1)*4+【】;

printf("%4d",x);

}

printf("\n");

}

10.数据模型是用来描述数据库的结构和语义的,数据模型有概念数据模型和结构数据模型两类,E-R模型是【】

二、单选题(10题)11.下列关系模型中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是

A.选择B.连接C.投影D.并

12.对n个关键字的序列进行快速排序,平均情况下的空间复杂度为_______

A.O(1)B.O(logn)C.O(n)D.O(nlogn)

13.以下说法中正确的是()。

A.C程序总是从第一个定义的函数开始执行

B.C程序总是从main函数开始执行

C.C函数必须有返回值,否则不能使用函数

D.C程序中有调用关系的所有函数必须放在同一个程序文件中

14.若有说明“chars1[30]="abc",s2[]="defghi";",则在使用函数stoat(s1,s2)后,结果是()。

A.s1的内容更新为abcdefghi

B.s1的内容更新为defghi\0

C.s1的内容更新勾defghiabc\0

D.s1的内容更新为abcdefghi\0

15.如下程序段

#include<stdio.h>

#include<ctype.h>

#include<conio.h>

intfun(char*str)

{inti,j=0;

for(i=0;str[i]!=’\0’;i++)

if(str[i]!=’’)str[j++]=str[i];

str[j]=’\0’;

}

main()

{

charstr[81];

intn;

clrscr();

printf("Inputastring:");

gets(str);

fun(str);

printf("%s\n",str);

}

当运行程序时,输入asdafaaz67<回车>,则输出是A.A.asdafaaz67

B.asdafaaz67

C.asd

D.z67

16.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称为()。

A.存储结构B.逻辑结构C.顺序存储结构D.链式存储结构

17.若变量c为char类型,能正确判断出c为小写字母的表达式是_______。A.′a′<=c<=′z′

B.(c>=′a′)||(c<=′z′)

C.(′a′=C)

D.(c>=′a′)&&(c<=′z′)

18.下列说法中错误的是A.A.只能在循环体内使用break语句

B.在循环体内使用break语句可以使流程跳出本层循环体,从而提前结束本层循环

C.在while和do…while循环中,continue语句并没有使整个循环终止

D.continue的作用是结束本次循环,即跳过本次循环体中余下尚未执行的语句,接着再一次进行循环判断

19.在一个无向图中,所有顶点的度数之和等于所有边数的()倍。

A.1/2B.1C.2D.4

20.

三、程序设计题(10题)21.使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,请编写函数fun(),该函数的功能是求出二维数组周边元素之和,作为函数值返回。二维数组中的值在主函数中赋予。例如,若二维数组中的值为13579299946999813570则函数值为61。注意:部分源程序在文件prog1.c中。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。试题程序:1#include2#include3#include4#defineM45#defineN56intfun(inta[m][n])7{89}10voidmain()11{12FILE*wf;13intaa[M][N]={{1,3,5,7,9},{2,9,9,9,4},{6,9,9,9,8},{1,3,5,7,0}};14inti,j,y;15system("CLS");16printf("Theoriginaldatais:\n");17for(i=0;i<m;i++)18{for(j=0;j<n;j++)19printf("%6d",aa[i][j]);20printf("\n");21}22y=fun(aa);23printf("\nThesum:%d\nM,y);24printf("\n");25/******************/26wf=fopen("out.dat","w");27fprintf(wf,"%d",y);28fclose(wf)29/******************/30}

22.N名学生的成绩已在主函数中放人一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,其功能是:求出平均分,并由函数值返回。

例如,若学生的成绩是:8576698591726487,则平均分应当是:78.625。注意:部分源程序在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填人你编写的若干语句。

23.使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,规定输入的字符串中只包含字母和*号。请编写函数其功能是使字符串的前导*号不得多于n个,若多于n个,则删除多余的*号;若少于或等于n个,则不做处理。字符串中间和尾部的*号不删除。例如,字符串中的内容为“*******A*BC*DEF*G****”,若n的值为4,删除后,字符串中的内容应当是“****A*BC*DEF*G****”;若n的值为8,则字符串中的内容仍为“*******A*BC*DEF*G****”。n的值在主函数中输入。在编写函数时,不得使用C语言提供的字符串函数。注意:部分源程序给出如下。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#include<conio.h>voidfun(char*a,intn){}voidmain(){ chars[81];intn; printf(“Enterastring:\n”); gets(s); printf(“Entern:”); scanf(“%d”,&n); fun(s,n); printf(“Thestringafterdeleted:\n”); puts(s);}

24.使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,编写函数fun(),其功能是根据以下公式求P的值,结果由函数值返回。m与n为两个正整数且要求m>n。例如:m=12,n=8时,运行结果为495.000000。注意:部分源程序在文件prog1.c中。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。试题程序:

25.请编写函数proc(),它的功能是:求出1~1000中能被5或13整除,但不能同时被5和13整除的所有整数,并将它们放在arr所指的数组中,通过n返回这些数。注意:部分源程序给H{如下。请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。试题程序:

26.请编写—个函数,用来删除字符串中的所有空格。例如,输入asdafaaz67,则输出为asdafaaz67。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:

27.编写函数fun,其功能是:实现两个字符串的连接(不要使用库函数strcat),即把p2所指的字符串连接到

pl所指的字符串的后面。

例如,分别输入下面两个字符串:

程序输出:

注意:部分源程序在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

28.请编写fun函数,其功能是:计算并输出3~m所有素数的平方根之和。

例如,若主函数从键盘给m输入50后,则输出为s=68.665791。

请勿改动main函数与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

注意:m的值要大于2但不大于100。部分源程序给出如下。

试题程序:

#include<math.h>

#include<stdio.h>

doublefun(intm)

{}

voidmain

{

intm;

doubles;

FILE*out:

printf("\n\nInputm:");

scanf("%d",&m);

s=fun(m);

printf("\n\ns=%f\n\n",s);

ut=fopen("outfile.dat","w");

for(m=0;m<10;m++)

fprintf(out,"%f\n",fun(m+80));

felose(out);

}

29.使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,规定输入的字符串中只包含字母和*号。请编写函数fun(),其功能是使字符串中尾部的*号不多于n个,若多于n个,则删除多余的*号;若少于或等于n个,则不做任何操作,字符串中间和前面的*号不删除。例如,字符串中的内容为“****A*BC*DEF*G*******”,若n的值为4,删除后,字符串中的内容应为“****A*BC*DEF*G****”;若n的值为7,则字符串中的内容仍为“****A*BC*DEF*G*******”。n的值在主函数中输入。编写函数时,不得使用C语言提供的字符串函数。注意:部分源程序给出如下。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>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);}

30.使用VC++2010打开考生文件夹夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,请编写函数fun(),该函数的功能是删除一维数组中所有相同的元素,使之只剩一个。数组中的元素已按由小到大的顺序排列,函数返回删除后数组中元素的个数。例如,若一维数组中的元素是2223445666677899101010删除后,数组中的元素应该是2345678910注意:部分源程序给出如下。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#defineN80intfun(inta[],intn){}voidmain(){ inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20; printf(“Theoriginaldata:\n”); for(i=0;i<n;i++)<p=""></n;i++)<> printf(n%3d”,a[i]); n=fun(a,n); printf(“\n\nThedataafterdeleted:\n”); for(i=0;i<n;i++)<p=""></n;i++)<> printf(“%3d”,a[i]); printf(“\n\n”);}

四、2.程序修改题(10题)31.下列给定程序中,fun()函数的功能是:根据形参m,计算下列公式的值。

t=1-1/2+1/3-1/4+…+(-1)(m+1)/m

例如,若输入5,则应输出0.783333。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include<conio.h>

#include<stdio.h>

/*************found*************/

intfun(intm)

{

doublet=1.0,j=1.0;

inti;

/*************found*************/

for(i=l;i<m;i++)

{j=-1*j;t+=j/i;}

returnt;

}

main()

{

intm;

clrscr();

printf("\nPleaseenter1integernumber:");

scanf("%d",&m);

printf("/nTheresultis%If\n",fun(m));

}

32.给定程序MODII.C中fun函数的功能是:根据整型形参m,计算如下公式的值。

例如,若主函数中输入5,则应输出-0.283333。

请改正函数fun中的错误或在横线处填上适当的内容并把横线删除,使它能计算出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

33.给定程序MODll.C中函数fun的功能是:根据整型形参m,计算如下公式的值。

例如,若m=2000,则应输出:0.000160。

请改正程序中的语法错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

34.下列给定程序中,fun()函数的功能是:根据形参m,计算下列公式的值。

t=-1+1/2+1/3+1/4+…+1/m

例如,若输入5,则应输出2.283333。

请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include<conio.h>

#include<stdio.h>

doublefun(intm)

{

doublet=1.0;

inti;

for(i=2;i<=m;i++)

/*************found**************/

t+=1.0/k;

/*************found**************/

returni;

}

main()

{intm;

clrscr();

printf("\nPleaseenterlintegernumber:");

scanf("%d",&m);

printf("\nTheresultis%1f\n",fun(m));

}

35.给定程序MODll.C中函数fun的功能是:交换主函数中两个变量的值。例如:若变量a中的值原为8,b中的值为3。程序运行后a中的值为3,b中的值为8。请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

36.下列给定程序中,函数fun()的功能是:应用递归算法求某数a的平方根。求平方根的迭代公式如下:

例如,2的平方根为1.414214。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include<math.h>

#include<stdio.h>

/*************found**************/

fun(doublea,doublex0)

{doublexl,y;

xl=(x0+a/x0)/2.0;

/*************found**************/

if(fabs(xl-x0)>0.00001)

y=fun(a,xl);

elsey=x1;

returny;

}

main()

{doublex;

printf("Enterx:");scanf("%1f",&x);

printf("Thesquarerootof%1fis%1f\n",

x,fun(x,l.O));

}

37.下列给定程序中,函数fun()的功能是:根据整型参数m,计算如下公式的值。

y=1/(100×100)+1/(200×200)+1/(300×300)+…+1/(m×m)

例如,若m=2000,则应输出0.000160。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include<conio.h>

#include<stdio.h>

/*************found**************/

fun(intm)

{doubley=0,d;

inti;

/*************found**************/

for(i=100,i<=m,i+=100)

{d=(double)i*(double)i;

y+=l.0/d;

}

return(y);

}

main()

{intn=2000;

clrscr();

printf("\nTheresultis%lf\n",fun(n));

38.下列给定程序中,函数fun()的功能是:求整数x的y次方的低3位值。例如,整数5的6次方为15625,此值的低3位值为6250

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include<stdio.h>

longfun(intx,inty,long*p)

{inti;

longt=1;

/**************found***************/

for(i=1;i<y;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=%1d,last=

%1d\n\n",x,y,r,t);

}

39.下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun()的功能是:将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并作为函数值返回。

其累加和通过函数值返回main()函数。例如,若n=5,则应输出8.391667。

请改正程序中的错误,使它能得到正确结果。

[注意]不要改动main函数,不得增行或删行,也不得更改程序的结构。

[试题源程序]

#include<stdio.h>

#include<stdiib.h>

typedefstructaa

{

intdata;

structaa*next;

}NODE;

intfun(NODE*h)

{

intsum=0;

NODE*P;

/**********found**********/

p=h;

while(P->next)

{

if(p->data%2==0)

sum+=p->data;

/**********found**********/

p=h->next;

}

returnsum;

}

NODE*creatlink(intn)

{

NODE*h,*p,*s,*q;

inti,x;

h=p=(NODE*)malloc(sizeof(NODE));

for(i=1;i<=n;i++)

{

s=(NODE*)malloc(sizeof(NODE));

s->data=rand()%16;

s->next=p->next;

p->next=s;

p=p->next;

}

p->next=NULL;

returnh;

}

outlink(NODE*h,FILE*Pf)

{

NODE*p;

p=h->next;

fprintf(Pf,"\n\nTHELIST:\n\nHEAD");

while(P)

{

fprintf(Pf,"->%d",p->data);p=p->next;

}

fprintf(pf,"\n");

}

outresult(ints,FILE*pf)

{

fprintf(Pf,"\nThesumofevennumbers:%d\n",s);

}

main()

{

NODE*head;inteven;

head=creatlink(12);

head->data=9000;

outlink(head,stdout);

even=fun(head);

printf("\nTheresult:\n");outresult(even,stdout);

}

40.给定程序中函数fun的功能是:从低位开始取出长整型变量S中偶数位上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。

例如,当s中的数为7654321时,t中的数为642。

请改正程序中的错误,使它能得到正确结果。

[注意]不要改动main函数,不得增行或删行,也不得更改程序的结构。

[试题源程序]

#include<stdio.h>

/************found***********/

voidfun(longs,longt)

{

longs1=10;

s/=10;

*t=s%10;

/************found************/

while(s<0)

{

s=s/100;

*t=s%10*s1+*t;

s1=s1*10;

}

}

msin()

{

longs,t;

printf("\nPleaseenters:");

scanf("%ld",&s);

fun(s,&t);

printf("Theresultis:%ld\n",t);

}

五、程序改错题(2题)41.下列给定程序中,fun()函数的功能是:从整数1~50中,选出能被3整除且有一位上的数是5的数,并把这些数放b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。

请修改函数中的错误,得出正确的结果。

注意:不要改动main()函数,不能增行或减行,也不能更改程序的结构。

试题程序:

42.下列给定程序中,函数proc的功能是:从字符串str中,删除所有大写字母F。请修改程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include<stdio.h>voidproc(char*str){inti,j;//****found****for(i=j=0;str[i]一0;i++)if(str[i]!=F)//****found****str[i]=str[i];str[j]=\0;}voidmain{charstr[80];printf("\nEnterastring:");gets(str);printf("Theoriginalstring:");puts(str);proc(str);printf("Thestringafterdeleted:");puts(str);printf("\n\n");}六、操作题(2题)43.以下程序运行后的输出结果是【】。

main()

{chara[]="Language",b[]="Pragrame";

char*p1,*p2;intk;

p1=a;p2=b;

for(k=0;k<=7;k++)

if(*(p1+k)==*(p2+k))

printf("%c",*(p1+k));

}

44.fun1函数的功能是将3个整数按由大到小的顺序调整后依次放入a、b、c3个变量中,a中放最大数,fun2函数的功能是交换两个变量中的值。补足所缺语句。

fun2(int*x,int*y)

{intt;

t=*x;*x=*y;*y=t;

}

fun1(int*p1,int*p2,int*p3)

{if(*p3>*p2)fun2(*P2,*p3);

if(*p1<*p3)fun2(______);

if(*p1<*p2)fun2(______);

}

main()

{inta,b,c;

scanf("%d%d%d",&a,&b,&c);

fun1(&a,&b,&c);

printf("%d,%d,%d\n",a,b,c);

}

参考答案

1.ptrptr解析:本题考查函数指针的概念。函数指针的定义格式是:类型标识符(*旨针变量名)()。注:“类型标识符”为函数返回值的类型。

2.软件危机软件危机

3.33解析:这里:b-5=4,a-=4之后a的值为6,并把它赋给c。此时b的值并未被改变。在第2个表达式中,也只有赋值表达式b=3改变了b的值。所以两行语句执行完毕,b的值应该为3。

4.时间复杂度时间复杂度解析:算法在执行过程中所执行的基本运算的次数,也就是执行算法所需要的计算工作量,称为算法的时间复杂度。

5.88解析:fabs函数功能是求x的绝对值,计算结果为double型。pow功能是计算x的y次方的值,计算结果同样为double型。所以本题表达式相当于2.0的3.0次方,结果为8.000000。

6.求出数组元素平均值求出数组元素平均值解析:函数有一个数组形参a和一个整型形参n。函数首先用循环求数组a的前n个元素和,然后将和除以n。即求数组元素的平均值。

7.存储结构

8.fopenfopen解析:C语言中的文件分为:ASCII文件与二进制文件。文件在使用前打开,使用后要关闭。

打开文件的函数为:fopen(),调用形式为:fp=fopen(“文件名”,“使用文件方式”);

关闭文件的函数为:fclose(),调用形式为:fclose(fp);其中fp为文件指针。

9.>=1或>0i>=1或>0\r\ni解析:程序的外层for循环控制输出数据的行数,故第一处填“>=1”或“>0”;内层循环控制每行输出的个数。在内层for循环中,语句x=(j-1)*4+______;用于控制输出方阵中的具体数据,由于这些数据与其所在的行、列(j,i)具有x=(j-1)*4+i的关系,故第二处填i。

10.概念数据模型概念数据模型

11.B解析:本题主要考查关系模型中几种运算的特征。经过选择或投影运算得到的新关系的属性个数最多不会超过原关系中的属性个数。经过连接运算得到的新关系最多不少于原关系中属性的个数。故选项B正确。

12.D

13.B解析:C++程序总是从main函数开始执行。

14.Dstrcat(s1,s2)函数的功能是把s2字符串连接到s1字符串的末尾,要保证s1有足够的空间容纳下连接后的字符串。

15.A在本题中,程序首先定义一个返回类型为整型的函数fun,该函数带有一个指针型的形参变量str,从主函数中对其调用时传递的参数我们可以知道,该指针指向的是一个数组,在该函数体中,首先定义两个整型变量,然后执行循环,循环变量i的初始值为0,循环结束的条件是str[i]!=’\\0’,表示取到的数组元素是字符串结束标识,即字符串中的字符被处理完,在循环体中,首先执行条件判断语句if(str[i]!=’’),如果结果为真,说明取到的当前字符不是空字符,这时执行str[j++]=str[i],即将非空格字符保存到数组中;如果为假,说明取到了空格字符,此时不保存,而接着执行下次循环跳过空格字符。循环结束后执行str[j]=’\\0’;,即保存字符结束标识符,用来标识字符串结束。通过上面的这些分析,我们可以知道函数fun的作用是去掉字符数组中的空格字符。

在主函数中,首先定义了一个大小为81的字符数组,然后调用函数clrscr()清除输入文本窗口,接着输出一条提示语句,执行gets(str);语句,该语句的作用是从键盘输入一个字符串到str数组,碰到换行符结束。然后调用函数fun,其实参为str。通过上面对函数fun作用的分析我们可以知道,调用函数后输入字符串中的空格符都被删除了,最后得到的字符串为asdafaaz67。

程序最后执行输出语句,输出字符数组str中的字符串,因此,程序最终的输出结果是asdafaaz67,本题答案选A。

16.C

17.D

18.A解析:只能在循环体内和switch语句体内使用break语句,当break出现在循环体中的switch语句体时,其作用是跳出该switch语句体。当break出现在循环体中,但不在switch语句体中时,则在执行break后,跳出本层循环体。continue语句的作用是,跳过本次循环体中余下尚未执行的语句,接着再一次进行循环的条件判定。

19.C

20.D

21.1intfun(inta[M][N])2{3inti,j,sum=0;4for(i=0;i<m;i++)5for(j=0;j<n;j++)6if(i==o||i==M-1||j==0||j==N-1)/*只要下标中有一个为。或M-1或N-1,则它一定是周边元素*/7sum=sum+a[i][j];/*将周边元素相加*/8returnsum;9}本题采用逐一判断的方式求数组周边元素和。二维数组周边元素的规律是,其两个下标中一定有一个是0或M-1或N-1。程序中循环语句用来控制数组的行和列,条件语句用来判断数组元素是否为周边元素。22.

【考点分析】

本题考查:链表的操作,对链表的主要操作有以下几种:建立链表、结构的查找与输出、插入一个结点、删除一个结点。

【解题思路】

题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各结点数据域中数值的和,再对和求平均分。遍历链表时应定义一个指向结点的指针P,因为“头结点”中没有数值,所以程序中让P直接指向“头结点”的下一个结点,使用语句STREC+P=h÷next。23.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’; /*在字符串最后加上字符串结束标志*/ }}字符串中前导*号不能多于n个,多余的应删除。首先需要通过while循环统计字符串前导*号的个数,然后通过if条件语句完成前导*号的个数和n的比较,如果前导*号多于n个,则需要把n个*号和其余字符重新保留。24.1floatfun(intm,fintn){Floatp1=1,p2=1,p3=1;inti;for(i=1;i<=m;i++)pi*=i;for(i=l;i<=n;i++)p2*=i;for(i=l;i<=(m-n);i++)p3*=i;returnpi/(p2*p3);本题考查循环的使用。通过3个for循环分别计算阶乘。其中p1=m!,p2=n!,p3=(m-n)!。

25.

【解析】题目中要求出1~1000中能被5或13整除,但不能同时被5和13整除的所有整数,首先应判断1~1000的每一个整数是否符合要求,将符合要求的每一个整数放入数组arr中。最后将整数的个数作为形参返回给主函数。

26.[答案][解析]题目要求删除空格,也就是重新保存空格以外的其他字符。通过循环删除字符串中的每一个空格,将非空格字符进行重新保存。27.

【考点分析】

【解题思路】

本题用两个循环完成操作,第1个循环的作用是求出第1个字符串的长度,即将i指到第1个字符串的末尾。第2个循环的作用是将第2个字符串的字符连到第1个字符串的末尾。

28.\r\n\tintn,k,i;

doublesum=0.0;

for(n=3;n<=m;n++)//判断n是否为素数

{

k=sqrt(n);//求n平方根

for(i=2;i<=k:i++)

if(n%i==0)break;//如果n不是素数,跳出

if(i>=k+1)

sum+=sqrt(n);//求平方根的和

}

returnsum;

【解析】首先判断循环中n是否为素数,如果不是素数,求其平方根的累加和,并返回计算结果,否则跳出判断循环。其中,对于平方根的求解可以使用C语句中的sqrt函数。29.voidfun(char*a,intn){ inti=0,k=0; char*p,*t; p=t=a;/*将指针移动到字符串末尾*/ while(*t) t++; t--;/*从后往前如果是*则使k自增1,找到最后一个*所在的位置,并记录*的个数*/ while(*t==‘*’)/*指针t指向前一个,同时标量k自增1*/ {k++;t--;}/*如果最后*的个数大于允许的个数*/ if(k>n)/*循环次数不大于前面的字符与最大允许*的个数之和*/ { while(*p&&p<t+n+1)<p=""></t+n+1)<>/*把字符保存到数组a中*/ {a[i]=*p; i++;p++; } a[i]=‘\0’; }}字符串中尾部*号不能多于n个,多余的要删除。首先需要通过while循环统计字符串尾部*号,然后通过if条件语句完成尾部*号数和n的比较,若尾部*号数多于n个,则需要把n个*号和其余字符重新保存。30.intfun(inta[],intn){ inti,j=1; for(i=1;i<n;i++) if(a[j-1]!=a[i])/*若该元素与前一个元素不相同,则保留*/ a[j++]=a[i]; returnj;/*返回不相同元素的个数*/}该程序的流程:定义变量i和j,其中j用于控制删除后剩下的元素在数组中的下标,i用于搜索原数组中的元素。j始终是新数组中最后一个元素的下一个元素的下标。所以if语句中的条件是a[j-1]!=a[i],其中a[j-1]是新数组中的最后一个元素,若条件成立,则表示出现了不同的值,所以a[i]要保留到新数组中。注意本题中i和j的初值都要从1开始,该算法只能用于数组已排序的题目中。

31.(1)错误:intfun(intm)正确:doublefun(intm)(2)错误:for(i=1;i<m;i++)正确:for(i=2;i<=m;i++(1)错误:intfun(intm)正确:doublefun(intm)\r\n(2)错误:for(i=1;i<m;i++)正确:for(i=2;i<=m;i++解析:错误1:函数的返回值为实型数,所以应定义为double类型。错误2:根据题目的公式,参加运算的数应从2到m,包括m。

32.(1)t=t-1.0/i;或t-=1.0/i;或t一=(double)1/i;(2)returnt;(1)t=t-1.0/i;或t-=1.0/i;或t一=(double)1/i;(2)returnt;解析:本题中函数的功能是计算公式的值。首先根据题干中给出的公式推出每一项之间的关系,求出每一项的表达式,然后求得数列的值。其中,每一项的值为1/n。

33.(1)doublefun(intm)(2)for(i=100;i<=m;i+=100)(1)doublefun(intm)(2)for(i=100;i<=m;i+=100)解析:本题中函数的功能是计算公式的值。关于题干公式的求解过程,首先根据题干中给出的公式推出每一项之间的关系,求出每一项的表达式,然后求得数列的值。

34.(1)错误:t+=1.0/k;正确:t+=1.0/i;(2)错误:returni;正确:returnt;(1)错误:t+=1.0/k;正确:t+=1.0/i;\r\n(2)错误:returni;正确:returnt;解析:该题目考查分母成等差数列递增的一个数学公式,我们先看看循环条件for(i=2;i<=m;i++),i是从2开始递增到m,所以t的值应该由1.0/i的值逐步循环叠加后的结果,而不是t+=1.0/k;,returni;考查对程序的解读能力,当循环结束后(由输入m的值决定),函数值返回当前t的值。

35.(1)voidfun(int*xint*y)(2)t=*x;*x=*y;*y=t;(1)voidfun(int*x,int*y)(2)t=*x;*x=*y;*y=t;解析:本题中函数的功能是交换主函数中两个变量的值。利用临时变量存放临时交换值,实现两个变量的交换。

36.(1)错误:fun(doubleadoublex0)正确:doublefun(doubleadoublex0)(2)错误:if(fabs(x1-x0)>0.00001)正确:if(fabs(x1-x0)>=0.00001)(1)错误:fun(doublea,doublex0)正确:doublefun(doublea,doublex0)\r\n(2)错误:if(fabs(x1-x0)>0.00001)正确:if(fabs(x1-x0)>=0.00001)解析:用C语言求平方根的方法一般有两种经典的算法,它们分别是迭代法和递归法,本题要求用递归法。该程序采用了if语句,错误在于if语句的判断条件,程序的含义是当迭代结果差小于误差时进行循环,故正确的应该是if(fabs(x1-x0)>=0.00001)。

37.(1)错误:fun(intm)正确:doublefun(intm)(2)错误:for(i=100i<=mi+=100)正确:for(i=100;i<=m;i+=100)(1)错

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论