700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > strel函数c语言写法 全国计算机等级考试二级C语言题型总结(二)——选择循环结构程序

strel函数c语言写法 全国计算机等级考试二级C语言题型总结(二)——选择循环结构程序

时间:2019-01-30 17:46:15

相关推荐

strel函数c语言写法 全国计算机等级考试二级C语言题型总结(二)——选择循环结构程序

}

答案:*(s+j) i+1 i 11.9 以下程序的输出结果是_____。

funa(int a,int b)

{ return a+b; }

funb(int a,int b)

{ return a-b; }

sub(int (*t)(),int x,int y)

{ return (*t)(x,y); }

main()

{ int x,(*p)(int ,int); p=funa; x=sub(p,9,3); x+=sub(funb,8,3); printf("%d

",x);

}

答案:17

11.10 以下程序中的trap函数是一个用梯形法求定积分的通用函数,梯形法求定积分s的公式为:

n-1

x=((f(a)+f(b))/2+∑ f(a+i*h)*h,

h=│(a-b)/n│

i=1

其中,n为积分小区间数,以下程序调用trap函数求积分,被积函数是:

f(x)=x*x+3*x+2,且 n=1000,a=0,b=4。

#include "math.h"

double trap(double _____,double a,double b)

{

double t,h;

int i,n=1000; t=0.5*((*fun)(a)+(*fun)(b)); h=fabs(a-b)/(double)(n); for(i=1; i<=n-1; i++) t=t+_____; t=t*h; return (t);

}

double mypoly(double x)

{

return (x*x+3.0*x+2.0);

}

main()

{

double y,(*pf)(double); pf=_____; y=trap(pf,0.0,4.0); printf("%f

",y);

} 答案:(*fun)(double) (*fun)(a+i*h) mypoly

三、 编程题

11.11 【分析与解答】

(1) 无论命令行的内容是什么,总是要求程序需要输出字符串中的一部分连续的字符,因此可将这一部分的功能放在output函数中完成。函数的首部如下:

output(char *s, int b,int e)

其中,s指向字符串,b为从s中开始输出的字符的下标,e为结束输出的字符的下标。只要确定了开始输出的字符的下标和结束输出的字符的下标,在一个for循环中就可以完成输出。请自己完成此函数体。

(2) 在主函数中读入一行字符串放在s数组中,求出s串的长度放在len变量中。另外用变量n存放要输出的字符的个数。

(3) 主函数的首部写成:

main( int a, char *[KG-*3]c[])

其中的第一个参数a将存入命令行中的字符串的个数,当命令行中没有其他参数时,a的值为1;因此按题目要求,此时输出字符的个数n应等于10。

(4) 主函数中的第二个参数是一个指向字符串的指针数组。当命令行为:

outch -2

这时,c[0]中存放了字符串outch的首地址,c[1]中存放了字符串-2的首地址。存储单元*[KG-*3]c[1](即*(c[1]+0)或c[1][0])中是字符-;存储单元*(c[1]+1)(或c[1][1])中是字符2。同理,当命令行为:

outch +6

这时,c[1]中存放了字符串+6的首地址。存储单元*[KG-*3]c[1](即*(c[1]+0))中是字符+;存储单元*(c[1]+1)中是字符6。

(5) 根据以上分析,可用以下语句来得到待输出的字符个数放在n中:

if( a>1 ) n=*(c[1]+1)-′0′;

else n=10;

(6) 按题目规定,如果a的值为1或者*[KG-*3]c[1]中的字符是′-′号时,输出s字符串的最后若干字符,这时调用output函数,把s数组的地址传给形参指针s,把开始输出的元素的下标len-n传给形参b,把最后一个输出的元素下标len-1传给形参e。可用以下语句来实现:

if(a==1 || *[KG-*3]c[1]==′-′)output(s,len-n,len-1);

(7) 如果*[KG-*3]c[1]中的字符是′+′号时,将从字符串s的最前面开始输出,除了把s数组的地址传给output函数的形参指针s外,把开始输出的元素的下标0传给形参b,把最后一个输出的元素下标n-1传给形参e。

if(*[KG-*3]c[1]==′+′)output(s,1,n-1);

(8) 总结:读者按以上所述写出相应的代码,存入OUTCH.C文件。在Turbo C 的环境下进行编译调试、运行,生成一个OUTCH.EXE文件。最后退出Turbo C,在OUTCH.EXE文件所在目录下,打入如题所示的命令行,在程序运行时输入一字符串,观察运行结果是否正确,如果不正确,则需回到Turbo C中进行修改。

11.12 【分析与解答】

习题9.32已经给出了把一个整数转换为二进制数的算法,这是一个把十进制整数不断被2除的过程,每次被2除的余数即是一个二进制位上的数(1或0)。转换的方法是一样的,只是每次转换的数被2除,这可用递归来完成,递归函数的部分内容可表示如下:

outbinary( int a )

计算机等级《二级C语言程序设计》预测试卷

(一)

一、单项选择题(共40题,合计40分) 1以下能正确定义一维数组的选项是(

)。 A.int a[5]={0.1,2.3.4,5); B.char a口={0,1,2,3,4,5); C.char a={'A’,'B','C'); D.int a[5]=”0123”; [正确答案]B

试题解析: 数组下标从0开始,A选项中所赋值的个数超过了数组的长度;c选项中定义a为字符型变量,而不是数组,赋值错误;D选项中,整型数组不能赋字符串。

2视图设计一般有3种设计次序,下列不属于视图设计次序的是( )。 A.自顶而下 B.由内向外 C.由外向内 D.自底向上 [正确答案]C

试题解析: 视图设计的设计次序分3种:自顶向下、自底向上和由内向外。它们为视图设计提供了具体的操作方法,设计者可根据实际情况灵活掌握。

3链表不具有的特点是(

)。 A.不必事先估计存储空间 B.町随机访问任意元素

C.插入、删除不需要移动元素 D.所需空间与线性表长度成正比 [正确答案]B

试题解析: 链表采用的是链式存储结构,它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,插入、删除不需要移动数据元素。但是链式存储结构也有不足之处:每个结点中的指针域需额外占用存储空间,它是一种非随机存储结构。

4有以下程序: main() { int x,i;

for(i=l;i<=50;i++) {x=i; if(x%2=0) if(x%3=0) if(x%7=0) printf(”%d,i)”; } } 输出结果是( )。 A.28 B.27 C.42 D.41 [正确答案]C

试题解析: 只有当3个if条件同时成立,即能够同时被

2、

3、7整除时,才输出i的值,而从0到50能够同时被

2、

3、7整除的数只有42,故选择C选项。

5若已定义:int a口一(0,1,2,3,4,5,6,7,8,9),*p=a,i;其中0≤i≤9,则对a数组元素的引用不正确的是(

)。 A.a[p-a] B.*(&a[i]) C.p[i] D.*(*(a十i)) [正确答案]D

试题解析: A:P开始是数组a首地址,只要p++则再减去a的首地址aEp—a]就能取到所有元素,B:&a[i]循环取其地址,*(&a[i])是该地址中所存储的元素C:p就是指针变量,相当于a[i],D:*(a+i)则正确。

6设有下列程序段: char str[]="HelloWorld": char*ptr; ptr=str ; 执行上面的程序段后,*(ptr+10)的值为( )。 A.'\O' B.'0' C.不确定的值 D.'0'的地址 [正确答案]A

试题解析: 本题主要考查字符数组和指针,在c语言中,字符型数组在存放字符串时会自动在末尾加上'\0',所以数组str有ll个元素;ptr指向数组str的首地址,ptr+10是指向str[10],*(ptr+10)是引用strEl0]的值。

7下列4个关于C语言的结论中错误的是(

)。

A.可以用do while语句实现的循环一定可以用while语句实现 B.可以用for语句实现的循环一定可以用while语句实现 C.可以用while语句实现的循环一定可以用for语句实现

D.do-while语句与while语句的区别仅是关键字“while”出现的位置不同 [正确答案]D

试题解析: 本题考查对各个循环语句的理解。①do—while语句、for语句、while语句所实现的循环可以相互替代;②d0—while语句至少执行一次,而while是符合条件执行,不符合不执行。

8有以下程序: #includemain(

)

{char s[]="012xy\O8s34f4w2‘; int i;n=0; , for(i=0;s[i]!=0;i++) if(s[i]>='0'&&s[i]<='9')n++; printf("%d\n",n); } 程序运行后的输出结果是(

)。 A. 0 B. 3 C. 7 D. 8 [正确答案]B

试题解析: 考查简单的C程序数组和循环。for循环是指i=0,如果s/[3]!=0,则i自动加1。if循环指的是s[i]中的元素大于等于0且小于等于9,则n加l,所以答案为B。

9若有以下说明,则(

)不是对strcpy库函数正确的调用。 strcpy库函数用于复制一个字符串:char*str1==”abed”, strZ[10],*str3="hijklmn",*str4[-2],*str5=”aaaa”; A.strcpy(str2,str1) B.strcpy(str3,slrl) C.strcpy(str1,str2)

D.strcpy(str5,strl) [正确答案]C

试题解析: strcpy(sl,s2)函数的功能是将字符串s2复制到字符串sl中。要保证sl存储区能容纳下s2字符串。

10数据库系统的核心是(

)。 A.数据模型

B.数据库管理系统 C.数据库

D.数据库管理员 [正确答案]B

试题解析: 本题考查对数据库系统的理解。数据库系统由数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、硬件平台(硬件)、软件平台5个部分构成。其中数据库管理系统是数据库系统的核心,它负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等工作。

11有下列函数定义: fun(float h) { printf(”%f,%f\n”,h,h*h);) 该函数的类型是(

)。 A.int类型 B.float类型 C.void类型

D.函数无类型说明,定义有错 [正确答案]A

试题解析: 本题考查函数值的类型,在函数定义时,由于函数没有说明其类型,系统默认一律自动按整型(int)处理。

12有以下程序 #include struct tt {int x;struct tt*y;)*P;

struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a); main() { int i;

P—a: .

for(i=1;i<=2;i++)(printf(”%d,”,p->x);P =P->y:} ) 程序的运行结果是(

)。 A.20,30, B.30,17, C.15,30, D.20,15, [正确答案]D

试题解析: 程序的结构体数组a的元素形成了一个单向的循环链表,每个元素的指针成员都指向下一个元素的地址。

13 有以下程序: main() { union {char ch[2]; im d;

d一0x4321;

printf(”%x,%x\n”,s.ch[O],s.ch[1]); )S;

在16位编译系统上,程序执行后的输出结果是(

)。 A.21,43 B.43,21 C.43,00 D.21,00 [正确答案]A

试题解析: s是一个公用体,d的值分别与ch中的两个元素的值相同,d的高位放在eh[1]中、低位放在ch[O]中,因此输出的结果为21,43。

14有以下程序: main() {int a=0,b=0;

a=10; /*给a赋值 b=20; 给b赋值 */ printf(”a+b=%d\n”,a+b);//输出计算机结果 ) 程序运行后的输出结果是(

)。

A.a+b=10 B.a+b=30 C.30 D.出错 [正确答案]A

试题解析: 本题中/*……*/为多行注释,所以可知b=20为注释语句,在程序运行时不起作用,b仍为0,所以本题中选项A正确。

15若有定义:“int a[2][3];”,则对a数组的第i行第j列元素的正确引用为(

)。 A.*(*(a+i)+j) B.(a+i)[j] C.*(a+j+j) D.*(a+i)+j [正确答案]A

试题解析: 通过地址来引用数组元素的方法有下列5种:①a[i][j];②*(a[i]+J);③*(*(a+i)+j);④*(aEiJEj]);⑤(&a[o]EoJ+3*i十j)。故A正确。

16以下程序的输出结果是(

)。 main() {int i,a[4][4]={{1,3,5},{2,4,6},{3,5,7}}; printf(”%d%d%d%d\n”,a[0][3],a[1][2], a[2][1],a[3][0]; } A.0650 B.1470 C.5430 D.输出值不定 [正确答案]A

试题解析: 当所赋的值不够其列的宽度时,系统在其后自动补0,因此a[o][3]=0,a[-1][2]=6,a[2][1]=5,a[3][o]=0,故选择A选项。

17软件生命周期中,花费最多的阶段是(

)。 A.详细设计 B.软件编码 C.软件测试

D.软件维护 [正确答案]D

试题解析: 本题考查对软件生命周期的理解,软件生命周期整体上可分为定义阶段、开发阶段和维护阶段。其中定义阶段包括可行性研究与计划制订和需求分析;开发阶段包括概要设计、详细设计、开发和测试;维护阶段是一个单独阶段,不包含在开发阶段内,它是所花费用最多的一个阶段。

18语句“printf(”a\bre”\'hi\’y\\\bou\n”);”的输出结果是( )。 A.a\bre\'hi\'y'\\\bou B.a\bre\'hi\\y\bou C.re'hi'you D.abre'hi'y\bou [正确答案]C

试题解析: 先输出a、b表示退一格,当执行到:\b后,1光标往后退,接着输出re’hi’y\(反斜杠后又加一个反斜杠的意思是要输出一个反斜杠),此时又执行:\b后,\就被OU 覆盖。

19有以下程序 #includevoid fun(int x) {if(x/Z>1)fun(x/Z); printf("%d",x); } main() {fun(7);printf("\n");} 程序运行后的输出结果是( )。 A. 1 3 7 B. 7 3 1 C. 7 3 D. 3 7 [正确答案]D

试题解析: 本程序主要考查递归函数。fun(7),首先将参数代入函数,因为(7/2)>1,所以执行f(3),依此类推直到f(1.5),(1.5/2)<1,所以执行打印函数,此时X值为3,然后退出f(1.5),返回f(3),打印x值即7。所以选D。

20下列运算符中优先级最低的算符是(

)。 A.|| B.! = C.

[正确答案]A

试题解析: C语言中规定运算符的优先顺序:一元算术运算符一>二元算术运算符一>关系运算符一>逻辑运算符一>赋值运算符,A项中为逻辑运算符,B项和C项都为关系运算符,D项为一元运算符。因此最低的是A项。

21软件生命周期可分为定义阶段、开发阶段和维护阶段。详细设计属于(

)。 A. 定义阶段 B. 开发阶段 C. 维护阶段 D. 上述三个阶段 [正确答案]B

试题解析: 开发阶段在开发初期分为需求分析、总体设计、详细设计3个阶段,在开发后期分为编码、测试两个子阶段。

22有以下程序 #includemain(

) {char cl,c2;

c1='A'+'8'-'4' c2='A'+'8'-'5'; printf("%C,%d\n",cl,c2); } 已知字母A的ASCIl码为65,程序运行后的输出结果是(

)。 A. E,69 B. D,69 C. E,D D. 输出无定值 [正确答案]A

试题解析: 本值输出两个值,%c为输出一个字母,0/4d输出一个数字。“A”的ASCIl码为65,再加 4之后为69,也就是字母E,所以本题A正确。

23设有以下语句: int a=1,b=2,c; c=a^(b<<2);

执行后,c的值为( )。 A.6 B.7 C.8 D.9 [正确答案]D

试题解析: 本题考查两个知识点,按位异或左移把b左移2位化成二进制c=a^(b<<2)=a^(oooolo<<2)=a^o01000=0000001^001000=9,故选择D。

24设有二元关系R和三元关系s,下列运算合法的是(

)。 A.Rn S B.RU S C.R-S D.R×S [正确答案]D

试题解析: 本题给出的两个关系R与s的表结构是不同的(R是二元关系,S是三元关系),它们不能进行“n、 U、一”运算,却可以进行笛卡儿积(×)运算。

25结构化程序设计的3种结构是(

)。 A.顺序结构、选择结构、转移结构 B.分支结构、等价结构、循环结构 C.多分支结构、赋值结构、等价结构 D.顺序结构、选择结构、循环结构 [正确答案]D

试题解析: 结构化程序设计的基本要点:①采用自顶向下、逐步求精的程序设计方法;②任何程序都可由顺序、选择和循环三种基本控制结构构造。

26下面for语句的循环次数为(

)。 for(x=1,y=0;(Y!=19)&&(x<6);x++); A.是无限循环 B.循环次数不定 C.最多执行6次

D.最多执行5次 [正确答案]D

试题解析: 本题考查for循环的使用。根据条件考虑X的取值变化,X从1取到5,可以循环5次,但并不知道Y如何变化,有可能出现Y=l9提前跳出循环的情况,所以最多执行5次。

27下列叙述中正确的是(

)。

A. 可以用关系运算符比较字符串的大小

B. 空字符串不占用内存,其内存空间大小是0 C. 两个连续的单引号是合法的字符常量 D. 两个连续的双引号是合法的字符串常量 [正确答案]D

试题解析: 比较两个字符串大小用函数strcomp(S,t),空字符串有结束符,所以也要占用字节,两个双引号表示的是空字符串。

28以下程序的输出结果是(

)。 void fun(int*a,int i,int j) {int t; if(i

for(i=0;i<4;i++)printf(”%2d”,x[i]); printf(”\n”); ) A.1,2,6,8 B.8,6,2,1 C.8,l,6,2 D.8,6,1,2

试题解析: 本题用了函数调用,fun中if语句成立则进行i,j的交换,用到主函数中则为把下标为0、3,

1、2互换,因此,当执行完后x的数组为8,1,6,2,故选择C选项

29设有定义"double a[10],*s=a;",以下能够代表数组元素a[3]的是(

)。 A. (*s)[3] B. *(s+3) C. *s[3] D. *s+3 [正确答案]B

试题解析: 用带下标的指针变量引用一维数组元素若有以下定义和语句:“int*P,s[10],i;P=s}”,且o≤i<10,可以用&.s[i]、s+i和p+i三种表达式来表示s[i]的地址。同时可以用s[i]、*(s+i)和*(p+i)三种表达式来表示数组元素s[i]。

30下列选项中非法的字符常量是(

)。 A.'\t' B.'\039' C.',' D.'\n' [正确答案]B

试题解析: 水平制表符中,’\t'表示的是横向跳若干格;选项B中,’\039’错误,’\039’是八进制形式表的字符,最大数为7,但其中出现'9',’,’是字符逗号;选项D中,7\n’表示的是换行。

31有以下程序: main() { int x=102,y=012; printf(”%2d,%2d\n”,x,y); } 执行后输出结果是(

)。 A.10,01 B.02,12 C.102,10 D.02,10 [正确答案]C

试题解析: x的值为十进制数102,而Y的值为八进制数012,根据题意将Y用十进制表示为10%md,m为指定输出数据的宽度,若位数小于m则左端补以空格,若位数大于m则按实际输出,所以答案是C。

32相对于数据库系统,文件系统的主要缺陷有数据关联差、数据不一致性和( )。 A.可重用性差 B.安全性差 C.非持久性 D.冗余性 [正确答案]D

试题解析: 文件系统所管理的数据文件基本上是分散、相互独立的。相对于数据库系统,以此为基础的数据处理存在3个缺点:数据冗余大、数据的不一致性、程序与数据的依赖性强。

33有以下程序: #includemain(

) { FILE*fp;

int k,n,i,a[6]={1,2,3,4,5,6};

fp=fopen("d2.dat","w");

for(i=0;i<6;i++) fprintf(fp,"%d\n",a[i]); fclose(fp);

fp(i=0;i<3;i++) fscanf(fp,"%d%d",&k,&n);

fclose(fp);

printf("%d\n,%d\n,k,n); } 程序运行后的输出结果是(

)。 A. 1, 2 B. 3,4 C. 5,6 D. 123,456 [正确答案]C

试题解析: 此题是考查fprintf和fscanf,其中fprintf是向文件输出,文件为da2.dat文件,fscanf是向文件输入,所以根据程序循环写入和写出.可知答案为C。

34有以下程序段: int k,j,s;

for(k=2;k<6;k++,k++) { s=1;

for(j=k;j<6;j++)s+=j; ) print[(”%d\n”,s);

程序段的输出结果是(

)。

A.9 B.1 C.11 D.10 [正确答案]D

试题解析: 因为首先k一2,然后你进行一次循环后,k自增两次,变成4,所以这时候S又成l了。然后当k一4的时候,s=1,j=4,然后执行内层循环,s=1+4,然后j自增等于5,s=5+5,然后J再自增为6,跳出内层循环。k自增两次后等于6,不成立,跳出外层循环。然后输出s的值,即为10。因此正确选项为D。

35下列叙述中正确的是( )。

A.软件测试应该由程序开发者来完成 B.程序经调试后一般不需要测试 C.软件维护只包括对程序代码的维护 D.以上三种说法都不对 [正确答案]D

试题解析: 程序调试是由程序开发者完成诊断和改正程序中的错误的过程;软件测试是由专门的测试人员完成,是发现错误而执行程序的过程;软件维护是指软件系统交付使用以后,为了改正错误或满足新的需要而修改软件的过程,是软件生存周期中非常重要的一个阶段。

36若有定义:int X,*pb;则正确的赋值表达式是(

)。 A.pb=&X B.pb=X C.*pb=&x D.*pb=*x [正确答案]A

试题解析: *pb是指解除对*pb的引用(也可以认为是取pb所指向的地址的值),被解除引用的指针可以作为左值,&为取地址运算符,&X就是取指向变量X的指针。

37下列叙述中正确的是(

)。

A. 为了建立一个关系,首先要构造数据的逻辑关系

B. 表示关系的二维表中各元组的每一个分量还可以分成若干数据项 C. 一个关系的属性名表称为关系模式 D. 一个关系可以包括多个二维表 [正确答案]A

试题解析: 元组分量的原子性要求二维表中元组的分量是不可分割的基本数据项。关系的框架称为关系模式。一个称为关系的二维表必须同时满足关系的7个性质。

38设有以下语句

char chl,ch2; scanf("%c%C",&chl,&ch2);

若要为变量chl和ch2分别输入字符A和B,正确的输入形式应该是(

)。 A. A和B之间用逗号间隔

B. A和B之间不能有任何间隔符 C. A和B之间可以用回车间隔 D. A和B之间用空格间隔 [正确答案]B

试题解析: scanf输入函数中,格式控制J必须严格按照函数中的要求进行输入,在scanf("%c%c", &chl,&ch2)的格式控制语句中没有任何字符进行间隔,所以在输入时也不能使用任何字符进行间隔,所以答案选择B。

39设x=011050,则x=x&01252的值是(

)。 A.000000 1000 101000 B.1111110100011001 C.0000001 01 1 100010 D.1100000OOOl0 1 000 [正确答案]A

试题解析: 本题主要考查按位与运算,x—Oll050的二进制形式为O001001000010lo00,01252的二进制形式为0000001010101010,两者相与得0000001000101000。

40有下列程序: #include main() { int a=6,b=7,m=1; switch(a%2) { case 0:m++;break; case 1:m++; switch(b%2) {default:m++;

case 0:m++;break; ) ) printf(”%d\n”,m);

程序的运行结果是(

)。 A.3 B.2 C.4 D.1 [正确答案]B

试题解析: 本题考查switch语句及break的用法。第一个switch语句,因为a=6,a%2=0,所以执行“case0,m++;”,将m加-1,遇到break语句跳出switch语句,结束循环。不执行下面的switch。

二、填空题(共1题,合计18分) 41请补充main()函数,该函数的功能是:把一个字符串中的所有小写字母字符全部转换成大写字母字符,其他字符不变,结果保存在原来的字符串中。 例如,当str[M]=”abcdefl23ABCD”,结果输出:“ABC DEF123ABCD”。

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

请勿改动main()函数和其他函数中的任何内容,仅在横线上填入所编写的若干表达式或语句。

试题程序: #include #include #include #define M 80 void main() { intj;

char str[M]=" abcdefl23ABCD”; char *pf=str; system(”CLS”):

printf(”***original string *** \n”): puts(str); 【1】

while(*(pf+j)) { if(*(pf+j)>='a' &&*(pf+j)<='Z') { *(pf+j)=【2】 ; 【3】 ; ) else j++;

) printf(”****new string****\n”); puts(str);

system(”pause”);} [正确答案]【1】j=0【2】*(pf+j)-321311j++

试题解析: 由程序中可知,变量j为字符数组的下标,其初始值为0。因此,【l】处填“j=0”;大写字母的ASCIl码值比小写字母的小32,要将小写字母变为大写字母,因此,【2】处填“*(pftj)-32”;要将字符串数组中的所有小写字母变为大写字母,需要检查其中的每一个字符,因此,【3】处填“j++”。

三、改错题(共1题,合计24分) 42下列给定程序中,函数proe()的功能是:对M名学生的学习成绩,按从高到低的顺序找出前m(m<10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。

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

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

#include%stdlib.h> #include#include#include#include%malloe.h> #define M 10 typedef struct ss { char num[10]; int s; } STU;

STU *proc(STU a[],int m) { STU b[-M],*t; int i,j,k;

//****found**** *t=calloc(m,sizeof(STU)); for(i=0;ib[j].s)j=i;

//****found**** t[k].num=b[j].num; t[k].s=b[j].S; b[j].s=0; } return t: } void outresuh(STU a[],FILE *pf) f int i;

for(i=0;isystem(”CLS”);

printf(”****THE RESULT****\n”); outresuh(stu,stdout);

print{(”\nGive the number of the students who have better score:”); scanf(”%d”,&m); while(m>10) printf(”\nGive the number of the students who have better score:”); scanf(”%d”,&m); } p()rder=proc(stu,m);

printf(”****THE RESULT****\n”); printf(”The lop:\n”); for(i=0:i(1)错误:*t=ealloc(m,sizeof(STU));

正确:t=(structSS*)calloc(m,sizeof(STU));(2)错误:t[kJ.num=b[j].num; 正确:t[k]-h[j+;

试题解析: 因为t是指向一个动态存储空间,因此其是指针,而不是其中的内容,故把“*t=calloc(m,sizeof(STU))”改为“t=(structSS*)calloc(m,sizeof(STU));”,而题目要求把学生的全部内容互换,因此即整个结构体,故把“t[k]. num=bl;”改为“t[k]=;”。

四、编程与应用题(共1题,合计18分) 43学生的记录由学号和成绩组成,M名学生的数据已在主函数中放入结构体数组stu中,请编写函数proc(),其功能是:按分数的高低排列学生的记录,高分在前。 注意:部分源程序给出如下。

请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。 试题程序:

# include #define M 16 typedef s truct { char num[10]; inl S; ) STREC;

void proc(STREC a[]) int i,j; STREC t;

for(i=1;i{”GA002“,69},{¨GA004”,815}.{¨GA001”,91}, {"GA007”,72},{“GA008”,64),{"GA006”,87}, {¨GA015”,85},i”GAO13”,91},{”GA012”,64}, {"GA014”,91},{”GA011”,66},{¨GA017”,64}, {”GA018”,64},{¨GA016”,72}};

in/i;

proc(stu):

prinlf(”The data afwr sorted:\n”); for(i=0;iprintf(”%s%4d”,stu[i].num,stu[i].s); } printf(”\n”): } [正确答案]voidproc(STRECa[]){ inti,j; STRECt;

for(i=1;i试题解析: 要按分数的高低排列学生的记录,可以使用冒泡排序法。将每一个学生的成绩与其他学生的成绩相比较,对不符合要求的记录交换位置。

《全国计算机等级考试二级教程——C语言程序设计》

习题分析与详细解答

第一章

程序设计基本概念习题分析与解答

1.1

【参考答案】

EXE 1.2

【参考答案】

[1] .C [2] .OBJ [3] .EXE 1.3

【参考答案】

[1] 顺序结构

[2] 选择结构

[3] 循环结构

第二章

C程序设计的初步知识习题分析与解答

一、选择题

2.1

【参考答案】

B) 2.2

【参考答案】

D) 2.3

【参考答案】

B) 2.4

【参考答案】

A) 2.5

【参考答案】

C) 2.6

【参考答案】

A) 2.7

【参考答案】

B) 2.8

【参考答案】

B) 2.9

【参考答案】

D) 2.10 【参考答案】

C) 2.11 【参考答案】

B) 2.12 【参考答案】

B) 2.13 【参考答案】

A)

二、填空题

2.14

【参考答案】

[1] 11

[2] 12 2.15

【参考答案】

[1] 4.2

[2] 4.2 2.16

【参考答案】

[1] {

[2] }

[3] 定义

[4] 执行 2.17

【参考答案】

[1] 关键字

[2] 用户标识符

2.18

【参考答案】

[1] int

[2] float

[3] double 2.19

【参考答案】

float a1=1.0, a2=1.0; 或float a1=1, a2=1;(系统将自动把1转换为1.0) 2.20

【参考答案】

存储单元 2.21

【参考答案】

3.5 2.22

【参考答案】

[1] a*b/c

[2] a/c*b

[3] b/c*a 2.23

【参考答案】

把10赋给变量s 2.24

【参考答案】

[1] 位

[2] 1位二进制数据(0或1) 2.25 【参考答案】 [1] 8 [2]127 [3]01111111 [4]-128 [ 5 ] 10000000 2.26 【参考答案】 [1] 32767 [2] -32768 [3] 1000000000000000 2.27

【参考答案】

[1] 十

[2] 八

[3] 十六

三、上机改错题

2.28 【分析与解答】 第1行的错误:

(1) include是一个程序行,因此在此行的最后不应当有分号(;)。

1 第2行的错误:

(1) main()是主函数的起始行,不是语句,因此最后不应当有分号(;)。

(2) 在同一行上的/ * main function * / 显然是注释;C语言规定:注释由/*开头,由*/结束,但在*号和/之间不得插入任何空格,而在此处“/ *”和“* /”之间存在空格,因此,/ * main function * /的写法是错误的,而应写成:/* main function */。 第3行的错误:

(1) 在主函数的起始行main()的后面是函数体,函数体由左花括号({}开始。但在函数体的第一行:float的前面缺少了左花括号({}。

(2) 在同一行上的/* /*r is radius*/, /* s is area of circular*/ */ 显然是注释;C语言规定:注释由/*开头,由*/结束,并且开头的/*将去找最近的*/去配对,因此在/* /*r is radius*/中,第一个/*与radius后的那个*/配上了对,结果紧跟在后面的那个逗号(,)落在了注释的外面,而构成了一个多余符号,为此,在编译时将报告“语法错”。/* s is area of circular*/ */中第一个*/就结束了注释,第一个*/就成了多余的了。 第6行的错误:

(1) printf(″%f \n″,s)应当是一条输出语句,但在最后缺少了一个分号。

(2) printf(″%f \n″,s);是程序的最后一条语句,程序应当结束;但缺少了程序体结束所需的右花括号());此右花括号可以放在printf(″%f \n″,s);的后面,也可以放在printf(″%f \n″,s);的下一行上。 2.27 【分析与解答】

第2行的错误:在main的后面缺少一对圆括号。 第4行的错误:在c=4.0的后面缺少分号。

第6行的错误:在printf(″%f \n″,v)的后面缺少分号。

第三章

顺序结构习题分析与解答

一、选择题

(单选题) 3.1 【参考答案】

C) 3.2 【参考答案】

C) 3.3 【参考答案】

D) 3.4 【参考答案】

C) 3.5 【参考答案】

D) 3.6 【参考答案】

B) 3.7 【参考答案】

C) 3.8 【参考答案】

D) 3.9 【参考答案】

A) 3.10 【参考答案】

B) 3.11 【参考答案】

C) 3.12 【参考答案】

D) 3.13 【参考答案】

D) 3.14 【参考答案】

A) 3.15 【参考答案】

C) 3.16 【参考答案】

C) 3.17 【参考答案】

C) 3.18 【参考答案】

D)把D的答案修改为:scanf(“%8f”,&c); 3.19 【参考答案】

C) 3.20 【参考答案】

B)

二、填空题

3.21 【参考答案】

(1)-200,2500(2)i=-200,j=2500 (3) i=-200 j=2500 3.22 【参考答案】

[1] 12 [2] 0 [3] 0 3.23 【参考答案】

[1] 一条语句

[2] 分号(或;) 3.24 【参考答案】

分号(;) 3.25 【参考答案】 [1]:100

25.81

1.89234 [2]: 100 25.81 1.89234 [3]:100 25.81 1.89234 3.26 【参考答案】

x=127, x=

127, x=

177,x=

7f, x=

127 3.27 【参考答案】

x=127, x=127

, x=$127

,x=$ 000127, x=%06d 3.28

【参考答案】

a=513.789215,a= 513.79,a= 513.78921500,a= 513.78921500

三、编程题和改错题 3.29 【分析与解答】

(1) 主函数名main后应有一对圆括号。

(2) 第三行的printf语句用以提示输入,但是原样输出的字符串没有用双引号括起来;另外,从输入的形式看,输入的数据紧跟在提示之后,因此,printf格式串中最后不应该有换行符——\n。

(3)因为输入项a、b、c从定义和计算结果来看都是double类型,因此,第四行scanf语句格式串中的格式说明不应当用%d而应当用%lf;且每一个变量之前应该加地址运算符&。

(4)第七行的printf语句中应当把%d都改成%lf或%f;按输出要求在格式串中应添加相应的原样输出的字符;因为下一个printf的输出从新的一行开始,因此在本输出语句的格式串的最后应当加换行符——\n。

(5) 第八行的printf语句中应当把格式串整理合并放在输出项的前面,输出项放在后面,%d都改成%lf或%f;中间的\n删去。

(6)请同学们自己写出修改后的程序,并上机调试。 3.30 【分析与解答】

(1) 分析:可用算术式560÷60把分钟换算成小时和分钟,商数就是小时数,余数就是分钟数。

(2) 确定变量的名字和定义变量的类型:在程序中把小时数放在变量h中,把分钟数放在变量m中。这两个变量的类型可以是整型(本题中采用整型),也可以是实型。

(3) 确定所用算法:求560÷60的商数,在C语言中可以用整除的算法,语句是h=560/60;。求余数可用求余运算符 %:560%60,其值放入变量m中的语句是:m=560%60;。(4) 设计输出格式。若输出的形式定为:小时:分钟,则按此形式设计输出语句。 (5) 把以上内容放在主函数的一对花括号中。 (6) 编写程序如下: main() {

int

h, m; h=560/60; m=560%60;

3 printf(″The result: %3d : %3d\n″, h,m); } 运行结果是:

The result:

9 : 20 3.31 【分析与解答】

(1) 确定变量的名字和定义变量的类型。若用a存放1500,用b存放350;用q存放商数,用r存放余数,所有变量应定义成int类型。

(2) 设计输入语句从终端输入1500和350;在输入语句之前,应当设计一个输出语句,用以提示输入。

(3) 可用整除求商数,结果放在变量q中。可用求余运算符%求两数之余数,结果放在变量r中。

(4) 设计输出语句。输出a、b、q、r。

(5) 把以上内容放在主函数的一对花括号中。

本题的程序与3.30相似,请大家参考上题并根据本题的解释自己编程,并上机调试。 3.32 【分析与解答】

(1) 定义4个双精度变量a、b、c和ave,变量a、b、c分别存放读入的3个双精度数,ave存放它们的平均值。

(2) 设计输入语句,以及在此之前用于提示输入的(printf)语句。 (3) 设计求平均值的算法,把所求得的平均值放入变量ave中。

(4) 设计把变量ave中的数,从小数点后第二位数进行四舍五入的算法。现举例说明:若ave中的数为123.4644,为了保留此值小数点后一位,可用表达式:(int)(123.4644*10)/10.0;依次推算,为了保留此值小数点后二位,可用表达式:(int)(123.4644*100)/100.0;其他依此类推。

(5) 若要求对小数点后第二位数进行四舍五入,则可对原数加0.05后再进行以上运算。如要求保留123.4644小数点后一位且对第二位数进行四舍五入,可用表达式:(int)((123.467+0.05)*10)/10.0。注意:分母一定要用实数10.0而不能用整数10,否则就变成整除了;若要求保留123.4644小数点后两位且对第三位数进行四舍五入,可用表达式:(int)((123.467+0.005)*100)/100.0;其他依此类推。 (6) 设计输出语句。输出a、b、c和ave。 (7) 把以上内容放在主函数的一对花括号中。 (8) 编写程序如下: main() {

double a,b,c,ave; printf(″Enter a ,b ,c : ″); scanf(″%lf%lf%lf″, &a, &b, &c ); ave=(a+b+c)/3; printf(″ave=%f\n″, ave);

/*用以比较四舍五入前后的数据*/ ave=(int)((ave+0.05)*10)/10.0; /*上句也可写成ave=(int)(ave*10+0.5)/10.0;*/ printf(″a=%f, b=%f, c=%f, ave=%f\n″, a,b,c,ave); } 3.33 【分析与解答】

(1) 关于对变量中的数进行交换的算法请参考3.7题中的解释和《教程》中有关的例题。 (2) 定义4个整型变量a、b、c和t,变量a、b、c分别存放读入的3个整数,t用作临时存储单元。

4 (3) 设计输入语句,以及在此之前用于提示输入的(printf)语句。 (4) 输出a、b、c中的值,以便于比较。 (5) 交换的步骤如下: ① 把c中的值赋给t。 ② 把b中的值赋给c。 ③ 把a中的值赋给b。 ④ 把t中的值赋给a。

经过以上步骤,已按要求进行了交换。 (6) 输出a、b、c中的值。 (7) 编写程序如下: main() {

int

a, b, c, t; printf(″Enter a, b, c :\n″); scanf(″%d%d%d″,&a,&b,&c); printf(″(1) a=%d,b=%d,c=%d\n″,a,b ,c); t=c; c=b; b=a; a=t; printf(″(2) a=%d,b=%d,c=%d\n″,a,b,c); } 第四章

选择结构习题分析与解答

一、选择题

4.1 【参考答案】

A) 4.2 【参考答案】

B) 4.3 【参考答案】

A) 4.4 【参考答案】

D) 4.5 【参考答案】

C) 4.6 【参考答案】

A) 4.7 【参考答案】

B) 4.8 【参考答案】

C) 4.9 【参考答案】

D) 4.10 【参考答案】

D)

二、填空题

4.11【参考答案】

[1] 非零

[2] 零

4.12【参考答案】

、<=、>=、==、![KG-*2]= 4.13【参考答案】

[1] ! [2] && [3] [JB>1|][JB>1|] 4.14【参考答案】

[1]:![KG-*2](逻辑非) [2]:、<=、>=(小于、大于、小于等于、大于等于) [3]:==、![KG-*2]=(等于、不等) [4]:&&(逻辑与) [5]:[JB>1|][JB>1|](逻辑或)。 4.15【参考答案】

! 4.16【参考答案】 [1] a=b 或 a1|]x[JB>1|]>4 4.17【参考答案】

1 4.18【参考答案】

[1] x<=0 [2] 1 4.19【参考答案】

[1] 3 [2] 2 [3] 2 4.20【参考答案】

*#

三、编程题

4.21【分析与解答】

相关内容请参考《教程》4.2节和4.4节。 (1) 改写如下: switch(a/10) {

default : m=5; break; case 0 : case 1 : case 2 : m=1; break; case 3 : m=2; break; case 4 : m=3; break; case 5 : m=4; break; }; (2) 本题中对a的判断条件有一定的规律可寻;关键是,在switch语句后的表达式中利用了a/10,从而简化了case标号。 4.22【分析与解答】

编写本题的程序,首先要解决如何计算学生当前的年龄(设存放实足年龄的变量是age)。 (1) 如果当前的月份大于生日的月份,则学生的实足年龄age=y1-y0。

(2) 如果当前的月份等于生日的月份,就要看日数,当前的日数大于或等于生日的日数,则学生的实足年龄age=y1-y0。

(3) 如果不满足以上的条件,就可断定当前的日期没有超过生日日期,就是说学生的年龄应当是age=y1-y0-1。

以上3条,用C语言可以描述如下:

if((m1>m0)[JB>1|][JB>1|](m1==m0&&d1>=d0)) age=y1-y0; else age=y1-y0-1; 读者可以参考以上语句写出程序,也可以根据分析写出与此形式不同的语句和程序。 4.23【分析与解答】

(1) 若输入的整数a是奇数,输出:odd number,是偶数输出:even number。

(2) 若一个a是偶数,它就能被2除尽,即a%2==0,输出even number;若是奇数, 它就不能被2除尽,即a%2!〖KG-*2〗=0,输出odd number。

读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。 4.24 【分析与解答】

本题的主要算法是从3个数中找出最大的那个数。假定始终把最大的数放在变量max中。 (1) 假定a中的数最大,把a赋给max。

(2) 用b去和max比较,若b大于max,则把b赋给max;若不大于max,则什么也不做。 (3) 用c去和max比较,若c大于max,则把c赋给max;若不大于max,则什么也不做。 (4) 经过以上操作,max中已放入了a、b、c三个数中的最大数,输出max即可。 读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。 4.25 【分析与解答】

(1) 本题已给出了非常明确的条件,只要写出正确的条件判断语句就可基本完成程序的编写。 (2) 由给出的函数可知,只有x的值在规定的范围内时,才求出y的值,因此程序应当对输入的x进行判断,若超过范围就不求y的值。

(3) 现以使用if[CD#*2]else语句为例写出程序供参考。 main() {

int x,y; printf(″Enter x : ″); scanf(″%d″, &x); if(x>-5&&x<10) {

if(x==0) y=x-1;

6 else if(x<10 && x>0 ) y=x+1; else if(x<0 && x>-5) y=x; printf(″x=%d y=%d\n″, x,y); } printf(″***END***\n\n″); } 第五章

循环结构习题分析与解答

一、选择题

(单选题) 5.1 【参考答案】

D) 5.2 【参考答案】

C) 5.3 【参考答案】

B) 5.4 【参考答案】

C) 5.5 【参考答案】

C) 5.6 【参考答案】

B) 5.7 【参考答案】

D) 5.8 【参考答案】

A) 5.9 【参考答案】

D) 5.10【参考答案】

D)

二、填空题

5.11 【参考答案】

[1] 5 [2] 4 [3] 6 5.12 【参考答案】

程序段无限循环,没有输出结果 5.13 【参考答案】

-1 5.14 【参考答案】

11 5.15 【参考答案】

[1] d=1.0 [2] k++ [3] k<=n 5.16 【参考答案】

strel函数c语言写法 全国计算机等级考试二级C语言题型总结(二)——选择循环结构程序设计部分(5篇范文)...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。