一、选择题((1)~(10)每小题2分,(11)-(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写
在答题卡相应位置上,答在试卷上不得分。
(1)在计算机中,算法是指_______。
A)查询方法 B)加工方法
C)解题方案的准确而完整的描述 D)排序方法
答案:C
评析:计算机算法是指解题方案的准确而完整的描述,它有以下几个基本特征:可行性、确定性、有穷性和拥有足够的情报。
(2)栈和队列的共同点是_______。
A)都是先进后出 B)都是先进先出
C)只允许在端点处插入和删除元素 D)没有共同点
答案:C
评析:栈和队列都是一种特殊的操作受限的线性表,只允许在端点处进行插入和删除。二者的区别是:栈是一种“后进先出”的线性表;而队列是一种“先进先出”的线性表。
(3)已知二叉树BT的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是_______。
A)cedba B)acbed C)decab D)deabc
答案:A
评析:二叉树BT的后序遍历序列为dabec,故BT的根结点为c;而BT的中序遍历序列是debac,即遍历序列中最后一个结点为跟结点,说明BT的右子树为空。由BT的的后序遍历序列和中序遍历序列可知BT的左子树(LST)的后序遍历序列和中序遍历序列分别为dabe和deba(树是递归定义的):故LST的根结点是e,在由LST的中序遍历序列可知其左子树为d。因此BT的前序遍历序列为cedba。
(4)在下列几种排序方法中,要求内存量最大的是_______。
A)插入排序 B)选择排序 C)快速排序 D)归并排序
答案:D
评析:快速排序的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录继续进行排序,以达到整个序列有序;插入排序的基本操作是指将无序序列中的各元素依次插入到已经有序的线性表中,从而得到一个新的序列;选择排序的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置),然后对剩下的子表采用同样的方法,直到表空为止;归并排序是将两个或两个以上的有序表组合成一个新的有序表。
(5)在设计程序时,应采纳的原则之一是_______。
A)程序结构应有助于读者理解 B)不限制goto语句的使用
C)减少或取消注解行 D)程序越短越好
答案:A
评析:滥用goto语句将使程序流程无规律,可读性差;添加的注解行有利于对程序的理解,不应减少或取消;程序的长短要依照实际需要而定,并不是越短越好。
(6)下列不属于软件调试技术的是_______。
A)强行排错法 B)集成测试法 C)回溯法 D)原因排除法
答案:B
评析:调试的关键在于推断程序内部的错误位置及原因。主要的调试方法有强行排错法、回溯法和原因排除法。
(7)下列叙述中,不属于软件需求规格说明书的作用的是_______。
A)便于用户、开发人员进行理解和交流
B)反映出用户问题的结构,可以作为软件开发工作的基础和依据
C)作为确认测试和验收的依据
D)便于开发人员进行需求分析
答案:D
评析:软件需求规格说明书是需求分析阶段的最后成果,是软件开发中的重要文档之一。它不能方便开发人员进行需求分析。
(8)在数据流图(DFD)中,带有名字的箭头表示_______。
A)控制程序的执行顺序 B)模块之间的调用关系
C)数据的流向 D)程序的组成成分
答案:C
评析:在数据流图中,用标有名字的箭头表示数据流。数据流可以从加工流向加工,也可以从加工流向文件或从文件流向加工,并且可以从外部实体流向系统或从系统流向外部实体。
(9)SQL语言又称为______。
A)结构化定义语言 B)结构化控制语言
C)结构化查询语言 D)结构化操纵语言
答案:C
评析:结构化查询语言(Structured Query Language,简称SQL)是集数据定义、数据操纵和数据控制功能于一体的数据库语言。
(10)视图设计一般有3种设计次序,下列不属于视图设计的是______。
A)自顶向下 B)由外向内 C)由内向外 D)自^芪向上
答案:B
评析:视图设计一般有3种设计次序,它们分别是自顶向下、自底向上和由内向外,它们又为视图设计提供了具体的操作方法,设计者可根据实际情况灵活掌握,可以单独使用也可混合使用。
(11)以下有4组用户标识符,其中合法的一组是______。
A)FOR B)4d C)f2一G3 D)WORD
-sub DO IF void
Case Size abc define
答案:C
评析:c语言的标识符的定义为:以字母或下划线开头的由字母、数字字符、下划线组成的字符串。而且标识符不能与关键字相同。
(12)下列属于c语言语句的是______。
A)print(“%dn”,a) B)#include<stdio.h>
C)a=b;b=c;c=a; D)/*this is a program*/
答案:C
评析:在c语言中,一个完整的c语句必须在语句末尾出现分号,分号是c语句的必要组成部分。本题答案为C。
(13)下列叙述中正确的是______。
A)C程序中注释部分可以出现在程序中任何合适的地方
B)花括号””{“”和””}””只能作为函数体的定界符
C)构成C程序的基本单位是函数,所有函数名都可以由用户命名
D)分号是C语句之间的分隔符,不是语句的一部分
答案:A
评析:c程序中注释部分用“/*”和“*/”括起来,可以出现在程序中任何合适的地方;花括号“{”和“}”不仅可作为函数体的定界符,也可作为复合语句的定界符;构成C程序的基本单位是函数;一个语句必须在最后出现分号,分号是C语句中不可缺少的部分。
(14)以下合法的赋值语句是______。
A)X=Y=100 B)D–; C)X+Y; D)C=int(A+B)
答案:B
评析:本题中的答案A与D都缺少“;”,而答案c中,表达式是不能独立成为语句的,答案B使用了c语言的自减运算符它就相当于D=D-l,所以答案B为一赋值语句。
(15)运行下面的程序,其输出结果为______。
main()
{
printf(“%d,%d”,5%-3,-5%3);
}
A)2,-2 B)-2,2 C)-2,-2 D)2,2
答案:A
评析:在c中,参与%运算的两个参数都必须为整型,在大多数c编译器下(包括TurboC)都采用了“向0靠近”的原则,即当两个运算量有一个为负数时,余数的符号由被除数的符号决定。故本题答案为A。
(16)设x,y均为int型变量,且x=10,y=3,则print(”%d,%dn”,x- -,- -y);语句的输出结果是______。
A)10,3 B)9,3 C)9,2 D)10,2}
答案:D
评析:c语言的自减运算符有前置与后置两种形式。当自减运算符前置时,变量先自减一后再参与表达式运算;而后置时,变量先参与表达式运算后再自身减一。
(17)设x为int型变量,执行以下语句,x=10;x+=x-=x-x;x的值为______。
A)10 B)20 C)30 D)40
答案:B
评析:本题x=10,表达式“X+=X-=X-X;”的求解步骤如下:先进行X-=X-X的运算,相当于X=X-(X-x)=x=10;再进行X+=X的运算,即x=x+x=20。
(18)X、Y、Z被定义为int型变量,若从键盘给X、Y、Z输入数据,正确的输入语句是 ______。
A)INPUT X,Y,Z; B)scanf(”%d%d%d”,&X,&Y,&Z);
C)scanf(”%d%d%d’,X,Y,Z); D)read(”%d%d%d”, &X,&Y,&Z);
答案:B
评析:c语言中没有输入输出语句,它是通过c语言提供的函数来实现的,本题c中,应为变量地址。
(19)以下程序的输出结果是______ 。
main()
{int a=3;
printf(”%dn”,(a+=a-=a*a));
}
A)-6 B)1 C)2 D)-12
答案:D
评析:赋值运算符的结合方向是自右至左,所以表达式a+=a-=a*a先运算最右边的a*a得9,再运算a=a-9,即a=3-9,所以此时a的值由3变成了-6,最后运算a=a+(-6),即a=(-6)+(-6)=-12。
(20)设int型占2个字节,则unsigned int所能表示的数据范围是______ 。
A)0~65535 B)-32769~32767 C)1~65536 D)0~32767
答案:A
评析:本题int型占2个字节,即16位,unsigned m所能表示的数据范围是O~(2^16-1),即0-65535。
(21)设a、b、c、d、m、n均为int型变量,且a=5、b=6、c=7、d=8、m=2、n=2则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为______。
A)0 B)1 C)2 D)3
答案:A
评析:c语言中比较表达式的运算结果为0或1。0代表不成立,l表示成立。
(22)以下程序的输出结果是______ 。
main()
{im num=0;
while(num<=2)
{ num++;printf(”%d\n”,num); }
}
A) B) C) D)
1 1 1 1
2 2 2
3 3
4
答案:B
评析:while的执行过程是:先计算条件表达式的值,若成立则执行循环体,重复上述过程,直到条件表达式的值为“假”(值为零)时,退出循环,并转下一语句去执行。本题在输出num的值为3之后,r再判断while的循环条件3<=2,不成立,所以不再输出num的值,故本题的答案选B。
(23)下面的关键字中,不能够从循环体中跳到循环体外的是______ 。
A)goto B)break C)return D)continue
答案:B
评析:在c语言中;可以用break语句和continue语句跳出本层循环和结束本次循环。goto语句可跳出多层循环,如果在函数的循环体内使用return语句,就会直接结束循环返回函数值。
(24)以下各选项企图说明一种新的类型名,其中正确的是______。
A)tyrpedef vl int; B)typedef v2=int;
C)typedef int v3; D)typedef v4:int
答案:C
评析:c语言中可以使用typedef来重新定义已有的数据类型,相当于为数据类型取个别名。
(25)为了避免嵌套的if-else的二义性,C语言规定:else与______配对。
A)缩排位置相同的if B)其之前最近的if
C)其之后最近的if D)同一行上的if
答案:B
评析:在if语句中又包含一个或多个if语句称为if语句的嵌套。应当注意if与else的配对关系,在c语言中,从最内层开始,else总是与它上面最近的(未曾配对的)if配对。
(26)在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是______ 。
A)地址传递 B)单向值传递
C)由实参传给形,再由形参传回实参 D)传递方式由用户指定
答案:B
评析:c语言函数中的参数传递方式有传值与传址两种方式,传值方式是指将实参的值复制一份传递给形参,而传址方式是指将实参的变量地址传递给形参,也就是实参的引用。
(27)以下函数值的类型是______。
fun(float x)
{float y;
y=3*x-4;
Return y;
}
A)int B)不确定 C)void D)float
答案:A
评析:c语言中如果函数前不加任何数据类型时,缺省函数的类型为整型,函数的类型就是函数返回值的类型。
(28)以下选项中,非法的字符常量是 ______。
A)’\t’ B)’\17’ C)”\n” D)’\xaa’
答案:C
评析:C语言中字符常量是以单引号括起来的单个字符,或为以“\”与三位八进制数值或两位十六进制数值代替单个字符。
(29)以下程序的输出结果是______ 。
#include<stdio.h>
main()
{
int a=200;
#define a lOO
printf(“%d”,a);
#undef a
printf (“%dt”,a);
}
A)200 100 B)100100 C)100 200 D)200 200
答案:C
评析:#define宏名的有效范围为定义命令之后到本源文件结束,可以在程序中使用#undef命令终止宏定义的作用域。本题由于#undef的作用,使a的作用范围在#define a 100到#undefa之间,故答案为c。
(30)若有说明:int i,j=2,*p=&i;,则能完成i=j赋值功能的语句是______。
A)i=*p; B)*p=*&j; C)i=&j; D)i=**p;
答案:B
评析:指针是一种用来存放变量地址的特殊变量。本题中指针变量p用于存放整型变量i的地址,改变*p的值即为改变i的值。又因为“&”和“∥两个运算符的优先级别相同,按自右而左的方向结合,所以。&j先进行&j运算,得j的地址,再进行+运算,取所得地址里面的值,故t&j与i等价。
(31)假定int类型变量占用两个字节,若有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是______。
A)3 B)6 C)10 D)20
答案:D
评析:当数组定义后,系统就为其分配内存空间,而不论其中有没有内容。因此,本题中数组x[10]不论是否为其元素初始化,它所分配的存储空间仍为2+10=20个字节。
(32)执行以下的程序段后,m的值是______。
int a[2][3]={{l,2,3},{4,5,6}};
int m,*p;
p=&a[0][0];
m=p[41;
A)4 B)5 C)3 D)不确定
答案:B
评析:程序中定义了一个指向整型变量的指针变量,并对其赋值为二维整型数组a的首元素的地址。P[4]等价于*(p+4),即二维数组a中第四个元素的值,而a是一个2*3的二维数组,其第四个元素为a[1][1],即5。
(33)以下程序的输出结果是______。
main()
{int i,a[10];
for(i=9;i>=O;i–) a[i]=lO-i;
printf(“%d%d%d”,a[2],a[5],a[8]);
}
A)258 B)74l C)852 D)369
答案:C
评析:在本题运行时主要注意的是当i=9时,a[i]=10-9=1;i=8时,a[i]=10-8=2;i=7时,a[i]=10-7=3:……依此类推,,直到i=0时,a[i]=10-0=10;此时,i的值已变为.1,判断for的循环条件,不成立,然后输出a[2],a[5],a[8]分别为8,5,2。
(34)下面程序的输出结果为______ 。
#include<string.h>
main()
{
char pl[7]=”abc”,p2[]=”ABC”,str[50]= “xyz”;
strcpy(str,strcat(pl,p2));
printf(“%s”,str);
}
A)xyzabcABC B)abcABC C)xyzabc D)xyzABC
答案:B
评析:strcpy(strl,s1):作用是将字符串s1拷贝到字符数组strl中去。strcat(字符数组1,字符数组2):把。字符串2接到字符串l的后面,结果放在字符数组1中,函数调用后返回字符数组l的地址。
本题定义了三个字符数组pl,p2,str,strcat(p1,p2)函数的作用是将字符串数组p2接到字符串p1的后面,结果放在字符数组p1,再通过sffcpy()函数将该字符串拷贝到str数组中,原str数组中的字符串xyz被覆盖,因此打印输出字符串str即可得到abcABC。
(35)以下数组定义中不正确的是______。
A)int a[2Ⅱ3]; B)int b[][3]={0,1,2);
C)int c[100][100]={0}; D)int d[3][]={{l,2},{l,2,3},{1,2,3,4}};
答案:D
评析:一维数组的定义方式为:
类型说明符数组名[常量表达式];
选项A符合此定义形式,正确;c语言中多维数组赋初值时可以部分赋值,也可以不指定除第一维以外的其它维的大小,故选项c正确;另外,如果对全部数组元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省,所以选项B正确,而选项D是错误的。
(36)以下程序的输出结果是______。
main()
{ jnt 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
评析:对未给出初始值的整数数组元素,被缺省初始化为零。
(37)在说明语句:int *f();中,标识符f代表的是______。
A)一个用于指向整型数据的指针变量 B)一个用于指向一维数组的行指针
C)一个用于指向函数的指针变量 D)一个返回值为指针型的函数名
答案:D
评析:带回指针值的函数,其一般定义形式为:
类型标识符 *函数名(参数表);
例如:int *f(x,y);
其中,f是函数名,调用它以后能得到一个指向整型数据的指针(地址),x,y是函数f的形参。在f的两侧分别为。运算符和()运算符,而()优先级高于s,因此f先与()结合,显然是函数形式。这个函数前面有一个。,表示此函数是指针型函数(函数值是指针)。前面的int表示返回的指针指向整型变量。
(38)以下程序的输出结果是______。
main()
{ char st[20]= “hellot”;
printf(“%d%d\n”,strlen(st),sizeof(st));
}
A)99 B)520 C)1320 D)2020
答案:B
评析:c语言中字符串是以‘\0’字符结束的,且strlen()函数计算的是‘\0’字符前的所有字符的个数。本题中strlen(st)应为5。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。sizeof()函数是计算变量或数组的所分配到的内存空间的大小。所以本题的sizeof(st)为20。
(39)下面程序运行后的输出结果是______。
int d=1:
fun(int p)
{ static int d=5;d+=p;
printf(“%d”,d);return d;
}
main()
{int a=3;printf(“%d\n”,fun(a+fun(d)));}
A)6 9 9 B)6 69 C)6 15 15 D)6 6 15
答案:C
评析:静态局部变量在编译时赋初值,即只赋初值一次,在程序运行时它已有初值。以后每次调用时不再重新赋初值而只是保留上次函数调用结束时的值,而对自动变量赋初值,不是在编译时进行的,而在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
本题在程序开头定义了全局变量d并赋初值1,在被调函数fun()中,定义了静态局部变量d,初值为5。在第一次调用函数fun时,d初值为5,p由主函数传递过来的值为1,则d=d+p=5+l=6,由于d是静态局部变量,在函数调用结束后,它仍保留d=6。再次调用fun函数,d的初值为6,而由主函数传递的p的值为9,则此时d=d+p=6+9=15,最后打印输出d的值并返回主函数。
(40)以下选项中,不能正确赋值的是______。
A)char s1[10];sl=”chest”; B)char s2[]。{’C’,’t’,’e’,’s’,’t’);
C)char s3[20]= “Chest”; D)char*s4=”Ctestn”’
答案:A
评析:c语言中不能将字符串常量直接赋给数组。但在赋初值时可以。
(41)以下程序输出正确的是______。
alnovep(int *p,int(*a)[3],int n)
{int i,j;
for(i=0;i<n;i++)
for(j=0 ;j<n;j++){ *p=a[i][j];p++;}
}
main()
{int *p,a[3][3]={{1,3,5},{2,4,6}};
p=(int*)malloc(100);
amovep(p,a,3);
printf(”%d%d\n”,p[2],p[5]);free(p);
}
A)56 B)25 C)34 D)程序错误
答案:A
评析:本题main函数中定义了指针p和二维数组a,通过函数amovep将数组的值存入指针p所指向的存储单元中,a的各元素分别为:a[0][0]=l,a[0][1]=3,a[0][2]=5,a[1][0]=2,a[l][1]=4,a[1][2]=6,a[2][O]=0,a[2][1]=0,a[2][2]=0a
通过malloc()函数给指针分配内存空间,free()函数用于释放指针变量所用内存空间。在主函数中通过amovep(p,a,3)调用函数amovep,使得实参p与形参p,实参数组a与形参中指向数组的指针变量共用同一存储空间。最后输出p[2],p[5]为56。
(42)下面程序的输出结果是______。
#define a 121
const b=12:
enum c{a1,a2};
main()
{
printf(”%d,%d,%d.”,sizeOf(a),sizeOf(b),sizeof(enum C));
}
A)121,0,4 B)2,2,2 C)0,2,4 D)0,2,2
答案:B
评析:sizeof函数是取变量所占的存储空间的字节数,标识a代表常量121;const b=12;,其中数据类型可以缺省,默认为整型;enum c{al,a2};定义了一个枚举类型enum c,al,a2为枚举元素,在c编译时,对枚举元素按常量处理,它们的值按定义顺序依次为0,1。因此它们的字节数均为2,2,2。
(43)以下程序的输出结果是______。
struct HAR
{int x,y;struct HAR *p;} h[2];
main()
{ h[0].X=1; h[O].y=2;
h[1].x=3;h[1].y=4;
h[0].p=&h[1];h[1].p=h;
printf(”%d%dn”,(h[O].p)->x,(h[1].p)->y);
}
A)12 B)23 C)14 D)32
答案:D
评析:本题中是一个含有两个结点的循环链表。
c语言中结构体的定义为:.
struct结构体类型名
{
成员项表:
};
(44)变量a所占的内存字节数是______ 。
A)4 B)5 C)6 D)8
Union U
{ char st[4];
Int i:
Long l;
};
Struct A
{ int c;
Union U u;
}a;
答案:C
评析:结构体变量所占内存长度是各成员占内存长度之和,而共用体变量所占的内存长度等于最长的成员的长度。本题结构体变量a中成员c为整型占2个字节,共用体变量u最大长度为4个字节,故选C。
(45)以下程序的结果是______。
int a,b;
void fun()
{ a=100;b=200;)
main()
{int a=5,b=7;
fun();
printf(”%d%d\n”,a,b);
}
A)100200 B)57 C)200100 D)75
答案:B
评析:全程变量是可以在子函数中对其值作改变,且它也可作为函数间的值传递。但当函数或子函数中定义了与全程变量名称相同的局部变量,则全程变量将被屏蔽。
(46)以下程序的输出结果是______。
#define M(x,y,z) x*y+z
main()
{ int a=l,b=2,c=3;
printf(”%d\n”,M(a+b,b+c,c+a));
}
A)19 B)17 C)15 D)12
答案:D
评析:c语言的宏定义包括不带参数的宏定义与带参数的宏定义。本题为带参数的宏定义,其形式为:#define宏名(形参表) 字符串,本题的M(a十b,b+c,c+a)被字符串a+b*b+c+c+a代替。
(47)若有以下说明和语句:
struct st
{int n;char *ch;);
struct st a[3]={5,”abc”,7,”def’,9,”ghK”},*p=a;则值为6的表达式是______。
A)p++ ->n B)p一>n++ C)(*p).n++ D)+十p->n
答案:D
评析:根据结构变量的存储特点,p+l意味着增加地址值为结构体数组a的一个元素所占的字节数,‘即p++使p由a[0]指向a[1]起始地址。本题++p>n得到p指向的结构体变量中成员n的值使之加l。因为p指向数组a起始地址,p->n的值为5,再执行自加l运行,结果为6。
(48)整型变量x和Y的值相等,且为非O值,则以下选项中结果为0的表达式是______。
A)x||Y B)X|Y C)X&Y D)X^Y
答案:D
评析:“‖”为或运算符,当其左右表达式中只要一个为非零则整个表达式的值1。︱是按位或,&是按位与,^是按位异或,这三位运算符是按值的二进制位来比较的。
(49)C语言中,组成数据文件的成分是______。
A)记录 B)数据行 C)数据块 D)字符(字节)序列
答案:D
评析:c语言中的文件是流式文件。流式文件是一种无结构文件,即整个文件是一串字符流或二进制流。文件的存取以字符或字节为单位。
(50)下面的程序执行后,文件test.t中内容是______。
#include<stdio.h>
void fun(char *fname,char *st)
{ FILE *myf;int i;
myf=fopen(fname, “w”);
for(i=0;i<strlen(st);i++)fputc(st[i],myf);
fclose(myf);
}
main()
{fun(“test.t”,”new world”);fun(“test.t”,”hello,”);}
A)hello, B)new worldhello C)new world D)hello,rid
答案:A
评析:c语言中文件有文本文件与二进制文件,对文件的使用前必须先打开,打开方式有只读、写入、读写等方式。
二、填空题(每空2分,共40分)
请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
(1)实现算法所需的存储单元多少和算法的工作量大小分别称为算法的 【1】 。
答案:【1】空间复杂度和时间复杂度
评析:算法的复杂性是指对一个在有限步骤内终止算法和所需存储空间大小的估计。算法所需存储空间大小是算法的空间复杂性,算法的计算量是算法的时间复杂性。
(2)数据结构包括数据的逻辑结构、数据的 【2】 以及对数据的操作运算。
答案:【2】存储结构
评析:数据结构包括3个方面,即数据的逻辑结构、数据的存储结构及对数据的操作运算。
(3)一个类可以从直接或间接的祖先中继承所有属性和方法。采用这个方法提高了软件的 【3】 。
答案:【3】可重用性
评析:继承的优点:相似的对象可以共享程序代码和数据结构,从而大大减少了程序中的冗余,提高软件的可重用性。
(4)面向对象的模型中,最基本的概念是对象和 【4】 。
答案:【4】类
评析:面向对象模型中,最基本的概念是对象和类。对象是现实世界中实体的模型化;将属性集和方法集相同的所有对象组合在一起,可以构成一个类。
(5)软件维护活动包括以下几类:改正性维护、适应性维护、 【5】 维护和预防性维护。
答案:【5】完善性
评析:软件维护活动包括以下几类:改正性维护、适应性维护、完善性维护和预防性维护。完善性维护是指为了满足用户对软件提出的新功能与性能要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维护性。
(6)语句:X++;、++X;、X=X+1;、X=l+X;,执行后都使变量X中的值增l,请写出一条同一功能的赋值语句(不得与列举的相同) 【6】 。
答案:【6】X+=1:
评析:在c语言中使变量增l的方法有:自增运算符与赋值语句。其中自增运算符有前置与后置方式,赋值语句也有两种类型。
本题中的主要增l方式有:x++;、++x;、X=X+I;、x=1+x;、x+=l;。
(7)设Y是int型变量,请写出判断Y为奇数的关系表达式 【7】
答案:【7】Y%2==1 或Y%2!=0
评析:判断变量是否为奇数可以用变量与2取模,判断结果是为1或不为0。本题具体做法如下:Y%2==1或Y%2 1=0。
(8) 以下程序的输出是 【8】 。
main()
{
char strl[]=”How do you do”,*pl=strl:
strcpy(strl+strlen(strl)/2,”es she”);
printf(“%s\n”,p1);
}
答案:【8】How does she
评析:strcpy(strl,s1):字符串拷贝函数,作用是将字符串s1拷贝到字符数组strl中去。strlen(str):测试字符串str的长度,函数的值为字符串中实际长度,不包括‘\O’在内。本题中strlen(strll的值为13,则strcpy(strl+strlen(strl)/2,”es she”,);相当于strcpy(strl+6,”es she”);,因此可得答案为How does she。
(9)以上程序运行后的输出结果是 【9】 。
main()
{int i=10,J=0;
do
{j=j+i;i–;}
while(i>2);
printf(“%d\n”,j);
}
答案:【9】52
评析:do...while语句的形式为:
do
{
语句:
}while(条件表达式)
当条件表达式为非零时,继续执行循环体,直到条件表达式为零时退出循环。
(10)设有如下程序:
main()
{int nl,n2;
scanf(“%df”,&n2);
while(n2!=0)
{ nl=n2%lO;
n2=n2/10:
printf(“%d”,n1);
}
}
程序运行后,如果从键盘上输入1298,则输出结果为 【10】 。
答案:【10】8921
评析:本题的程序的功能是将输入的整数反向输出。
(11)以下程序输出的最后一个值 【11】 。
Int ff(int n)
{static int f=1:
f=f*n:
retun f
}
main()
{ int i;
for(i=1;i<=5;i++)printf(“%d\n”,ff(i));
}
答案:【ll】120
评析:
静态变量的类型说明符是static,静态局部变量属于静态存储方式,它具有以下特点:
①静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
②对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
③如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。(注意:c语言中的非静态变量在定义时,系统并不会自动给它赋初值)
④虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
本题中函数的功能是:与for语句一起求一个整数的阶乘。
(12)以下函数的功能是:求x的y次方,请填空.
double fun(double x,int y)
{int i;
double z;
for(i=1,z=x;i<y;i++)z=z* 【12】 ;
return z:
)
答案:【12】x
评析:函数的定义形式为:
函数类型函数名(形参表)
{
类型说明语句;
执行语句:
}
本题中函数的功能是:累积变量以求得变量的Y次方。
(13)下列程序的输出结果是 【13】 。
main()
{
int a[]={2,4,6},*ptr=&a[0],x=8,y,z;
for(y=O;y<3;y++)
z=(*(ptr+y)<x)?*(ptr十y):x;
printf(”%d\n”,z);
}
答案:【13】6
评析:条件运算符的优先级高于赋值运算符,因此本题先计算关系表达式(*(ptr+y)<x)?*(ptr+y):x的值,再赋给变量z。当y=O时,*(ptr+y)=2,而x=8,(*ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=2,所以Z=2;当y=l时,*(ptr+y)=4,(*(pty+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=4,所以z=4;当y=2时,*(ptr+y)=6,(*(ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=6,所以z=6;循环结束。因此输出z的结果为6。
(14)以下程序运行后的输出结果是 【14】 。
main()
{ char s[]=”9876”,*p;
for(p=s;p<s+2;p++)printf(“%s\n”,p);
}
答案:【14】9876
876
评析:指针是一种数据类型,这种数据类型的变量用来存放内存中分配的存储单元的首地址。
指针的定义:
类型说明符 *指针变量名;
(15)若有定义语句:char s[100],d[100];int j=0,i=0;且s中已赋字符串,请填空以实现拷贝。(注:不使用逗号表达式)
while(s[i]){d[j]= 【15】 ;j++;}
d[j]=0;
答案:【15】s[i++]
评析:本题中为了能实现字符串的拷贝,需要使字符数组s从头到尾依次遍历其所有元素。本题应使用i的自增后置来实现。
(16)若有如下结构体说明:
struct STRU
{ int a,b;char c:double d:
struct STRU *pl,*p2;
};
请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。
【16】 t[20]
答案:【16】struct STRU
评析:结构体类型是构造数据类型,是用户自己定义的一种类型。
结构体类型的定义:
struct结构体类型名
{
成员项表:
};
定义结构体变量的的形式为:
struct结构体类型名 变量1,变量2,...
其中变量包括:一般变量、指针变量、数组变量等。
(17)下面的程序可对指定字符串中的字符串进行从大到小排序,请将程序填完整(注:程序采用了冒泡排序算法)
#include<stdio.h>
#include<string.h>
main()
{ char *str=”ABCDabcd”,temp;
Int n,i;
n=strlen(str);
while(n–>1)
for(i=0;i<n;i++)
if(str[i]<str[i+1])
{ temp=【17】 ;
str[i]=str[i+1];
_【18】 =temp;
}
Printf(_【19】 );
}
答案:【17】str[i]
【18】str[i+1]
【19】“%s”,str
评析:本题要求将字符串str中的字符用冒泡排序算法从大到小排列,其实现过程是将相邻两个字符进行比较,如果当前字符小于下一个字符,则通过中间变量temp将字符两两交换,所以第一空应填:str[i],第二空应填:str[i+1]。最终打印输出得到的字符串str,所以第三空应填;“%s”,str。
(18)以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文件末尾,然后调 用ftell函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。
FILE *myf;long fl;
myf=_【20】 (“test.t”,”rb”);
fseek(myf,(),SEEK_END);fl+ftell(myf);
fclose(myf);
printf(”%l d\n”,f1);
答案:【20】fopen
评析:C语言中的文件分为:ASCII文件与二进制文件。文件在使用前打开,使用后要关闭。
打开文件的函数为:fopen(),调用形式为:fp=fopen(“文件名”,“使用文件方式”);
关闭文件的函数为:fclose(),调用形式为:fclose(fp);其中fp为文件指针。



