一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写 在答题卡相应位置上,答在试卷上不得分。
(1)算法一般都可以用________控制结构组合而成。
A)循环、分支、递归 B)顺序、循环、嵌套
C)循环、递归、选择 D)顺序、选择、循环
答案:D
评析:算法的控制结构给出了算法的基本框架,不仅决定了算法中各操作的执行顺序,也直接反映了算法的设计是否符合结构化原则。一个算法一般都可以用顺序、选择、循环三种基本控制结构组合而成。
(2)数据的存储结构是指________。
A)数据所占的存储空间量
B)数据的逻辑结构在计算机中的表示
C)数据在计算机中的顺序存储方式
D)存储在外存中的数据
答案:B
评析:数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构。
(3)设有下列二叉树:
对此二叉树中序遍历的结果为________。
A)ABCDEF B)DBEAFC C)ABDECF D)DEBFCA
答案:B
评析:中序遍历是指首先遍历左子树,然后访问根结点,最后遍历右子树;并且在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树的一种二叉树遍历算法。
(4)在面向对象方法中,一个对象请求另一对象为其服务的方式是通过发送________。
A)调用语句 B)命令 C)口令 D)消息
答案:D
评析:面向对象的世界是通过对象与对象间彼此的相互合作来推动的,对象间的这种相互合作需要一个机制协助进行,这样的机制称为消息。消息是一个实例与另一个实例之间传递的信息,它请求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。
(5)检查软件产品是否符合需求定义的过程称为________。
A)确认测试 B)集成测试 C)验证测试 D)验收测试
答案:A
评析:确认测试的任务是验证软件的功能和性能及其他特性是否满足了需求规格说明中的确定的各种需求,以及软件配置是否完全、正确。
(6)下列工具中为需求分析常用工具的是________。
A)PAD B)PFD C)N-S D)DFD
答案:D
评析:常见的需求分析方法有:结构化分析方法和面向对象的分析方法。结构化分析的常用工具有:数据流图(DFD)、数据字典(DD)、判定树和判定表等。
(7)下面不属于软件设计原则的是________。
A)抽象 B)模块化 C)自底向上 D)信息隐蔽
答案:C
评析:在软件设计过程中,必须遵循软件工程的基本原则:这些原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可靠性。
(8)索引属于_________。
A)模式 B)内模式 C)外模式 D)概念模式
答案:B
评析:内模式(Internal Schema)又称物理模式(Physical Schema),它给出了数据库物理存储结构与物理存取方法,如数据存储的文件结构、索引、集簇及hash等存取方式与存取路径。
(9)在关系数据库中,用来表示实体之间联系的是_________。
A)树结构 B)网结构 C)线性表 D)二维表
答案:D
评析:在关系数据库中,用二维表来表示实体之间联系。
(10)将E-R图转换到关系模式时,实体与联系都可以表示成_________。
A)属性 B)关系 C)键 D)域
答案:B
评析:关系是由若干个不同的元组所组成,因此关系可视为元组的集合,将E-R图转换到关系模式时,实体与联系都可以表示成关系。
(11)有如下程序
main()
{
char ch[2][5]={“6937″,”8254″},*p[2];
int I,j,s=0;
for(I=O;i<2;i++)p[i]=ch[I];
for(I=O;i<2;i++)
for(j=0;p[i][j]>’\0’;j+=2)
s=10*s+(p[i][j].’0’);
printf(”%d\n”,s);
}
该程序的输出结果是_________。
A)69825 B)63825 C)6385 D)693825
答案:C
评析:本题“ch[2][5]={“6937″,”8254″}”用于2行5列的二维数组初始化,ch[O][0]-ch[O][4]的值分别为:6,9,3,7,\0;ch[1][0]-ch[1][4]的值分别为:8,2,5,4,\0;第一个for循环用于将数组指针分别指向二给数组的第一行和第二行;第二个for嵌套循环用于取出p[O][0],p[O][2],p[1][0],p[1][2]四个存储单元的数组成一个四位数进行输出。
(12)以下叙述不正确的是_________。
A)分号是C语言的必要组成部分
B)C程序的注释可以写在句的后面
C)函数是C程序的基本单位
D)主函数的名字不一定用main表示
答案:D
评析:c语言的程序是由主函数main()开始运行,由主函数来调用其他函数,所以D是错误的。
(13)若变量已正确定义并赋值,下面符合c语言的表达式是_________。
A)a:_b+1 B)a=b=c+2 C)int 18.5%3 D)a=a+7=c+b
答案:B
评析:选项A和c一望而知其错:对于表达式a=a+7=c+b(答案D),是先执行赋值表达式a+7=c+b,再把这个表达式的值赋给a,显然,表达式a+7=c+b非法,因为赋值表达式的左侧不能为常量或表达式。
(14)C语言运算对象必须是整型的运算符是_________。
A)%= B)/ C)= D)<:
答案:A
评析:在C语言中,模运算(即取余运算%)的运算对象必须是整型数据(常量、变量或表达式)。
(15)下面一组中都是C语言关键字的是_________。
A)double Int for B)main while goto
C)volatile break static D)malloc sizeof new
答案:C
评析:c语言中的关键字有32个关键字(参见c语言教程),本题中只有C符合题意。
(16)若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是_________。
A)l B)2 C)2.0 D)2.5
答案:C
评析:这是一个逗号表达式,它的值应为表达式y=x+3/2的值,而前一个表达式已给x赋值l,在没有进行类型转换的t留下,3/2的值为1,所以x+3/2的值应为2.0。
(17)执行语句:for(、i=1;i++<4;);后变量i的值是_________。
A)3 B)4 C)5 D)不定
答案:C
评析:for语句的一般形式为:for(表达式1;表达式2;表达式3)语句,循环结束的条件是i++<4,所以当i++_4时,循环结束,此时变量i的值为5。
(18)若变量a、i已正确定义,且i已正确赋值,合法的语句是_________。
A)a==l B)++i; C)a=a++=5; D)a=int(i);
答案:B
评析:选项D显然是错的,而选项A没有分号结束,不是c语句;a++=5违反了赋值表达式左侧必须为一个变量(不能是常量或表达式)的规定.
(19)有如下程序
main()
{ int y=3,x=3,z=l;
printf(”%d %dn”,(++x,y++),z+2);
}
运行该程序的输出结果是________。
A)3 4 B)4 2 C)4 3 D)3 3
答案:D
评析:逗号表达式(++X,y++)的值应该是y++的值,由于y++是先引用后自增,所以y++的值是3。
(20)运行以下程序后,如果从键盘上输入65 14<回车>,则输出结果为________。
main()
{
int m,n;
printf(”Enter m,n:”);
scanf(”%d%dt.,&m,&n);
while(mI-n)
{
while(m>n)re-=n,
while(n>m)n-=m;
}
printf(”m=%d\n”,m);
}
A)m=3 B)m=2 C)m=l D)m=O
答案:C
评析:分析程序可知,该程序实现的功能是对数m,n求其最大公约数。在本题中m与n的值分别为65与14,其最大公约数为1,故其输出结果为m=l。
(21)能正确表示逻辑关系:””a≥10或a≤0””的C语言表达式是________。
A)a>=10 or a<=O B)a>=0 I a<=10
C)a>=10&&a<=0 D)a>=10 ll a<=10
答案:D
评析:c语言中的“或”关系用“‖”表示,其它相关逻辑运算符“与”用“&&”表示;运算符“非”用“!”来表示。
(22)已经定义ch为字符型变量,以下赋值表达式中错误的是________。
A)ch=’\’ B)ch=62+3 C)ch=NULL D)ch=’\xaa’
答案:A
评析:反斜杠字符“\”赋给字符,应该写成ch=‘’,所以A是错误的。
(23)有如下程序
main()
{ int x=l,a=0,b=0;
switch(x){
case 0:b++:
case 1:a++:
case 2:a++;b++;
}
printf(”a=%d,b。%d\n”,a,b);
)
该程序的输出结果是__________。
A)a:2,b=1 B)a=l,b=1 C)a=l,b:O D)a=2,b=2
答案:A
评析:在这个switch语句中,因为x的值为1,所以执行case 1:后面的a++,这样a=1。但又由于其下没有break语句,所以其后面的语句“a++;b++”也将被执行,这样一来,a=2,b=1。
(24)有如下程序
main()
{ float x=2.0,y;
if(x<O.O)y=0.0;
else if(x<lO.O)y=1.O/x;
else y=1.O;
printf(%f\n”,y);
}
该程序输出结果是_________。
A)0.000000 B)0.250000 C)0.500000 D)1.000000
答案:C
评析:本题考查的是if..else语句的使用。x=2.0,符合第二个IF语句的条件x<lO.O,所以执行y=1.0/x语句,即y=1.0/2.0=0.500000。
(25)有以下函数定义:
void fun(int n,double x){……}
若以下选项中的变量都已正确定义并赋值,则对函数fun正确调用语句是_______。
A)fun(int y,double m); B)k=fun(10,12.5);
C)fun(x,n); D)void fun(n,x);
答案:C
评析:函数调用的一般形式为:函数名(实参表列);,实参与形参的个数应相等,类型应一致,在调用函数时,不要指定其返回类型,对于返回类型为void的函数,不能作为赋值表达式的组成部分,所以选C。
(26)有如下程序
main()
{ int i,sum;
for(i=l;i<=3;sum++) sum+=i;
printf(”%d\n”,sum);
}
该程序的执行结果是_________。
A)6 B)3 C)死循环 D)O
答案:C
评析:在循环过程中,i的值一直没有被改变,所以这是一个死循环。
(27)下列函数定义中,会出现编译错误的是_________。
A)max(int x,int y,int*z) B)int max(im x,y)
{ *z=x>y?x:y;} { int z;
z=x>y?x:y;
return z;}
C)max(intx,inty) D)intmax(intx,inty)
{int z; {return x>y?x:y;}
z=x>y?x:y;
return(z);}
答案:B
评析:在c语言中,不可以在函数的参数声明列表中用一个类型名指定多个参数。故选项B是错误的。
其正确的表示方式应为
int max(int x,int y){……}
或
int max(x,y)
int x,y;
{……}
(28)有如下程序
main()
{ int x=3;
do
{ printf(”%d”,x–);}
while(!x);
}
该程序的执行结果是________。
A)321 B)3 C)不输出任何内容 D)陷入死循环
答案:B
评析:本题x赋初值为3,当执行printf(“%d”,x–);时,由于X–的作用是先运算x,再将x的值减l,所以,printf输出的x值为3,等输出后,x的值减1变为2,继续执行,判断条件!x为假,循环只被执行一次。
(29)设有声明语句:char a=’\72’;则变量a__________
A)包含1个字符 B)包含2个字符
C)包含3个字符 D)声明不合法
答案:A
评析:转义字符常量‘xx’可以把‘\’后面的数字转换为对应的ASCII字符。
(30)有以下程序段:
main()
{
int a=5,*b,**c
c==&b;b=&a;
}
程序在执行了c=&b;b=&a;语句后,表达式ttc的值是__________。
A)变量a的地址 B)变量b中的地址
C)变量a中的值 D)变量b的地址
答案:C
评析:指针变量是用来存放地址的。&:取地址运算符。+:指针运算符。**c为指针变量*c所指向的存储单元,*c为指针指针变量c所指向的存储单元,而c=&b表示c为变量b的地址,b=&a表示b为变量a的地址。表达式一c的值就是变量a中的值。
(31)有如下函数调用语句
func(recl,rec2+rec3,(rec4,rec5));
该函数调用语句中,含有的实参个数是________。
A)3 B)4 C)5 D)有语法错误
答案:A
评析:(rec4,rec5)是逗号表达式,它的值是rec5的值。所以该函数调用语句含有的实参个数是3。
(32)有如下程序
main()
{
char s[115]={.tabc”,”de”,”fgh”};
printf(“%e”,s[2][6]);
}
其输出为__________。
A)不确定 B)编译错误 C)g D)输出null字符
答案:A
评析:由于s[2116]表示字符串已超出了数组s的表示范围,在c中不会对数组越界进行检查,当数组越界时,会得到一个不确定的值。
(33)有如下程序
int rune(ira a,int b)
{ remm(a+b);}
main()
{ int x=2,y=5,z=8,r;
r=func(func(x,y),z);
primf(”%dn”,r);
}
该程序的输出结果是________。
A)12 B)13 C)14 D)15
答案:D
评析:调用函数func(x,y),返回x+y,即7;再调用函数func(7,z),返回7+z,即15。
(34)有如下程序段
int *p,a=10,b=l;
p=&a; a=*p+b;
执行该程序段后,a的值为_________。
A)12 B)11 C)10 D)编译出错
答案:B
评析:执行p=&a;后,p指向整数a,*p即p的目标变量,也就是a;所以a=*p+b等价于a=a+b,可知a的值最终为11。
(35)有以下程序:
int*f(int*x,int*y)
{ if(*x<*y)return x;
else returny;
}
main()
{
int a=7,b=8,*p,*q,*r;
p=&a;q=&b;
r=f(p,q);
printf(”%d,%d,%d\n”,*p,*q,*r);
}
程序运行后输出结果是_________。
A)7,8,8 B)7,8,7 C)8,7,7 D)8,7,8
答案:B
评析:f函数的功能是返回地址为x,y的两个数中值较的数的地址,本题输出结果是7,8,7。
(36)有如下程序
long fib(im n)
{ if(n>2) return(fib(n-1)+fib(n-2));
else return(2);
)
main()
{ printf(%ld\n”,fib(3));}
该程序的输出结果是_________。
A)2 B)4 C)6 D)8
答案:B
评析:函数舶内部有两个递归调用,当n=3时,fib(n-1)返回2,fib(n-2)也返回2,所以fib(n-I)+fib(n-21的值为4。
(37)下面程序的输出结果是_________。
main()
{
char str[10],c=’a’;
inti=0:
for(;i<5;i++)
str[I]=c++;
printf(”%s”,str);
}
A)abcde B)a C)不确定 D)bcdef
答案:C
评析:字符串少一个结束标志,所以输出的结果不确定。
(38)在c语言中,函数中变量的隐含存储类别是__________。
A)auto B)static C)extern D)无存储类别
答案:A
评析:函数中变量的存储类别包括auto,static,extern,其中auto为隐含存储类别,static为静态存储类别,register是寄存器存储类别。A
评析:函数中变量的存储类别包括auto,static,extern,其中auto为隐含存储类别,static为静态存储类别,register是寄存器存储类别。
(39)有如下程序
#define n 2
#define m N+I
#define NUM 2*m+l
main()
{ int i;
for(i=1;i<=NUM;i++)printtf(”%d\n”,i);
}
该程序中的for循环执行的次数是_________。
A)5 B)6 C)7 D)8
答案:B
评析:在c语言中,宏定义在编译时将被直接替换,所以NUM最后会被替换成2*N+l+l,即2*2+1+1,值为6。因此,for循环执行的次数为6。
(40)假设在turboc2.0采用small模式编译如下程序
main()
{
char a[4]:{’a’,’b’};
char%=”abc.t:
printf(”%d,%d”,sizeof(a),sizeof(b));
}
其输出结果为_________。
A)4,2 B)4,4 C)4,3 D)2,2
答案:A
评析:用small模式编译,指针变量占2个字节。sizeof(array):数组名array代表数组本身,sizeof函数测出的是整个数组的大小。a数组的大小为4,b指针变量的大小为2。
(41)有以下函数
char *fun(char *p)
{ retum p; }
该函数的返回值是_________。
A)无确切的值 B)形参p中存放的地址值
C)一个临时存储单元的地址 D)形参p自身的地址值
答案:B
评析:p本身就是一个字符型指针变量,返回p也就是返回变量p中存放的地址值。
(42)有如下程序段:
#include<stdio.h>
#define Max(a,b)a>b?a:b
main()
{
int a=5,b=6,c=4,d;
d=c+Max(a,b);
printf(”%d”,d);
}
其输出结果为__________。
A)10 B)5 C)6 D)编译错误
答案:B
评析:在c语言中,宏定义是直接替换的,所以在c+a>b?a:b这个条件表达式中,c+a>b为真,所以用a的值作为整个表达式的值,而a的值为5,所以整个表达式的值为5。
(43)有如下程序段
int a=14,b=l 5,x;
char c=’A’:
x=(a&&b) &&(c<’B’);
执行该程序段后,x的值为________。
A)true B)false C)0 D)l
答案:D
评析:a&&b的值为true,c<‘B’的值也为true,所以(a&&b)&&(c<‘B’)的值为true。但x是int型变量,所以(披&b)&&(c<‘B’)的值最后要从bool型转换为int型赋给x。这样x的值应为l。
(44)下述关于C语言文件的操作的结论中,正确的是________。
A)对文件操作必须先关闭文件
B)对文件操作必须先打开文件
C)对文件操作顺序无要求
D)对文件操作前必须先测文件是否存在,然后再打开文件。
答案:B
评析:在c中对文件操作必须先打开文件,待文件操作完毕后要关闭文件。对文件以读的方式进行打开操作时,同时会执行文件的检查文件是否存在,不存在将会返回空的文件指针,如果对文件以写的方式打开时,文件不存在,将会自动创建文件,.因此在C中打开文件前不必对其检查文件是否存在,故答案为B。
(45)下列关键字中,不属于C语言变量存储类别的是________。
A)register B)auto C)extem D)public
答案:D
评析:变量的存储类别具体包含四种:自动的(auto),静态的(statiC),寄存器的(register),外部的(extern)。
(46)有如下说明
im a[10]={l,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9的表达式是________。
A)木p+9 B)半(p+8) C)牛p+=9 D)p+8
答案:B
评析:p是指针,p+8是地址值,D是错的;*p是p的目标变量,即a[0],值为1,所以+p+9的值是lO,而*p+=9值是重新给a[O]赋了值(1+9);所以A和C也是错的。p+8是地址值,指向a[8],那么*(p+8)。的值就是a[81的值,即9。
(47)若有以下定义:int t[3][2];能正确表示t数组元素地址的表达式是________。
A)&t[3][2] B]t[3] C]t[1] D]*t[2]
答案:C
评析:A和B两个表达式都已越界了;*t[2]是目标变量,即一个整数,而不是地址值。
(48)下面程序运行后的输出结果是________。
struct abc
{
int a,b,c;
}
main()
{
struct abc s[2]={{1,2,3},{4,5,6}};
int t=-s[0].a+s[1].b;
printf(“%d\n”,t);
}
A)5 B)6 C)7 D)8
答案:B
评析:在main函数中定义了一个struct abc类型的数组,同时分别利用{1,2,3}及{4,5,6}对数组中两个元素进行初始化。在该结构体,依次对其中的a,b,c三个变量进行初始化。故s[O].a=l,s[1].b=5,所以本题输出为6。
(49)有如下程序
main()
{
int a[31131。{{1,2},{3,4},{5,6}},i,j,s=0;
for(i=l;i<3;i++)
for(j=0;j<=i;j++)
s+=a[I][j];
printf(“%d\n”,s);
}
该程序的输出结果是________。
A)18 B)19 C)20 D)2l
答案:A
评析:题中的外循环只执行了2次:
第1次:a[1][0]=3,a[1][1]=4,所以s=7;
第2次:a[2][O]=5,a[2][1]=6,a[2][2]=0,所以s=7+5+6+0=18。
(50)若己建立如下图所示的单向链表结构:
在该链表结构中,指针p、s分别指向图中所示结点,则不能将s所指的结点插入到链表末尾仍构成单向链表的语句组是__________。
A)p=p->next;s->next:p;p->next=s;
B)p=p->next;s->next:p->next;p->next=s;
C)s->next:NULL;p=p->next;p->next:s;
D)p=(*p).next;(*s).next=(*p).next;(*p).next=s;
答案:A
评析:在答案A中:p=p->next;s->next=p;p->next=s;s的确已插到了链表的末尾,但它的next却并没有为NULL,而是指向了它的直接前趋p,这样它就不是一个单向链表(单向链表最后一个结点的next指针一定是一个NULL)。
二、填空题(每空2分,共40分)‘
请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得 分。
(1)在运算过程中,能够使空表与非空表的运算统一的结构是 【1】 。
答案:【1】循环链表
评析:在链表的运算过程中,采用链接方式即循环链表的结构把空表与非空表的运算统一起来。循环链表具有两个特点:
①在循环链表中增加了一个表头结点,其数据域为任意或根据需要来设置,指针域指向线性表的第一个元素的结点。循环链表的头指针指向表头结点。
②循环链表中最后一个结点的指针不是空,而是指向表头结点。
(2)软件工程研究的内容主要包括: 【2】 技术和软件工程管理。
答案:【2】软件开发
评析:基于软件工程的目标,软件工程的理论和技术性研究的内容主要包括:软件开发技术和软件工程管理。
软件开发技术包括:软件开发方法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。
软件工程管理包括:软件管理学、软件工程经济学、软件心理学等内容。
(3)与结构化需求分析方法相对应的是 【3】 方法。
答案:【3】结构化设计
评析:与结构化需求分析方法相对应的是结构化设计方法。结构化设计就是采用最佳的可能方法设计系统的各个组成部分以及各个成分之间的内部联系的技术。也就是说,结构化设计是这样一个过程,它决定用哪些方法把哪些部分联系起来,才能解决好某个具体且有清楚定义的问题。
(4)关系模型的完整性规则是对关系的某种约束条件,包括实体完整性、 【4】 和自定义完整性。
答案:【4】参照完整性
评析:关系模型允许定义三类数据约束,它们是实体完整性、参照完整性以及用户定义的完整性约束,其中前两种完整性约束由关系数据库系统自动支持。
实体完整性约束要求关系的主键中属性值不能为空,这是数据库完整性的最基本要求,因为主键是惟一决定元组的,如为空则其惟一性就成为不可能的了。
参照完整性约束是关系之间相关联的基本约束,它不允许关系引用不存在的元组:即在关系中的外键要么是所关联关系中实际存在的元组,要么是空值。
自定义完整性是针对具体数据环境与应用环境由用户具体设置的约束,它反映了具体应用中数据的语义要求。
(5)数据模型按不同的应用层次分为三种类型,它们是 【5】 数据模型、逻辑数据模型和物理数据模型。
答案:【5】概念
评析:数据模型按不同的应用层次分为三种类型,它们是概念数据模型、逻辑数据模型和物理数据模型。
概念数据模型简称概念模型,是一种面向客观世界、面向用户的模型;它与具体的数据库管理系统无关。
(6)表示””整数x的绝对值大于5””时值为””真””的C语言表达式是 【6】 。
答案:【6】x>5‖x<-5或k<-5‖x>5
评析:要使整数x的绝对值大于5,则x大于5或x小于-5,用c语言表示即为:x>5‖x<-5或者x<-5‖x>5。
故本题答案为:x>5‖x<-5或者x<-5‖x>5。
(7)以下程序的输出结果是 【7】 。
main()
{ unsigned short a=65536;int b;
printf(”%d\n”,b=a);
}
答案:【7】0
评析:对于一个unsigned short来说,它能取的最大值是65535。这里给a赋值65536,已经超出了它的取值范围,这样它的高位将被截掉,只把低位赋给它(全零)。所以a的值实际为0。
(8)若有定义:ira a=lO,b=9,c=8;,接着顺序执行下列语句,变量b中的值是 【8】 。
c=(a-=(b-5));
c=(a%11)+(b=3);
答案:【8】3
评析:这里:b-5=4,a.=4之后a的值为6,并把它赋给c。此时b的值并未被改变。在第2个表达式中,也只有赋值表达式b=3改变了b的值。所以两行语句执行完毕,b的值应该为3。
(9)以下程序运行后的输出结果是 【9】 。
main()
{
int p=30;
primf(“%d\n”,(p/3>O?p/10:p%3));
}
答案:【9】3
评析:条件表达式的一般形式为:表达式17表达式2:表达式3条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式l的值为0(假)-,则求解表达式3,表达式3的值就是整个条件表达式的值。30/3=10>0,所以执行p/lO,结果为3。
(10)函数pi的功能是根据以下近似公式求n值:
(∏*∏)/6=1+1/(2*2)+1/(3*3)+…+1(n*n)
现在请你在下面的函数中填空,完成求n的功能。
#include”math.H”
{ double s=0.0;long i;
for(i=1;i<=n;i++)s=s+ 【10】 ;
retum(sqrt(6*s));
}
答案:【10】1.O/(i*i1或(double)l/(i*i)
评析:表达式1+1/(2*2)+l/(3*3)+…+1(n*n)可写为:1/(1*1)+1/(2*2)+1/(3*3)+…+1(n*n)
n
即:∑l÷(i×i)
i-l
对应的c语言的表达式:s=s+1.O/(i*i)。注:必须要写成1.0的形式,否则1/(i*i)返回值为其值截尾取整,即恒为O。
(11)函数pi的功能是根据以下公式近似求得的:
pi*pi/6=1+1/(2*2)+1/(3*3)+…+1/(n*n)
请在下面的函数中填空,完成求pi的功能。
#include<math.h>
double pi(10ng n1
{ double s=O.O,long i;
for(i=1;i<=n;I++)s=s+ 【11】 ;
return(sqrt(6*s));
}
答案:【11】1.0/i/i或1.O/(i*i)
评析:由题面中提供的计算pi的公式可知:在第i项其值为1/(i*i),考虑到运算结果为浮点数,故必须要将l转化为浮点数或采用1.O/(i*i)的形式。故本题应填1.O/(i*i)或其等效形式。
(12)若输入字符串:abcde/,则以下while循环体将执行 【12】 次。
while((ch=getchar())==’e’)printf(“*”);
答案:【12】0
评析:函数getchar()是从键盘得到用户输入的一个字符。用户输入的第1个字符是a,不管后面输入的是什么ch的值都是‘a’,因此条件(ch=getchar())==‘e’为假,这个循环不会被执行。
(13)以下函数用来求出两整数之和,并通过形参将结果传回,请填空。
voidfunc(intx,inty, 【13】 z]
{ *z-x+y;},
答案:【13】int*
评析:从题中代码可知:z应该是一个整型指针,因此应填:int*
(14)若有以下定义,则不移动指针p,且通过指针p引用值为98的数组元素的表达式是 【14】 。
int w[10]={23,54,10,33,47,98,72,80,61},*p=w;
答案:【14】p[5]或*(p+5)
评析:98是数组w的第5个元素(最开始的为第O个),而通过*p=w已经将p指向了数组w,要想不移动指针p而引用98,可以有以下两种写法:p[5]、*(p+5)。
(15)设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函 数的首部 【15】 。要求形参名为b。
main()
{ double s[10][22];
int n:
……
fun(s);
……
}
答案:【15】void fun(double b[1011221]
评析:本题答案:void fun(double b[10][22])
(16)有以下程序:
int f(int n)
{ if(n==1)return 1;
else return f(n-1)+1;}
main()
{ int i j=0;
for(i=1;i<3;i++)j+=f(i);
printf(”%d\n”’j);
}
程序运行后的输出结果是 【16】 。
答案:【16】3
评析:i=l时,f(1)=1 J=j+f(1)=0+1=1;i=2时,f(2)=f(1)+l=1+1=2 j=j+f(2)=l+3=3;此时循环结束,程序运行后的输出结果是3。
(17)以下程序的输出结果是 【17】 。
void fun()
{ static int a:0;
a+=2;printf(”%d”,a);
}
main()
{ int cc;
for(CC=1;cc<4;cc++)fun();
printf(”\n”);
}
答案:【17】246
评析:循环for(cc=l;cc<4;cc++)被执行了3次。在函数fun中,由于a是static型变量,所以函数第1次调用后,a=2;第2次调用后,a=4;第3次调用后,a=6。
(18)实现程序可将磁盘中的一个文件复制到另一个文件中,两个文件的文件名在可执行命令的命令行中(相当于copy命令),假定文件在当前目录下。请补全程序。
#include<stdio.h>
void main(int argc,char。argv[])
{ FILE *f1,*f2;
if(argc< 【18】 )
{ printf(“parameter error!n”);exit(0);}
fl=fopen(argv[1],”r”);
f2=fopen(argv[2],”w”);
while( 【19】 )fputc(fgetc(f1),f2);
fclose(f1);
fclose(f2);
}
答案:【18】3
【19】!feof(f1)
评析:在c语言中,宏定义是直接替换的,所以在对表达式MAX(a+b,c+d)*10进行或替换后,表达式变为:(a+b)>(c+d)?(a+b):(c+d)*10
在这个条件表达式中,(a+b)>(c+d)为真,所以用(a+b)的值作为整个表达式的值(否则用(c+d)*10的值作为整个表达式的值),而(a+b)的值为7。所以整个表达式的值为7。
(19)以下程序的输出结果是 【20】 。
#define MAX(x,y)(x)>(y)?(x):(y)
main()
f int a=5,b=2,c=3,d=3,t;
t=MAX(a+b,c+d)*10;
printf(”%d\n”,t);
}



