2006年9月计算机二级C语言真题【附答案】
2006 年9 月全国计算机等级考试笔试试卷
二级公共基础知识和 C 语言程序设计
(考试时间 120 分钟,满分100 分)
PDF版(非扫描)下载: 2006年9月计算机二级C语言真题
一、选择题((1)-(10)每小题2 分,(11)-(50)每小题1 分,共60 分)
(1)下列选项中不符合良好程序设计风格的是( )。
A)源程序要文档化 B)数据说明的次序要规范化
C)避免滥用goto 语句 D)模块设计要保证高耦合、高内聚
(2)从工程管理角度,软件设计一般分为两步完成,它们是( )。
A)概要设计与详细设计 B)数据设计与接口设计
C)软件结构设计与数据设计 D)过程设计与数据设计
(3)下列选项中不属于软件生命周期开发阶段任务的是( )。
A)软件测试 B)概要设计
C)软件维护 D)详细设计
(4)在数据库系统中,用户所见的数据模式为( )。
A)概念模式 B)外模式
C)内模式 D)物理模式
(5)数据库设计的4 个阶段是:需求分析、概念设计、逻辑设计和( )。
A)编码设计 B)测试阶段
C)运行阶段 D)物理设计
(6)设有如下3 个关系表

下列操作中正确的是( )。
A)T=R∩S B)T=R∪S
C)T=R×S D)T=R/S
(7)下列叙述中正确的是( )。
A)一个算法的空间复杂度大,则其时间复杂度也必定大
B)一个算法的空间复杂度大,则其时间复杂度必定小
C)一个算法的时间复杂度大,则其空间复杂度必定小
D)上述三种说法都不对
(8)在长度为64 的有序线性表中进行顺序查找,最坏情况下需要比较的次数为( )。
A)63 B)64 C)6 D)7
(9)数据库技术的根本目标是要解决数据的( )。
A)存储问题 B)共享问题 C)安全问题 D)保护问题
(10)对下列二叉树

进行中序遍历的结果是( )。
A)ACBDFEG B)ACBDFGE
C)ABDCGEF D)FCADBEG
(11)下列叙述中错误的是( )。
A)一个C 语言程序只能实现一种算法
B)C 程序可以由多个程序文件组成
C)C 程序可以由一个或多个函数组成
D)一个C 函数可以单独作为一个C 程序文件存在
(12)下列叙述中正确的是( )。
A)每个C 程序文件中都必须要有一个main( )函数
B)在C 程序中main( )函数的位置是固定的
C)C 程序中所有函数之间都可以相互调用,与函数所处位置无关
D)在C 程序的函数中不能定义另一个函数
(13)下列定义变量的语句中错误的是( )。
A)int _int; B)double int_;
C)char For; D)float US$;
(14)若变量x、y 已正确定义并赋值,下列符合C 语言语法的表达式是( )。
A)+ +x,y=x-- B)x+1=y
C)x=x+10=x+y D)double(x)/10
(15)下列关于逻辑运算符两侧运算对象的叙述中正确的是( )。
A)只能是整数0 或1 B)只能是整数0 或非0 整数
C)可以是结构体类型的数据 D)可以是任意合法的表达式
(16)若有定义int x,y; 并已正确给变量赋值,则下列选项中与表达式(x-y)?(x+ +):(y+ +)中
的条件表达式(x-y)等价的是( )。
A)(x-y>0) B)(x-y<0)
C)(x-y<0‖x-y>0) D)(x-y= =0)
(17)有下列程序:
main( )
{ int x,y,z;
x=y=1;
z=x+ +,y+ +,+ +y;
printf("%d,%d,%d\n",x,y,z);
}
程序运行后的输出结果是( )。
A)2,3,3 B)2,3,2
C)2,3,1 D)2,2,1
(18)设有定义: int a; float b; 执行scanf("%2d%f",&a,&b);语句时,若从键盘输入
876543.0<CR>,a 和b 的值分别是( )。
A)876 和543.000000 B)87 和6.000000
C)87 和543.000000 D)76 和543.000000
(19)有下列程序:
main( )
{ int a=0,b=0;
a=10; /*给a 赋值
b=20; 给b 赋值 */
printf("a+b=%d\n",a+b); /*输出计算结果 */
}
程序运行后的输出结果是( )。
A)a+b=10 B)a+b=30
C)30 D)出错
(20)在嵌套使用if 语句时,C 语言规定else 总是( )。
A)和之前与其具有相同缩进位置的if 配对 B)和之前与其最近的if 配对
C)和之前与其最近的且不带else 的if 配对 D)和之前的第一个if 配对
(21)下列叙述中正确的是( )。
A)break 语句只能用于switch 语句
B)在switch 语句中必须使用default
C)break 语句必须与switch 语句中的case 配对使用
D)在switch 语句中,不一定使用break 语句
(22)有下列程序:
main( )
{ int k=5;
while(--k) printf("%d",k-=3);
printf("\n");
}
执行后的输出结果是( )。
A)1 B)2
C)4 D)死循环
(23)有下列程序:
main( )
{ int i;
for(i=1;i<=40;i+ +)
{ if(i+ +%5= =0)
if(+ +i%8= =0) printf("%d",i);
}
printf("\n");
}
执行后的输出结果是( )。
A)5 B)24
C)32 D)40
(24)下列选项中,值为1 的表达式是( )。
A)1-'0' B)1-'\0'
C)'1'-0 D)'\0'-'0'
(25)有下列程序:
fun(int x,int y){return (x+y);}
main( )
{ int a=1,b=2,c=3,sum;
sum=fun((a+ +,b+ +,a+b),c+ +);
printf("%d\n",sum);
}
执行后的输出结果是( )。
A)6 B)7
C)8 D)9
(26)有下列程序:
main( )
{ char s[ ]="abcde";
s+ =2;
printf("%d\n",s[0]);
}
执行后的结果是( )。
A)输出字符a 的ASCII 码 B)输出字符c 的ASCII 码
C)输出字符c D)程序出错
(27)有下列程序:
fun (int x,int y)
{ static int m=0,i=2;
i+ =m+1; m=i+x+y; return m;
}
main ( )
{ int j=1, m=1, k;
k=fun(j,m); printf("%d, ",k);
k=fun(j,m); printf("%d\n",k);
}
执行后的输出结果是( )。
A)5,5 B)5,11
C)11,11 D)11,5
(28)有下列程序:
fun(int x)
{ int p;
if(x= =0‖x= =1) return(3);
p=x-fun(x-2);
return p;
}
main( )
{ printf("%d\n",fun(7));}
执行后的输出结果是( )。
A)7 B)3
C)2 D)0
(29)在16 位编译系统上,若有定义int a[ ]={10,20,30},*p=&a;,当执行p+ +;后,下列说法
错误的是( )。
A)p 向高地址移了一个字节 B)p 向高地址移了一个存储单元
C)p 向高地址移了两个字节 D)p 与a+1 等价
(30)有下列程序:
main( )
{ int a=1, b=3,c=5,*p;
int *p1=&a, *p2=&b, *p3=&c;
*p=*p1*(*p2);
printf("%d\n",*p);
}
执行后的输出结果是( )。
A)1 B)2
C)3 D)4
(31)若有定义:int w[3][5];,则下列不能正确表示该数组元素的表达式是( )。
A)*(*w+3) B)*(*w+1)[4]
C)*(*(*w+1)) D)*(&w[0][0]+1)
(32)若有以下函数首部
int fun (double x[10],int *n)
则下列针对此函数的函数声明语句中正确的是( )。
A)int fun(double x, int *n); B)int fun(double , int);
C)int fun(double *x, int n); D)int fun(double *, int *);
(33)若有定义语句:int k[2][3], *pk[3];,则下列语句中正确的是( )。
A)pk=k; B)pk[0]=&k[1][2];
C)pk=k[0]; D)pk[1]=k;
(34)有下列程序:
void change (int k[ ] ){k[0]=k[5];}
main( )
{ int x[10]={1,2,3,4,5,6,7,8,9,10},n=0;
while (n<=4) {change(&x[n]);n+ +;}
for(n=0;n<5;n+ +) printf("%d",x[n]);
printf("\n");
}
程序运行后输出的结果是( )。
A)6 7 8 9 10 B)1 3 5 7 9
C)1 2 3 4 5 D)6 2 3 4 5
(35)若要求定义具有10 个int 型元素的一维数组a,则下列定义语句中错误的是( )。
A)#define N 10 B)#define n 5
int a [N]; int a [2*n];
C)int a [5+5]; D)int n=10,a [n];
(36)有下列程序:
main( )
{ int x[3][2]={0},i;
for(i=0;i<3;i+ +) scanf("%d",x[i]);
printf("%3d%3d%3d\n",x[0][0],x[0][1],x[1][0]);
}
若运行时输入:2 4 6 <CR>,则输出结果为( )。
A)2 0 0 B)2 0 4
C)2 4 0 D)2 4 6
(37)有下列程序:
main( )
{ char s[ ]={"aeiou"} ,*ps;
ps=s; printf("%c\n",*ps+4);
}
程序运行后的输出结果是( )。
A)a B)e
C)u D)元素s[4]的地址
(38)下列语句中存在语法错误的是( )。
A)char ss[6] [20]; ss[1]= "right? "; B)char ss[ ] [20]={ "right? "};
C)char *ss[6]; ss[1]= "right? "; D)char ss[ ]={ "right? "};
(39)若有定义:char *x="abcdefghi";,下列选项中正确运用了strcpy 函数的是( )。
A)char y[10]; strcpy(y,x[4]); B)char y[10]; strcpy(+ +y,&x[1]);
C)char y[10],*s; strcpy(s=y+5,x); D)char y[10],*s; strcpy(s=y+1,x+1);
(40)有下列程序:
int add (int a,int b) {return (a+b);}
main( )
{ int k,(*f)( ),a=5,b=10;
f=add;
…
}
则下列函数调用语句错误的是( )。
A)k=(*f)(a,b); B)k=add(a,b);
C)k=*f(a,b); D)k=f(a,b);
(41)有下列程序:
# include <string .h>
main(int argc,char *argv[ ])
{ int i=1,n=0;
while (i<argc) {n=n+strlen(argv[i]);i+ +;}
printf("%d\n",n);
}
该程序生成的可执行文件为:proc.exe。若运行时输入命令行:
proc 123 45 67
则程序的输出结果是( )。
A)3 B)5
C)7 D)11
(42)有下列程序:
void fun2(char a, char b) {printf("%c%c",a,b); }
char a='A',b='B';
void fun1( ){a='C'; b='D' ; }
main( )
{ fun1( );
printf("%c%c",a,b);
fun2('E','F');
}
程序的运行结果是( )。
A)C D E F B)A B E F
C)A B C D D)C D A B
(43)有下列程序:
#include <stdio.h>
#define N 5
#define M N+1
#define f(x) (x*M)
main( )
{ int i1,i2;
i1=f(2);
i2=f(1+1);
printf("%d %d\n", i1,i2);
}
程序的运行结果是( )。
A)12 12 B)11 7
C)11 11 D)12 7
(44)设有以下语句:
typedef struct TT
{ char c; int a[4]; } CIN;
则下列叙述中正确的是( )。
A)可以用TT 定义结构体变量 B)TT 是struct 类型的变量
C)可以用CIN 定义结构体变量 D)CIN 是struct TT 类型的变量
(45)有下列结构体说明、变量定义和赋值语句:
struct STD
{ char name[10];
int age;
char sex;
} s[5],*ps;
ps=&s[0];
则下列scanf 函数调用语句中错误引用结构体变量成员的是( )。
A)scanf("%s",s[0].name); B)scanf("%d",&s[0].age);
C)scanf("%c",&(ps->sex)); D)scanf("%d",ps->age);
(46)若有下列定义和语句:
union data
{ int i; char c; float f; } x;
int y;
则下列语句正确的是( )。
A)x=10.5; B)x.c=101;
C)y=x; D)printf("%d\n",x);
(47)程序中已构成如下图所示的不带头结点的单向链表结构,指针变量s、p、q 均已正确
定义,并用于指向链表结点,指针变量s 总是作为头指针指向链表的第一个结点。

若有下列程序段
q=s; s=s->next; p=s;
while (p->next) p=p->next;
p->next=q; q->next=NULL;
该程序段实现的功能是( )。
A)首结点成为尾结点 B)尾结点成为首结点
C)删除首结点 D)删除尾结点
(48)若变量已正确定义,则下列语句的输出结果是( )。
s=32; s^=32; printf("%d",s);
A)-1 B)0
C)1 D)32
(49)下列叙述中正确的是( )。
A)C 语言中的文件是流式文件,因此只能顺序存取数据
B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖
C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读
到第1 个数据
D)当对文件的读(写)操作完成之后, 必须将它关闭,否则可能导致数据丢失
(50)有下列程序:
#include <stdio.h>
main( )
{ FILE *fp; int i;
charch[ ]="abcd",t;
fp=fopen("abc.dat","wb+");
for(i=0;i<4;i+ +) fwrite(&ch[i],1,1,fp);
fseek(fp,-2L,SEEK_END);
fread(&t,1,1,fp);
fclose(fp);
printf("%c\n",t);
}
程序执行后的输出结果是( )。
A)d B)c C)b D)a
二、填空题(每空2 分,共40 分)
注意:以命令关键字填空的必须拼写完整。
(1)下列软件系统结构图的宽度为【1】。

(2) 【2】的任务是诊断和改正程序中的错误。
(3)一个关系表的行称为【3】。
(4)按“先进后出”原则组织数据的数据结构是【4】。
(5)数据结构分为线性结构和非线性结构,带链的队列属于【5】。
(6)设有定义:float x=123.4567;,则执行下列语句后的输出结果是【6】。
printf("%f\n",(int)(x*100+0.5)/100.0);
(7)下列程序运行后的输出结果是 【7】。
main( )
{ int m=011,n=11;
printf("%d %d\n",+ +m,n+ +);
}
(8)下列程序运行后的输出结果是 【8】。
main( )
{ int x,a=1,b=2,c=3,d=4;
x=(a<b)?a:b; x=(x<c)?x:c; x=(d>x)?x:d;
printf("%d\n",x);
}
(9)有下列程序,若运行时从键盘输入:18,11<CR>,则程序的输出结果是 【9】。
main( )
{ int a,b;
printf("Enter a,b: "); scanf("%d,%d",&a,&b);
while(a! =b)
{ while(a>b)a-=b;
while(b>a)b-=a;
}
printf("%3d%3d\n",a,b);
}
(10)下列程序的功能是:将输入的正整数按逆序输出。例如:若输入135 则输出531。请
填空。
#include<stdio.h>
main( )
{ int n,s;
printf("Enter a number : "); scanf("%d",&n);
printf("Output: ");
do
{ s=n%10; printf("%d",s); 【10】;}
while(n! =0);
printf("\n");
}
(11)下列程序中,fun()函数的功能是计算x2-2x+6,主函数中将调用fun()函数计算:
y1=(x+8)2-2(x+8)+6
y2=sin2(x)-2sin(x)+6
请填空。
#include "math.h"
double fun(double x){return(x*x-2*x+6);}
main( )
{ double x,y1,y2;
printf("Enter x: "); scanf("%lf",&x);
y1=fun( 【11】);
y2=fun( 【12】);
printf("y1=%lf,y2=%lf\n",y1,y2);
}
(12)下列程序的功能是将N 行N 列二维数组中每一行的元素进行排序,第0 行从小到大
排序,第1 行从大到小排序,第2 行从小到大排序,第3 行从大到小排序,例如:

请填空。
#define N 4
void sort(int a[ ][N])
{ int i,j,k,t;
for(i=0;i<N;i+ +)
for(j=0;j<N-1;j+ +)
for(k= 【13】; k<N;k+ +)
/*判断行下标是否为偶数来确定按升序或降序来排序*/
if( 【14】? a[i][j]<a[i][k]:a[i][j]>a[i][k])
{ t=a[i][j];
a[i][j]=a[i][k];
a[i][k]=t;
}
}
void outarr(int a[N][N])
{ …… }
main( )
{ int aa[N][N]={{2,3,4,1},{8,6,5,7},{11,12,10,9},{15,14,16,13}};
outarr(aa);/*以矩阵的形式输出二维数组*/
sort(aa);
outarr(aa);
}
(13)下列程序中的函数strcpy2( )实现字符串两次复制,即将t 所指字符串复制两次到s 所
指内存空间中,全并形成一个新字符串。例如。若t 所指字符串为:efgh,调用strcpy2
后,s 所指字符串为:efghefgh。请填空。
#include <stdio.h>
#include <string.h>
void strcpy2(char *s,char *t)
{ char *p=t;
while(*s+ + =*t+ +);
s= 【15】;
while ( 【16】=*p+ +);
}
main( )
{ char str1[100]= "abcd",str2[ ]="efgh";
strcpy2(str1,str2); printf("%s\n",str1);
}
(14)下列程序的运行结果是: 【17】。
#include <stdio.h>
int f(int a[ ],int n)
{ if(n>1)
return a[0]+f(a+1,n-1);
else
return a[0];
}
main( )
{ int aa[10]={1,2,3,4,5,6,7,8,9,10},s;
s=f(aa+2,4); printf("%d\n",s);
}
(15)下列程序由两个源程序文件:t4.h 和t4.c 组成,程序编译运行的结果是: 【18】。
t4.h 的源程序为:
#define N 10
#define f2(x) (x*N)
t4.c 的源程序为:
#include <stdio.h>
#define M8
#define f(x)((x)*M)
#include "t4.h"
main( )
{ int i,j;
i=f(1+1); j=f2(1+1);
printf("%d%d\n",i,j);
}
(16)下列程序的功能是建立一个有3 个结点的单循环链表,然后求各个结点数值域data
中数据的和。请填空。

#include <stdio.h>
#include <stdlib.h>
struct NODE {int data;
struct NODE *next;
};
main( )
{ struct NODE *p,*q,*r;
int sum=0;
p=(struct NODE *)malloc(sizeof(struct NODE));
q=(struct NODE *)malloc(sizeof(struct NODE)) ;
r=(struct NODE *)malloc(sizeof(struct NODE)) ;
p->data=100; q->data=200; r->data=300;
p->next=q; q->next=r;r->next=p;
sum=p->data+p->next->data+r->next->next 【19】;
printf("%d\n",sum);
}
(17)有下列程序,其功能是:以二进制"写"方式打开文件d1.dat,写入1~100 这100 个整
数后关闭文件。再以二进制"读"方式打开文件d1.dat,将这100 个整数读入到另一个
数组b 中,并打印输出。请填空。
#include <stdio.h>
main( )
{ FILE*fp;
int i,a[100],b[100];
fp=fopen("d1.dat", "wb");
for(i=0;i<100;i+ +), a[i]=i+1;
fwrite(a,sizeof(int),100,fp);
fclose(fp);
fp=fopen("d1.dat", 【20】);
fread(b,sizeof(int),100,fp);
fclose(fp);
for(i=0;i<100;i+ +) printf ("%d\n",b[i]);
}
二级公共基础知识和 C 语言程序设计
(考试时间 120 分钟,满分100 分)
PDF版(非扫描)下载: 2006年9月计算机二级C语言真题
一、选择题((1)-(10)每小题2 分,(11)-(50)每小题1 分,共60 分)
(1)下列选项中不符合良好程序设计风格的是( )。
A)源程序要文档化 B)数据说明的次序要规范化
C)避免滥用goto 语句 D)模块设计要保证高耦合、高内聚
(2)从工程管理角度,软件设计一般分为两步完成,它们是( )。
A)概要设计与详细设计 B)数据设计与接口设计
C)软件结构设计与数据设计 D)过程设计与数据设计
(3)下列选项中不属于软件生命周期开发阶段任务的是( )。
A)软件测试 B)概要设计
C)软件维护 D)详细设计
(4)在数据库系统中,用户所见的数据模式为( )。
A)概念模式 B)外模式
C)内模式 D)物理模式
(5)数据库设计的4 个阶段是:需求分析、概念设计、逻辑设计和( )。
A)编码设计 B)测试阶段
C)运行阶段 D)物理设计
(6)设有如下3 个关系表

下列操作中正确的是( )。
A)T=R∩S B)T=R∪S
C)T=R×S D)T=R/S
(7)下列叙述中正确的是( )。
A)一个算法的空间复杂度大,则其时间复杂度也必定大
B)一个算法的空间复杂度大,则其时间复杂度必定小
C)一个算法的时间复杂度大,则其空间复杂度必定小
D)上述三种说法都不对
(8)在长度为64 的有序线性表中进行顺序查找,最坏情况下需要比较的次数为( )。
A)63 B)64 C)6 D)7
(9)数据库技术的根本目标是要解决数据的( )。
A)存储问题 B)共享问题 C)安全问题 D)保护问题
(10)对下列二叉树

进行中序遍历的结果是( )。
A)ACBDFEG B)ACBDFGE
C)ABDCGEF D)FCADBEG
(11)下列叙述中错误的是( )。
A)一个C 语言程序只能实现一种算法
B)C 程序可以由多个程序文件组成
C)C 程序可以由一个或多个函数组成
D)一个C 函数可以单独作为一个C 程序文件存在
(12)下列叙述中正确的是( )。
A)每个C 程序文件中都必须要有一个main( )函数
B)在C 程序中main( )函数的位置是固定的
C)C 程序中所有函数之间都可以相互调用,与函数所处位置无关
D)在C 程序的函数中不能定义另一个函数
(13)下列定义变量的语句中错误的是( )。
A)int _int; B)double int_;
C)char For; D)float US$;
(14)若变量x、y 已正确定义并赋值,下列符合C 语言语法的表达式是( )。
A)+ +x,y=x-- B)x+1=y
C)x=x+10=x+y D)double(x)/10
(15)下列关于逻辑运算符两侧运算对象的叙述中正确的是( )。
A)只能是整数0 或1 B)只能是整数0 或非0 整数
C)可以是结构体类型的数据 D)可以是任意合法的表达式
(16)若有定义int x,y; 并已正确给变量赋值,则下列选项中与表达式(x-y)?(x+ +):(y+ +)中
的条件表达式(x-y)等价的是( )。
A)(x-y>0) B)(x-y<0)
C)(x-y<0‖x-y>0) D)(x-y= =0)
(17)有下列程序:
main( )
{ int x,y,z;
x=y=1;
z=x+ +,y+ +,+ +y;
printf("%d,%d,%d\n",x,y,z);
}
程序运行后的输出结果是( )。
A)2,3,3 B)2,3,2
C)2,3,1 D)2,2,1
(18)设有定义: int a; float b; 执行scanf("%2d%f",&a,&b);语句时,若从键盘输入
876543.0<CR>,a 和b 的值分别是( )。
A)876 和543.000000 B)87 和6.000000
C)87 和543.000000 D)76 和543.000000
(19)有下列程序:
main( )
{ int a=0,b=0;
a=10; /*给a 赋值
b=20; 给b 赋值 */
printf("a+b=%d\n",a+b); /*输出计算结果 */
}
程序运行后的输出结果是( )。
A)a+b=10 B)a+b=30
C)30 D)出错
(20)在嵌套使用if 语句时,C 语言规定else 总是( )。
A)和之前与其具有相同缩进位置的if 配对 B)和之前与其最近的if 配对
C)和之前与其最近的且不带else 的if 配对 D)和之前的第一个if 配对
(21)下列叙述中正确的是( )。
A)break 语句只能用于switch 语句
B)在switch 语句中必须使用default
C)break 语句必须与switch 语句中的case 配对使用
D)在switch 语句中,不一定使用break 语句
(22)有下列程序:
main( )
{ int k=5;
while(--k) printf("%d",k-=3);
printf("\n");
}
执行后的输出结果是( )。
A)1 B)2
C)4 D)死循环
(23)有下列程序:
main( )
{ int i;
for(i=1;i<=40;i+ +)
{ if(i+ +%5= =0)
if(+ +i%8= =0) printf("%d",i);
}
printf("\n");
}
执行后的输出结果是( )。
A)5 B)24
C)32 D)40
(24)下列选项中,值为1 的表达式是( )。
A)1-'0' B)1-'\0'
C)'1'-0 D)'\0'-'0'
(25)有下列程序:
fun(int x,int y){return (x+y);}
main( )
{ int a=1,b=2,c=3,sum;
sum=fun((a+ +,b+ +,a+b),c+ +);
printf("%d\n",sum);
}
执行后的输出结果是( )。
A)6 B)7
C)8 D)9
(26)有下列程序:
main( )
{ char s[ ]="abcde";
s+ =2;
printf("%d\n",s[0]);
}
执行后的结果是( )。
A)输出字符a 的ASCII 码 B)输出字符c 的ASCII 码
C)输出字符c D)程序出错
(27)有下列程序:
fun (int x,int y)
{ static int m=0,i=2;
i+ =m+1; m=i+x+y; return m;
}
main ( )
{ int j=1, m=1, k;
k=fun(j,m); printf("%d, ",k);
k=fun(j,m); printf("%d\n",k);
}
执行后的输出结果是( )。
A)5,5 B)5,11
C)11,11 D)11,5
(28)有下列程序:
fun(int x)
{ int p;
if(x= =0‖x= =1) return(3);
p=x-fun(x-2);
return p;
}
main( )
{ printf("%d\n",fun(7));}
执行后的输出结果是( )。
A)7 B)3
C)2 D)0
(29)在16 位编译系统上,若有定义int a[ ]={10,20,30},*p=&a;,当执行p+ +;后,下列说法
错误的是( )。
A)p 向高地址移了一个字节 B)p 向高地址移了一个存储单元
C)p 向高地址移了两个字节 D)p 与a+1 等价
(30)有下列程序:
main( )
{ int a=1, b=3,c=5,*p;
int *p1=&a, *p2=&b, *p3=&c;
*p=*p1*(*p2);
printf("%d\n",*p);
}
执行后的输出结果是( )。
A)1 B)2
C)3 D)4
(31)若有定义:int w[3][5];,则下列不能正确表示该数组元素的表达式是( )。
A)*(*w+3) B)*(*w+1)[4]
C)*(*(*w+1)) D)*(&w[0][0]+1)
(32)若有以下函数首部
int fun (double x[10],int *n)
则下列针对此函数的函数声明语句中正确的是( )。
A)int fun(double x, int *n); B)int fun(double , int);
C)int fun(double *x, int n); D)int fun(double *, int *);
(33)若有定义语句:int k[2][3], *pk[3];,则下列语句中正确的是( )。
A)pk=k; B)pk[0]=&k[1][2];
C)pk=k[0]; D)pk[1]=k;
(34)有下列程序:
void change (int k[ ] ){k[0]=k[5];}
main( )
{ int x[10]={1,2,3,4,5,6,7,8,9,10},n=0;
while (n<=4) {change(&x[n]);n+ +;}
for(n=0;n<5;n+ +) printf("%d",x[n]);
printf("\n");
}
程序运行后输出的结果是( )。
A)6 7 8 9 10 B)1 3 5 7 9
C)1 2 3 4 5 D)6 2 3 4 5
(35)若要求定义具有10 个int 型元素的一维数组a,则下列定义语句中错误的是( )。
A)#define N 10 B)#define n 5
int a [N]; int a [2*n];
C)int a [5+5]; D)int n=10,a [n];
(36)有下列程序:
main( )
{ int x[3][2]={0},i;
for(i=0;i<3;i+ +) scanf("%d",x[i]);
printf("%3d%3d%3d\n",x[0][0],x[0][1],x[1][0]);
}
若运行时输入:2 4 6 <CR>,则输出结果为( )。
A)2 0 0 B)2 0 4
C)2 4 0 D)2 4 6
(37)有下列程序:
main( )
{ char s[ ]={"aeiou"} ,*ps;
ps=s; printf("%c\n",*ps+4);
}
程序运行后的输出结果是( )。
A)a B)e
C)u D)元素s[4]的地址
(38)下列语句中存在语法错误的是( )。
A)char ss[6] [20]; ss[1]= "right? "; B)char ss[ ] [20]={ "right? "};
C)char *ss[6]; ss[1]= "right? "; D)char ss[ ]={ "right? "};
(39)若有定义:char *x="abcdefghi";,下列选项中正确运用了strcpy 函数的是( )。
A)char y[10]; strcpy(y,x[4]); B)char y[10]; strcpy(+ +y,&x[1]);
C)char y[10],*s; strcpy(s=y+5,x); D)char y[10],*s; strcpy(s=y+1,x+1);
(40)有下列程序:
int add (int a,int b) {return (a+b);}
main( )
{ int k,(*f)( ),a=5,b=10;
f=add;
…
}
则下列函数调用语句错误的是( )。
A)k=(*f)(a,b); B)k=add(a,b);
C)k=*f(a,b); D)k=f(a,b);
(41)有下列程序:
# include <string .h>
main(int argc,char *argv[ ])
{ int i=1,n=0;
while (i<argc) {n=n+strlen(argv[i]);i+ +;}
printf("%d\n",n);
}
该程序生成的可执行文件为:proc.exe。若运行时输入命令行:
proc 123 45 67
则程序的输出结果是( )。
A)3 B)5
C)7 D)11
(42)有下列程序:
void fun2(char a, char b) {printf("%c%c",a,b); }
char a='A',b='B';
void fun1( ){a='C'; b='D' ; }
main( )
{ fun1( );
printf("%c%c",a,b);
fun2('E','F');
}
程序的运行结果是( )。
A)C D E F B)A B E F
C)A B C D D)C D A B
(43)有下列程序:
#include <stdio.h>
#define N 5
#define M N+1
#define f(x) (x*M)
main( )
{ int i1,i2;
i1=f(2);
i2=f(1+1);
printf("%d %d\n", i1,i2);
}
程序的运行结果是( )。
A)12 12 B)11 7
C)11 11 D)12 7
(44)设有以下语句:
typedef struct TT
{ char c; int a[4]; } CIN;
则下列叙述中正确的是( )。
A)可以用TT 定义结构体变量 B)TT 是struct 类型的变量
C)可以用CIN 定义结构体变量 D)CIN 是struct TT 类型的变量
(45)有下列结构体说明、变量定义和赋值语句:
struct STD
{ char name[10];
int age;
char sex;
} s[5],*ps;
ps=&s[0];
则下列scanf 函数调用语句中错误引用结构体变量成员的是( )。
A)scanf("%s",s[0].name); B)scanf("%d",&s[0].age);
C)scanf("%c",&(ps->sex)); D)scanf("%d",ps->age);
(46)若有下列定义和语句:
union data
{ int i; char c; float f; } x;
int y;
则下列语句正确的是( )。
A)x=10.5; B)x.c=101;
C)y=x; D)printf("%d\n",x);
(47)程序中已构成如下图所示的不带头结点的单向链表结构,指针变量s、p、q 均已正确
定义,并用于指向链表结点,指针变量s 总是作为头指针指向链表的第一个结点。

若有下列程序段
q=s; s=s->next; p=s;
while (p->next) p=p->next;
p->next=q; q->next=NULL;
该程序段实现的功能是( )。
A)首结点成为尾结点 B)尾结点成为首结点
C)删除首结点 D)删除尾结点
(48)若变量已正确定义,则下列语句的输出结果是( )。
s=32; s^=32; printf("%d",s);
A)-1 B)0
C)1 D)32
(49)下列叙述中正确的是( )。
A)C 语言中的文件是流式文件,因此只能顺序存取数据
B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖
C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读
到第1 个数据
D)当对文件的读(写)操作完成之后, 必须将它关闭,否则可能导致数据丢失
(50)有下列程序:
#include <stdio.h>
main( )
{ FILE *fp; int i;
charch[ ]="abcd",t;
fp=fopen("abc.dat","wb+");
for(i=0;i<4;i+ +) fwrite(&ch[i],1,1,fp);
fseek(fp,-2L,SEEK_END);
fread(&t,1,1,fp);
fclose(fp);
printf("%c\n",t);
}
程序执行后的输出结果是( )。
A)d B)c C)b D)a
二、填空题(每空2 分,共40 分)
注意:以命令关键字填空的必须拼写完整。
(1)下列软件系统结构图的宽度为【1】。

(2) 【2】的任务是诊断和改正程序中的错误。
(3)一个关系表的行称为【3】。
(4)按“先进后出”原则组织数据的数据结构是【4】。
(5)数据结构分为线性结构和非线性结构,带链的队列属于【5】。
(6)设有定义:float x=123.4567;,则执行下列语句后的输出结果是【6】。
printf("%f\n",(int)(x*100+0.5)/100.0);
(7)下列程序运行后的输出结果是 【7】。
main( )
{ int m=011,n=11;
printf("%d %d\n",+ +m,n+ +);
}
(8)下列程序运行后的输出结果是 【8】。
main( )
{ int x,a=1,b=2,c=3,d=4;
x=(a<b)?a:b; x=(x<c)?x:c; x=(d>x)?x:d;
printf("%d\n",x);
}
(9)有下列程序,若运行时从键盘输入:18,11<CR>,则程序的输出结果是 【9】。
main( )
{ int a,b;
printf("Enter a,b: "); scanf("%d,%d",&a,&b);
while(a! =b)
{ while(a>b)a-=b;
while(b>a)b-=a;
}
printf("%3d%3d\n",a,b);
}
(10)下列程序的功能是:将输入的正整数按逆序输出。例如:若输入135 则输出531。请
填空。
#include<stdio.h>
main( )
{ int n,s;
printf("Enter a number : "); scanf("%d",&n);
printf("Output: ");
do
{ s=n%10; printf("%d",s); 【10】;}
while(n! =0);
printf("\n");
}
(11)下列程序中,fun()函数的功能是计算x2-2x+6,主函数中将调用fun()函数计算:
y1=(x+8)2-2(x+8)+6
y2=sin2(x)-2sin(x)+6
请填空。
#include "math.h"
double fun(double x){return(x*x-2*x+6);}
main( )
{ double x,y1,y2;
printf("Enter x: "); scanf("%lf",&x);
y1=fun( 【11】);
y2=fun( 【12】);
printf("y1=%lf,y2=%lf\n",y1,y2);
}
(12)下列程序的功能是将N 行N 列二维数组中每一行的元素进行排序,第0 行从小到大
排序,第1 行从大到小排序,第2 行从小到大排序,第3 行从大到小排序,例如:

请填空。
#define N 4
void sort(int a[ ][N])
{ int i,j,k,t;
for(i=0;i<N;i+ +)
for(j=0;j<N-1;j+ +)
for(k= 【13】; k<N;k+ +)
/*判断行下标是否为偶数来确定按升序或降序来排序*/
if( 【14】? a[i][j]<a[i][k]:a[i][j]>a[i][k])
{ t=a[i][j];
a[i][j]=a[i][k];
a[i][k]=t;
}
}
void outarr(int a[N][N])
{ …… }
main( )
{ int aa[N][N]={{2,3,4,1},{8,6,5,7},{11,12,10,9},{15,14,16,13}};
outarr(aa);/*以矩阵的形式输出二维数组*/
sort(aa);
outarr(aa);
}
(13)下列程序中的函数strcpy2( )实现字符串两次复制,即将t 所指字符串复制两次到s 所
指内存空间中,全并形成一个新字符串。例如。若t 所指字符串为:efgh,调用strcpy2
后,s 所指字符串为:efghefgh。请填空。
#include <stdio.h>
#include <string.h>
void strcpy2(char *s,char *t)
{ char *p=t;
while(*s+ + =*t+ +);
s= 【15】;
while ( 【16】=*p+ +);
}
main( )
{ char str1[100]= "abcd",str2[ ]="efgh";
strcpy2(str1,str2); printf("%s\n",str1);
}
(14)下列程序的运行结果是: 【17】。
#include <stdio.h>
int f(int a[ ],int n)
{ if(n>1)
return a[0]+f(a+1,n-1);
else
return a[0];
}
main( )
{ int aa[10]={1,2,3,4,5,6,7,8,9,10},s;
s=f(aa+2,4); printf("%d\n",s);
}
(15)下列程序由两个源程序文件:t4.h 和t4.c 组成,程序编译运行的结果是: 【18】。
t4.h 的源程序为:
#define N 10
#define f2(x) (x*N)
t4.c 的源程序为:
#include <stdio.h>
#define M8
#define f(x)((x)*M)
#include "t4.h"
main( )
{ int i,j;
i=f(1+1); j=f2(1+1);
printf("%d%d\n",i,j);
}
(16)下列程序的功能是建立一个有3 个结点的单循环链表,然后求各个结点数值域data
中数据的和。请填空。

#include <stdio.h>
#include <stdlib.h>
struct NODE {int data;
struct NODE *next;
};
main( )
{ struct NODE *p,*q,*r;
int sum=0;
p=(struct NODE *)malloc(sizeof(struct NODE));
q=(struct NODE *)malloc(sizeof(struct NODE)) ;
r=(struct NODE *)malloc(sizeof(struct NODE)) ;
p->data=100; q->data=200; r->data=300;
p->next=q; q->next=r;r->next=p;
sum=p->data+p->next->data+r->next->next 【19】;
printf("%d\n",sum);
}
(17)有下列程序,其功能是:以二进制"写"方式打开文件d1.dat,写入1~100 这100 个整
数后关闭文件。再以二进制"读"方式打开文件d1.dat,将这100 个整数读入到另一个
数组b 中,并打印输出。请填空。
#include <stdio.h>
main( )
{ FILE*fp;
int i,a[100],b[100];
fp=fopen("d1.dat", "wb");
for(i=0;i<100;i+ +), a[i]=i+1;
fwrite(a,sizeof(int),100,fp);
fclose(fp);
fp=fopen("d1.dat", 【20】);
fread(b,sizeof(int),100,fp);
fclose(fp);
for(i=0;i<100;i+ +) printf ("%d\n",b[i]);
}