c语言期末考试题库及详解答案 c语言题库及详解答案
大家好,关于c语言期末考试题库及详解答案很多朋友都还不太明白,今天小编就来为大家分享关于c语言题库及详解答案的知识,希望对各位有所帮助!
...C语言版(清华大学出版社)的期末考试试题及答案
《数据结构》期末考试试卷( A)
一、选择题(每小题2分,共24分)
1.计算机识别、存储和加工处理的对象被统称为( A)
A.数据 B.数据元素
C.数据结构 D.数据类型
2.栈和队列都是( A)
A.限制存取位置的线性结构 B.顺序存储的线性结构
C.链式存储的线性结构 D.限制存取位置的非线性结构
3.链栈与顺序栈相比,比较明显的优点是( D)
A.插入操作更加方便 B.删除操作更加方便
C.不会出现下溢的情况 D.不会出现上溢的情况
4.采用两类不同存储结构的字符串可分别简称为( B)
A.主串和子串 B.顺序串和链串
C.目标串和模式串 D.变量串和常量串
5.一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是:B
A. 110 B.108
C. 100 D. 120
6.串是一种特殊的线性表,其特殊性体现在:B
A.可以顺序存储 B.数据元素是一个字符
C.可以链接存储 D.数据元素可以是多个字符
7.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为: C
A. 2h B.2h-1
C. 2h+1 D. h+1
软件开发网
8.树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。这里,我们把由树转化得到的二叉树叫做这棵树对应的二叉树。下列结论哪个正确? A
A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同
B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同
C.树的先根遍历序列与其对应的二叉树的中序遍历序列相同
D.以上都不对
9.一个有n个顶点的无向图最多有多少边?C
A. n B.n(n-1)
C. n(n-1)/2 D. 2n
10.在一个图中,所有顶点的度数之和等于所有边数的多少倍?C
A. 1/2 B.1
C. 2 D. 4
11.当在二叉排序树中插入一个新结点时,若树中不存在与待插入结点的关键字相同的结点,且新结点的关键字小于根结点的关键字,则新结点将成为( A)
A.左子树的叶子结点 B.左子树的分支结点
C.右子树的叶子结点 D.右子树的分支结点
软件开发网
12.对于哈希函数H(key)=key%13,被称为同义词的关键字是( D)
A.35和41 B.23和39
C.15和44 D.25和51
二、已知某棵二叉树的前序遍历结果为A,B,D,E,G,C,F,H,I,J,其中中序遍历的结果为D,B,G,E,A,H,F,I,J,C。请画出二叉的具体结构。(注意要写出具体步骤)(10分)
原理见课本128页
三、有图如下,请写出从顶点c0出发的深度优先及宽度优先遍历的结果。(10分)
深度优先;C0-C1-C3-C4-C5-C2
宽度优先:C0-C1-C2-C3-C4-C5
四、有图如下,按Kruskal算法求出其最小生成树。要求写出完整的步骤。(10分)
原理见课本250页
五、给定线性表(12,23,45,66,76,88,93,103,166),试写出在其上进行二分查找关键字值12,93,166的过程。并写出二分查找的算法。(20分)
0 1 2 3 4 5 6 7 8
12 23 45 66 76 88 93 103 166
过程:
mid=(0+8)/2=4
high=3,low=0 mid=1
high=0,low=0 mid=0(找到12)
high=8,low=5,mid=6(找到93)
high=8,low=7,mid=7
high=8 low=8 mid=8
算法:见课本84页上
六、知单链表的结点结构为
Data next
下列算法对带头结点的单链表L进行简单选择排序,使得L中的元素按值从小到大排列。
请在空缺处填入合适的内容,使其成为完整的算法。(可用文字说明该算法的基本思想及执行的过程,10分)
void SelectSort(LinkedList L)
{
LinkedList p,q,min;
DataType rcd;
p=(1);
while(p!=NULL){
min=p;
q=p->next;
while(q!=NULL){
if((2))min=q;
q=q->next;
}
if((3)){
rcd=p->data;
p->data=min->data;
min->data=rcd;
}
(4);
}
}
本题不会。嘿嘿。。。。
七、一个完整的算法应该具有哪几个基本性质?分别简要说明每一性质的含意。(5分)
输入:
四个基本性质:1.输入:有零个或多个有外部提供的量作为算法的输入
2:输出:算法产生至少一个量作为输出
3.:确定性:组成算法的每条指令是清晰的,无歧异的。
4.:有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的
八、何谓队列的"假溢"现象?如何解决?(5分)
队列的假溢现象是指数组实现的顺序队列中,队尾指针已到达数组的下表上界产生上溢而队头指针之前还有若干空间闲置的现象。解决的办法之一是利用循环队列技术使数组空间的首尾相连。
九、说明并比较文件的各种物理结构。(6分)
C语言期末考试试题(谭浩强版)
C语言期末考试试题
2008年04月12日星期六 00:22
一选择题(24分,每小题2分)
1.已知函数fread的调用形式为fread(buffer,size,count,fp),其中buffer代表的是()。
A存放读入数据项的存储区
B存放读入数据的地址或指向此地址的指针
C一个指向所读文件的文件指针
D一个整形变量,代表要读入的数据项总数
2.以下程序的输出结果为()。
main()
{
int i=010,j=10;
printf("%d,%d\n",i++,j--);
}
A 11,9
B 9,10
C 8,10
D 9,9
3.设a为int型变量,执行下列赋值语句后,a的取值分别是()。
a=125.534;
a=20.0/3;
a=(int)125.521%4;
a=5<<2;
A 125,6,31,1
B 125,6,1,20
C 125,6.666666,31,20
D 125.534,6.666666,2,20
4.设i和k都是int类型,则for循环语句()。
for(i=0,k=-1;k=1;i++,k++)
printf("****\n");
A循环结束的条件不合法
B循环体一次也不执行
C循环体只执行一次
D是无限循环
5.以下程序的输出结果为()。
main()
{
char c;
int i;
for(i=65;i<68;i++)
{
c=i+32;
switch(c)
{
case'a':
case'b':
case'c':printf("%c,",c);break;
default:printf("end");
}
}
}
A a,b,c,end
B a,a,a,end
C a,a,a,
D a,b,c,
6.函数调用语句:fseek(fp,-10L,2);的含义是()。
A将文件位置指针从文件末尾处向文件头的方向移动10个字节
B将文件位置指针从当前位置向文件头的方向移动10个字节
C将文件位置指针从当前位置向文件末尾方向移动10个字节
D将文件位置指针移到距离文件头10个字节处
7.以下程序的输出结果为()。
main()
{
int i=0,j=0;
while(s1[i]!='\0')
i++;
while(s2[j]!='\0')
s1[i++]=s2[j++];
s1[i]=0;
printf("%s\n",s1);
}
A side
B country
C sidetry
D countryside
8.下列说法不正确的是()。
A主函数main中定义的变量在整个文件或程序中有效
B不同函数中,可以使用相同名字的变量
C形式参数是局部变量
D在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效
9.在下列程序段中,枚举变量 c1的值是()。
enum color{ red,yellow,blue=4,green,white}c1;
c1=yellow;
c1=white;
A 1
B 3
C 5
D 6
10.设有说明 int(*ptr)();其中标识符ptr是()。
A是一个指向整形变量的指针
B是一个指针,它指向一个函数值是int的函数
C是一个函数名
D定义不合法
11.定义由n个指向整形数据的指针组成的数组p,其正确的方式为()。
A int p;
B int(*p)[n];
C int*p[n];
D int(*p)();
12.具有相同类型的指针类型变量p与数组a,不能进行的操作是()。
A p=a;
B*p=a[0];
C p=&a[0];
D p=&a;
二判断对错,对的划“√”,错的划“×”(20分,每小题2分)
1.参加位运算的数据可以是任何类型的数据。()
2.若有定义和语句:
int a;
char c;
float f;
scanf("%d,%c,%f",&a,&c,&f);
若通过键盘输入:10 A 12 5
则a=10,c=‘A’,f=12.5。()
3.C语言把文件看作是一个字符(字节)的序列。()
4.若有宏定义:
#define S(a,b) t=a;a=b;b=t
由于变量t没定义,所以此宏定义是错误的。()
5.在Turbo C中,下面的定义和语句是合法的:
file*fp;
fp=fopen("a.txt","r");()
6.若有定义:
char s[ ]="china";
则Turbo C系统为数组s开辟6个字节的内存单元。()
7.若有定义和语句:
int a[3][3]={{3,5},{8,9},{12,35}},i,sum=0;
for(i=0;i<3;i++)
sum+=a[i][2-i];
则sum=21。()
8.若有定义和语句:
struct student
{
int num;
char name[10];
float score;
}
s[5]={{1,"lili",98.5},{9,"xiaohua",66}},*p=s;printf("%d",*p++);
输出结果是1。()
9.在程序中定义了一个结构体类型后,可以多次用它来定义具有该类型的变量。()
10.在Turbo C中,此定义和语句是合法的:
enum aa{ a=5,b,c}bb;
bb=(enum aa)5;()
三写出下列程序的运行结果(36分,每小题6分)
1.
main()
{
int i=29,j=6,k=2,s;
s=i+i/j%k-9;//s=i+(i/j)%k-9
printf(“s=%d\n”,s);
}
2.
main()
{
int x=31,y=2,s=0;
do
{
s-=x*y;
x+=2;y-=3;
}
while(x%3==0);//先执行,后判断
printf(“x=%d\ty=%d\ts=%d\n”,x,y,s);
}
3.
main()
{
int a[6]={10,20,30,40,50,60},i;
invert(a,0,5);
for(i=0;i<6;i++)
printf(“%d,”,a[i]);
printf(“\n”);
}
invert(int s[ ],int i,int j)//倒置
{
int t;
if(i<j)
{
invert(s,i+1,j-1);//函数自身的嵌套调用,形成循环
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
4.
#include<stdio.h>
main()
{
char str[ ]="The C program",c;
int i;
for(i=2;(c=str[i])!='\0';i++)
{
switch(c)
{
case'g':++i; break;//由于++i,跳过了g后面的1个字母
case'o': continue;
default: printf(“%c”,c); continue;
}
printf(“*”);
}
printf(“\n”);
}
5.
struct w//结构体
{
char low;
char high;
};
union u//共用体
{
struct w byte;
short word;
}uw;
main()
{
int result;
uw.word=0x1234;
printf("word value:%04x\n",uw.word);
printf("high byte:%02x\n",uw.byte.high);
printf("low byte:%02x\n",uw.byte.low);
uw.byte.low=0x74;
printf("word value:%04x\n",uw.word);
result=uw.word+0x2a34;
printf("the result:%04x\n",result);
}
6.
main()
{
char*s2="I love China!",**s1=&s2;
char*s3,c,*s4="w";
s3=&c;
*s3='H';
s2=s2+2;
printf("%s\t%c\t%s\t%c\n",s2,*s3,s4,**s1);
}
四阅读下列程序,在处填入适当内容,使程序完整(20分,每个空2分)
1.百马百担问题:有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问大、中、小马各多少匹?
main()
{
int hb,hm,hl,n=0;
for(hb=0;hb<=100;hb+=(1))
for(hm=0;hm<=100-hb;hm+=(2))
{
hl=100-hb-(3);
if(hb/3+hm/2+2*(3)==100)
{
n++;
printf("hb=%d,hm=%d,hl=%d\n",hb/3,hm/2,2*hl);
}
}
printf("n=%d\n",n);
}
2.用“起泡法”对输入的10个字符排序后按从小到大的次序输出。
#define N 10
char str[N];
void main()
{
int i,flag;
for(flag=1;flag==1;)
{
scanf("%s",str);
flag=0;
printf("\n");
}
sort(___(4)___);
for(i=0;i<N;i++)
{
printf("%c",str[i]);
}
printf("\n");
}
sort(char str[N])//冒泡排序
{
int i,j;
char t;
for(j=1;j<N;j++)
for(i=0;i<10-j;i++)
if(str[i]>str[i+1])
{
t=str[i];
____(5)____;
____(6)____;//交换位置
}
}
3.以下程序是一个函数,功能是求二阶矩阵(m行n列矩阵)的所有靠外侧的各元素值之和。(本程序中二阶矩阵用一维数组来表示。)
例如,矩阵为:
3 0 0 3
2 5 7 3
1 0 4 2
则所有靠外侧的各元素值之和为3+0+0+3+2+3+1+0+4+2=18。
add(int m,int n,int arr[])
{
for(i=0;i<m;i=i+m-1)
for(j=0;j<n;j++)
sum=sum+____(7)____;
for(j=0;j<n;j=j+n-1)
for(i=1;____(8)____;i++)
sum=sum+arr[i*n+j];
return(sum);
}
4.用指针作函数参数,编程序求一维数组中的最大和最小的元素值。
#define N 10
main()
{
void maxmin(int arr[],int*pt1,int*pt2,int n);
int array[N]={10,7,19,29,4,0,7,35,-16,21},*p1,*p2,a,b;
p1=&a;
p2=&b;
maxmin(array,p1,p2,N);
printf("max=%d,min=%d",a,b);
}
void maxmin(int arr[],int*pt1,int*pt2,int n)
{
int i;
*pt1=*pt2=arr[0];
for(i=1;i<n;i++)
{
if(arr[i]>*pt1)
____(9)____;
if(arr[i]<*pt2)
____(10)____;
}
}
答案
一选择题(24分,每小题2分)
1.( B) 2.( C) 3.( B)
4.( D) 5.( D) 6.( A)
7.( D) 8.( A) 9.( D)
10.( B) 11.( C) 12.( D)
二判断对错,对的划“√”,错的划“×”(20分,每小题2分)
1.(×) 2.(√)
3.(√) 4.(×)
5.(×) 6.(√)
7.(√) 8.(×)
9.(√) 10.(√)
三写出下列程序的运行结果(36分,每小题6分)
1.s=20
2.x=35 y=-4 s=-29
3.60,50,40,30,20,10,
4.e C pr*am
5.word value:1234
6.love China! H w l
high byte:12
low byte:34
word value:1274
the result:3ca8
四阅读下列程序,在处填入适当内容,使程序完整(20分,每个空2分)
1.(1) 3(2) 2(3)hm hl
2.(4) str(5) str[i]=str[i+1](6) str[i+1]=t
3.(7) arr[i*n+j](8) i<m-1
4.(9)*ptr1=arr[i](10)*ptr2=arr[i]
求一份C语言程序设计的期末考试试题!!!谢谢了
一.选择题(共15题,每题2分,共30分)
1.定义结构体的关键字是()
A. union B. enum C.struct D.typedef
2.设整型变量a为5,使b不为2的表达式是()
A. b=a/2 B. b=6-(--a) C. b=a%2 D. b=a>3?2:1
3.下面哪一项是不正确的字符串赋值或赋初值的方法()
A. char*str; str=“china”;
B. char str[7]={‘c’,‘h’,‘i’,‘n’,‘a’};
C. char str1[]=“china”,str2[]=“123”;
D. char str1[10]; str1=“china”;
4.以下对二维数组a进行正确初始化的是()
A. int a[2][3]={{1,2},{3,4},{5,6}}; B. int a[ ][3]={1,2,3,4,5,6};
C. int a[2][ ]={1,2,3,4,5,6}; D. int a[2][ ]={{1,2},{3,4}};
5.选出下列标识符中不是合法的标识符的是()
A. hot_do B. cat1 C. _pri D. 2ab
6.以下说法中正确的是()
A. C语言程序总是从第一个的函数开始执行
B.在C语言程序中,要调用的函数必须在main()函数中定义
C. C语言程序总是从main()函数开始执行
D. C语言程序中的main()函数必须放在程序的开始部分
7.若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式为()
A. p+1 B. a+1 C. a++ D.++p
8.若有说明: int i,j=7,*p=&i;,则与i=j;等价的语句是()
A. i=*p; B.*p=*&j; C. i=&j; D. i=**p;
9.若变量c为char类型,能正确判断出c为小写字母的表达式是()
A.‘a’<=c<=‘z’ B.(c>=‘a’)||(c<=‘z’)
C.(‘a’<=c) and(‘z’>=c) D.(c>=‘a’)&&(c<=‘z’)
10.以下程序的输出结果是()
main()
{ int a[]={1,2,3,4,5,6,7,8,9},*p;
p=a;
*(p+3)+=2;
printf(“%d,%d\n”,*p,*(p+3));}
A. 0, 5 B. 1, 6 C. 1, 5 D. 0, 6
11.以下程序的输出结果是()
main()
{ int a=5;
float x=3.14;
a*=x*(‘E’-‘A’);
printf(“%f\n”,(float)a);}
A. 62.000000 B. 62.800000 C. 63.000000 D. 62
12.以下程序的输出结果是()
#define f(x) x*x
main()
{ int a=6,b=2,c;
c=f(a)/f(b);
printf(“%d\n”,c);}
A. 9 B. 6 C. 36 D. 18
13.定义如下变量和数组:int i; int x[3][3]={1,2,3,4,5,6,7,8,9};
则语句for(i=0;i<3;i++) printf("%d",x[i][2-i]);的输出结果是()
A. 1 5 9 B. 1 4 7 C. 3 5 7 D. 3 6 9
14.下列程序段的输出结果是()
void main()
{ int k;
for(k=1;k<5;k++)
{ if(k%2!=0)
printf(“#”);
else
printf(“*”);}
}
A.#*#* B.*#*# C.## D.**
15.下列程序执行后输出的结果是()
int d=1;
fun(int p)
{ int d=5;
d+=p++;
printf("%d,",d);}
main()
{ int a=3;
fun(a);
d+= a++;
printf("%d\n",d);}
A. 8, 4 B. 9, 6 C. 9, 4 D. 8, 5
二.填空题(共7题,每空2分,共30分)
1.数组 int a[3][5];共定义了_______________个元素。
2.有float f=3.1415927;则 printf(“%5.4f”, f);输出的结果是_______________。
3.下面程序的功能是:输出 100以内(不包含100)能被 3整除且个位数为 6的所有整数,请填空。
main()
{ int i;
for(i=1; _______________; i++)
if(_______________)
printf("%d", i);
}
4.设有“int x=2, y”说明,则逗号表达式“y=x+5,x+y”的值是 _______________
5.以下是使用指针,进行字符串复制的程序,请填空。
main()
{ char a[]=“Tsinghua University”, b[30],*p1,*p2;
p1=a;
p2=b;
for(;*p1!=‘_______________’; p1++, p2++)
_______________=_______________;
*p2=‘_______________’;
printf(“string a is:%s\n”,a);
printf(“string b is:%s\n”,b);
}
6.下面程序用冒泡法对数组a进行降序排序,请填空。
main()
{ int a[5]={4,7,2,5,1};
int i,j,m;
for(i=0;i<4;i++)
for(j=0;j<_______________;j++)
if( _______________< _______________)
{ m=a[ j];
a[ j]=a[ j+1];
a[ j+1]= m;}
for(i=0;i<5;i++)
printf("%d",a[i]);
}
7.函数fun的功能是:使一个字符串按逆序存放,请填空。
void fun(char str[])
{ char m; int i,j;
for(i=0,j=strlen(str);i<_______________;i++,j--)
{ m=str[i];
str[i]= _______________;
str[j-1]=m;
}
printf("the rotated string is%s\n",_______________);
}
好了,文章到此结束,希望可以帮助到大家。