武汉大学计算机学院C语言历年试题1

更新时间:2023-03-11 21:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

武汉大学计算机学院 2001-2002学年度第一学期2001级 《高级语言程序设计》期末考试试卷

姓名: 学号: 专业:

未经主考教师同意,考试试卷、答题纸、草稿纸均不得带离,否则视为违规。

一. 选择最合适的答案填空(每题1分,共10分)

( )1. ______ 不是C语言的基本控制结构。

A. 转移 A. 74和74

m,n的值为______ 。

A. 1和1 A. 4

B. 0和1 B. 38

C. 1和0 C. 105

D. 0和0 D. 280

( )4. 表达式35<<3的值为______ 。 ( )5. 设有如下宏定义 #define WIDTH 80

#define LENGTH WIDTH+1

则执行赋值语句 v=LENGTH*20;/*v为int型变量*/后,v的值为______ 。

B. 循环 B. 73和1

C. 顺序 C. 74和405

D. 选择 D. 73和9

( )2. 表达式65|9和65&9的值为______ 。

( )3. 设变量int m,n,a,b的值均为1,则执行表达式(m=a>b) &&(n=a>b)后,

A. 1620 A. q=**p A. a[8]

B. 1601 B. q=*&p B. a[4]

C. 100 C. q=&&p C. a[2]

D. 1600 D. q=*p D. 无法确定

( )6. 假如指针p已经指向某个整型变量,语句____ 使指针q与p指向同一变量。 ( )7. 设long a[50],*p;执行p=a; p+=4;后*(p+4)等价于____ 。

( )8. 执行fp=fopen(”A:Exam1_8.txt”,”wb”);后fp为null,最可能的原因是____ 。

A. 按二进制方式打开文本文件 C. 文件写保护

( )9. ______ 不是对象的基本特性。

A. 封装

B. 多态(重载)

C. 非结构

C. 结构优

B. 文件A:Exam1_8.txt不存在 D. 文件A:Exam1_8.txt大小写不一致

D. 继承

D. 代码长度最短

( )10. 结构化程序设计追求的首要目标是程序的______ 。

A. 运行速度快 B. 存储空间少

二. 程序纠错(10分)

下列两个程序段有若干错误,请你错误之处下方标明,如有必要可以简要说明原因(在程序

右侧)。

重要提示:任何一种程序语言其数据类型的存储空间将受到计算机制约。

程序段A

/*输入不超过20个正整数,计算其乘积*/

#define num 20 int a[num],count=0, buf=1; for(int i=0; (i0); i++) { scanf(“%u”, buf); a[++count] = buf; }

num = count; long sum=0;

for ( i=0; i

程序段B

/*下列函数递归函数求f(n) = (2n)!*/ long f(int n) { int tmp

if (n<2) tmp = 1;

tmp = (2*n)*(2*n-1) * f(n-2); return (long ) tmp; }

三. 程序阅读与分析(32分)

1. (6分)下面的程序求矩阵A(m,m)的右下三角区的所有元素的和,请在程序的空白处填上适当的内容。 #define m 100 main()

{ int a[m][m];

int i, j;

① sum = 0; for (i=0; i

for (j=0;j

for (i= ③ ; i< ④ ; i++)

for (j= ⑤ ;j< ⑥ ;j++) sum += (double) a[i][j];

}

2. (6分)写出下列程序的运行结果。 #include

main()

{ int i,b,k=0;

for(i=1;i<=5;i++) { b=i%2;

while(b-->=0) k++;

} printf(“%d,%d”,k,b); }

3. (6分)写出下列程序的运行结果。 int fat(int n)

{ static int f=1; f=f*n*2; return (f); }

main() { int i,j;

for(i=1;i<=5;++i)

printf(“%d\\t”,fat(i)); }

4. (6分)下列程序段将一个单链表写入一个文件: p=head;

if (fp = fopen (“Exam5.dat”,”w”) != null) { while (p != null) {

fwrite(p,sizeof(struct node),1,fp); p = (*p).next; } };

请问用下面的程序段,可以将这个链表从该文件中生成到内存中吗?为什么? if (fp = fopen (“Exam5.dat”,”r”) != null) { while !feof(fp)

{ p = malloc(sizeof(struct node)) fread(p,sizeof(struct node),1,fp);

p = (*p).next; } };

5. (8分)阅读以下递归函数,并用非递归方法改写该函数。

#include void convert(int n) { int i;

if (( i=n/7)!=0) convert(i); putchar(n%7+?0?); }

四. 子程序设计(每题10分,共30分)

本题说明:完成函数设计时,请自行说明所有的形式参数的类型

1. 设计一个函数arrsum(a, n)计算一维整数数组a中前n个元素的平均值。 2. 设计函数prime(n),其中n为任意一个整数,当n为素数时,函数返回真,否则返回假。

3. 调用函数reverse(h)将h指向的单链表倒置。实在参数h应该指向倒置后链表的头节点。五. 算法设计(选做一题说明:

? 仅需任意选做一题。多选者,以卷面先列出的为判分依据;

? 分析思路、重要数据类型的定义、模块的功能、形式参数、函数返回值说明;(9分) ? 用伪代码或其它方法描述子程序;(9分)

? 不必完整写出函数程序的代码,完整代码将不作为判分依据。

18分)

1. 用字符数组模拟实现字符串,给出下列函数:两个字符串的并接、找一个字符在串中的位置、统计一个字符在串中的数目。

2. 模拟实现大小写(52个)英文字母的集合运算,给出集合的表示方法,及运算属于∈、并∪、差─的子程序。

3. 模拟实现复数类型,给出复数的加法、减法和乘法的子程序。

武汉大学计算机学院 2002-2003学年度第一学期2002级 《高级语言程序设计》期末考试试卷

姓名: 学号: 专业:

未经主考教师同意,考试试卷、答题纸、草稿纸均不得带离,否则视为违规。 一. 选择最合适的答案填空(每题2分,共20分)

( )1.在一个整常量后面加一个字母,如213L,则表示该常量为 型常量。

A. 长整数

B. 常量

C. 地址

D. 八进制

( )2. 定义变量时冠以关键字 ,则表示此标识符是静态外部变量,可以供其他文件共用。

A. register A. 转移 A. 3345 A. 30 A. 54

B. extern B. 循环 B. 0x3345 B. 20 B. 13

C. void C. 顺序 C. 0x345 C. 10 C. 81

D. static D. 选择 D. 0x3fff D. 0 D. 108

( )3. ______ 不是C语言的基本控制结构。 ( )4. 表达式0x0fff&0x3345的值为______ 。

( )5. 设变量int x=10,y=20,则执行x=x+y;y=x-y;x=x-y后x为______ 。 ( )6. 表达式27<<2的值为______ 。

( )7. 设有如下宏定义 #define WIDTH f(x,y) (x>y)?x-y:x+y; 则表达式

f(10,20)的值为______ 。

A. 30 A. *&p

____ 。

A. a[6] ____ 。

B. 20 B. *&p

C. -10 C. p->data

D. 10 D. p->*data

( )8. 与*p.data指等价的表达式为____ 。

( )9. 设int a[50],q; long *p;执行p=(long *)a; p+=4;q=(int *)p;后*(q+2)等价于

B. a[4]

C. a[10]

D. 无法确定

( )10. 执行fp=fopen(”A:Exam1_8.txt”,”rb”);后fp为null,最可能的原因是

A. 源文件不是二进制文件 C. 文件写保护

B. 文件A:Exam1_8.txt不存在 D. 文件A:Exam1_8.txt长度太大

二. 文字填空(15分)

1.变量名实际上是一个符号地址,对于已经定义的一个整型变量X,要获取其地址则可以用操作 来实现。

2.如果将变量c定义为无符号字符类型,定义形式为 ,其数值取值范围(写成十六进制)为 至 。

3.设有int a = 2, b = 3; float c = 2.5; 则算术表达式 (a + b) / (int) c + (float) (a + b) / c的值是 。

4.对于c = a < b ? b : a; 如果已知a = 5; b = 4; 则c的值为 。 5.已知char *name[ ] = {“Basic”, “C”, ”Pascal”, “VB”, “VC++”}; char **p; p =

name +2; 则语句printf (“%o\\n”, *p);的输出为 , 语句printf (“%s\\n”, *p);的输出为 。

6.在定义函数时,如果在函数首部的最左端冠以关键字 ,则表示此函数是外部函数,可以供其他文件调用。

7.声明一个结构体类型的一般形式为 。

三. 程序阅读与分析(20分)

1. 一个int型变量的最大允许值为32767,请写出程序的执行结果。(6分) main ( )

{ int a, b; long c; a = 32767; b = a + 1; c = a + 1; printf (“%d, %d, %u”, a, b, c); }

2. (6分)下面的程序对数组A[m]进行排序,并计算它们的和。请在程序的空白处填上适当的内容。 #define m 50 main() { int a[m];

① sum = 0;

int i, j, K;

for (i=0; i

for (j= ③ ; ④ ;j++) { sum += (double) a[i][j]; if ⑤

{ K = a[i]; a[i]= ⑥ ; a[j] = K; } } }

3. (8分)说明子程序的功能

void Reverse(char ch) {

ch = getchar(); if ch !=?#? {

Reverse(ch); putchar(ch); }; };

给定输入字符串 ABCDXF%&123#KK 调用该过程Reverse(C)后,产生的输出是什么?实在参数C(字符变量)的值为什么?

四. 子程序设计(共30分)

说明:

? 每题15分,仅需任意选做两题。多选者,以卷面先列出的为判分依据; ? 完成函数设计时,请自行说明所有的形式参数。

1.

1.左图为设定的有关结点及指针的取值示意,如果执行Try(p1,p2,p3)后,有关结点、指针的值如右图所示。

请你用C语言:

? 给出结点、指针的类型定义形式

? 写出子程序Try的定义。(提示:形式参数应该适当作变化)

2.编写递归函数f(n)求Fibonacci数列的第n个数。

3. 3.函数int getbin( int *bitno);完成从键盘上读入二进制字符串将它的值作为函数值返回。其中,bitno返回二进制串的长度。(该串以非0、1的字符为结尾)

如 输入:101010B 函数结果为:42 输入:111111# 函数结果为:63

2.

五. 算法设计(选做一题15分) 说明:

? 任意选做一题。多选者,以卷面先列出的为判分依据;

? 分析思路、重要数据类型的定义、模块的功能、形式参数、函数返回值说明; ? 用伪代码或其它方法描述子程序;

? 不必完整写出函数程序的代码,完整代码将不作为判分依据。

1. 1. 任意给定一个年份year、月份month。设计一个输出月历的算法。 2. 2. 用字符数组存储整数,如123则数组的前四个元素为?1? 、?2?、 ?3?、

?\\0?设计一个整数乘法、加法的子程序。

武汉大学计算机学院 2003-2004学年度第一学期2003级 《高级语言程序设计》期末考试试卷

姓名: 学号: 专业:

未经主考教师同意,考试试卷、答题纸、草稿纸均不得带离,否则视为违规。

一. 单项选择题:(选择最合适的答案填空,每小题2分,共20分) ( )1.不正确的字符常量是______ 。

A. ?2? B. ?\\\\? C. “q” D. ?*?

( )2.表达式7.5+7%2-5/2*3的结果为______ 。

A. 1.0 B. 2.5 C. 3.0 D. 4.5

( )3.设变量int m,n,a,b的值均为0,则执行表达式(m=a>=b)||(n=a>=b)后,m,n

的值为______ 。

A. 1和1 B. 0和1 C. 1和0 D. 0和0

( )4.表达式35>>2的值为______ 。

A. 8 B. 9 C. 16 D. 17

( )5.设有如下宏定义 #define weight 50

#define price 1+weight

则执行赋值语句 v=price*20;/*v为int型变量*/后,v的值为______ 。

A. 510 B. 501 C. 61 D. 500

( )6.在定义函数时,在局部变量前面加上____ 前缀,则在多次调用该函数

时,该局部变量值保持一致。

A. extern B. static C. auto D. void

( )7. 设long a[50],*p;执行p=a+2; 后*(p+4)等价于________。

A. a[2] B. a[4] C. a[6] D. 无法确定

( )8.static char a1={?h?,?e?,?l?,?l?,?o?}; static char a2=”hello”;

以上定义的数组a1和a2的数组长度为________。

A. 6和6 B. 6和5 C. 5和5 D. 5和6

( )9.表达式0x7586&~0xff结果为______ 。

A. 0x86 B. 0x7586 C. 7500 D. 0x7500

( )10. int a[10][10]; int (*p)[10]; p=a; 则*p+3表示____ 。

A. &a[0][3] B. a[0][3]

C. a[3][0]

D. &a[3][0]

二. 文字填空(共15分

1. 为了判断两个字符串s1和s2是否相等,应当使用库函数______________。

2. *作为单目运算符表示____________________。 3. 在C语言中,存储类别为________和____________的变量只有在使用它们时才占用内存空间。

4. 设x、y为int类型变量,请写出以下命题:

(1) x和y都大于10 _________________________________

(2) x、y中有一个为负数 ______________________________________ 5. C语言的编译系统对于预处理中的宏命令是在_______________________进行处理的。

6. 设有如下定义int (*ptr)();则表示ptr是____________________变量。 7. 设int x,y,z;初值分别为2、3、4,则表达式(x>=y>=z)?1:0的结果为__________。

8. 用于定义枚举类型的关键字为____________。

三. 程序填空(请在空白处填写合适内容以完成整个程序,共10分)

1. 将文本文件file1.txt复制到文件file2.dat中,复制时只复制小写字母。 #incude

void main()

{ FILE *f1,*f2;

char c;

if(( (1) ==NULL)

{ printf(“file1.txt can not open\\n”); return; }

if( (2) ==NULL)

{ printf(“file2.dat can not open”\\n); return; }

while( (3) ) { c=getc(f1); if( (4) ) putc(c,f2); }

fclose(f1); fclose(f2); } 2. 下面程序从字符串s中去掉重复出现的字符,例如s的内容为”asdadf12”,则处理后为”asdf12”。 #include

#include void main()

{ char s[50]; (5) *p,*q;

scanf(“%s”, (6) ); for( (7) ; (8) ;p++) { q=p+1;

while(*q)

if( (9) ) strcpy(q,q+1); else

(10) ; }

printf(“%s\\n”,s);

}

四. 程序阅读与分析(每小题5分,共10分)

1. 写出下列程序的运行结果。 int fat(int n)

{ static int f=1; f=f*n-1; return (f); }

main() { int i,j;

for(i=1;i<=5;++i)

printf(“%d\\t”,fat(i)); }

2. 阅读以下递归函数,分析进行funx(6,&x)调用时程序运行过程;调用完成后变量x的值为多少?

#include void func(int n,int *s) { int f1,f2;

if (n==1||n==2) *s=1; else

{ func(n-1,&f1); func(n-2,&f2); *s=f1+f2; } }

五. 子程序设计(每题10分,共30分)

本题说明:完成函数设计时,请自行说明所有的形式参数的类型

1. 设计函数count(s,c),统计字符c在字符串s中出现的次数。

2. 设计一个函数arrsum(a,b,c,m,n),a、b为两个已经按照从小到大排列的一维整数数组(数组元素的个数分别为m和n),将数组a、b合并为一个有序的数组c。

六. 算法设计(选做一题15分)

说明:

? 仅需任意选做一题。多选者,以卷面先列出的为判分依据;

? 分析思路、重要数据类型的定义、模块的功能、形式参数、函数返回值说明; ? 用伪代码或其它方法描述子程序;

? 不必完整写出函数程序的代码,完整代码将不作为判分依据。

1. 函数reverse(h)从读入若干正整数(以-1结束),组成一个单链表。实在参数h应该指向创建后链表的头结点,函数返回值为链表中结点个数。给出reverse(h)的定义。 具体要求如下:

A)说明链表结点类型的C定义形式; B)用图示的方法说明链表的创建过程。 C)描述函数的算法。

2. 如果采用字符串表示“十六进制数”(最多10位),编程实现十六进制数的加法的子程序。

如两个“十六进制数”为‘F38A4’、‘12C3’,其加法结果为:‘F4B67’ 具体要求如下:

D)说明如何表示一个“十六进制数”,最好用图示方法说明; E)给出“十六进制数”类型的C语言定义形式;

F)给出一个DexAdd(x,y)返回“十六进制数”x,y的和。

武汉大学计算机学院 2004-2005学年度第2学期2004级 《高级语言程序设计》期末考试试卷A卷

答案及评分标准

一. 单项选择题:(选择最合适的答案填空,每小题2分,共20分)

( )1.不正确的常量是____B__ 。

A. ‘\\t’ B. 084 C. 1.2e4 D. 0x8fL

( )2.表达式-8%3+13/2的结果为______D 。

A. 4.5 B. 8 C. 8.5 D. 4

( )3.设变量 int a=1,b=2; 则执行表达式a+=3,b-2,++b,a*=b后变量a和b 的

值为______C 。

A. 2和2 B. 3和3 C. 12和3 D. 12和2

( )4.表达式0xad86|0xff的值为____A__ 。

A. 0xadff B. 0x86 C. 0xad86 D. 0xff

( )5.设有如下宏定义 #define price(x) 5+x

则执行赋值语句 v=price(4)*price(15);/*v为int型变量*/后,v的值为 C 。

A. 180 B. 85 C. 40 D. 60

( )6.在定义指针变量时,void *类型表明指针____ A 。

A. 指向对象类B. 不指向任C. 指向整型D. 指向char类型未知 何对象 的对象 型对象

( )7.设int a[3][4],*p[3]; 则以下___C____赋值语句是正确的。

A. p=a[0]; B. p[1]=a; C. p[1]=a[2]; D. p=a;

( )8.创建一个新的文本文件,可对该文件进行读写操作,则____A____打开方式是正确的。

A. “w+” B. “wb” C. “r+” D. “rb+”

( )9.表达式4&&5结果为______B 。

A. 0 B. 1 C. 4 D. 5

( )10. 正确的标识符是______A 。

A. _a123 B. 3z C. “next” D. ‘A’ 二. 文字填空(共15分)

1. 一个合理的算法应该具有“有穷性”,“有穷性”指的是_____经过有限个步骤的处理以后,算法应该结束_________。

2. %作为运算符表示________取余数 ____________。

3. 在C语言中,____全局变量____变量和_____静态(局部静态)__变量在程序一开始执行就被分配内存空间,直到整个程序执行结束其内存空间才被释放。

4. 设x、y为int类型变量,请写出以下命题:

(1) x和y都为偶数 _____(x%2==0)&&(y%2==0) 或者 (!(x%2)&&!(y%2))________________

(2) x和y中至少一个能被3整除 ________(x%3==0)||(y%3==0) 或者 _(!(x%3)||!(y%3))______

5. 编译预处理命令#include的作用是_______文件包含_____________。 6. 设有如下定义int (*ptr)[5]; 则表示定义的ptr是__指向一维数组的指针____或者 数组_____________变量。

7. 完成字符串连接的库函数是____strcat()_____。 8. typedef int A[12]; 的作用是__定义类型名A,表示类型int [12]__。

三. 程序填空(请在空白处填写合适内容以完成整个程序,共10分)

1. 以下程序实现从键盘输入一个整数,然后以相反的顺序输出每位数字。 例如:输入1234,则输出4321。

#include void main() {

int number,right; printf(“enter your number:\\n”);

scanf(“%d”, &number ); do { right= number ; printf(“%d”,right);

number= number/10 ;

}while( number!=0 ); printf(“\\n”); }

a) 下面程序将若干字符串按照字典顺序排列并输出 #include

#include

void sort( char *s[] ,int n) { int i,j; char *t;

for(i= 0 ;i< n-1 ;i++) for(j= i+1 ;j< n ;j++) if( strcmp(s[i],s[j])>0 )

{ t=s[i];

s[i]=s[j]; s[j]=t; } }

void main() {

char *s[5]={“Pascal?,”C language”,”Prolog”,”fortran”,”Visual C++”}; int i;

sort(s,5);

for(i=0;i<5;i++) puts(s[i]); }

四. 程序阅读与分析(共10分)

1. 分析以下程序执行流程,并写出下列程序的运行结果。

#include void main() { int j;

for(j=1;j<=5;++j) switch(j%2)

{ case 0: j++;printf(“#”);break; case 1:j+=2;printf(“*”);

default: printf(“\\n”);

}

}

解答:运行结果为: * #

(注意:评分时如果试卷中给出结果不正确或者没有给出运行结果,但分析程序执行流程基本正确给分不超过2分。)

2. 阅读以下递归函数,分析进行k=fib(7)调用时程序运行过程;调用完成后变量k的值为多少?

#include long fib(int g)

{ switch(g)

{ case 0:return 0;

case 1:case 2:return 1; }

return(fib(g-1)+fib(g-2)); }

解答:调用完成后k的值为13

(注意:评分时如果试卷中给出k的值不正确或者没有给出k的值,但分析程序执行流程基本正确给分不超过3分。)

五. 子程序设计(每小题15分,共30分)

本题说明:完成函数设计时,请自行说明所有的形式参数的类型

1. 设计一个函数strcpy(s1,s2),将字符串s1复制到字符串s2中,且函数strcpy()返回值为实际复制到s2中字符个数。

例如:函数调用strcpy(“asdfgh”,s2)完成后,字符串s2中内容为”asdfgh”,函数返回值为6。 解答:

int strcpy(char *s1,char *s2) /*函数原型3分*/ { int n=0; /*2分*/

while((*s1=*s2)!=0) /*3分*/ { s1++; /*1分*/ s2++; /*1分*/ n++; /*1分*/ }

return n; /*2分*/ }/*语法2分*/

2. 设计一个函数delarr(a, m, n),a为一个已经按照从小到大排列的一维整数数组(数组元素的个数为m),从数组a中删除所有等于n的元素,且函数返回值为删除n以后数组a余下的元素个数。

例如:

int a[5]={1,2,2,3,4};

则,delarr(a,5,2)调用完成后,数组a的内容为{1,3,4,0,0},函数返回值为3。 解答:

int delarr(int *a,int m,int n) /*函数原型3分*/ { int i,j,k=m; /*1分*/

for(i=0;i

{ for(j=i+1;j

}

return k; /*2分*/ }/*语法2分*/

六. 算法设计(选做一题15分)

说明:

? 仅需任意选做一题。多选者,以卷面先列出的为判分依据;

? 分析思路、重要数据类型的定义、模块的功能、形式参数、函数返回值说明; ? 用伪代码或其它方法描述子程序;

? 不必完整写出函数程序的代码,完整代码将不作为判分依据。

1. 函数link(h1,h2,h), 将两个由整数组成的单链表h1和h2组合成一个有序链表h。实在参数h应该指向创建后有序链表的头结点,函数返回值为有序链表中结点个数。 具体要求如下:

A)说明链表结点类型的C语言定义形式;(4分) 解答:

struct node{ int data;

struct node *next};

B)给出函数link(h1,h2,h)的原型。(3分) 解答:

int link(struct node *h1,struct node *h2,struct node **h); C)描述函数的算法。(8分)

2. 编程实现将一个整型数据转换成二进制数据。 具体要求如下:

D)说明如何表示一个“二进制进制数”,最好用图示方法说明,并给出“二进制数据”的C语言定义形式;(4分)

解答:

数组或者堆栈

E)说明程序中划分多少模块?并给出每个模块的原型;(3分) F)描述每个模块的算法。(8分)

武汉大学计算机学院 2004-2005学年度第2学期2004级 《高级语言程序设计》期末考试试卷B卷

姓名: 学号: 专业:

说明:未经主考教师同意,考试试卷、答题纸、草稿纸均不得带离,否则视为违规。

答案请全部写在答题纸上,写在试卷上无效。

一. 单项选择题:(选择最合适的答案填空,每小题2分,共20分) ( )1.不正确的常量是______ 。

A. ‘\\t’ B. 074 C. 1.2e4.2 D. 0x8fL

( )2.表达式-7/2+13%2的结果为______ 。

A. -2.5 B. -2 C. -9.5 D. 3.5

( )3.设变量 int a=1,b=2; 则执行表达式a++,b-2, b-=3,a*=b后变量a和b 的

值为______ 。

A. -2和-1 B. 2和2 C. 1和-1 D. 2和-1

( )4.表达式0xad86&0xff的值为______ 。

A. 0xadff B. 0x86 C. 0xad86 D. 0xff

( )5.设有如下宏定义 #define price(x) 5+x

则执行赋值语句 v=price(3)*price(5);/*v为int型变量*/后,v的值为 。

A. 150 B. 45 C. 30 D. 25

( )6.在给指针变量p赋值NULL 时,表示指针p____ 。

A. 指向对象类B. 不指向任C. 指向整型D. 指向char类型未知 何对象 的对象 型对象

( )7.设int a[3][4],*p[3]; 则以下_______赋值语句是不正确的。

A. p[1]=&a[0][0]B. p[1]=aC. p[1]=a[2]D. p[0]=*(a+1); ; ; ;

( )8.打开一个已存在的文本文件,可对该文件进行读写操作,如果文件不存在

则打开失败,下面________打开方式是正确的。

A. “w+” B. “wb” C. “r+” D. “rb+”

( )9.表达式4||5结果为______ 。

A. 0 B. 1 C. 4 D. 5

( )10. 不正确的标识符是______ 。

A. _a123 B. z3 C. int A. H. A_2 二. 文字填空(共15分)

1. 一个合理的算法应该具有“确定性”,“确定性”指的是______________。 2. ->作为运算符表示____________________。 3. 在C语言中,要指定定义的全局变量不能被其他文件使用,需要加_______前缀;而要指定要定义的局部变量分配在寄存器中,需要加___________前缀。

4. 设x、y为int类型变量,请写出以下命题:

(1) x、y的和为偶数 _________________________________

(2) x和y中至少一个不能被3整除 ______________________________ 5. 编译预处理命令#ifdef的作用是_______________________。

6. 设有如下定义int *ptr[5]; 则表示定义的ptr是____________________变量。

7. 完成字符串复制的库函数是__________。 8. typedef int *PA; 的作用是____________。

三. 程序填空(请在空白处填写合适内容以完成整个程序,共10分)

1.函数fun的功能是:使字符串str按逆序存放。

void fun ( (1) ) {

char m; int i, j;

for (i=0, j=strlen(str); i< (2) ; (3) ) {

m = str[i];

str[i] = (4) ; str[j-1] = m; }

}

2. 以下程序用来检查二维数组是否对称(即:对所有i,j都有a[i][j]=a[j][i])。

#include void main(void) {

int a[4][4];

int i, j, found=0; for(i=0;i<4;i++) for(j=0;j<4;j++)

scanf(“%d”, (5) ); for(j=0; j<4; j++){ for(i=0; i<4; i++)

if ( (6) ) {

found= (7) ; break; }

if( (8) ) (9) ; }

if( (10) ) printf(\不对称\\n\ else printf(\对称\\n\ }

四. 程序阅读与分析(共10分)

1. 分析以下程序执行流程,并写出下列程序的运行结果。

#include void main() { int i,j;

for(i=j;i<=2*j;++i) switch(i/j) { case 0:

case 1:printf(“*”);break;

case 2: printf(“#”); }

}

2. 阅读以下递归函数,分析进行convert(83)调用时程序运行过程;调用完成后程序结果是多少?程序功能是什么?

#include void convert(int n) { int i;

if (( i=n/7)!=0) convert(i); putchar(n%7+?0?); }

五. 子程序设计(每小题15分,共30分)

本题说明:完成函数设计时,请自行说明所有的形式参数的类型

1. 设计一个函数strcmp(s1,s2),比较字符串s1和字符串s2大小,如果s1>s2则函数返回1,如果s1=s2,则函数返回0,如果s1

2. 设计一个函数cparr(a, b,c,m, n),a为一个一维整数数组(数组元素的个数为m),将数组a中所有小于等于n的元素按照从小到大的顺序存入数组b中,所有大于n的元素按照从小到大的顺序存入数组c中。

六. 算法设计(选做一题15分)

说明:

? 仅需任意选做一题。多选者,以卷面先列出的为判分依据;

? 分析思路、重要数据类型的定义、模块的功能、形式参数、函数返回值说明; ? 用伪代码或其它方法描述子程序;

? 不必完整写出函数程序的代码,完整代码将不作为判分依据。

1. 函数link(h1,h2,h), 将一个由整数组成有序链表h拆分成两个单链表,所有偶数作为链表h1的结点,奇数作为链表h2的结点。实在参数h1应该指向创建后偶数链表的头结点,实在参数h2指向创建后奇数链表中的头结点 1. 具体要求如下:

A)说明链表结点类型的C语言定义形式; B)给出函数link(h1,h2,h)的原型。 C)描述函数的算法。

2. 编程实现二进制数据的加法运算。 具体要求如下:

D)说明如何表示一个“二进制进制数”,最好用图示方法说明,并给出“二进制数据”的C语言定义形式;

E)说明程序中划分多少模块?并给出每个模块的原型; F)描述每个模块的算法。

武汉大学计算机学院

2005-2006学年度第2学期2005级 《高级语言程序设计》期末考试试卷A卷答案

一. 单项选择题:(选择最合适的答案填空,每小题2分,共20分)

( )1. 下面的文字中___C___ 是不正确的变量名。

B. Case

C. _12

D. else

E. eve

( )2. 下面的四个选项中,正确的字符型常量是_____B_ 。

A. ‘\\68’

B. ‘\\t’

C. “\\n”

D. ‘\\xdh’

( )3. 表达式sizeof(float)的结果为______C 类型。

A. 单精度

B. 双精度

C. 整型

D. 不合法

( )4. 设有变量定义:int m=0,n=0;则执行表达式(m-->=0)||(n++<0)后,

m,n

的值为_____A_ 。

A. -1和0

B. -1和1

C. 0和0

D. 0和1

( )5. C语言的编译系统对宏命令是 D 。

A. 在程序执行时处理的 C. 和源程序其他语句一起编

B. 在程序连接时处理的 D. 在对源程序中其它成分正

式编译之前进行处理的

( )6. 以下正确的程序语句段为____D 。

A. char s1[]=”123456”,s2[]=”abcdef”;strcat(s1,s2); B. char *s1=”1234”,*s2=”abcde”;strcpy(s1,s2); C. char *s1,*s2=”1234”;strcpy(s1,s2); D. char s1[10]=””,s2[5]=”1234”;strcat(s1,s2);

( )7. 设int a[3][4],(*p)[4];p=a; 则表达式*(p+1)等价于__ C ___。

A. &a[0][1]

B. a+1

C. &a[1][0]

D. a[1][0]

( )8. 如果执行打开文件函数fopen()时发生错误,该函数返回值为___B_____。

A. EOF

B. NULL

C. -1

D. 随机值

( )9. 若有以下说明和语句,则下面四个选项中对ttd中lab域的正确引用

方式是

_ A _ 。 struct example{

char lab; int num; }ttd, *p; p=&ttd;

A. (*p).lab

( )10.

A. 10

B. p->ttd.lab

C. (*p).ttd.lab

D. p.ttd.lab

表达式(int)(6.8+7/2)的结果是____B_ 。

B.9

C.11

D.8

二.

1.

文字填空(共15分)

break语句出现在循环语句中的作用是__终止整个循环的执行____________。

2. 如果int类型数据在内存中占据2个字节,则int类型数据取值范围为

从___-32768______到___32767________。

3. 在C语言中,全局变量定义时在数据类型前面增加前缀static,则表示

该变量仅在____本文件内或者定义它的文件中或者整个程序______ 内有效。

4. 设x、y为char类型变量,请写出以下命题:

(1) x和y都为大写字母 _______(x>=’A’&&x<=’Z’)&&(y>=’A’&&y<=’Z’)_

评分要点:少写“=”给1分

(2) x和y中至少一个是数字 __(x>=’0’&&x<=’9’)||(y>=’0’&&y<=’9’)____________

评分要点:少写“=”给1分

5. 假设a=3,b=7,c=5,则表达式a

则表达式q-p的结果等于_____4___答16个字节也算正确___ _。 7. 库函数malloc(sizeof(long))的作用是_ 动态申请存放一个long类型数据内存 _________。 评分要点:写明动态申请内存即算正确

8. 表达式10&12的结果等于_ _8__________。

三.

程序填空(请在空白处填写合适内容以正确完成整个程序,共10

分)

1. 以下程序的功能是:统计100到1000之间各位数字之和为8的数据个数。 #include

void main()

{ int i,s,k,count=0;

for(i=100;i<=1000;i++) {

s= ①0 ;

k= ②i ;

while ( ③ k!=0或者k或者k>0或者k>=1 )

{ s=s+k;

k= ④k/10 ;

}

2. 下面程序的功能是:从一个字符串中删除指定字符,例如,从字符串”Prolog”中删除字符?o?,则结果为”Prlg”。

#include

void deletechar( ⑥ char *s或者char s[] , char c) { int i=0,j;

while( ⑦ s[i]!=’\\0’或者s[i]!=0或者s[i] 或者s[i]>0 ) if(s[i]==c) { j= ⑧ i ;

while( ⑨ s[j]!=’\\0’或者s[j]!=0或者s[j]或者s[j]>0 )

{ s[j]=s[j+1]; j++; } } else

⑩ i++或者++i或者i=i+1或者i+=1 ;

}

void main(void) { char s[20],c; gets(s); getchar(c);

deletechar(s,c); puts(s);

}

}

if (s!=8) ⑤break ; count++; }

printf(\

⑦填s[i++]!=’\\0’或者s[i++]!=0或者s[i++] 或者s[i++]>0 ⑩填continue 算正确

四. 程序阅读与分析(共10分)

1. 分析以下程序执行流程,并写出下列程序的运行结果。

#include int x=0;

int fat(int n) { static int f=0;

x+=2; f=f+n; return (f); }

void main(void) { int i,j;

for(i=3;i<=5;++i)

{ printf(“%d\\t”,fat(i)); printf(“%d\\n”,x);

} }

答案: 3 2 7 4 12 6

评分要点:给出上述6个正确结果,给满分5分

结果完全不对,但是给出程序执行流程分析基本正确,最多给3分

2. 阅读以下递归函数,假设有如下定义:int a[6]={6,1,4,7,4,0};分析进行

printn(a)调用时程序运行过程;并写出该调用产生的运行结果。 #include void printn(int *x) { if(*x!=0) printn(x+1);

if(*x%2) printf(“%d,”,*x*2); else printf(“%d,”,*x); }

答案: 0,4,14,4,2,6

评分要点:给出答案6,2,4,,14,4,0给4分,如果结果完全不对,但是给出程序执行流程分析基本正确,最多给3分

五.

1.

子程序设计(每小题15分,共30分)

本题说明:完成函数设计时,请自行说明所有的形式参数的类型

设计一个函数getnum(s,&n),字符串s是十六进制字符串,函数getnum统计s的字符个数并作为函数值返回,另外n返回s对应的十进制整数数据值。

例如,有如下定义, char s[]=”12a”;int n,m;

则有函数调用m=getnum(s,&n)后,m的值为3,n的值为298即等于1×162+2×16+10=298。 参考答案

#include

int getnum(char s[],int *m) { int n,sum=0; n=0;

while(s[n]!=’\\0’) { switch(s[n]) { case ‘0’:case ’1’:case ’2’:case ‘3’:case ’4’: case ‘5’:case ’6’:case ’7’:case ‘8’:case ’9’: sum=s*16+s[n]-‘0’;break;

case ‘a’:case ’b’:case ’c’:case ‘d’:case ’e’:case ’f’: sum=sum*16+s[i]-‘a’+10;break;

case ‘A’:case ’B’:case ’D’:case ‘C’:case ’E’:case ’F’: sum=sum*16+s[i]-‘A’+10;break; } n++;

}

*m=sum; return n; }

2.

评分要点:

1 计算s的长度并正确返回

2 将字符串s的内容转换为十进制整数的求解算法正确 注意语法错误最多扣2分,重点在于程序的思路正确

设计一个函数rightarr(a, m, n),a为一维整数数组(数组元素的个数为m),该函数实现数组a的循环左移n位。 例如:有如下定义,int a[5]={1,2,3,4,5};

则,rightarr(a,5,2)调用完成后,数组a的内容为{3,4,5,1,2}。 参考答案:

void rightarr(int a[],int m,int n) {

int x=0,y,t; while(x

t=a[0];

for(y=0;y

评分要点:

1 移位方向为左移

2 循环移位算法正确,重点注意a[0]移动正确

注意语法错误最多扣2分,重点在于程序的思路正确

六.

说明:

? ? ? ?

算法设计(选做一题15分)

仅需任意选做一题。多选者,以卷面先列出的为判分依据;

分析思路、重要数据类型的定义、模块的功能、形式参数、函数返回值说明; 用伪代码或其它方法描述子程序;

不必完整写出函数程序的代码,完整代码将不作为判分依据。

2. 函数link(h,n), 其中h 是一个由整数组成的从小到大排列的有序单链

表,n为整数。函数link实现把n按照顺序插入到链表h中,函数返回值为完成插入n之后的有序链表中结点个数。 具体要求如下:

A)说明链表结点类型的C语言定义形式; B)给出函数link(h,n)的原型。 C)描述函数的算法。 参考答案:

评分要点:以算法可行,基本正确为主要评分指标 (1) 链表结点类型为结构类型

(2) 函数link(h,n)中参数h为二级指针,n为整型

(3) 插入算法:首先查找插入位置,然后完成插入操作(注意插入在链表

头部和非头部的区别。

3. 任意输入一个年、月、日,编程实现判断该日期是星期几。

具体要求如下:

D)说明如何表示一个日期数据,以及星期一到星期天; E)说明程序中划分多少模块?并给出每个模块的原型; F)描述每个模块的算法。 参考答案:

评分要点:以算法可行,基本正确为主要评分指标

(1) 日期可为结构类型或者整型,星期一到星期天可为枚举、字符串或者

整数等

(2) 算 法中主要功能:判断某年是否为闰年;给出一个基准日期的星期数

据为计算的初始数据;计算该天为多年第几天;计算星期几。

武汉大学计算机学院

2005-2006学年度第2学期2005级 《高级语言程序设计》期末考试试卷B卷

姓名: 学号: 专业:

说明:未经主考教师同意,考试试卷、答题纸、草稿纸均不得带离,否则视为违规。

答案请全部写在答题纸上,写在试卷上无效。

一、 单项选择题:(选择最合适的答案填空,每小题2分,共20分)

( )1. 下面四个选项中 D 是合法的标识符。 F. ‘t’

( )2.

E. -234.

( )3.

G. A#12

H. sum.5

I.

eve

下面四个选项中,不正确的浮点型常量为____B__ 。

F. .23E1.2

G. .84e+2

H. .174

若有以下类型说明语句: char a; int b; float c;

double d; 则

表达式a*b+d-c的运算结果的类型为_____C_ 。

E. char

( )4.

F. float

G. double

H. int

设有变量定义:int m=0,n=0;则执行表达式

(m--<0)&&(n++<0)后,m,n

的值为___A___ 。

E. -1和0

F. -1和1

G. 0和0

H. 0和1

( )5.

以下关于C语言中预处理的叙述中不正确的是 F. 预处理命令行必须位于源程序

始的控制行都是预处理命的开始部位。 令行。

H. 预处理命令是在正式编译

之前先行被处理的

B 。

E. C源程序中凡是以\号开

G. 一条有效的预处理命令行必须

单独占据一行。

( )6.

若有说明语句: int a[ ][3]={1,2,3,4,5,6,7,8};,则数

组的行数为__ C 。

E. 1 F. 2 G. 3

H. 缺少数据,不

能确定

( )7.

设int a[3][4],(*p)[4];p=a; 则表达式(*(p+1))[0]等

价于__ D ___。

E. &a[0][1]

;

F. a[0][1]

;

G. &a[1][0

]

H. a[1][0

]

( )8.

正常执行关闭文件函数fclose()后,该函数返回值为

F. 0

G. -1

H. 随机值

___B_____。

E. EOF

( )9.

设有如下定义,若要使px指向rec中的x域,则下面四个

选项中 D 是

正确的赋值语句。 struct aa

{

int x; float y; }rec, *px;

E. *px=rec.x;

F. px=&rec.x;

G. px=(struct aa

*)rec.x;

H. px=(struct aa

*) &rec.x;

( )10.

B. 5

表达式(int)(6.8+(-7)%2)的结果是______A 。 B.6

C.7

D.8

二、 文字填空(共15分)

1. 2. 3.

4.

5. 6. 7. 8.

continue语句出现在循环语句中的作用是___退出本次循环,转下次循环___________。

如果unsigned int类型数据在内存中占据2个字节,则int类型数据取值范围为从__0_______到____65535______。

在C语言中,局部变量定义时在数据类型前面增加前缀static,则表示该变量在___整个程序执行_______ 过程中占据固定的内存单元。

设x、y为char类型变量,请写出以下命题:

(1) x为数字并且y不是数字 ____(x>=’0’&&x<=’9’)&&_(y<’0’||y>’9’)____

或者 isdigit(x)&&!isdigit(y)________________________ (2) x和y中至少一个不是数字 _

________(x<’0’||x>’9’_)||(y<’0’||y>’9’)_ 或者 !isdigit(x)||!isdigit(y)______________

假设a=8,则表达式3<=a<=6的结果等于_________1______________。 设有如下定义long a[10];int *p,*q;p=(int *)a;q=(int *)(a+8), 则表达式q-p的结果等于_____16或者32个字节_______。

库函数free(p)的作用是_ 释放p指向的内存 _________。 表达式10|9的结果等于___11________。

三、 程序填空(请在空白处填写合适内容以完成整个程序,共10分)

1.以下程序的功能是:列出100到1000之间各位数字之和可以被3整除的数。

#include

void main() {

int i,s,k;

for(i=100;i<= ①1000 ;i++) {

s= ②0 ;

k= ③ i ;

while ( ④ k!=0或者k或者k>0或者k>=1 )

{ s=s+k;

k= ⑤ k/10 ; }

if (s%3==0)

printf(“m”,i); }

}

2. 下面程序的功能是:把一个字符串中的所有大写字母改变为小写字母,

而小写字母改成大写字母,其他字符不变。例如对字符串”Prolog10”操作后结果为”pROLOG10”。 #include

void convert( ⑥ char s[]或者char *s ) { int i=0;

while( ⑦ s[i]!=’\\0’或者*(s+i)!=’\\0’或者s[i]!=0或者*(s+i)!=0或者s[i]或者*(s+i) )

{ if( ⑧s[i]>=’A’&&s[i]<=’Z’ ) s[i]=s[i]+32; else

if( ⑨ s[i]>=’a’&&s[i]<=’z’ ) s[i]=s[i]-32;

⑩ i++或者++i或者i=i+1或者i+=1 ; }

void main() {

char s[20]; int i; gets(s); convert(s); puts(s); }

评分要点:注意s[i]和*(s+i)是完全等价的形式。

四、 程序阅读与分析(共10分)

3. 分析以下程序执行流程,并写出下列程序的运行结果。

#include int x=2;

int fat(int n) { static int f=0; int x=0;

x+=2; f=f-n; return (f); }

void main(void) { int i,j;

for(i=3;i<=5;++i)

{ printf(“%d\\t”,fat(i)); printf(“%d\\n”,x); } }

答案: -3 2 -7 2 -12 2

评分要点:给出上述6个正确结果,给满分5分

结果完全不对,但是给出程序执行流程分析基本正确,最多给3分

4. 阅读以下递归函数,假设有如下定义:int a[6]={6,1,4,7,4,0},分析进行

printn(a)调用时程序运行过程;并写出该调用结束后数组a的内容是多少? #include void printn(int *x) { if(*x!=0) printn(x+1); *x+=2; }

答案:

该调用结束后数组a的内容是{8,3,6,9,6,0}

评分要点:如果结果完全不对,但是给出程序执行流程分析基本正确,最多给3分

五、

3.

子程序设计(每小题15分,共30分)

本题说明:完成函数设计时,请自行说明所有的形式参数的类型

设计一个函数tnum(s,n),函数tnum把十进制整数n转换为十六进制字符串,函数值为该十六进制字符串的长度,而转换后的十六进制字符串由s返回。

例如,有如下定义 char s[10]=,n=298,m;

则有函数调用m=tnum(s,n)后,m的值为3,s的为”12a”。 参考答案:

int tnum(char *s,int n) {

int k,m,i;

4.

char c; k=0;

while(n) {

m=n; n=n/16; switch(m) {

case 15: s[k]=’f’;break; case 14: s[k]=’e’;break; case 13: s[k]=’d’;break; case 12: s[k]=’c’;break; case 11: s[k]=’b’;break; case 10: s[k]=’a’;break; default:s[k]=m+’0’; } k++; }

s[k]=0;

for(i=0,m=k-1;i

c=s[i]; s[i]=s[m]; s[m]=c; }

return k; }

评分要点:

1 计算s的长度并正确返回

2 将十进制整数转换为十六进制字符串s的内容的求解算法正确 注意语法错误最多扣2分,重点在于程序的思路正确

设计一个函数rightarr(a, m, n),a为一维整数数组(数组元素的个数为m),该函数实现数组a的循环右移n位。 例如:

int a[5]={1,2,3,4,5};

则,rightarr(a,5,2)调用完成后,数组a的内容为{4,5,1,2,3}。 参考答案:

void rightarr(int a[],int m,int n) {

int x=0,y,t; while(x

t=a[m-1];

for(y=m-1;y>0;y--) a[y]=a[y-1];

a[0]=t; x++; } }

评分要点:

1 移位方向为右移

2 循环移位算法正确,重点注意a[0]移动正确

注意语法错误最多扣2分,重点在于程序的思路正确

六、

说明:

? ? ? ?

算法设计(选做一题15分)

仅需任意选做一题。多选者,以卷面先列出的为判分依据;

分析思路、重要数据类型的定义、模块的功能、形式参数、函数返回值说明; 用伪代码或其它方法描述子程序;

不必完整写出函数程序的代码,完整代码将不作为判分依据。

4. 函数link(h,n), 其中h 是一个由整数组成的从小到大排列的有序单链

表,n为整数。函数link实现把n从链表h中删除,函数返回值为1表示删除成功,返回0表示删除失败。 具体要求如下:

A)说明链表结点类型的C语言定义形式; B)给出函数link(h,n)的原型。 C)描述函数的算法。 参考答案:

评分要点:以算法可行,基本正确为主要评分指标 (4) 链表结点类型为结构类型

(5) 函数link(h,n)中参数h为二级指针,n为整型 (6) 删除算法:首先查找删除数据在链表中的位置,然后完成删除操作(注

意删除位置在链表头部和非头部的区别。

5. 任意输入一个年、月,编程输出该月月历。

具体要求如下:

D)说明如何表示一个日期数据,以及星期一到星期天; E)说明程序中划分多少模块?并给出每个模块的原型; F)描述每个模块的算法。 参考答案:

评分要点:以算法可行,基本正确为主要评分指标

(3) 日期可为结构类型或者整型,星期一到星期天可为枚举、字符串或者

整数等

(4) 算 法中主要功能:判断某年是否为闰年;给出一个基准日期的星期数

据为计算的初始数据;计算当月1日为该年第几天以及是星期几;。输出该月日历。

本文来源:https://www.bwwdw.com/article/5hbw.html

Top