(28)已定义以下函数:
fun(char*p2,char*p1)
{while((*p2=*p1)!='\0'){pl++;p2++;}}
函数的功能是__________。
A)将p1所指字符串复制到p2所指内存空间
B)将pl所指字符串的地址赋给指针p2
C)对p1和p2两个指针所指字符串进行比较
D)检查p1和p2两个指针所指字符串中是否有'\O'
答案:A
评析:由于在while循环的条件中执行了*p2=*pl运算,其作用是将*pl中的内容复制到*p2中,而(*p2=*p1)!='\0'的作用是判断当前字符是否为字符串结束字符'\O'。在循环体中p1++,p2++的目的是移动字
(29)有以下程序
void fun(char*c,int d)
{*c=*c+1;d=d+1;
printf("%c,%c,",*c,d);
}
main()
{char a:。A',b。'a';
fun(&b,a);printf("%c,%c\n",a,b);
)
程序运行后的输出结果是_________。
A)B,a,B,a B)a,B,a,B C)A,b,A,b D)b,B,A,b
答案:D
评析:将a,b代入函数得+&b=。&b+1=a+l=b,所以打印出第一个字母b;
a=a+l=A+l=B,打印出第二个字符B;
a='A',输出字母A;
b由于是按地址传到函数而被修改,为'b',输出字母b
(30)以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序。
void sort(int a[],im n)
{intiJ,t;
for(i=O;i<n-1;i++)
for=i+1 0<n0++)
if(a[i]<aD)) {t=-a[I];a[I=a[j];a[j]=t;}
}
main()
{int aa[10]:{1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(i=0;i<lO;i++)primf("%d,",aa[I]);
printf("\n");
)
程序运行后的输出结果是________。
A)l,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1,
C)l,2,3,8,7,6,5,4,9,10, D)l,2,10,9,8,7,6,5,4,3,
答案:C
评析:本题并不是对数组的所有元素进行排序,而是对从a[3]开始往后的4个元素进行排序。
(31)对于基类型相同的两个指针变量,不能进行的运算是________。
A)< B)= C)+ D)
答案:C
评析:对于指针变量,除了常规的*、&、=运算外,还可以对其比较地址的大小,计算两指针变量的差值,但对于地址执行+、*、/、%等算术运算都是无意义的。
(32)有以下程序
main()
{char a[]={'a','b','c','d','e','f','g','h','\O'};int I,J;
i=sizeof(a); j=strlen(a);
printf("%d,%d\n",I,J);
}
程序运行后的输出结果是________。
A)9,9 B)8,9 C)1,8 D)9,8
答案:D
评析:sizeof()函数是计算字符数组的长度,因为'\0'也是一个字符,要计算在内。strlen()是计算字符串长度的函数,遇到'\0'即认为是字符串结束,不把空字符计入字符串的长度。
(33)以下不能正确定义二维数组的选项是_________。
A)int a[2][2]={{1},{2}} B)int a[][2]={l,2,3,4}
C)int a[2][2]={{l},2,3} D)int a[2][]={{1,2},{3,4}}
答案:D
评析:在二维数组进行初始化时,可以省略数组的一个维度,但省略的维数只能是高维部分,不能是低维。对于多维数组的初始化时,也是同样处理,因此,本题答案应选D,其它选项均能对数组进行正确的初始化。
(34)有一函数
┏ l x>O
y=┨ O x=O
┗ -1 x<O
以下程序段中不能根据x的值正确计算出y的值的是___________。
A)if(x>O)y=l;else if(x==O)y=0;else y=-l;
B)y=O;if(x>O)y=1;else if(x<O)y=-1;
C)y=0;if(x>=0)if(x>O)y=1;else y=-l;
D)if(x>=0)if(x>O)y=l;else y=O;else y=-1;
答案:C
评析:本题应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if配对。
(35)以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。
void reverse(int a[],im n)
{int i,t;
for(i=O;i<n/2;i++)
{t=a[i];a[i]=a[n-l-i];a[n-1-i]=t;}
}
main()
{int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0;
reverse(b,8);
for(i=6;i<10;i++)s+=b[I];
printf("%d\n",s);
}
程序运行后的输出结果是
A)22 B)10 C)34 D)30
答案:A
评析:本题并不是将整个数组中的内容逆置,而是逆置前8个元素。逆置后的数组为:8,7,6,5,4,3,2,1,9,10通过for循环计算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。
(36)执行下面的程序段后,变量k的值为___________。
int k=3,s[2];
s[0]=k;k=s[1]*10;
A)不确定 B)33 C)30 D)10
答案:A
评析:由于本题中未对数组进行初始化,因此程序运行时,数组s中各个元素的值都是不确定的,虽然在代码中对s[O]进行了赋值,但没有对s[1]进行赋值,故执行l(=s[1]+10;后,k的值不确定。
(37)有以下程序
#include<string.h>
main()
{ char'p="abcde\0fghjik\O";
printf("%d\n",strlen(p));
}
程序运行后的输出结果是__________。
A)12 B)15 C)6 D)5
答案:D
评析:"\0"是字符串结束标志,当遇到此标志时字符串已结束。所以字符串的长度为5。
(38)程序中头文件t)rpel_h的内容是:
#define N 5
#define Ml N*3
程序如下:
#include"type 1.h"
#define M2 N*2
main()
{ int i;
i=MI+M2;
printf("%d\n",i);
}
程序编译后运行的输出结果是_________。
A)lO B)20 C)25 D)30
答案:C
评析:宏定义就是用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:
#define 标识符 字符串
这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为"宏名"。
(39)若有以下的程序段,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是________。
int t[3][3],*pt[3],k;
for(k=0;k<3;k++)pt[k]=&t[k][O];
A)t[2][0] B]t[2][2] C]t[1][2] D]t[2][1]
答案:C
评析:在题面中定义了一个二维数组l,及一个一维指针数组pt,在循环语句中分别对指针数组赋值为二维数组t的第k行首元素的地址。*(pt+1),表示的是数组pt中下标为1的元素的值,而该值为二维数组t的第l行(从第0行算起)的首元素的地址,故*(*(pt+1)+2)表示的是数组t中t[1][2]的元素的值。
(40)以下叙述中错误的是_________。
A)二进制文件打开后可以先读文件的末尾,而顺序文件不可以
B)在程序结束时,应当用fclose函数关闭已打开的文件
C)利用fread函数从二进制文件中读数据,可以用数组名给数组中所有元素读入数 据
D)不可以用FILE定义指向二进制文件的文件指针
答案:D
评析:每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息,这些信息是保存在一个名为FILE的结构体类型的结构体变量中的。而文件又分为ASCII文件和二进制文件,所以,、可以用FILE定义指向二进制文件的文件指针。
(41)有以下程序
#include<string.h>
main(int argc,char *argv[])
{ inti,len=0;
for(i=1;i<argc;i++)len+=strlen(argv[I]);
printf("%d\n",len);
)
程序编译连接后生成的可执行文件是exl.exe,若运行时输入带参数的命令行是:
exl abcd efg 10↙
则运行的结果是________。
A)22 B)17 C)12 D)9
答案:D
评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。argc用于存放命令行中命令字和参数的总和的个数4,argv用来存放命令行中命令字和所有参数的字符串,并规定argv[0]存放命令字字符串exl,argv[1]用来存放第一个参数的字符串abcd,argv[21用来存放第二个参数的字符串e龟,argv[3]用来存放第三个参数的字符串10。那么for循环将循环3次分别将argv数组中元素的长度累加到len中,所以答案为9。
(42)若有以下说明和定义:__________。
fun(*C){…}
main()
{int(*a)()=fun,(*b)(),w[10],c;}
在必要的赋值后,对fun函数调用正确的是_________。
A)a=a(w); B) (*a)(&C); C)b=*b(w); D)fun(b);
答案:B
评析:在主函数中定义了二个指向函数的指针a,b,其中指针a指向函数fun,指针b未初始化。对于选项A、c,其返回类型是错误的,对于D,其调用的参数是错误的,选项B是正确的,其相当于调用函数fhll(&C);。
(43)有以下程序
intfa(intx、
{returnx*x;}
int fb(intxl
{returnX*X*x;}
int f(int(*f1)(),int(*f2)(),int x)
{return f2(x)-fl(x);)
main()
{ int i;
i=f(fa,fb,2);printf("%d\n",i);
}
程序运行后的输出结果是
A) 4 B)1 C)4 D)8
答案:C
评析:f[fa,fb,2]即为fb(2)-fa(2)=2*2*2-2*2=8-4=4。
(44)有以下程序
void ss(char *s,char t)
{while(*s)
{ if(*s==t)*s=t-'a'+'A';
s++:
}
}
main()
{char strl[100]="abcddfefdbd",c='d';
ss(strl,C); printf("%s\n",strl);
}
程序运行后的输出结果是_________。
A)ABCDDEFEDBD B)abcDDfefDbD
C)abcAAfefAbA D)Abcddfefdbd
答案:B
评析:在主函数中因为c被赋值为字符'd.,所以函数的功能是将字符串中d字母转换为大写。
(45)下面程序运行后的输出结果是__________。
intf()
{
static int i=O:
int s=l:
s+=i;i++;
return s:
}
main()
{
inti,a=0;
for(I=0;i<5;i++)a+=f();
printf("%dha",a);
)
A)20 B)24 C)25 D)15
答案:D
评析:在主函数main中,当I=0时,f()返回1;当I=1时,f()中保留前次执行后的i,返回2,i为n时;f()返回n+l,,在主函数main中一共调用了5次f(),其返回值分别是1,2,3,4,5,对各次的返回值进行累加,其和为15。
(46)设有如下定义:
struct sk
{int a;
float b:
}data;
int*p;
若要使p指向data中的a域,正确的赋值语句是_________。
A)p=&a; B)p=data.a; C)p=&data.a; D)*p。data.a
答案:C
评析:将data.a的起始地址赋给指针变量p,也就是使p指向data.a。
(47)有以下程序
#include<stdlib.h>
struct NoDE
{int num;struct NoDE。next;}
main()
{struct NODE *p,*q,*r;
p=(struct NoDE*)malloc(sizeof(struct NODE));
q=(struct NODE*)malloc(sizeof(struct NODE));
r==(struct NODE*)malloc(sizeof(struct NODE));
p->num=10;q->num=20;r->num=30;
p->next=q;q->next=r;
pdntf("%d\n",p->num+q->next->num);
}
程序运行后的输出结果是____________。
A)10 B)20 C)30 D)40
答案:D
评析:p->num即为10,q->next->num即为r->num,为30,所以p->num+q->next=>num=10+30=40。
(48)若有以下说明和定义
typedef int *INTEGER
INTEGER p,*q;
以下叙述正确的是________。
A)p是int型变量 B)p是基类型为int的指针变量
C)q是基类型为int的指针变量 D)程序中可用INTEGER代替int类型名
答案:B
评析:typedef int*INTEGER;(声明INTEGER为整型指针类型):
INTEGER p,*q;(定义p,*q为整型指针类型),所以p是基类型为int的指针变量;*q是基类型为int的指针变量;程序中可用*INTEGER代替int类型名。
(49)有以下程序
main()
{unsigned char a,b,c;
a=0x3;b=a︱0x8;c=b<<l;
printf("%d%d\n",b,C);
}
程序运行后的输出结果是___________。
A)-11 12 B)-6 -13 C)12 24 D)l1 22
答案:D
评析:0x3表示16进制表,"︱"为按位或,"<<"为按位左移,将a,b转换为二进制数进行位运算,再将结果以十进制打印出,结果为11 22。
(50)以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。
#include<string.h>
void f(char p[][lO],int n)
{chart[201;int ij;
for(i=0;i<n-1;i++)
for 0=i+l;j<n;j++)
if[strcmp(p[i],p[j])<O]
{strcpy(t,p[i]);strcpy(p[i],pD)};strcpy(p[j],t);)
}
main()
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i;
f(p,5);print"%d\n",strlen(p[0]));
}
程序运行后的输出结果是__________。
A)6 B)4 C)5 D)3
答案:C
评析:比较字符串的大小是从字符串的第一个字母开始比较,如果第一个字母相同则比较第二个字母,以此类推,直至字符串结束。
二、填空题(每空2分,共40分)
请将每一个空的正确答案写在答题卡的【l】至【20】序号的横线上,答在试卷上不得分。
(1)测试的目的是暴露错误,评价程序的可靠性;而 【1】 的目的是发现错误的位置并 改正错误。
答案:【1】调试
评析:软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定:调试是一个与测试有联系又有区别的概念。具体来说,测试的目的是暴露错误,评价程序的可靠性,而调试的目的是发现错误的位置,并改正错误。
(2)在最坏情况下,堆排序需要比较的次数为 【2】 。
答案:【2】O(nlog2n1)
评析:在最坏情况下,冒泡排序所需要的比较次数为n(n-1)/2;简单插入排序所需要的比较次数为n(n-1)/2;希尔排序所需要的比较次数为O(n^1.5);堆排序所需要的比较次数为O(nlog2n)。
(3)若串s="Program,,,则其子串的数目是 【3】 。
答案:【3】29
评析:串s中共有7个字符,由于串中字符各不相同,则其子串中字符个数为0的串有1个,即空串;字符个数为1的字符串有7个;字符个数为2的字符串有6个;字符个数为3的字符串有5个;字符个数为4的字符串有4个;字符个数为5的字符串有3个;字符个数为6的字符串有2个;字符个数为7的字符串有1个;共有1+2+3+4+5+6+7+1=29。
(4)一个项目具有一个项目主管,一个项目主管可管理多个项目,则实体""项目主管""与实体""项目""的联系属于 【4】 的联系。
答案:【4】l对多或1:N
评析:两个实体集间的联系实际上是实体集间的函数关系,这种函数关系可以有3种,即一对一(1:1)的联系、一对多(1:N)或多对一(N:1)的联系和多对多(N:N)的联系。
(5)数据库管理系统常见的数据模型有层次模型、网状模型和 【5】 三种。
答案:【5】关系模型
评析:数据库管理系统是位于用户与操作系统之间的一层系统管理软件,是一种系统软件,是用户与数据库之间的一个标准接口,其总是基于某种数据模型,可以分为层次模型、网状模型和关系模型。
(6)以下程序运行后的输出结果是 【6】 。
main()
{ int x=10,y=20,t=O;
if(x==y)t=x;x=y;y=t;
printf("%d,%d\n",x,y);
}
答案:【6】20,0
评析:在本题给出的程序中,if条件为假,不执行t=x;语句,而去执行x=y;和y=t;语句,所以打印出x的值为20,y的值为0;但是如果程序这样写{t=-x;x=y;y=t;},那么就是实现x与y的交换。
(7)若已知a=20,b=lO,则表达式!a>b的值为 【7】 。
答案:【7】O
评析:c语言中逻辑运算符按由高到低顺序依次为:逻辑非(!)、算术运算符、关系运算符、逻辑与(&&)和逻辑或(1f)、赋值运算符。所以表达式!a>b先运算!a的值为0,再运算0>b,所以结果为0。
(8)以下程序运行后的输出结果是 【8】 。
main()
{intx=15;
while(x>10&&x<50)
{x++;
if(x/3){x++;break;)
else continue;
}
print("%d\n",x);
}
答案:【8】17
评析:当x=15时,while条件为真,执行x++;,这时x的值为16,if条件为真,执行x++:后跳出循环体,此时x的值为17a
(9)有以下程序:
#include<stdio.h>
main()
{charc;
while((c=getchar())!d?。)putchat(--C);
}
程序运行时,如果从键盘输入:Y?N?↙,则输出结果为 【9】 。
答案:【9】X
评析:getchar()只能接收一个字符,当从键盘输入Y?N?↙,系统判断出第一个字符Y!='?'条件为真,输出x,继续循环,这时while条件不成立,循环结束。
(10)以下函数的功能是计算s=1+1/2!+1/3!+……+l/n!,请填空。
double fun(int n)
{double s=0.0,fac=1.O;int i;
for(i=1;i<=n;i++)
{ fac=fac 【10】 ;
s=s+fac;
}
return s;
}
答案:【10】/i或*1.0/i或*1/I或*(1.0/i)或/(double)i
评析:该程序实现的功能是求各个因式的和,观察表达式可以看出,只要将i的值的倒数乘以fac就得到每个因式的值。
(11)下面程序的运行结果是: 【11】 。
#define N 10
#define s(x)X*X
#define f(x)(x*x)
main()
{int i1,i2;
il=1000/s(N);i2=1000/f(N);
printf("%d%d\n",t1,i2);
}
答案:【11】1000 10
评析:根据宏定义,变量i1的值为1000/10*10=1000,变量i2的值为1000/(10*lO)=lO
(12)以下程序的运行结果是 【12】 。
main()
{
static int a[]={l,2,3,4};
int iJ=2;
for(I=l;i<3;i++)
{n(a);J++;}
printf(%d,%d\n",a[0],J);
}
f1(int a[4])
{
int I,J=l;
for(I=1;i<4;i+|+)
a[I-1]=a[I];
j++;
}
答案:【12】3,4
评析:用static对局部变量声明,则为该变量分配的空间在整个程序执行期间始终存在。n函数中定义的变量为局部变量,主函数中j的初值为2,循环执行了两次,所以j=4。主函数通过对n的调用输出原数组a[3]的值。
(13)下面程序的运行结果是: 【13】 。
typedef union student
{char name[10];
long sno;
char sex;
float score[4];
}STU;
main()
{STU a[5];
primf("%d\n",sizeof(a));
}
答案:【13】80
评析:共用体变量所占的内存长度等于最长的成员的长度,所以变量、STU所占的字节数等于其成员score[4]所占的字节数,即为16个字节,最终打印出共用体数组a[5]的长度为J6*5=80。
(14)若f1)已正确定义为一个文件指针,d1.dat为二进制文件,请填空,以便为"读"而打开此文件:f1):fopen(【14】 );。
答案:【14】"d1.dat"."rb"
评析:ANSIC规定了标准输入输出函数库,用fopen()函数来实现打开文件,其调用方式为(fb已定义为一个文件指针):fb=fopen(文件名,使用文件方式)。
(15)以下程序的功能是将无符号八进制数构成的字符串转换为十进制的整数,请填空。
#include<stdio-b>
main()
{
char*p,s[6];
int n:
p=s;
gets(p);
n=*p-'0';
while(【15】 !='\0')n=n*8+*p-'0';
printf("%d\n",n);
}
答案:【15】*++D
评析:本题中,主要是通过将8进制数各位上的数乘以对应位的权值,然后累加转换成10进制数的。在程序中,n=*p-'0',用于将8进制字符串的最高位转换成10进制字符。在while循环中,通过不断对已转换的10进制数*8+*p-'0'形成新的10进制数。由于在该循环中没有其它地方对指针p的值进行更改,要实现对8进制字符串的遍历,必须要对其进行自加,而在循环的外面己处理了第1个8进制字符,故应该是采用先自加的形式,同时要对自加后的p所对应的字符进行判断以确定该字符串是否结束,故该空应填*++p。
(16)设有定义:int n,*k=&n;,以下语句将利用指针变量k读写变量n中的内容,请将语 句补充完整。
scanf("%d",【16】);
printf("%d",【17】);
答案:【16】k
【17】*k
评析:本题中的笫一空,要求输入变量n的地址,而指针变量k指向整型变量n,故填写k.第二空要求打印输出变量n的值,应该填入*k。
(17)以下程序的功能是:从键盘输入一行字符,存入一个字符数组中,然后输出该字符 串,请填空。
#include<ctype.H>
#include<stdio.h>
main()
{
char str[8l],*sptr;
int i:
for(I=0;i<80;i++)
{ str[I]=getchar();
if(str[I]=='\n')break;
}
str[i]= 【18】 ;
sptr=str;
while(*sptr)putchar(*sptr【19】 );
}
答案:【18】0或NULL
【19】++
评析:在for循环中,其作用是直接从标准输入设备获取字符,直到遇到回车符结束。由于在while循环输出字符时,是根据*sptr来判断字符串是否结束,故在字符串的结束部分必须添加上字符'\0'。对于第二空,要实现对字符串的遍历,必须要进行自加操作,以使下次访问时能够访问下一个字符,故第二空应为++。
(18)fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回。请填空。
#include<stdio.h>
#define N 100
int fun(im(*a)[N])
{ int row,col,max,min;
for(row=0;row<N;row++)
{for(max=a[row][0],col=1;coI<N;col++)
if(【20】]max=a[row][col];
if(row==0)min=max;
else if(max<min)min=max;
}
retummin;
}
答案:【20】max<a[row][col]或max<=a[row][col]或a[row][col]>max或a[row][col]>=max
评析:本题空格所在的if条件要求判断出每一行中的最大数,应该填写条件max<a[row][col]。