(38)有以下程序
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);}
程序运行后的输出结果是
A)4
B)3
C)2
D)1
(39)设有如下定义:
struck 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;‘
(40)以下对结构体类型变量的定义中,不正确的是
A)typedef struct aa
{ int n;
float m;
}AA;
AA tdl;
B)#define AA struct aa
AA{ int n;
float m;
} tdl;
C)struct
{ int n;
float m;
} aa;
struct aa tdl;
D)struct
{ int n;
float m;
} tdl;
(41)若说明int *p,n;则通过语句scanf能够正确读入数据的程序段是
A)p=&n;scanf("%d",&p);
B)p=&n;scanf("%d",*p);
C)scanf("%d",n);
D)p=&n;scanf("%d",p);
(42) 在下述程序中,判断i>j共执行的次数是
main()
{int i=0, j=10, k=2, s=0;
for (;;)
{i+=k;
if(i>j)
{printf("%d",s);
break;
}s+=i;
}
}
A)4
B)7
C)5
D)6
(43)以下4个选项中,不能看做一条语句的是
A);
B)a=5,b=2.5,c=3.6;
C)if(a<5);
D)if(b!=5)x=2;y=6;
(44)在C语言中,变量的隐含存储类别是
A)auto
B)static
C)extern
D)无存储类别
(45)若有以下程序
#include <stdio.h>
void f(int n);
main()
{ void f(int n);
f(5);
}
void f(int n)
{ printf("%d\n",n); }
则以下叙述中不正确的是
A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f
B)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数f
C)对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明
D)函数f无返回值,所以可用void将其类型定义为无返回值型
(46)若有下面的说明和定义
struct test
{ int ml; char m2; float m3;
union uu {char ul[5]; int u2[2];} ua;
} myaa;
则sizeof(struct test )的值是
A)12
B)16
C)14
D)9
(47)以下程序的输出是
struct st
{ int x; int *y;} *p;
int dt[4]={ 10,20,30,40 };
struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]};
main()
{ p=aa;
printf("%d\n",++(p->x));
}
A)10
B)11
C)51
D)60
(48)若有运算符<<,sizeof,^,&=,则它们按优先级由高至低的正确排列次序是
A)sizeof,&=,<<,^
B)sizeof,<<,^,&=
C)^,<<,sizeof,&=
D)<<,^,&=,sizeof
(49)函数fseek(pf, OL,SEEK_END)中的SEEK_END代表的起始点是
A)文件开始
B)文件末尾
C)文件当前位置
D)以上都不对
(50)有以下程序
#include <stdio.h>
main()
{ FILE *fp; int i=20,j=30,k,n;
fp=fopen("d1.dat","w");
fprintf(fp,"%d\n",i);fprintf(fp,"%d\n",j);
fclose(fp);
fp=fopen("d1.dat","r");
fscanf(fp,"%d%d",&k,&n); printf("%d %d\n",k,n);
fclose(fp);
}
程序运行后的输出结果是
A)20 30
B)20 50
C)30 50
D)30 20
二、填空题
(1)数据结构分为逻辑结构与存储结构,线性链表属于 【1】 。
解析: 数据的逻辑结构是指反映数据元素之间逻辑关系的数据结构;数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式。在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。
(2)在面向对象方法中,类之间共享属性和操作的机制称为 【2】 。
解析: 类是面向对象语言中必备的程序语言结构,用来实现抽象数据类型。类与类之间的继承关系实现了类之间的共享属性和操作,一个类可以在另一个已定义的类的基础上定义,这样使该类型继承了其超类的属性和方法,当然,也可以定义自己的属性和方法。
(3)耦合和内聚是评价模块独立性的两个主要标准,其中 【3】 反映了模块内各成分之间的联系。
解析: 内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量,内聚是从功能角度来度量模块内的联系;耦合性是模块间互相连接的紧密程度的度量。
(4)一个项目具有一个项目主管,一个项目主管可管理多个项目,则实体"项目主管"与实体"项目"的联系属于 【4】 的联系。
解析: 两个实体集间的联系实际上是实体集间的函数关系,这种函数关系可以有3种,即一对一(1∶1)的联系、一对多(1∶N)或多对一(N∶1)的联系和多对多(N∶N)的联系。
(5)数据库设计分为以下6个设计阶段:需求分析阶段、 【5】 、逻辑设计阶段、物理设计阶段、实施阶段、运行和维护阶段。
解析: 数据库设计分为以下6个设计阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、实施阶段及数据库运行和维护阶段。
(6)以下程序的运行结果是【6】。
#define MAX (a,b)(a>b?a:b)+1
main ()
{ int i=6,j=8,k;
printf ("%d\n",MAX(i,j));
}
解析: 本题考查宏定义与三目运算符的综合用法,宏定义是原样替换,本题中,如果a>b成立,则a+1的值为整个表达式的值,否则为b+1的值为整个表达式的值,(应注意后面的加1)。
(7)以下程序的功能是从健盘输入若干学生的成绩,并输出最高成绩和最低成绩,当输入负数时结束。请填空。
main ()
{float x,amax,amin;
scanf ("%f",&x);
amax=x;
amin=x;
while (【7】)
{if (x>amax)
amax=x;
else
if【8】
amin=x;
else scanf ("%f",&x);
}
printf ("\n amax=%f\n amin=%f\n",amax,amin);
}
解析: 本题先从键盘接受数值,并分别赋给amax(用于保存最高成绩)和amin(用干保存最低成绩),然后通过while循环控制是否结束输入,并且通过if语句来给amax和amin赋值和进行下一次的输入。
(8)在对文件操作的过程中,若要求文件的位置指针回到文件的开始处,应当调用的函数是【9】。
答案;rewind()
(9)在计算机中,字符的比较是对它们的【10】进行比较。
解析: C语言中,字符也可以进行比较运算,且是按照ASCII码值进行的。
(10)在内存中,存储字符′x′要占用1个字节,存储字符串″X″要占用【11】个字节。
解析: 计算机存储一个字符用1个字节,存储字符串时,每个字符用占用1个字节,另在字符串的有效字符之后存储1个字符串的结束标记符。所以存储字符串“X”要占用2个字节,存储字符′x′只要1个字节。
(11)下列程序的输出结果是16.00,请填空。
main()
{int a=9, b=2;
float x=【12】, y=1.1,z;
z=a/2+b*x/y+1/2;
printf("%5.2f\n", z );
}
解析: 本题最后一条语句,表示以浮点格式输出z的值,宽度为5,其中所含2位小数,应该注意的是,两个整型运算结果仍为整型,如1/2的结果为0,对本题可逐步求解:
16.00=9/2+2*x/1.1+1/2
16.00=4+2*x/1.1+0
12.00=2*x/1.1
所以,x的值为6.6。
(12)设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的首部【13】。要求形参名为b。
main()
{double s[10][22];
int n; ┆
┆
fun(s);
┆
}
解析: 本题中,为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。这系统就保证不使函数带回任何值,二维数组的第一维可以省略。
(13)下列程序的功能是输入一个整数,判断是否是素数,若为素数输出1,否则输出0,请填空。
main()
{int i, x, y=1;
scanf("%d", &x);
for(i=2; i<=x/2; i++)
if【14】{ y=0; break;}
printf("%d\n", y);
}
解析: 为判数x是否是素数,预置变量y的值为1(x可能是素数),然后用循环,用2至x/2的整数i测试对x的整除性,若能被其中的某个整数整除,则x是合数,置y的值为0(x不是素数),结束测试循环。若都不能整除,则x为素数。i能否整除x,可用求余运算x%i等于0来判定。所以程序中的空框可填x%i == 0。测试x为素数的代码可写成:y = 1;
for(i=2; i <=x/2; i++)
if(x%i == 0){ y = 0; break; }
(14)下面程序的功能是将一个字符串str的内容颠倒过来,请填空。
#include<string.h>
main()
{ int i,j,【15】;char str[]={"1234567"};
for(i=0,j=strlen(str)【16】;i<j;i++,j--)
{k=str[i];str[i]=str[j];str[j]=k;}
printf("%s\n",str);
}
解析: 颠倒一个字符串中的字符,就是首尾对应的元素两两交换。简单地可用两个游标变量i和j,i是前端元素的下标,j是后端元素的下标,交换以这两个变量值为下标的元素str[i]和str[j]。开始时,i的值为0,j的值为字符串末元素的下标(字符串长度减1)。每次交换后,i增1,j减1。继续交换的条件是str[i]还位于str[j]的前面,即i<j。字符串末元素的下标是它的长度减1,所以在第二个空框处应填入-1。程序为了交换str[i]和str[j],使用了变量k,该变量应在程序的变量定义部分中一起定义,所以在第一个空框处应填入k。
(15)以下程序可把输入的十进制数以十六进制数的形式输出,请填空。
main()
{char b[17]={"0123456789ABCDEF"};
int c[64],d,i=0,base=16;
long n;
printf("Enter a number:\n");scanf("%ld",&n);
do{c[i]=【17】;i++;n=n/base;}
while(n!=0);
printf("Transmite new base:\n");
for(--i;i>=0;--i)
{d=c[i];printf("%c",b【18】);}
printf("\n");
}
解析: 程序中,字符数组b存储十六进制的16个数字符,整型数组c存储译出的十六进制数的各位数值。从整数n译出它的各位十六进制数值,需采用除16取余的方法,即求n除16的余,得到它的十六进制的个位数,接着将n除以16。在n不等于0的情况下循环,能顺序求出n的十六进制的个位数、十位数、百位数等等。程序中变量base已预置16,所以在第1个空框处可填代码n%base。当n的十六进制数的个位、十位、百位等依次存放于数组c中后,就从最高位至最低位,参照数组c[i]的内容d(以其内容为下标),取十六进制数字符表中的字符b[d]输出。所以在第2个空框处可填入代码[d]。
(16)若给fun函数的形参s传送字符串:“]]6354abcc” (其中]表示空格字符),则函数的返回值是【19】。
#include <ctype.h>
long fun(char s[])
{long n;int sign;
for(;isspace(*s);s++);
sign=(*s==′-′)?-1:1;
if(*s==′+′||*s==′-′)s++;
for(n=0;isdigit(*s);s++)n=10*n+(*s-′0′);
return sign*n;
}
解析: 函数fun的第一个for循环跳过字符串的前导空白符,接着判断第一个非空白符是否是负号,若是则置变量sign为-1;否则,置变量sign为1。接着的if语句在第一个非空白字符是负号或正号时,跳过该字符。以后的for循环将后面的数字符当作十进制数的各位数字译出一个长整数n。遇字符a时,结束循环。最后,函数返回sign与n的乘积。所以若调用函数时提供的实参是“∪∪6354abc”,函数返回值是6354。
(17)设有定义“struct {int a; float b; char c;} abc, *p_abc=&abc;”,则对结构体成员a的引用方法可以是abc.a和p_abc【20】a。
解析: 若有结构变量abc有成员a,并有指针p_abc指向结构变量abc,则引用变量abc成员a的标记形式有abc . a和p_abc->a。
选择题
01-05 B A B D D
06-10 D D A B C
11-15 D D A A A
16-20 C C A C D
21-25 B D A C D
26-30 D C D D B
31-35 C D B B A
36-40 B C B C C
41-45 D D D A C
46-50 A C B B A