C语言期末试卷题及答案
一、选择题(共20分,每小题2分)
1. 在C语言类型说明中,int, char, short等类型数据的长度是( D )。
A. 固定的
B. 由用户自己定义的
C. 任意的
D. 与机器字的长度有关
2. 若已正确说明为int类型,要给abc输入数据,则正确的输入语句是( D )。
A. read(a,b,c);
B. scanf(“%d%d%d”,a,b,c);
C. scanf(“%D%D%D”,&a,&b,&c);
D. scanf(“%d%d%d”,&a,&b,&c);
3. C语言中对嵌套if语句的规定是:else总是与( D )配对。
A. 其之前最近的if
B. 第一个if
C. 缩进位置相同的if
D. 其之前最近且不带else的if
4. 以下语句中,( C )是不可能做到提前退出循环语句的。
A. goto
B. break
C. continue
D. return
5. 假设有两个字符数组a、b,则以下正确的输入语句是( B )。
A. gets(a, b)
B. scan f(“%s %s”,a,b)
C. scanf(“%s%s”,
D. gets(“a”); gets(“b”)
6. 以下正确的描述是( B )。在C语言程序中,
A. 函数的定义可以嵌套,但函数的调用不可以嵌套
B. 函数的定义不可以嵌套,但函数的调用可以嵌套
C. 函数的定义和含糊的调用均可以嵌套
7. 在宏定义#define PI 3.1415926中,用宏名PI代替一个( D )。
A. 单精度数
B. 双精度数
C. 常量
D. 字符串
8. 以下选项中,对指针变量p不正确的操作是( C )。
A. int a[6], *p; p = &a;
B. int a[6], *p; p = a;
C. int a[6]; int *p = a = 1000;
D. int a[6]; int *p1, *p2 = a; *p1 = *p2;
9. 设有以下说明,已知int类型占2个字节,则下列叙述正确的是( D )。
struct st { int a; int b[2]; } a;
A. 结构体变量名a和结构体成员a同名,不合法
B. 程序运行时将为结构体st分配6个字节的内存单元
C. 程序运行时不为结构体st分配内存单元
D. 程序运行时将为结构体变量a分配6个字节的内存单元
10. 当文件顺利关闭时,fclose()的返回值是( C )。
A.-1 B. EOF C. 0 D. 1
二、填空题(共20分,每小题2分)
1. C程序中定义的一个变量,代表内存中的一个存储单元。
2. …\72?在内存中占一个字节,”\72”在内存中占二个字节。
3. 结构化程序设计的3种基本结构是顺序结构、选择结构、循环结构。
4. 下列for循环执行 4 次。For (x =0 , y = 0; y != 99 && x < 4; x++) ;
5. 若有定义“double x[3][5];”则x数组中行下标的下限为0 , 列下标的上限为 4 。
6. 函数swap(intx, inty)可以完成对x和y值的交换。在运行调用函数中的如下语句后,
a[0]和a[1]的值分别为1, 2 ,原因是参数按值传递,形参值的改变不会影响实参值。
a[0] = 1; a[1] = 2; swap(a[0], a[1]);
7. 设有以下宏定义:
#define WIDTH 80
#define LENGTH (WIDTH + 40)
则执行赋值语句”k = LENGTH * 20;” (k为int型变量)后,k的值是2400 。
8. 声明语句” int (*p)( ); ” 的含义是P是一个指向函数的指针变量,该函数的返回值是整
型。
9. typedef long int BIGGY 的作用是定义了一个新的数据类型标识符。
10. EOF只可用于文本文件,用来作为文件结束标志。
三、阅读程序,并将分析结果写在程序右边空白处(共24分,每小题6分)
1. 运行下列程序,如果输入5432,请写出程序运行结果。
#include
main()
{
int digit, number;
scanf("%d", &number);
while(number){
digit = number % 10;
number /= 10;
printf("%d", digit);
}
}
结果为:2345
评分标准:若结果正确,6分;若结果部分有误,但有正确分析过程,根据比例适当得分;若结果有误且无分析,得0分
2. 运行下列程序,如果输入18 ,请写出程序运行结果(库、头文件省略)。
#include
int main()
{
int x, y, i, a[8], j, u, v;
scanf("%d", &x);
y = x;
i = 0;
do {
u = y / 2;
a[i] = y % 2;
i++;
y = u;
} while(y >= 1);
for(j = i - 1; j >= 0; j--)
printf("%d", a[j]);
printf("\nyes");
}
结果为:(十进制转二进制)
10010
Yes
评分标准:若结果正确,6分;若结果部分有误,但有正确分析过程,根据比例适当得分;
若结果有误且无分析,得0分
3. 请写出以下程序的运行结果
#include
void increment(void);
int main()
{
increment();
increment();
increment();
}
void increment(void)
{
static int x;
x += 1;
printf("%d", x);
}
结果为:123
评分标准:若结果正确,6分;若结果部分有误,但有正确分析过程,根据比例适当得分;
若结果有误且无分析,得0分
4. 请写出以下程序的运行结果
#include
#include
int main()
{
char *p1, *p2, str[20] = "ABC";
p1 = "abc";
p2 = "abc";
strcpy(str+1, strcat(p1, p2));
printf("%s\n", str);
}
结果为:Aabcabc
评分标准:若结果正确,6分;若结果部分有误,但有正确分析过程,根据比例适当得分;
若结果有误且无分析,得0分
四、程序填空(共16分,每小题8分)
1. 以下程序可计算10名学生1门课成绩的平均分,请根据题意填空。
#include
float average(float array[]);
int main()
{
float score[10], aver;
int i;
printf("\n please input 10 scores:");
for(i = 0; i < 10; i++)
scanf("%f", &score[i]);
aver = average(score) ;
printf("\naverage score is %5.2f\n", aver);
getchar(); getchar();
}
float average(float array[10])
{
int i;
float aver, sum = array[0];
for(i=1; i <= 9 ; i++)
sum += array[i] ;
aver = sum / 10;
return (aver);
评分标准:每空2分
2. 以下程序从键盘输入一行字符作为字符串(遇换行符结束)存放在字符数组中,然后输出,请根据题意填空。
#include
main()
{
char s[80], *p;
int i;
for(i = 0; i < 80; i++){
s[i] = getchar();
if(s[i] == '\n' )
break;
}
s[i] = '\0' ;
p = s ;
while(*p)
putchar (*p ++ );
}
评分标准:每空2分
五、程序设计(共20分,每小题10分)
1. a是一个2*4的整型数组,且各元素以通过键盘赋值。函数max_value可求出其中的
最大元素值max,并将此值返回主调函数。现有函数调用语句”max = max_value(a);”,请编写max_value函数和main()函数,在main()中调用max_value函数并输出其结果。
#include
int max_value(int arr[][4]);
int main()
{
int i, j, x, a[2][4];
printf("please input the array a[2][4]:\n");
for(i = 0; i < 2; i++)
for(j = 0; j < 4; j++)
scanf("%d", &a[i][j]);
x = max_value(a);
printf("\n%d\n", x);
}
int max_value(int arr[][4])
{
int i, j, m;
m = arr[0][0];
for(i = 0; i < 2; i++)
for(j = 0; j < 4; j++)
if (arr[i][j] > m)
m = arr[i][j];
return m;
}
评分标准:在符合题意的要求上,实现方式任意,其中各部分声明总共2分;Main中,scanf 2分,调用1分,输出1分;max_value中,循环2,比较及返回2分。
2. 运用指针编写一个函数,将一个3*3的矩阵转置(即行列互换),并在主调函数中调用
实现。矩阵数据要求从键盘读取输入,并要求显示转置前后的矩阵内容。
#include
main()
{
void move(int *pointer);
int a[3][3], *p, i;
printf("please input the matrix:\n");
for(i = 0; i < 3; i++)
scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
fflush(stdin);
printf("\noriginal matrix is:\n");
for(i = 0; i < 3; i++)
printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);
p = &a[0][0];
move(p);
printf("\nnow, the converted matrix is:\n");
for(i = 0; i < 3; i++)
printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);
}
void move(int *pointer)
{
int i, j, t;
for(i = 0; i < 3; i++)
for(j = i; j < 3; j++){
t = *(pointer + 3*i +j);
*(pointer + 3*i + j) = *(pointer + 3*j + i);
*(pointer + 3*j + i) = t;
}
}
评分标准:在符合题意的要求上,实现方式任意,其中各部分声明总共2分;Main中,scanf 2分,调用1分,输出1分;move中,循环2分,交换2分。