哈尔滨工业大学C语言期末试卷(2007秋季笔试A卷)
下载地址:http://115.com/file/e74ss30j#2007秋季笔试A卷.doc
一、单项选择题:(10分,每题2分)
1.char (*p)[5];该语句声明p是一个 。
A) 指向含有5个元素的一维字符型数组的指针变量p
B) 指向长度不超过5的字符串的指针变量p
C) 有5个元素的指针数组p,每个元素可以指向一个字符串
D) 有5个元素的指针数组p,每个元素存放一个字符串
2.C语言源程序的某文件中定义的全局变量的作用域为:_______。
A) 本文件的全部范围
B) 本函数的全部范围
C) 从定义该变量的位置开始到本文件结束
D) 本程序的所有文件的范围
3.以下程序的正确输出结果为:_______。
main()
{
int a = 2, c = 5;
printf("a = %%d, b = %%d\n", a, c);
}
A)a = %2, b = %5 B)a = 2, b = 5
C)a = %%d, b = %%d D)a = %d, b = %d
4.已知学生记录描述为:
struct student
{
int no;
char name[20];
char sex;
struct
{
int year;
char month[20];
int day;
}birth;
};
struct student s;
设变量s中的“生日”应是“1984年11月11日”,下列对“生日”的正确赋值方式是_____ 。
A) s.birth.year = 1984;
s.birth.month = "11";
s.birth.day = 11;
B) s.birth.year = 1984;
s.birth.month = 11;
s.birth.day = 11;
C) s.birth.year = 1984;
strcpy(s.birth.month,"11");
s.birth.day = 11;
D) s.birth.year = 1984;
s.birth.month[] = {"11"};
s.birth.day = 11;
5.若有二维数组定义语句:int a[3][4]; 则下面能正确引用元素a[i][j]的为: 。
A) *(a+j*4+i) B) *(a+i*4+j)
C) *(a[i]+j) D) *((*a+i)+j)
二、写出下列程序的运行结果。(10分,每题2分)
1.
2.
3.
4.
5.
三、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空1分)
1. 从键盘任意输入一个年号,判断它是否是闰年。若是闰年,输出“Yes”,否则输出“No”。已知符合下列条件之一者是闰年:
¡ 能被4整除,但不能被100整除。
¡ 能被400整除。
2.下面函数Fail用于计算不及格成绩的学生人数,函数Sort采用选择法对n个学生成绩由高到低排序。
四、在下面的4个程序中,共有16处错误(包括语法错误和逻辑错误),只要找出其中的15处错误并改正之即可,多找不多加分,重新编写程序不加分。(30分)
1.编程判断m是否为素数。
2.利用前200项之积,编程计算p的值。
3.编写一个函数Inverse(),实现将字符数组中的字符串逆序存放的功能。
4.下面程序的功能是求解爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。编程打印这条阶梯共有多少阶。
五、编程(42分)
1.编程计算1×2 + 3×4 + 5×6 + ……+ 99×100的值,其中,n值由键盘输入。(14分)
2. 不用标准库函数strcat,自己编写一个函数MyStrcat,实现字符串链接功能,在主函数中输入两个字符串,然后调用函数MyStrcat将这两个字符串链接起来,并将结果显示到屏幕上。(14分)
已知函数MyStrcat的函数原型如下:
void MyStrcat(char dstStr[], char srcStr[]);
其中,dstStr为目的字符串数组,srcStr为源字符串数组。
3.从键盘任意输入某班20个学生的成绩(int型)和学号(long型),编程打印最高分及其相应的学号。然后,在主函数中打印这些结果。(14分)
要求必须按照如下函数原型编程求解最高分和学号:
int FindMax(int score[], long num[], int n, long *pMaxNum);
其中,函数的返回值为求得的最高分,pMaxNum代表求得的最高分学生的学号,score数组用于存储学生的成绩,num数组用于存储学生的学号,n表示学生人数。
一、单项选择题:(10分,每题2分)
1.char (*p)[5];该语句声明p是一个 。
A) 指向含有5个元素的一维字符型数组的指针变量p
B) 指向长度不超过5的字符串的指针变量p
C) 有5个元素的指针数组p,每个元素可以指向一个字符串
D) 有5个元素的指针数组p,每个元素存放一个字符串
2.C语言源程序的某文件中定义的全局变量的作用域为:_______。
A) 本文件的全部范围
B) 本函数的全部范围
C) 从定义该变量的位置开始到本文件结束
D) 本程序的所有文件的范围
3.以下程序的正确输出结果为:_______。
main()
{
int a = 2, c = 5;
printf("a = %%d, b = %%d\n", a, c);
}
A)a = %2, b = %5 B)a = 2, b = 5
C)a = %%d, b = %%d D)a = %d, b = %d
4.已知学生记录描述为:
struct student
{
int no;
char name[20];
char sex;
struct
{
int year;
char month[20];
int day;
}birth;
};
struct student s;
设变量s中的“生日”应是“1984年11月11日”,下列对“生日”的正确赋值方式是_____ 。
A) s.birth.year = 1984;
s.birth.month = "11";
s.birth.day = 11;
B) s.birth.year = 1984;
s.birth.month = 11;
s.birth.day = 11;
C) s.birth.year = 1984;
strcpy(s.birth.month,"11");
s.birth.day = 11;
D) s.birth.year = 1984;
s.birth.month[] = {"11"};
s.birth.day = 11;
5.若有二维数组定义语句:int a[3][4]; 则下面能正确引用元素a[i][j]的为: 。
A) *(a+j*4+i) B) *(a+i*4+j)
C) *(a[i]+j) D) *((*a+i)+j)
二、写出下列程序的运行结果。(10分,每题2分)
1.
#include <stdio.h>
main()
{
int x = 12, y = 8;
printf("%d\t%d\t%d\n", !x, x&y, x|y);
}
程序运行结果是:main()
{
int x = 12, y = 8;
printf("%d\t%d\t%d\n", !x, x&y, x|y);
}
2.
#include <stdio.h>
main()
{
int v1 = 10 ;
float v2 = 2.5 ;
float v3 ;
int v4 ;
float v5 ;
v3 = v1 / v2 ;
v4 = v1 / v2 ;
v5 = v1 / 4 ;
printf("v3=%f\tv4=%d\tv5=%f\n",v3,v4,v5) ;
}
程序运行结果是:main()
{
int v1 = 10 ;
float v2 = 2.5 ;
float v3 ;
int v4 ;
float v5 ;
v3 = v1 / v2 ;
v4 = v1 / v2 ;
v5 = v1 / 4 ;
printf("v3=%f\tv4=%d\tv5=%f\n",v3,v4,v5) ;
}
3.
#include<stdio.h>
struct date
{
int year;
int month;
int day;
};
void func(struct date p)
{
p.year = 2000;
p.month = 5;
p.day = 22;
}
main()
{
struct date d;
d.year = 1999;
d.month = 4;
d.day = 23;
printf(“%d,%d,%d\n”, d.year, d.month, d.day);
func(d);
printf(“%d,%d,%d\n”, d.year, d.month, d.day);
}
程序运行结果是:struct date
{
int year;
int month;
int day;
};
void func(struct date p)
{
p.year = 2000;
p.month = 5;
p.day = 22;
}
main()
{
struct date d;
d.year = 1999;
d.month = 4;
d.day = 23;
printf(“%d,%d,%d\n”, d.year, d.month, d.day);
func(d);
printf(“%d,%d,%d\n”, d.year, d.month, d.day);
}
4.
#include <stdio.h>
main()
{
int k=4, n=0;
for (;n<k;)
{
n++;
if (n%2 == 0) continue;
k--;
}
printf("k=%d, n=%d\n",k,n);
}
程序运行结果是:main()
{
int k=4, n=0;
for (;n<k;)
{
n++;
if (n%2 == 0) continue;
k--;
}
printf("k=%d, n=%d\n",k,n);
}
5.
#include <stdio.h>
int Func(int i);
main()
{
int i;
for (i=3; i<5; i++)
{
printf(" %d", Func(i));
}
printf("\n");
}
int Func(int i)
{
static int k = 10;
for (; i>0; i--)
{
k++;
}
return (k);
}
程序运行结果是:int Func(int i);
main()
{
int i;
for (i=3; i<5; i++)
{
printf(" %d", Func(i));
}
printf("\n");
}
int Func(int i)
{
static int k = 10;
for (; i>0; i--)
{
k++;
}
return (k);
}
三、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空1分)
1. 从键盘任意输入一个年号,判断它是否是闰年。若是闰年,输出“Yes”,否则输出“No”。已知符合下列条件之一者是闰年:
¡ 能被4整除,但不能被100整除。
¡ 能被400整除。
#include <stdio.h>
main()
{
int year, flag;
printf("Enter year:");
scanf("%d",&year );
if ( )
{
flag = 1;
}
else
{
flag = 0;
}
if ( )
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
main()
{
int year, flag;
printf("Enter year:");
scanf("%d",&year );
if ( )
{
flag = 1;
}
else
{
flag = 0;
}
if ( )
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
2.下面函数Fail用于计算不及格成绩的学生人数,函数Sort采用选择法对n个学生成绩由高到低排序。
int Fail(float score[], int n)
{
int i, j, sum = ;
for (i=0; i<n; i++)
{
if (score[i] < 60) sum ;
}
;
}
void Sort(float score[], int n)
{
int i, j, k;
float temp1;
for (i=0; i<n-1; i++)
{
k = i;
for (j= ; j<n; j++)
{
if (score[j] > score[k]) k = ;
}
if ( )
{
temp1 = score[k];
score[k] = score[i];
score[i] = temp1;
}
}
}
{
int i, j, sum = ;
for (i=0; i<n; i++)
{
if (score[i] < 60) sum ;
}
;
}
void Sort(float score[], int n)
{
int i, j, k;
float temp1;
for (i=0; i<n-1; i++)
{
k = i;
for (j= ; j<n; j++)
{
if (score[j] > score[k]) k = ;
}
if ( )
{
temp1 = score[k];
score[k] = score[i];
score[i] = temp1;
}
}
}
四、在下面的4个程序中,共有16处错误(包括语法错误和逻辑错误),只要找出其中的15处错误并改正之即可,多找不多加分,重新编写程序不加分。(30分)
1.编程判断m是否为素数。
#include <stdio.h>
#include <math.h>
int IsPrime(int m)
main()
{
int n, flag;
printf("Input n:");
scanf("%d", n);
flag = IsPrime(n);
if (!flag)
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
int IsPrime(int m);
{
int i, k;
if (m <= 1)
{
return 0;
}
for (i=2; i<=sqrt(m); i++)
{
k = m % i;
if (k = 0)
{
return 0;
}
}
return 1;
}
#include <math.h>
int IsPrime(int m)
main()
{
int n, flag;
printf("Input n:");
scanf("%d", n);
flag = IsPrime(n);
if (!flag)
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
int IsPrime(int m);
{
int i, k;
if (m <= 1)
{
return 0;
}
for (i=2; i<=sqrt(m); i++)
{
k = m % i;
if (k = 0)
{
return 0;
}
}
return 1;
}
2.利用前200项之积,编程计算p的值。
#include <stdio.h>
main()
{
double term, result = 0;
int n;
for (n=2; n<=100; n+2)
{
term = double(n*n)/(n-1)*(n+1);
result = result * term;
}
printf("result = %f\n", 2 * result);
}
main()
{
double term, result = 0;
int n;
for (n=2; n<=100; n+2)
{
term = double(n*n)/(n-1)*(n+1);
result = result * term;
}
printf("result = %f\n", 2 * result);
}
3.编写一个函数Inverse(),实现将字符数组中的字符串逆序存放的功能。
#include<string.h>
#include<stdio.h>
#define ARR_SIZE = 80;
void Inverse(char str[]);
main()
{
char a[ARR_SIZE] ;
printf("Please enter a string: ");
gets(a);
Inverse(char a[]);
printf("The inversed string is: ");
puts(a);
}
void Inverse(char str[])
{
int len, i, j;
char *temp;
len = strlen(str);
for (i=0; j=len-1; i<j; i++; j--)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
#include<stdio.h>
#define ARR_SIZE = 80;
void Inverse(char str[]);
main()
{
char a[ARR_SIZE] ;
printf("Please enter a string: ");
gets(a);
Inverse(char a[]);
printf("The inversed string is: ");
puts(a);
}
void Inverse(char str[])
{
int len, i, j;
char *temp;
len = strlen(str);
for (i=0; j=len-1; i<j; i++; j--)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
4.下面程序的功能是求解爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。编程打印这条阶梯共有多少阶。
#include <stdio.h>
main()
{
int x,find;
x=0;
do{
++x;
find=x%2=1&&x%3=2&&x%5=4&&x%6=5&&x%7=0;
}while (find);
printf("x=%d\n",x);
}
main()
{
int x,find;
x=0;
do{
++x;
find=x%2=1&&x%3=2&&x%5=4&&x%6=5&&x%7=0;
}while (find);
printf("x=%d\n",x);
}
五、编程(42分)
1.编程计算1×2 + 3×4 + 5×6 + ……+ 99×100的值,其中,n值由键盘输入。(14分)
2. 不用标准库函数strcat,自己编写一个函数MyStrcat,实现字符串链接功能,在主函数中输入两个字符串,然后调用函数MyStrcat将这两个字符串链接起来,并将结果显示到屏幕上。(14分)
已知函数MyStrcat的函数原型如下:
void MyStrcat(char dstStr[], char srcStr[]);
其中,dstStr为目的字符串数组,srcStr为源字符串数组。
3.从键盘任意输入某班20个学生的成绩(int型)和学号(long型),编程打印最高分及其相应的学号。然后,在主函数中打印这些结果。(14分)
要求必须按照如下函数原型编程求解最高分和学号:
int FindMax(int score[], long num[], int n, long *pMaxNum);
其中,函数的返回值为求得的最高分,pMaxNum代表求得的最高分学生的学号,score数组用于存储学生的成绩,num数组用于存储学生的学号,n表示学生人数。