(28)有以下程序
void fun(char *a,char *b)
{ a=b;
(*a)++;
}
main()
{
char c1='A',c2='a,*p1,*p2;
clrscr0;
pl=&cl;
p2=&c2;
fun(p1,p2);
printf("%c%c\n",cl,c2);
}
程序运行后的输出结果是__________。
A)Ab B)aa C)Aa D)Bb
答案:A
评析:在函数调用中,可以分值传递和地址传递。若参数传递的是简单数据类型的数值,称为值传递方式。若参数传递的是变量的地址,称为地址传递方式。
(29)若有定义:static int fun(int a,int b),则以下叙述中错误的是_________。
A)定义了一个返回值为整型的静态函数
B)该函数只能被同一文件内的函数调用
C)该函数可以在任何文件中被调用
D)该函数属于内部函数
答案:C
评析:根据函数能否被其他源文件调用,将函数区分为内部和外部函数。如果将函数定义为外部函数,则在函数首部最左端冠以关键字eXtem。如果将函数定义为内部函数,则在函数首部最左端冠以关键字static。内部函数只能被本文件中的其它函数调用。而外部函数则可以被其他任何c程序文件调用。
(30)以下能正确定义一维数组的选项是_________。
A)int num[]; B)int num[0..100];
C)#define N 100; D)int N=100;
int num[N]; int num[N];
答案:C
评析:有二种方法指定数组长度。其一是直接在数组名后面的方括号内输入数组的长度。其二是,在定义数组的同时对其赋值,由实际赋值的元素个数自动确定数组的长度。
(31)有以下程序
fun(int a[],intm,int n)
{ int I,J;
for(i=m;i<n;i++)
a[i+ll=a[I]+3;
}
main()
{
int i,a[6l={2,4,6,8,10,12};
clrscr0;
fun(a,2,5);
for(i=O;i<6;i++)
printf("%"a[I]);
}
程序运行后输出的结果是__________。
A)24691315 B)24691215 C)249121518 D)249121415
答案:B
评析:在调用函数时,既可以用单个的变量作为参数,也可以用数组名作为参数。还可将数组的下标值作为实参使用。在本题中,是将数组名和数组的下标值作为实参。
(32)以下不正确的叙述是__________.
A)在C程序中,逗号运算符的优先级最低。
B)在C程序中,T和t是两个不同的变量
C)若a和b类型相同,在执行了赋值表达式a=b后,b中的值将放入a中,而b中的值不变。
D)当从键盘输入数据时,对于整型变量只能输入整型数据。对于实型变量只能输入实型数据。
答案:D
评析:在c语言中,为方便表达式的运算,对所有的运算符都设定了一定的优先级,其中逗号运算符的优先级最低。c语言中的数据有常量和变量之分,其中变量是区分大小写的,也就是说T和t是两个不同的变量名。将某个变量的值赋给其它的变量之后,并不影响其本身的值。当定义一个整型变量后,可以从键盘上对其输入整型值,也可以是字符型的数据。如果将字符型的值赋给整型变量,则它接受的是字符常量的ASCII码值。实型变量也可以接收整型值。
(33)有以下程序
pf(char *p,int n)
{ int i;
for(i=0;i<n;i++1
p[i]=p[I]+32;
}
main()
{
char a[]="ABCD";
int i:
clrscr();
pf(a,4);
for(i=0;i<4;i++)
printf("%c",a[I]);
}
程序运行后的输出结果是________。
A)ABCD B)ABCD\0 C)abcd D)abed\0
答案:C
评析:通过指向数组的指针可以引用数组中的任何元素,并且对其进行各种运算。本题中就是通过指向数组的指针将一字符数组中的所有大写字母转换成相应的小写字母。
(34)有以下程序
main()
{
int a[3][3],*p,i;
clrscr();
p=&a[0][0];
for(i=0;i<9;i++)
p[i]:i+2;
printf("%d\n",a[2][11);
}
程序运行后的输出结果是_________。
A)3 B)6 C)9 D)2
答案:C
评析:当某个指针变量指向多维数组时,可以用其每次加l来顺序操作数组中的元素。在此题中,a[3][3]={{2,3,4},{5,6,7},{8,9,10}}。而最后输出的a[2][1]就是第3行的第2列的元素,即9。
(35)有以下程序
#include<stdio.h>
#define F(X,Y)(X)*(Y)
main()
{
int a=3,b=4;
clrscr();
printf("%d\n",F(a--,++b));
}
程序运行后的输出结果是_________。
A)8 B)10 C)12 D)15
答案:D
评析。在带参数的宏定义中,不是简单的字符替换。其方法是:在程序中如果有带实参的宏, (如F(x,Y)),则按#define命令行中指定的字符串进行置换。如果串中包含宏中的形参(女NX,Y),、则将程序语句中相应的实参代替形参。本题中的宏定义展开后为:(a.--)*(++b)=(3)*(5)=15。
(36)有以下程序
main()
{
int x=3,y=2,z=l;
printf("%d\n",x/y&&z);
}
程序运行后的输出结果是_________。
A)0 B)l C)2 D)3
答案:B
评析:在c程序的标准输出函数prim冲,要注意表达式的优先级。如本题的表达式x/y&&z,先运算的是算术运算x/v,结果是1,然后才运算l&&z,结果是1。
(37)下列关于c程序编译的描述中,错误的是_________。
A)在程序的编译过程中可以发现所有的语法错误
B)在程序的编译过程中可以发现部分的语法错误
C)在程序的编译过程中不能发现逻辑错误
D)程序编译是调试程序的必经过程
答案:B
评析:编译过程实际上就是调试程序,找出程序中所有可能存在的语法错误。但是,对于程序逻辑上的一些错误,编译过程无能为力,只有程序编写人员自己通过一些良好的编程技巧和方法来排除。
(38)若有以下说明和定义
union、s
{ int i;
char ch
float e
}a;
下列对共用体的操作正确的是________。
A)a='A'; B)re=a;
C)a.i=3; D)printf("%dha",a);
答案:C
评析:共用体实际上用同一内存段来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是现时存放几种。因此,不能对共用体名赋值,不能引用共用体名以得到某一个值,也不能把共用体变量作为函数参数。
(39)下列选项中正确的语句组是_________。
A)char s[8];s={"Beijing"}; B)char *s;s={"Beijing"};
C)char s[8];s="Beijing"; D)char *s;s="Beijing";
答案:D
评析:字符串通常是指用一对双引号括起来的一组字符常量序列。在c语言中,可以直接定义一个指向字符串的指针变量,然后对其赋值为字符串常量后,指向字符串的指针就指向了字符串的首地址。
(40)如果一个C程序由多个文件组成,在将多个文件编译连接成一个统一的可执行文件时,可采用的方法有多种,以下叙述中错误的是__________。
A)可以利用Turbo c集成环境 B)在MS C上进行编译连接
C)用#include命令 D)用文字处理软件Word
答案:D
评析:运算多个文件的程序有3种方法,第1种是利用Turbo c集成环境,先将每个文件输入并存储在磁盘上,然后在编译在状态下建立一个"项目文件",最后再编译连接。第2种方法是在MS c上先分别对多个文件进行编译得到.obj文件,然后用link命令把四个文件连接起来。第3种方法是用#include命令将多个文件包含进某个文件中。
(41)有以下程序
main()
{
int n,s=0;
clrscr0;
for(n=10;n<30;n++)
{
if(n%3==O)
{ s+=n;
continue;
}
if(s>100)break;
}
printf("%d",s);
}
程序运行后的输出结果是___________。
A)117 B)147 C)127 D)137
答案:A
评析:continue语句的功能是结束本次循环,即跳过循环体中下面尚未执行的语句,接着执行下一次是否执行循环的判定。而break语句是从循环体内跳出,即提前结束循环。
(42)有以下程序
main()
{
char s[]={'T','E','A','C','H','E','R'},*p;
clrscr0;
p=s+3;
printf("%c",*p++);
printf("%c",*p++);
}
程序运行后的输出结果是________。
A)AC B)CH C)HE D)TEA
答案:B
评析:如果有指向字符数组的指针,那么字符数组中的元素可以用指针变量表示,执行第一个输出语句printf("%c",*p++);后,输出字符'C',执行第二个输出语句printr("%c",*p++);后,输出字符'H'。
(43)已定义以下函数
fun(char *pl,char*p2)
{
while(('pl='p2)『-'\0'』
{
pl++;
p2++;
}
}
函数的功能是__________。
A)将p2所指字符串复制到pl所指内存空间
B)将p2所指字符串的地址赋给指针p1
C)对pl和p2两个指针所指字符串进行比较
D)检查pl和p2两个指针所指字符串中是否有'\O'
答案:A
评析:指针的白加或自减运算,表示指针向前或向后移动一个存储单元。
(44)有以下程序
main()
{
char s[][5]={{",",'*'},{",'*',",'*'},{'*'",",",'*'},{",'*',",'*'},{",",'*'}};
int i, j;
for(i=0;i<5;i十+)
{
for(j=O;__________j++)
printf("%c",s[i][I]);
printf("\n");
}
}
若输出如下的钻石形平面图,则在程序的下划线处应填入的表达式是__________。
*
* *
* *
* *
*
A)j<5 B)j<=5 C)j>5 D)j>=5
答案:A
评析:在一个二维数组中,可以通过其行标和列标来控制其输出的数据元素。
(45)有以下程序
sum(char *p)
{ *p=*p+3;}
main()
{
char str[10]={"abcde"},*p=str;
clrscr0;
sum(p);
primf("%c\n",*p--);
}
程序运行后的输出结果是_________。
A)c B)d C)e D)f
答案:B
评析:在用字符指针作为形式参数时,先让指针p指向字符数组的首地址,然后可以用*(p+i)的形式直接存取各对应单元中的元素,而*p+i的意义则不样,它是指将指针变量p所指向的存储单元的值加上i。
(46)已定义以下函数
fun(int *p)
(return *p;)
该函数的返回值是_________。
A)不确定的值 B)形参p中存放的值
C)形参p所指存储单元的值 D)形参p的地址值
答案:C
评析:指针p是指向一个地址,而*p是表示指针p指向存储单元中的数据。
(47)有如下语句
int *p, a[]={2,4,6,8,10};
p=a;
则与语句*p++;等价的语句是__________。
A)(*p)++; B)*(p++); C)*(++p); D)++*p;
答案:B
评析:由于++和*同优先级,结合方向为自右向左,因此语句*p++;等价于*(p++);,而*(++p)是先使p加l,再取*p的值。语句++*p;相当于++(*p),则是先取p所指变量的值,然后自加l。
(48)下列关于结构体与苯用体的说法中,错误的是_________。
A)结构体变量所占内存长度是各成员占的内存长度之和
B)共用体变量所占内存长度是各成员占的内存长度之和
C)共用体变量所占内存长度等于最长成员的长度
D)共用体变量和结构体变量中的所有成员可以是不同数据类型
答案:B
评析:共用体也称"联合体",与结构体定义形式相同,而它们是含义不同的两类构造数据类型。结构体中每个成员都有自己独立的内存空间,是所有成员的内存长度之和。而共用体不同,所有成员是共用一个内存区的,所以共用体变量的内存长度是最长成员的长度。
(49)下列对于文件的打开方式叙述中,错误的是_________。
A)用"r"方式打开的文件只能读
B)用"w"方式打开的文件只能向该文件写数据
C)用"a"方式打开的文件既能读,又可以向该文件写数据
D)如果不能打开文件,fopen函数将会带回一个错信息
答案:C
评析:在c程序中打开文件时,必须要确定文件的打开方式。在文件打开函数fopen中,用"r"方式打开的文件只能读,即从文件向计算机输入,而不是向文件输入;用"w"方式打开的文件只能写,即向文件写入数据,而不能从文件中向计算机输入数据。用"a"方式打开的文件只能在文件末尾添加数据。在用"r"方式打开时,fopen函数如果不能打开一个文件,会返回一个出错信息。
(50)下列关于c语言数据文件的叙述中正确的_________。
A)文件由ASCII码字符序列组成,c语言只能读写文本文件
B)文件由二进制数据序列组成,c语言只能读写二进制文件
C)文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件
D)文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件
答案:D
评析:c语言把文件看作一个字符(字节)的序列,即由一个一个字符(字节)数据顺序组成。根据数据的组织形式,可分为ASCII码文件和二进制文件。因此,一个c文件是一个字节流或二进制流。它把数据看作是一连串的字符(字节)。而不考虑记录的界限。换句话说,c语言文件并不是由记录组成的。
二、填空题(每空2分,共40分)
请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
(1)某二叉树中共有27个结点,其中度为2的结点有10个,则该二叉树中有 【1】 个度为l的结点。
答案:【1】6
评析:已知n2=10,根据二叉树中度为2的结点与叶子结点的关系:n0=n2+l可知,为1l。因此,度为l的结点数为:n1=n-n0-n2=27-10-l1=6
(2)1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种新的流程图中,完全去掉了带箭头的流程线,全部算法写在一个矩形框内。这种流程图称为
【2】 流程图。
答案:【2】N-S
评析:基于可以用顺序结构表示任何复杂算法结构的思想,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。这种流程图称为N-S流程图(N和s是两位美国学者的英文姓名的第一个字母)。
(3)在软件测试过程中,单元测试的目的 【3】 ,多采用白盒测试法。
答案:【3】保证每个模块单独运行正确
评析:软件测试的实施过程分为四步,即单元测试、综合测试、确认测试利系统测试。其中单元测试的主要的目的是保证每个模块单独运行正确:多采用白盒测试法,检查模块控制结构的某些特殊路径,期望覆盖尽可能多的出错点。
(4)在数据库系统中,数据冗余度大大降低的最主要原因是 【4】 。
答案:【4】实现数据共享
评析:数据库中的数据是可以被多个用户共享的,这和以前的文件系统有所不同。由于数据库中的数据实现数据共享,可以极大的降低数据冗余度,并且只花费很少的存储空间。
(5)在软件生存周期中,软件定义阶段的主要任务是 【5】 。
答案:【5】确定软件系统的工程需求
评析:一个软件生存周期主要包含三个阶段,即软件定义、软件开发、软件维护。软件定义阶段主要任务是确定软件系统的工程需求。为准确明确软件的工程需求,软件定义又分成软件系统的可行研究和需求分析两个子阶段。
(6)如果在运行以下程序时从键盘输入:bcd<回车>。输出结果 【6】 。
#include<stdio.h>
main()
{
char I='a'J='a',k='a';
clrscr();
scanf("%c%*c%c",&i,&j,&k);
printf("%c%c%c",i,j,k);
}
答案:【6】bda
评析:在scanf()语句中,如果输入格式中带有"*",则变量在接收数据时,自动忽略掉数据输入序列中"*'对应位置的的数据元素,其对应变量的值从"*"对应位置的下一个数据开始接收。
(7)以下程序运行后的输出结果是 【7】 。
#define SQ(y) y*y
main()
{ int x=lO,y;
y=SQ(x+3);
primf("%d",y);
}
答案:【7】43
评析:在使用带参数的宏定义时不是进行简单的字符替换。如果在程序有带实参的宏,则按#define命令行中指定的字符串从左到右进行置换。如果是表达式时,一定要注意其替换后得到的表达式。本题中,有宏定义行#define sQ(y) y*y。在用实参x+3进行替换后,其得到的字符串表达式为:x+3*x+3=10+3*10+3=43。
(8)已知字符"A"的ASCII值为65,以下程序运行后的输出结果是 【8】 。
main()
{
int x=30,y=50,t=4;
char z='A':
clrscr();
if(y>x+2&&y<z-12)
x=y;
y=t;
if(y<z&&y>z-20)
t=x:
x=y;
y=t;
printf("%d,%d,%d\n",x,y,z);
}
答案:【8】4,4, 65
评析:如果多个分支结构处于顺序关系时,每个分支语句都要执行。本题中的两个if语句就是这种关系。
(9)以下程序的运行结果是 【9】 。
main()
{
int a=4,b=8,c;
c=("b==a)&&(a+b!=20);
printf("%d,%d,%d\n",a,b,C);
}
答案:【9】4,8,0
评析:如果在表达中出现多种运算符时,一定要撂照他们的优先级别进行运算,否则其结果可能会产生错误。本题中,由于赋值表达中式c=(a/b==a)&&(a+b!=20)中有两个括号,而且两个括号是进行逻辑与运算。当第1个括号内的值为假时,不管后面括号内的值是否为假,两个括号内的值进行逻辑与(&&)运算时,其结果肯定为假。
(10)以下程序的运行结果是 【10】 。
main()
{
char a='A',b='E';
int sum=1,i=1;
do
{
sum*=i;
i++:
}while(i<=b-a);
printf("%d",sum);
}
答案:【10】24
评析:字符数据进行算术运算时,是将字符对应的ASCII值当作一个整型数据来处理。同样要将整数进行字符运算时,可以将整数转换成ASCII值与其相等的字符。
(11)已知数字'0'的AsCII码值为48,在程序运行时若从键盘输入:096<回车>,则下列程序运行后的输出结果是 【11】 。
#include<stdio.h>
main()
{ char x,y;
x=getchar();
scanf("%d",&y);
x=x+4; y=y/2;
printf("%c%C",x,y);
}
答案:【11】40
评析:以ASCII码值为桥梁,可以将字符数据与其ASCII值相等的整型数进行相互转换,并且可以用这个特性对字符进行一些整型数据的运算。
(12)以下程序中,min函数的功能是求4行5列二维数组每列元素的最小值。请填空。
Void min(int m,int n,int fI)[5],int *bt)
{ inti,j,k=0;
for (j=0;j<n;j++)
{ k=f[0][j]};
for(i=0;i<m;i++)
if( 【12】 )k=f[i][j];
bt[j]=k;
}
}
main()
{ int a[4][5],i,j,b[5];
for(i=0;i<4.i++)
for(j=0;0<5.J++)
scanf("%d",&a[i][j]);
min(4,5,a,b);
f'0r(j=0;j<5;j++)
printf("%d",b[j]);
primf("\n");
}
答案:【12】k>f[i][j]
评析:求二维数组中每列的最小值时,其方法是先让每列中的第一个元素同第二个元素比较,然后将较小的值保存在临时变量k中,最后再将k中的值与问列中剩余的元素进行比较,每次都是将较小的值保存在临时变量k中。靳列比较后完成后,其最小值就是k的值。然后将k值赋给一维数组b啪中对应的单元。最后得到的一维数组b啪中的所有值就是所要求的二维数组中每列的最小值。
(13)有以下程序
main()
{ int a,b,c,d;
clrsc();
scanf("%o",&a);
b=a>>4:
c:~(~0<<4);
d=b&c:
printf("%d,%d\n",a,d);
}
若从键盘上输入331,则程序运行后的输出结果 【13】 。
答案:【13】217,13
评析: c语言中的位运算符有6种,本程序有其中4种位运算符,分别是左移、右移、取反和按位与运算。
(14)以下程序运行后输出结果是 【14】 。
int a=30,b=40;
voidfun(int x,inty)
{ int z;
z=(x>y)?x:y;
a=z+10;
b=z+20;
}
main()
{
printf("a=%d,b=%d\n",a,b);
fun(a,b);
printf("a=%d,b=%d\n",a,b);
}
答案:【14】a=30,b=40
a=50,b=60
评析:全局变量的作用域是从定义变量的位置开始到本源文件的结束。在本题中,变量a,b就是属于全局变量。其初值分别为a=30,b=4O。在没有对两个全局变量作任何处理前,它们的值保持原值,所以第1次输出a,b的值分别是初值a=30,b=40。但在fun函数中a,b的值改变后,其值在结束fun函数后仍然保留,所以第2次输出a,b的值分别为a=50,b=60。
(15)以下程序运行后的输出结果是 【15】 。
#include<string.h>
main()
{
int i:
char a[]。"abcdef',*p,*s;
p=a;
for(I=O;i<strlen(a)/2;i++)
{
a[strlen(a)-i-1]=*p;
p++;
}
s=strupr(a);
puts(s);
}
答案:【15】ABCCBA
评析:for循环是将字符数组a的前半段元素取出,然后按原来相反的顺序覆盖字符数组的后半段。字符串函数strupr的功能是将字符串中小写字母转换为大写字母。然后用字符串输出函数puts输出。
(16)以下程序运行后其输出的结果是 【16】 。
ma(int a)
{ static int y=l,z=2;
y*=a;
Z*=a:
printf("y=%d,z=%d",y,z);
}
main()
{
int i,a=2:
clrsc");
for(i=0;i<3;I++)
{ printf("%d",i);
ma(a);
printf("\n");
}
}
答案:【16】0 y=2,z=4
l y=4,z=8
2 y=8,z=16
评析:静态存储变量的定义方法是在定义变量里,前面加关键字static,而且一次允许定义多个静态变量。一旦某个变量在函数中被定义成静态的类型,在程序运行期间,每次调用函数时,它不再重新赋初值,而是保留上次函数调用结束时的值。.如本题中,在第1次调用函数ma()结束时,y、z的值分别是y=2,z=4。在第2次调用ma()函数时,静态存储变量y、z不再重新被赋初值,而是保留上次结束时的值。
(17)已知有如图所示的单链表,则以下函数的功能是 【17】 。
#include<stdio.h>
typedef struct node
{ int data;
struct node *next;
}Node;
Node *reverlist(Llist *head)
{
Node *p,*q;
if(head&&head->nex0
{
p=head;
q=p->next;
p->next=null;
while(q)
{
p=q;
q=q->next;
p->next=head;
head=p;
}
}
return(head);
答案:【17】逆置单链表
知识点:单链表的运算
评析:该函数是首先将head指向的链表在第l和第2个结点间断开成前后两个链表,用指针head指向前面单个结点的链表,而用指针q指向后面断开部分的链表,每次将指针q指向链表的第1个结点取出,然后插入到head指针指向链表的最前面,直到q指针指向链表的结点全部取出,并插入到head指针指向的链表中,最后指针head指向的链表就是原来链表的逆置链表。
(18)以下程序的功能是将一个字符串sl中的内容复制到字符串s2中,请填空。
void copy_string(char *pl,char *p2)
{
for ( ;*p1 !='\0' ;p1 ++,p2++)
【18】 ;
【19】 ;
;
}
main( )
{
char * s1 ="hello!";
char *s2="Good morning!";
prinff("\nstring sl=%s\nstring s2=%s\n",sl,s2);
copy_string( 【20】 );
printf("\nstring sl=%s\nstring s2=%s\n",sl,s2);
答案:【18】*p2=*pl
【19】*p2='\0'
【20】sl,s2
评析:形式参数可以有不同的数据类型,其中本题中的字符指针也是一种形式a在本题中,pl,p2都是字符指针,在调用copy_string函数时,将数组s1的首地址传给p1,把数组s2的首地址传给p2。在函数copy_string中的for循环中,每次将*pl赋给*p2,第1次就是将s1数组的第1个字符赋给s2数组。在执行pl++和p2++后,p1和p2就分别指向s1[1]和s2[1]。然后依此类推。在复制所有字符后,还要记得在最后将结束符'\0'赋给p2。