一、选择题 下列各题A) 、B) 、C) 、D) 四个选项中,只有一个选项是正确的。
16. 以下程序输出的结果是_______。
main()
{
int a=65535;
printf("%d%u",a,A) ;
}
A.-1-1 B.65535 65535 C.-1 65535 D.65535-1
A B C D
C
[解析] printf函数中不同类型的数据用不同的格式字符,其中%d是按整型数据的实际长度输出十进制整数。变量a=65535以%d格式输出时溢出输出值为该数的补码值,即-1:%u用来输出unsigned型数据,无符号整型变量的数值范围为0~ 65535,所以变量a=65535以%u格式输出的值为65535。
18. 以下程序的输出结果是_______。
main()
{ int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1];
for(i=0;i<4;i+=2)printf("%d",p[i]);
}
A B C D
C
[解析] 题中*p=&x[1][1];是指将数组x的数组元素x[1][1]的地址赋值给指针变量p,使p指向x[1][1]这个数组元素,那么 p[0]即为指针变量p当前所指向的数组元素x[1][1]的值。
20. 以下程序的运行结果是_______。
#include "stdio.h"
main()
{
int a[]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a+5,*q=NULL;
*q=*(p+5);
printf("%d %d\n",*p,*q);
}
A B C D
A
[解析] 题目中没有给q分配存储单元,只是简单的给它赋了一个值,所以程序的运行结果是6 11 NULL pointer assignment,也就是运行后报错。
22. 有如下程序
float fun (int x,int y){return(x+y);}
main()
{
int a=2,b=5,c=8;
printf("%3.Of\n",fun((int)fun(a+c,B) ,(a-C) ))
}
程序运行后的输出结果为_______。
A B C D
B
[解析] 本题中先执行(int)fun(a+c,b)函数的调用,值为整型数值15;然后再执行fun(15,(a-c))函数调用,值为单精度实型数值9.000000。输出为%3.of,即有效数长度为3,没有小数位数,所以最后结果为9。
25. 以下程序的输出结果是_______。
main()
{ int a=-1,b=1,k;
if(++a<0)&&!(b-<=0))
printf("%d %d\n",a,b) ;
else
printf("%d %d\n",b,a) ;
}
A B C D
C
[解析] 逻辑运算符的优先次序如下:!(非)→&&(与)→||(或),但本题特别注意的是短路的概念。
26. 下面程序的输出结果是_______。
#define P1(x)printf(x)
main()
{
char d[]="p";
P1(d) ;
P1("d");
}
A B C D
A
[解析] 带参数的宏定义的一般形式为:#define宏名(参数表)字符串程序中的P1(d);经宏置换后为printf(d);,所以输出字符串p;程序中的P1("d");经宏置换后printf("d")。
28. 请读程序:
#include<stdio.h>
#include<string.h>
main()
{
char*s1="AbCdEf",*s2="aB";
s1++;s2++;
printf("%d\n",strcmp(s1,s2));
}
上面程序的输出结果是_______。
A B C D
A
[解析] strcmp(X1,X2)是串比较函数,本题中“s1”、“s2”分别表示这两个串中第一个字符的地址,s1++和s2++是将指针指向串的第二个字符,则*s1为“bCdEf”,*s2为“B”。在字符串比较中,划、的确定是各个字符串相应位置字符的ASCII码值的大小决定的, s1>s2,返回值为正数。
29. 请读程序:
#include<stdio.h>
main()
{
int a=5,b=7,c=9;
pintf("%d,%d,"a,b,C) ;
printf("%d,%d",a,D) ;
}
上面程序的输出结果是_______。
A.5,7,9,5,7 B.5,7,5,7 C.5,7,不定7,9 D.5,7,5,7,不定
A B C D
D
[解析] printf函数按格式控制符的个数输出表列中对应的数据,若输出表列的个数大于格式控制符个数,则输出与格式控制符对应的输出表列的数据,输出表列中多的则省略;若格式控制符个数大于输出表列的个数,则输出与格式控制符对应的输出表列的数据,格式控制符多的部分输出的数据是随机的。
30. 请读程序:
#include<stdio.h>
func(int a,int b) {
int c;
c=a+b;
return c;
}
main(){
int x=6,y=7,z=8,r,
r=func((x-,y++,x+y),z-);
printf("%d\n",r);
}
上面程序的输出结果是_______。
A B C D
C
[解析] 函数func()的作用是返回两个形参的和,第一个形参是x、y分别自减和自增后的和,其中(x-,y++,x+y)是一个逗号表达式,它的值应该等于x+y,所以整个表达式(x-,y++,x+y)的值为13,而第二个形参的值为8(根据语法规则,应当先使用,后自增),所以func()的返回值为13+8=21。
31. 请读程序:
#include<stdio.h>
main()
{
int a,b;
for(a=1,b=1;a<=100:a++){
if(b>=20)break;
if(b%3=1”{b+=3;continue;}
b=5;
}
printf("%d\n",A) ;
}
上面程序的输出结果是_______。
A B C D
B
[解析] break语句的作用是用刊曲循环体;Continue语句的作用是用于跳出本次循环。执行第一次循环时,(b%3=1)为真,b=4,继续下一次循环,如此反复,当b=22时结束循环,共循环8次,即a=8。
34. 运行以下程序后,如果从键盘上输入china#<回车>,贝愉出结果为_______。
#include<stdio.h>
main()
{
int v1=0,v2=O;char ch;
while((ch=getchar())!='#')
switch(ch)
{
case'a':
case'h':
default:v1++;
case'O':v2++;
}
printf("%d,%d\n",v1,v2);
}
A B C D
C
[解析] 执行完一个case后面的语句后,流程控制移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
37. 请选出以下程序的输出结果_______。
#include<stdio.h>
sub(int*s,inty)
{ static int t=3,
y=s[t];t-;
}
main()
{ int a[]={1,2,3,4},i,x=0;
for(i=0;i<4;i++){
sub(a,x);printf("%d",x);}
printf("\n");
}
A B C D
C
[解析] x作为函数sub()的实参时,函数对x值的改变没有返回主函数,并不能使得x的值变化,所以在打印时,x的值是始终不变的,即为0。
38. 假定下面程序可执行文件名prg.exe,则该程序所在的子目录下输入命令行:prg hello good<回车>后,程序的输出结果是_______。
main(int argc,char*argv[])
{
int i;
for(i=1;i<argc;i++)printf("%c",argv[i]);
}
A.hello good B.hg C.hel D.hellogood
A B C D
B
[解析] 带参数的main()函数常用形式为:main(int argc,char*argv[]),其中,整型变量argc用来记录命令行中的参数个数。参数的个数由C程序运行时自动计算出来。字符型指针数组argv的第一个元素存放命令名,其后各个元素依次存放命令行中各个参数的首地址,数组的大小由argc确定。for循环语句实现输出各参数的第一个字母。
42. 设有如下定义
struct ss
{ char name [10];
int age;
char sex;
}std[3],*p=std;
下列各输入语句中错误的是_______。
A.scanf("%d",&(*p).age); B.scanf("%s",&std.name); C.scanf("%c",&std[0].sex); D.scanf("%c",&(p->sex));
A B C D
B
[解析] 在C语言中,结构体变量的引用有三种等价方式: 1、结构体变量成员名;2、(*p).成员名;3、p->成员名。 因为std.name是字符数组名,本身代表地址,其前面不应该使用“&”符号,所以选项B错误。
45. 以下程序的输出结果是_______。
#include<stdio.h>
main()
{ int i;
for(i=1;i<5;i++){
if(i%2)printf("*");
else continue;
printf("#");
}
printf("$\n");
}
A.*#*#*#$ B.#*#*#*$ C.*#*#$ D.#*#*$
A B C D
C
[解析] 当i不可以整除2时打印“*”然后打印“#”,不能整除2则执行continue,跳挝printf("#");语句,结束本次循环,返回到循环的起始点。当循环结束后,打印“$”。
47. 有以下程序
#include<stdio.h>
main()
{ int c;
while((c=getchar())!='\n'){
switch(c-'2'){
case O:case1:putchar(c+4);
case 2:putchar(c+4);braeak;
case3:putchar(c+3);
default:putchar(c+2);break;}
}
}
从第一列开始输入以下数据,↓代表一个回车符。
2473↓
程序的输出结果是_______。
A.668977 B.668966 C.66778777 D.6688766
A B C D
A
[解析] getchar()函数是从键盘接受一个字符输入;当用户键入的字符不是回车符时,会进入一个多分支选择语句,根据 C-'2'的值进行分支选择;putchar()是在屏幕上打印一个字符,最后的结果应当为668977。
48. 下面程序的输出结果是_______。
union un
{ int a[4];
long b;
char c[6];}
main()
{
union un u;
printf("%d%d",sizeof(u),sizeof(uA) );
}
A B C D
B
[解析] sizeof函数计算已知类型所占的字节数。共用体变量所占的内存长度等于最长的成员的长度。
49. 以下程序的输出结果是_______。
main()
{ int w=5;fun(w);printf("\n");}
fun(int k)
{ if(k>0) fun(k-1);
printf("%d",k);
}
A.5 4 3 2 1 B.0 l 2 3 4 5 C.1 2 3 4 5 D.5 4 3 2 1 0
A B C D
B
[解析] 函数的递归调用就是在调用一个函数的过程中又出现直接或间接地调用该函数本身。fun函数共被调用6次,即 fun(5)、fun(4)、fun(3)、fun(2)、fun(1)、fun(O)。其中fun(5)是main函数调用的。
二、填空题 请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
1. 算法的复杂度主要包括时间复杂度和
复杂度。
空间
[解析] 习惯上常常把语句重复执行的次数作为算法运行时间的相对量度,称作算法的时间复杂度。算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度。
2. 数据的物理结构在计算机存储空间中的存放形式称为数据的
。
内模式 或 物理模式 或 存储模式
[解析] 一个数据库只有一个内模式,它是数据物理结构和存储方式的描述,是数据库内部的表示方法。例如,记录的存储方式是顺序存储、索引按照什么方式组织;数据是否压缩存储,是否加密等。
3. 若按功能划分,软件测试的方法通常分为
测试方法和黑盒测试方法。
白盒
[解析] 软件测试的方法有三种:动态测试、静态测试和正确性证明。设计测试实例的方法一般有两类:黑盒测试方法和白盒测试方法。
4. 数据库三级模式体系结构的划分,有利于保持数据库的
。
数据独立性
[解析] 数据库的三级模式体系结构把数据的组织管理工作进行了划分,把数据的具体组织留给DBMS管理,使用户能逻辑地、抽象地处理数据,而不必关心数据在计算机中的具体表示方式与存储方式,保证了数据的独立性。
5. 在关系运算中,查找满足一定条件的元组的运算称之为
。
选择
[解析] 在关系数据库中,选择运算也是一个元运算,关系R通过选择运算(并由该运算给出所选择的逻辑条件)后仍为一个关系。这个关系是由R中的那些满足逻辑条件的元组所组成。
6. 在C语言中(以16位PC机为例),一个float型数据在内存中所占的字节数为4:一个double型数据在内存中所占的字节数为
。
8
[解析] 在一般16位PC机中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节。
7. 设有以下变量定义,并已赋确定的值,
char w;int x;floaty;double Z;
则表达式:w*x+z-y所求得的数据类型为上
。
double型 或双精度型
[解析] ①先进行w*x的运算,先将字符型w转换成整型,运算结果为整型;②再将w*x的结果与z相加,要先将第一步的整型转换为double型,运算结果为double型;③最后将w*x+z的结果与y相减,要先将float型y转换成double型,结果为double型。
8. 若运行时给变量x输入12,则以下程序的运行结果是
;
main(){
int x,y;
scanf(""%d"",&x);
y=x>12?x+10:x-12;
printf(""%d\n"",y);
}
0
[解析] 三目运算符的形式为(表达式1)?(表达式2):(表达式3)。当(表达式1)值为真时,返回(表达式2)的值;为假时,返回(表达式3)的值。题中因为x>12为假,所以结果为x-12,即为0。
9. 四条语句:x++;、++x;、x=x+1;、x=1+x;,执行后都使变量x中的值增1,请写出一条同一功能的赋值语句(不得与列举的相同)
。
x+=1;
[解析] 题面中的四条语句的作用是使x的值加1,在C中有多种方法可以对变量进行加1操作,这里可以利用C的复合赋值运算符+=实现,本题答案为x+=1;。
10. 设有以下定义和语句,则*(*(P+2)+1)的值为
。
int[3][2]={10,20,30,40,50,60},(*p)[2];
p=a;
60
[解析] 本题定义了一个3行2列的二维数组a,并定义了一个指向两个元素的一维数组指针p,让p指向二维数组a的首行。*(*(p+2)+1)是引用a[2][1],其值是60。
11. 若要使指针p指向一个double类型的动态存储单元,请填空。
p=
malloc(sizeof(double));
(double*)
[解析] 函数malloc返回的是void*, 所以若要使指针指向一个double类型,则必须进行类型转换,类型转换格式为:(数据类型*)。
12. 下面程序的功能:输出100以内能被3整除且个位数为6的所有整数,请补充完整。
main()
{ int i,j;
for(i=0;
;i++)
{ j=i*10+6;
if(
)continue;
printf("%d",j);
}
}
[12] i<10 [13]i%3!=0
[解析] 本题要求输出100以内能被3整除且个位数为6的所有整数,程序中j=i*10+6;语句是求个位数为6的整数,由此可得出程序的循环次数为i<10。然后通过if语句判断整数是否能被3整除,若不能则继续下一次循环,若能则输出该整数,所以逻辑表达式为j%3!=0。
13. 函数mycmp(char*s,char*t)的功能提比较字符串s和t的大小,当s等于t时返回0,当s>t返回正值,当s<t时返回负值。请填空。
mycmp(char*s,char*t)
{ while(*s==*t)
{ if(*s=='\0')return0;
++s;++t;
}
return(
)
}
*s-*t 或 -*t+*s
[解析] 函数的两个形参是两个字符指针变量,字符串的首地址是指针变量的值,*s和*t表示字符串数组s和t的第一个字符,在while循环中,是通过s和t值的不断变化来改变指针所指向的字符,要改变s和t所指不同字符的ASCII码的差值,必须使用“*s-*t”得出。
14. 以下程序运行后的输出结果是
。
void fun()
{
static int a=0;
a+=2;printf("%d",A) ;
}
main()
{ int cc;
for(cc=1;cc<4,cc++)fun();
printf("\n");
}
2 4 6
[解析] static声明的外部变量只限于被本文件引用,而不能被其他文件引用。用static来声明一个变量的作用有:①对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在;②全部变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。
15. 下列程序的运行结果是
。
main()
{ union EXAMPLE
{ struct
{ int x;int y;}in;
int a;
int b;
} e:
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf("%d,%d\n",e.in.x,e.in.y);
}
4,8
[解析] C语言规定,共用体中各个成员变量在内存中占用同一段内存单元,即e.in.x和e.a、e.b占用同一段内存单元,由于e.in.x和e.a、e.b占用的是同、段内存单元,所以程序最后的打印结果为“4,8”。
16. 在对文件进行操作的过程中,若要求文件的位置回到文件的开头,应当调用的函数是
函数。
[NN]rewind或fseek
[解析] 在对文件进行操作的过程中,若要求文件的位置回到文件的开头,可以调用rewind或fseek函数。其中rewind函数的作用是将位置指针重新返回文件的开头,而fseek函数可以实现文件指针的定位。
17. 以下函数用于求出一个2×4矩阵中的最大元素值。
max_value(arr)
int arr[][4];
{
int i,j,max;
max=arr[O][0];
for(i=0;i<2;i++)
for(j=0;
;j++)
if(
>max)max=
;
return(max);
}
[18] j<4 [19] arr[i][j] [20] arr[i][j]
[解析] 2*4矩阵实际上就是一个二维数组,结合本题应为arr[2][4],所以在第一个循环中应当填写“4”;第二个横线处是要判断当前的数组元素值是否大于max,所以应填写arr[i][j];第三个横线处是要将当前大于max的数组元素的值赋给变量max,所以应当填写“arr[i][j]”。