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

下载本文档

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

文档简介

2023年江苏省苏州市全国计算机等级考试

C语言程序设计真题(含答案)

学校:班级:姓名:考号:

一、2.填空题(10题)

1.有以下语句段:

intnl=10,n2=20;

printf("[]",nl,n2);

要求按以下格式输出nl和n2的值:

nl=10

n2=20

每个输出行从第一列开始,请填空。

2.下面程序中函数creat用于建立一个带头结点的单向链表,新产生的

结点总是插在链表的末尾,单向链表的头指针作为函数值返回。将程序

补充完整。

#include<stdiao.h>

structlist

{chardata;structlist*next;};

structlist*creat()

(

structlist*h,*p,*q;charch;

h=[]malloc(sizeof(structlist));

p=q=h;ch=getchar();

while(ch!='?')

p=[]malloc(sizeof(structlist));

p->data=ch;q->next=p;q=p;ch=getchar();

}

p->next='\0';

[];

)

3.按“先进后出”原则组织数据的数据结构是口。

4.下列程序的运行结果是____o

#definePOW(r)(r)*(r)

main()

{intx=3,y=2,t;

t=POW(x+y);

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

)

5.以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文

件末尾,然后调用ftell函数返回当前文件的具体位置,从而确定文件长

度,请填空。

FILE*myf;longfl;

myf=【]

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

fclose(myf);

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

6.以下涵数rotate的功能是:将a所指N行N列的二维数组中的最后

一行放到b所指二维数组的第0列中,把a所指二维数组中的第0行放

到b所指二维数组的最后一列中,b所指二维数组中其他数据不变。

#defineN4

voidrotade(inta[][N],intb[][N])

{inti,j;

for(i=0;i<N;i++)

{b[i][N-l]=[];[]=a[N-l][i];}}

7.以下程序的输出结果是【】。

#include<stdio.h>

main()

{inti;

for(i='a';i<'f;i++,i++)printf("%c",i-'a'+'A');

printf("\n");

)

8.按照逻辑结构分类,结构可以分为线性结构和非线性结构,栈属于

9.表达式l/2*(int)3.7/(int)(2.4*(L5+2.5))值的数据类型为。

10.以下程序是从终端读入数据到数组中,统计其中正数的个数,并计

算它们的和。请填

main()

(

inti,a[20],sum,count;

sum=count=[];

for(i=0;i<20;i++)scanf("%d("%d",[]);

for(i=0;i<20;i++)

(

if(a[i]>0)

{count++;

sum+=【];

)

)

printf("sum=%d,count=%d\n",sum,count);

}

二、单选题(10题)

(40)函数rewind(fp)的作用是()。

A)使fp指定的文件的位置指针重新定位到文件的开始位置

B)将fp指定的文件的位置指针指向文件中所要求的特定位置

o使m指定的文件的位置指针向文件的末尾

nD)使fp指定的文件的位置指针白动移至下一个字符位置

12.数据在计算机存储器内表示时,如果元素在存储器中的相对位置能反

映数据元素之间的逻辑关系,则称这种存储结构为()。

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

13.有以下程序:

main()

{intk=5,n=0;

do

{switch(k)

{case1:

case3:n+=l;k—;break;

defalut:n=0;k—;

case2:

case4:n+=2;k—;break:

)

printf("%d",n);

}while(k>0&&n<5);

)

程序运行后的输出结果是()。

A.235B.0235C,02356D,2356

14.在循环队列中,若front与rear分别表示对头元素和队尾元素的位置,

则判断循环队列空的条件是0。

A.front==rear+1B.rear==front+1C.front==rearD.front==0

15.用单链表方式存储的线性表,存储每个结点需要两个域,一个数据域,

另一个是()。

A.当前结点的所在地址B.后继结点的所在地址C.空指针域D.空闲域

16.

有以下程序

#include<stdio.h>

#include<string.h>

typedefstrllct{charname[9];charsex;floatscore[2];}STU;

STUf(STUa)

{STUb={"Zhao",m,85.0,90.0);inti;

strcpy(aname,b.name);

sex:b.sex;

for(i=0;i<2;i++)a.score[i]=b.score[i];

returna;

)

main

{STUc="Qian",f,95,0,92.0},d;

d=f(c).printf("%s,%c,%2.Of,%2.Of,d.Name,d.sex,d.score[0],

d.score[l]);

)

程序的运行结果是()。

A.Qian,f,95,92

B.Qian,m,85,90

C.Zhao,m,85,90

D.Zhao,f,95,92

17.已知一个无向图(边为正数)中顶点A,B的一条最短路P,如果把各

个边的权重(即相邻两个顶点的距离)变为原来的2倍,那么在新图中,

P仍然是A,B之间的最短路,以上说法是()

A.错误B.正确

18.具有20个结点的二叉树,其深度最多为o

A.4B.5C,6D.20

19.以下程序的输出结果是()。

main()

{inti,a[4][4]-*{{l,3,5),{2,4,6},[3,5,7)};

printf("%(l%d%d%d\n".a[O][3],a[l][2],a[2]

]],a[3][0];

)

A.0650B.1470C.5430D.输出值不定

20.以下不能输出字符A的语句是(注:字符A的ASCII码值为65,字

符a的ASCII码值为97)()。

A.print[("%c\n",a-32);

B.print[("%d\n",A);

C.printf("%c\n",65);

D.printf("%c\n",B-l);

三、程序设计题(10题)

21.

请编写一个函数voidproc(intm,intk,intxxE3),该函数的功能是:

将大于整数m且紧靠m的k个素数存入所指的数组中。例如,若输入

206,则应输出232931374143。注意:部分源程序给出如下。请勿

改动main()函数和其他函数中的任何内容,仅在函数proc()的花括

号中填入所编写的若干语句。试题程序:

$induce

sincludeVconw.h>

,tnciudeVAtdio.

vouSprocimtm*mlmtotJ)

voed0M*n()

ifiim»n»Arv(1000]i

■y>lctn<*CLS*>i

prmli(*\nPle«9cctitcrtwomtegeoi*)t

■“dXd,・&m・&.n)i

proc^tn«n«arr)।

tor(♦♦»

priat((.*d•.aEm])i

print"*\n*)»

22.请编写一个函数,用来删除字符串中的所有*。例如,输入

abc*de*f*gh,则输出为abcdefgh。注意:部分源程序给出如下。请勿

改动main()函数和其他函数中的任何内容,仅在函数proc()的花括

号中填入所编写的若干语句。试题程序:

19tnclvd*Vzdto*h>

9includeVctype

9*nHudeVcoaio.b>

9include<ntdlib,K>

“idprcc*(ch«•aif)

voidmam<>

charnif(811e

»jr*<etn(*CLSa)i

pnmf(*Input•Mnngi*>i

<et>(*tr)•

puiMutr)i

proc(»ir)t

pnntf(fl•••ttrcK*\n*«*tr)i

23.编写函数fun,其功能是:将所有大于1小于整数m的非素数存人

XX所指数组中,非素数的个数通过k返回。

例如,若输入17,则应输出:46891012141516。注意:部分源程序

在文件PROG1.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括

号中填入你编写的若干语句。

tindude<sldio.h>

voidfiin(intm.int*k,intxx[])

main()

I

intm,n,n[100]:

voidNONO();・

printf("\nPleaseenteranintegernumberbetween10and100:");

scanf("%d*,&n);

fun(n,&mtzz);

printf("\n\nlliercare%dnon-primenumbersthan%d:**,m.n);

for(n&0;n<m;n++)

printf(-\n%4<1".u[n]);

NONO();

voidNONO()

I

/•南在此函数内打开文件,愉人测试数据,谒用fun函数.

输出数据,关闭文件。•/

inim,n.u[100](

FILEerf,•wf;

rf=fbpen(-in.dat-/r");

wf=fof)en("out.dat"/wH);

fecanf(rf,-%d-.&n);

fun(n.&m,u);

fprintf(wf,"%d\n%d\n\mvn);

for(ns0;n)

Hw

fprintf(wf,%d\n,B[n]);

fclooe(tf);

fckme(wf);

24.假定输人的字符串中只包含字母和*号。请编写函数proc,它的功能

是:将字符串中

的前导*号全部删除,中间和后面的*号不删除。

例如,若字符串中的内容为****a*bc*def*g****,删除后,字符串中的

内容则

应当是a*bc*def*g****。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括号

中填入所编

写的若干语句。

试题程序:

#include<stdio.h>

#include<conio.h>

voidproc(char*str)

(

)

voidmain

(

charstr[81];

printf("Enterastring:kn");

gets(str);

proc(str);

printf("Thestringafterdeleted:kn");

puts(str);}

25.请编写函数proc,该函数的功能是:将放在字符串数组中的M个

字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。

例如,若字符串数组中的M个字符串为:

ABCD

BCDEFG

CDEFGHI

贝U合并后的字符串内容应该是ABCDBCDEFGCDEF—GH10

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括

号中填人所编写的若干语句。

试题程序:

#include<stdio.h>

#include<conio.h>

#defineM3

#defineN20

voidproc(chararr[M][N],char*b)

(

)

voidmain

(

charstr[M][N]={"ABCD","BCDEFG","

CDEFGHI"),i;

charHIT[100]={"#############

#####");

printf("Thestring:\n");

for(i=0;i<M;i++)

puts(str[i]);

printf("\n");

proc(str,arr);

printf("TheAstring:\n");

printf("%s",arr);

printf("\n\n");

26.使用VC++2010打开考生文件夹夹下progl中的解决方案。此解决

方案的项目中包含一个源程序文件progl.c。在此程序中,请编写函数

fun(),该函数的功能是删除一维数组中所有相同的元素,使之只剩一个。

数组中的元素已按由小到大的顺序排列,函数返回删除后数组中元素的

个数。

例如,若一维数组中的元素是

2223445666677899101010

删除后,数组中的元素应该是

2345678910

注意:部分源程序给出如下。

请勿改动主函数main。和其他函数中的任何内容,仅在函数fun()的花

括号中填入你编写的若干语句。

试题程序:

#include<stdio.h>

#defineN80

intfun(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=""x/n;i++)<>

prmtf(n%3d^^,a[i]);

n=fun(a,n);

printf("\n\nThedataafterdeleted:\n^^);

for(i=0;i<n;i++)<p=""x/n;i++)<>

printf("%3d”,a[i]);

printfCt\n\n^,);

27.

请编写一个函数,用来删除字符串中的所有空格。

例如,输入asdafaaz67,则输出为asdafaaz67o

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括

号中填入你编写的若干语句。

试题程序:

#iiclude

#i)iclude<ctype.h>

#iiiclude<conio.h>

vodfun(char*stz)

(

)

main()

(charstr[81];

charMsgf拉"Inputastring:n;

intn;

printf(Msg);gets(str);puts(str);{iin(str);

printfC****str:%8\nM,str);

28.请编写函数fun(),其功能是计算并输出下列多项式的值:F=l+1

/l!+l/21+l/31+l/41+...+l/m!例如,若主函数从键盘给m输入

5,则输出为F=2.716667。注意:m的值要求大于1但不大于100。

部分源程序给出如下。请勿改动main()函数与其他函数中的任何内

容,仅在函数fun()的花括号中填入所编写的若干语句。试题程序:

宫tncludrVydict

<iouMefun<mlnt)

wid)

(eirtmi

double||

FILEeotfti

prmifCaln|>ui*>i

•%/■・&!!1)•

(*■

prmd('F,%f\iTi

out-fop«fi<*<Mitfde,

KhiaVlOw♦)

fpnnif(<RiK»*Kf\n*«fun(m>>i

(ck>*e(out)«

29.使用VC++2010打开考生文件夹下progl中的解决方案。此解决方案

的项目中包含一个源程序文件progl.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("Enter

scanf("%d”,&n);

fun(s,n);

printf("Thestringafterdeleted:\n^^);

puts(s);

)

30.

请编写函数proc(),它的功能是计算下列级数和,和值由函数值返回。

sum=l-x+x2/2!-x3/31+...+(-l*x)n/n!例如,当n=23,x=0.3时,

函数值为0.740818。注意:部分源程序给出如下。请勿改动main。

函数和其他函数中的任何内容,仅在函数proc()的花括号中填人所编

写的若干语句。试题程序:

*include<Mdbhb>

<includr<conio.h>

力iftducW<.&d>db>

#includeh>

doubkpeoc(doublex.101a)

voidmaifi<)

(

»y*tcni(*CLS*)(

pnnKf<*Kfa«proc<0.

四、2.程序修改题(10题)

31.下列给定程序中,函数fun()的功能是:依次取出字符串中所有的字

母,形成新的字符串,并取代原字符串。

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

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

试题程序:

#include<stdio.h>

#include<conio.h>

voidfun(char*S)

(

inti,j;

for(i=0,j=0;s[i]!='\0';i++)

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

if((s[i]>='A'&&s[i]<='Z')&&(s[i]>='a'&&S[i]<='z',))

s[j++]=s[i];

/*********,

S用="\0”;

main()

(

charitem[80];

clrscr();

printf("\nEnterastring:");

gets(item);

printf("\n\nThestringis:\%S\n",item);

fun(item);

printf("\n\nThestringofchanging

is:\%S\n",item);

)

32.给定程序M0D11.C中函数fun的功能是:将s所指字符串的正序

和反序进行连接,形成一个新串放在t所指的数组中。

例如,当s所指字符串为:“ABCD”时,则t所指字符串中的内容应为:

“ABCDDCBA”。

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

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

1•tinclude<stdio.h>

*

2Itinclude<string.h>

3i/*♦*♦♦*♦*♦*♦♦found************/

4voidfun(chars,chart)

5(

6inti,d;

7d-strlen(s);

8for(i=0;i<d;[♦+)t[i]«s[i];

9for(i■0;i<d;i++)t[d>i]»

s[d-l-i];

10/♦♦♦*********found*******♦♦***/

11t[2*d-l]-t\0,;

12

13main()

14

15chars[100]9t(100);

16printf(H\nPleaseenterstringS:R);

w

scanf("%s#s);

17fun(s,t);

w

18printf(\nTheresultis:%s\n"rt);

19

33.下列给定程序中,函数fun。的功能是:求整数x的y次方的低3位

值。例如,整数5的6次方为15625,此值的低3位值为6250

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

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

试题程序:

#include<stdio.h>

longfun(intx,inty,long*p)

{inti;

longt=l;

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

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

t=t*x;

*p=t;

t=t/1000;

returnt;

main()

{longt,r;intx,y;

printf("\nlnputxandy:");scanf

("%ld%ld",&x,&y);

t=fun(x,y,&r);

printf("\n\nx=%d,y=%d,r=%ld,last=

%ld\n\n",x,y,r,t);

34.下列给定程序中,函数fun()的功能是:从s所指字符串中,找出t

所指字符串的个数作为函数值返回。例如,当s所指字符串中的内容为

abcdabfab,t所指字符串的内容为ab,则函数返回整数3。

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

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

试题程序:

#include<conio.h>

#include<stdio.h>

#include<string.h>

intfun(char*s,char*t)

{intn;char*p,*r;

n=0;

while(*s)

{P=s;

r=t;

while(*r)

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

if(*r==*p){r++;p++)

elsebreak;

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

if(r=='\O')

n++;

s++;

)

returnn;

)

main()

{chars[100],t[100];intm;

clrscr();

printf("\nPleaseenterstrings:");

scanf("%s",s);

printf("\nPleaseentersubstringt:");

scanf("%s",t);

m=fun(s,t);

printf("\nTheresultis:m=%d\n",m);

35.下列给定程序中,函数fun()的功能是:将长整型数中每一位上为偶

数的数依次取出,构成一个新数放在冲。高位仍在高位,低位仍在低位。

例如,当s中的数为87653142时,t中的数为8642。

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

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

试题程序:

#include<conio.h>

#include<stdio.h>

voidfun(longs,long*t)

{intd;

longsl=l;

*t=0;

while(s>0)

{d=s%10;

if(d%2=0)

{*t=d*sl+*t;

sl*=10

}................................................................

s\=10;

)

}

main()

{longs,t;

clrscr();

printf("\nPleaseenters:");scanf

("%ld",&s);

fun(s,&t);

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

}

36.下列给定程序中,函数fun()的功能是:计算s所指字符串中含有t

所指字符串的数目,并作为函数值返回。

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

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

试题程序:

#include<conio.h>

#include<string.h>

#include<stdio.h>

#defineN80

intfun(char*s,char*t)

{intn;

char*p,*r;

n=0;

while(*s)

{P=s;

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

r=p;

while(*r)

if{*r==*p){r++;p++;)

elsebreak;

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

if(*r==O)

n++;

s++;

)

returnn;

)

main()

{chara[N],b[N];intm;

clrscr();

printf("\nPleaseenterstringa:");

gets(a);

printf("\nPleaseentersubstringb:");

gets(b);

m=fun{a,b);

printf("\nTheresultis:m=%d\n",m);

37.给定程序M0D11.C中函数fun的功能是:在字符串的最前端加入

n个*号,形成新串,并且覆盖原串。

注意:字符串的长度最长允许为79o

请改正函数fun中指定部位的错误,使它能得出正确的结果。

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

1tinclude<stdio.h>

2linclude<string.h>

3voidfun(chars[],intn)

4(

5chara[80],*p;

6inti;

7/……•…found♦………•/

8s-p;

9for(i-0;i<n;i++)a[i]-1*1;

10do

11{a[i)«wp;

12i++;

13)

14/……•…found

15while(«p++)

16a(i]-0;

17strcpy(s,a);

18)

19main()

20{intn;chars[80];

21printf(M\nEnterastring:

gets(s);

22printf(H\nThestring;

23printf(w\nEntern(numberof*):

ww

");scanf(%dr&n);

24fun(s,n);

25printf(w\nThestringafterinsert:

\n%s\w\nw,s);

26

38.数列中,第一项为3,后一项都比前一项的值增5。下列给定程序中,

函数fun()的功能是:计算前n(4SE50)项的累计和。在累加过程中把那

些被4除后余2的当前累加值放入数组中,符合此条件的累加值的个数

作为函数值返回主函数里。如,当n的值为20时,该数列为3,8,13,

18,23,28,93,98O符合此条件的累加值应为42,126,366,

570,1010o

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

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

试题程序:

#include<stdio.h>

#defineN20

intfun(ihtn,int*a)

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

{inti,j,k,sum;

sum=0;

for(k=3,i=0;i<n;i++,k+=5)

{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<d;i++)printf("%6d",a[i]);

printf("\n\n");

39.已知一个数列从。项开始的前3项:0,0,1,以后的各项都是其相

邻的前3项之和。下列给定的程序中,函数fun()的功能是:计算并输出

该数列前。项的平方根之和sum。n的值通过形参传入。例如,当n=10

时,程序的输出结果应为23.197745o

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

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

试题程序:

#include<conio.h>

#include<stdio.h>

#include<math.h>

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

fun(intn)

{doublesum,sO,si,s2,s;intk;

sum=1.0;

if(n<=2)sum=0.0;

s0=0.0;sl=0.0;s2=1.0;

for(k=4;k<=n;k++)

{s=s0+sl+s2;

sum+=sqrt(s);

sO=sl;sl=s2;s2=s;

/****************^Qund*****************I

returnsum

main()

{intn;

clrscr();

printf("InputN=");

scanf("%d",&n);

printf("%An",fun(n));

40.给定程序M0D11.C中函数fun的功能是:求出以下分数序列的前

n项之和。和值通过函数值返回到main函数。

23581321

T2*395*G,IT

例如,若n=5,则应输出:8.391667O

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

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

Iinclude<stdio.h>

2/♦♦♦♦♦♦♦♦♦*wwfound****w****w**/

3voidfun(intn)

4{inta,b,c,k;doubles;

5s,0.0;a»2;bw1;

6for(k-1;k<«n;k++)(

7/♦♦♦****w****found**w*♦♦♦♦**♦♦/

8s-s*(Double)a/b;

9c»a;a»afb;b«c;

10)

11returns;

12)

13main()

14(intn«5;

15printf(w\nThevalueoffunction

w

is:%lf\nrfun(n));

16

五、程序改错题(2题)

41.

下列给定程序中函数fun()的功能是:求出如下分数序列的前n项之

和,结果通过函数值返回。

235AIS21

T•亍

例如,若n=5,则应输出8.391667。请改正程序中的错误,使其得出

正确的结果。注意:不要改动main()函数,不得增行或删行,也不

得更改程序的结构!试题程序:

力lltrlude•二ntdliii.h

Uinclude<coiw(xh>

9mcludcVvubo.h>

//•♦♦♦found♦•••

fun(iatn)

mtbmI*c・ki

doubleH*0.Oi

(or<k*♦)

//•••♦kxind••••

•■・+<DtMiblt></b|

c**aia-.♦bib-j

m«irfi<•)।

向dmain()

mt!!■$.

>y»tcm(*CLS")।

printf(*\nTbeslueoffunewa由%八Z.hm

(n))«

42.下列给定程序中,函数proc()的功能是:在字符串str中找出ASCII

码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向

后顺序移动。例如,调用proc()函数之前给字符串输入DcybkdGT,调

用后字符串中的内容为yDcbkdOTo

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

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

构。

试题程序:

#include<stdio.h>

//••••found•••

voidproc(chart)

charmax,,qiinti=0;

max=tfiji

while=0)

if(max<t[i]>

//*♦•»found••

t-q+ijmax-t[i]i

i++$

)

while(q>t>

q------I

)

tLOj^maxi

voidmain()

charstr[80]i

printf("Enterastring:H)igetH(»(r)i

printfC"\nTheortginalstring:")।

puts(str)i

pro€(sir)<

prinif("\nThesiringaftermoving:**)।

puts(Mr)iprinif<*\n\n**>j

六、操作题(2题)

43.请编一个函数voidproc(intttEM][N],intpp[N]),tt指向一个M行

N列的二维数组,求出二维数组每行中最大元素,并依次放入pp所指

的一维数组中。二维数组中的数已在主函数中给出。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括

号中填入所编写的若干语句。

试题程序:

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#defineM3

#defineN4

voidproc(intttrM3rN]。intpp[N])

(

)

voidmain

(

intstr[M][N]={{34,56,84,78},

{23,84,93,12),

{28,38,39,93}};

intp[N],i,j,k;

system("CLS");

printf("Theriginaldatais:\n");

for(i=0;i<M;i++)

(

for(j=O;j<N;j++)

printf("%6d",str[i][j]);

printf("\n");

)

proc(str,p);

printf("\nTheresultis:\n");for(k=0:k<M;k++)

printf("%4d",p[k]);

printf("n");}

44.以下程序的运行结果是【】。

#include<stdio.h>

longfib(intg)

{switch(g)

{case0:return0;

case1:

case2:return1;}

return(fib(g-l)+fib(g-2));}

main()

{longk;

k=fib(5);

printf("k=%51d\n",k);)

参考答案

I.nl=%d\nn2=%dnl=%d\\nn2=%d解析:根据输出结果,可以确定“格式

控制”为nl=%d\\nn2=%d,其中,“nl=”和“n2=”是按原样输出的字符,

“%d”是按十进制整数输出,“\\n"是转义字符,用于输出回车换行。

2.(structlist*)(structlist*)retum(h)

3.栈栈解析:栈和队列都是一种特殊的操作受限的线性表,只允许在端

点处进行插入和删除。二者的区别是:栈只允许在表的一端进行插入或

删除操作,是一种“先进后出”的线性表;而队列只允许在表的一端进行

插入操作,在另一端进行删除操作,是一种“先进先出”的线性表。

4.2525解析:本题考查带参数的宏的定义及相关运算。运算过程为:

t=POW(x+y)=(2+3)*(2+3)=25。

5.fopenfopen解析:C语言中的文件分为:ASCII文件与二进制文件。

文件在使用前打开,使用后要关闭。

打开文件的函数为:fopen(),调用形式为:fP=fopen("文件名",”使用文

件方式”);

关闭文件的函数为:foloseQ,调用形式为:foclose(fp);其中fp为文件

指针。

6.a[0][i]b[i][o]a[0][i]\r\nb[i][o]解析:b皿N-l]=a⑼国实现把a所指二维

数组中的第0行放至Ub所指二维数组的最后一列中,b[i][0]=a[N-l][i]

实现将a所指N行N列的二维数组中的最后一行放到b所指二维数组

的第0列中。

7.ACEACE解析:在本题中,for循环体每执行完一次,变量i的值自

加两次。i的初值为“a”,执行一次循环后变为“c",之后再变成“e”,当

其变为“g”时,循环条件若不满足,循环终止,故本题共输出3个字符。

表达式上旬+囚”即表示输出i对应的大写字母,结果为ACEO

8.线性结构线性结构解析数据的逻辑结构是指数据元素之间的逻辑关

系,分为线性结构和非线性结构。常见的线性结构有线性表、栈和队列

等,常见的非线性结构有树、二叉树等。

9.整型整型解析:上面的表达式中,通过强制类型转换把最后参与运算

的数据都转换成了int型,所以最后得到的结果也是int类型。

10.0&a[i]a[i]0\r\n&a[i]\r\na[i]解析:本题要求从终端读入数据到数组中,

统计其中正数的个数,并计算它们的和。程序中首先要对存放正数个数

的变量count及存放和值的变量sum初始化为0,所以第一空应填0。

接着要求从终端读入数据到数组中,可以通过scanf函数实现,因此第

二空应填&a[i]。最后通过sum+=a[i];语句累加正数a[i]的值到sum中,

因此第三空应填a用。

11.A

12.C

13.B

本题考查分支语句用法加个句号因为变量的初始值分别为k—5、n一

0,所以程序第1次进入循环时,执行default语句,输出0,k减1;

这时n=0、k=4,程序进行第2次循环,执行case4:这个分支,结果

是n=2、k=3,打印出2;这时n=2、k=3,break跳出,程序进行第3

次循环,执行case3:这个分支,结果是n=3、k=2,打印出3;这时n

一3、k2,b"ak跳出,程序然后进行第4次循环,执行case2:case

4:这个分支,结果是n=5、k=l,打印出5,break跳出,这时因为

n=5不满足n<5的循环条件,因此循环结束。

14.C

15.B

16.Cf函数的功能是对形参a的各个成员用结构体变量b的各个成员进

行赋值后,然后返回变量a。

17.B

18.D

19.A

当所赋的值不够其列的宽度时,系统在其后自动补0,因此

a[0][3]=0,a[l][2]=6,a[2][l]=5,a[3][0]=0,故选择A选项。

20.B

在C语言中%d表示输出整型数值,所以答案为B。

21.

【解析】要将大于整数m且紧靠m的k个素数存入所指的数组中,首

先应该判断大于整数m且紧靠m的整数是否为素数。将紧靠m且为素

数的k个整数放入数组xx中。

22.

【解析】根据题目中要求删除字符串中所有的*号,需要检查字符串中

的每一个字符,将不是*号的字符放入原来的字符串中,形成新的字符

串,最后在新的字符串的末尾加上结束符。

23.

【考点分析】

本题考查:如何判断非素数;循环判断结构;数组的引用。

【解题思路】

题目要求将1—m之问的非素数存人数组中,应使用循环判断结构。循

环语句用来遍历1一m之间的每个数,判断语句用来判断该数是否为

素数,若不是素数,则将其存人数组中。这道题目是考查一个数是否

为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解

决。

【解题宝典】

判定一个数是否为素数,即该数除了能被1和它本身外,不能被任何

数整除。

代码实现为:

for(j=2;j<i;j++)if(i%j==O)/*如余数为0,证明i不是素数•/

此语句需要熟记,很多判断素数的题目也可通过此法解决。

24.voidproc(char*str)

\n(

\nchar*p=str;

\nwhile(*p==*)p++;//通过p的移动来达到使p指向第一"不是*

号的字符

\nfor(;*p!=\0;p++,str++)//把从第一个不是*号的字符放到a中

\n*str=*P:

\n*str=\0;//最后用\0作为字符串结束标志

\n}

\n【解析】题目中要求将字符串中的前导*号全部删除,首先将指针P移

动到第一个不是*的字符,将指针P之后的字符放入原来的字符串中,

并为新的字符串添加结束符。

\n

25.\n\tvoidproc(chararr[M][N],char*b)

\n(

\ninti,j,k=0;

\nfor(i=0;i<M;i++)//i表示其行下标

\nfor(j=0;.rr[i][j]!=\0;j++)//由于每行的个数不等,因此用

a[i][j]!=\0来作为循环结束的条件

\nb[k++]=arr[il[j];//把二维数组中的元素茄到b的一维数组中,

\nb[k]=\O;//最后把b赋'。作为字符串结束的标志

\n}

\n【解析】字符串数组中每一行都是一个一个完整的字符串,其结束

标志为\0。因此,通过字符串的结束标志来判断每一个字符串是否

结束,将字符串数组中的所有字符串均赋值新的一维数组b来完成字

符串的合并。\n

26.intfun(inta[],intn)

(

inti,j=l;

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

if(a|j-l]!=a[i])

/*若该元素与前一个元素不相同,则保留*/

a[j++]=a[i];

returnj;/*返回不相同元素的个数*/

)

该程序的流程:定义变量i和J,其中j用于控制删除后剩下的元素在数

组中的下标,i用于搜索原数组中的元素。j始终是新数组中最后一个元

素的下一个元素的下标。所以if语句中的条件是其中a[j-

1]是新数组中的最后一个元素,若条件成立,则表示出现了不同的值,

所以a[i]要保留到新数组中。注意本题中i和j的初值都要从1开始,该

算法只能用于数组已排序的题目中。

27.[答案]

voidftm(char*str)

(inti=0;

char*p=fstr;

whi砥*遍历字符串*/

(

/*如果当前元素不为空格*/

玳*p!:,•)•・

I

/*将当前元素保存到str中*/

sti(i}=*p;

.收.

)

P++;

)

s用户”/字符串最后加上结束标记符腐力

)

[解析]

题目要求删除空格,也就是重新保存空格以外的其他字符。通过循环删

除字符串中的每一个空格,将非空格字符进行重新保存。

28.

【解析】该程序的功能是计算并输出多项式的值。该题的解题思路是根

据题干中给出的数列,首先推出每一项的表达式,然后再对多项式进行

累加求和。

根据题干中给出的数列,推出每一项是阶乘的倒数,所以首先在循环中

求得每一项的阶乘。其中阶乘的计算公式

定义为:

m!=m*(m=l)*(m=2)*...*l(m>l)

m!=l(m=l)

公式分为参数m是1和大于1的两种情况,例如.1的阶乘1!=1;5的

阶乘5!=5*4*3*2*1O

然后求得阶乘分之一的累加和。

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=""x/t+n+l)<>

/*把字符保存到数组a中*/

{a[i]=*p;

i++;p++;

a[i]='\O';

}

}

字符串中尾部*号不能多于n个,多余的要删除。首先需要通过while循

环统计字符串尾部*号,然后通过if条件语句完成尾部*号数和n的比

较,若尾部*号数多于n个,则需要把n个*号和其余字符重新保存。

30.

【解析】首先定义两个变量分别用来存储级数的和与每一项的分母。观

察级数的特点,其每一项的正负号是交替变化的。根据这些特点,每增

加一项都需要变换符号。最后求出级数的和。

31.⑴错误:if(s[i]>='A'&&s[i

温馨提示

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

评论

0/150

提交评论