哈尔滨工业大学C语言期末试卷(2007秋季笔试B卷)
下载地址:http://115.com/file/e74ssody#2007秋季笔试B卷.doc
一、单项选择题:(10分,每题2分)
1.在下面的语句中:只有一个在功能上与其他三个语句不等价(其中s1和s2表示某个C语句),这个不等价的语句是 。
A)if (a) s1; else s2;
B)if (!a) s2; else s1;
C)if (a!=0) s1; else s2;
D)if (a==0) s1; else s2;
2.以下正确的描述是 。
A) 对共用体初始化时,只能对第一个成员进行初始化,每一瞬时起作用的成员是最后一次为其赋值的成员
B) 结构体可以比较,但不能将结构体类型作为函数返回值类型
C) 函数定义可以嵌套
D) 关键字typedef用于定义一种新的数据类型
3.下列的定义中,正确使用字符串初始化的是 。
A)char str[7] = "FORTRAN";
B)char str[] = {F,O,R,T,R,A,N,0};
C)char *str = "FORTRAN";
D)char str[] = {'F','O','R','T','R','A','N'};
4.要使下面程序的输出语句在屏幕上显示
1,2,34
则从键盘上输入的正确数据格式为: 。
main()
{
char a,b;
int c;
scanf("%c%c%d", &a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
}
A)1 2 34 B)1,2,34 C)'1''2'34 D)12 34
5.若有二维数组定义语句:int a[3][4]; 则下面对元素a[i][j]不正确的引用方式是: 。
A) *(&a[i][j]) B) *(a+4*i+j)
C) *(a[i]+j) D) *(*(a+i)+j)
二、写出下列程序的运行结果。(10分,每题2分)
1.
2.
当程序输入13时,完整的(包括输入)程序运行结果是:
3.
4.
5.
三、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空2分)
1. 假设有40个学生被邀请来给自助餐厅的食品和服务质量打分,分数划分为1~10这10个等级(1表示最低分,10表示最高分),试统计调查结果,并用*打印出如下形式的统计结果直方图。
Grade Histogram
1 *****
2 **********
3 *******
...
2. 不用函数strcat(),编程实现字符串连接函数strcat()的功能,将字符串srcStr连接到字符串dstStr的尾部。
四、在下面4个程序中,共有16处错误(包括语法错误和逻辑错误),只要找出其中的15处错误并改正之即可,多找不多加分。(30分,每找对1个错误,加1分,每修改正确1个错误,再加1分。)
1.下面程序用于打印所有的水仙花数。所谓“水仙花数”,是指一个三位数,其各位数字的立方和等于该数本身。例如,153是“水仙花数”,因为153=13+33+53。
4.下面程序用于计算两个正整数的最小公倍数。
五、编程(42分)
1.编程计算的值,要求n由用户从键盘输入。(14分)
2.编程打印如下形式的杨辉三角形,打印的杨辉三角形的行数n(不超过10行)要求由用户从键盘输入。要求按照如下函数原型进行编程,不能使用全局变量。(14分)
void YHTriangle(int a[][SIZE], int n);
void PrintYHTriangle(int a[][SIZE], int n);
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
3. 从键盘输入数组a和数组b的元素值,编程交换数组a和数组b中的对应元素的值,然后打印数组a和数组b的元素值。已知数组a和数组b各含有10个元素。要求按照如下函数原型进行编程,不能使用全局变量。(14分)
void Swap(int *x, int *y);
void Exchange(int a[], int b[], int n);
void InputArray(int a[],int n);
void PrintArray(int a[],int n);
一、单项选择题:(10分,每题2分)
1.在下面的语句中:只有一个在功能上与其他三个语句不等价(其中s1和s2表示某个C语句),这个不等价的语句是 。
A)if (a) s1; else s2;
B)if (!a) s2; else s1;
C)if (a!=0) s1; else s2;
D)if (a==0) s1; else s2;
2.以下正确的描述是 。
A) 对共用体初始化时,只能对第一个成员进行初始化,每一瞬时起作用的成员是最后一次为其赋值的成员
B) 结构体可以比较,但不能将结构体类型作为函数返回值类型
C) 函数定义可以嵌套
D) 关键字typedef用于定义一种新的数据类型
3.下列的定义中,正确使用字符串初始化的是 。
A)char str[7] = "FORTRAN";
B)char str[] = {F,O,R,T,R,A,N,0};
C)char *str = "FORTRAN";
D)char str[] = {'F','O','R','T','R','A','N'};
4.要使下面程序的输出语句在屏幕上显示
1,2,34
则从键盘上输入的正确数据格式为: 。
main()
{
char a,b;
int c;
scanf("%c%c%d", &a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
}
A)1 2 34 B)1,2,34 C)'1''2'34 D)12 34
5.若有二维数组定义语句:int a[3][4]; 则下面对元素a[i][j]不正确的引用方式是: 。
A) *(&a[i][j]) B) *(a+4*i+j)
C) *(a[i]+j) D) *(*(a+i)+j)
二、写出下列程序的运行结果。(10分,每题2分)
1.
#include <stdio.h>
main()
{
int k=4, n=0;
for (;n<k;)
{
n++;
if (n%2 == 0) break;
k--;
}
printf("k=%d, n=%d\n",k,n);
}
程序运行结果为main()
{
int k=4, n=0;
for (;n<k;)
{
n++;
if (n%2 == 0) break;
k--;
}
printf("k=%d, n=%d\n",k,n);
}
2.
#include <stdio.h>
main()
{
int n;
static char *mName[]={"Illegal month", "January",
"February","March","April",
"May", "June", "July",
"August", "September",
"October", "November",
"December"};
printf("\nPlease enter a integer:");
scanf("%d",&n);
printf("%s\n",(n<1||n>12)? mName[0] : mName[n]);
}
当程序输入9时,完整的(包括输入)程序运行结果是:main()
{
int n;
static char *mName[]={"Illegal month", "January",
"February","March","April",
"May", "June", "July",
"August", "September",
"October", "November",
"December"};
printf("\nPlease enter a integer:");
scanf("%d",&n);
printf("%s\n",(n<1||n>12)? mName[0] : mName[n]);
}
当程序输入13时,完整的(包括输入)程序运行结果是:
3.
#include <stdio.h>
typedef struct date
{
int year;
int month;
int day;
}DATE;
void func(DATE *p)
{
p->year = 2000;
p->month = 5;
p->day = 22;
}
main()
{
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);
}
运行结果是:typedef struct date
{
int year;
int month;
int day;
}DATE;
void func(DATE *p)
{
p->year = 2000;
p->month = 5;
p->day = 22;
}
main()
{
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 m = 7;
printf("%d\n",m/2+1);
printf("%d\n",m/2.0+1);
printf("%f\n",(float)(m/2+1));
printf("%f\n",(float)m/2+1);
printf("m=%d\n",m);
}
运行结果是:main()
{
int m = 7;
printf("%d\n",m/2+1);
printf("%d\n",m/2.0+1);
printf("%f\n",(float)(m/2+1));
printf("%f\n",(float)m/2+1);
printf("m=%d\n",m);
}
5.
#include<stdio.h>
int Fun(int x)
{
static int y = 1;
y += x;
return y;
}
main()
{
int k;
for (k=0; k<3; k++)
{
printf("%d\n", Fun(k));
}
}
运行结果是:int Fun(int x)
{
static int y = 1;
y += x;
return y;
}
main()
{
int k;
for (k=0; k<3; k++)
{
printf("%d\n", Fun(k));
}
}
三、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空2分)
1. 假设有40个学生被邀请来给自助餐厅的食品和服务质量打分,分数划分为1~10这10个等级(1表示最低分,10表示最高分),试统计调查结果,并用*打印出如下形式的统计结果直方图。
Grade Histogram
1 *****
2 **********
3 *******
...
#include <stdio.h>
main()
{
int i, j, grade;
int score[40], count[11] = {0};
printf("Please enter the response score:\n");
for (i=0; i<40; i++)
{
scanf( );
}
for (i=0; i<40; i++)
{
;
}
printf("Grade\tCount\tHistogram\n");
for (grade=1; ; grade++)
{
printf("%5d\t", grade);
for (j=0; ; j++)
{
printf("%c",'*');
}
printf("\n");
}
}
main()
{
int i, j, grade;
int score[40], count[11] = {0};
printf("Please enter the response score:\n");
for (i=0; i<40; i++)
{
scanf( );
}
for (i=0; i<40; i++)
{
;
}
printf("Grade\tCount\tHistogram\n");
for (grade=1; ; grade++)
{
printf("%5d\t", grade);
for (j=0; ; j++)
{
printf("%c",'*');
}
printf("\n");
}
}
2. 不用函数strcat(),编程实现字符串连接函数strcat()的功能,将字符串srcStr连接到字符串dstStr的尾部。
#include <stdio.h>
#include <string.h>
void MyStrcat(char dstStr[], char srcStr[]);
main()
{
char s[80], t[80];
printf("Please enter source string: ");
gets(s);
printf("Please enter destination string: ");
gets(t);
MyStrcat(s,t);
printf("The concatenate string is: ");
puts(s);
}
void MyStrcat(char dstStr[], char srcStr[])
{
int i = 0, j;
while (dstStr[i] != '\0')
{
;
}
for (j=0; ; j++, i++)
{
;
}
= '\0';
}
#include <string.h>
void MyStrcat(char dstStr[], char srcStr[]);
main()
{
char s[80], t[80];
printf("Please enter source string: ");
gets(s);
printf("Please enter destination string: ");
gets(t);
MyStrcat(s,t);
printf("The concatenate string is: ");
puts(s);
}
void MyStrcat(char dstStr[], char srcStr[])
{
int i = 0, j;
while (dstStr[i] != '\0')
{
;
}
for (j=0; ; j++, i++)
{
;
}
= '\0';
}
四、在下面4个程序中,共有16处错误(包括语法错误和逻辑错误),只要找出其中的15处错误并改正之即可,多找不多加分。(30分,每找对1个错误,加1分,每修改正确1个错误,再加1分。)
1.下面程序用于打印所有的水仙花数。所谓“水仙花数”,是指一个三位数,其各位数字的立方和等于该数本身。例如,153是“水仙花数”,因为153=13+33+53。
#include <stdio.h>
main()
{
int i, j, k, n;
printf("result is:");
for (n=100; n<1000; n++);
{
i = n % 100;
j = (n - i * 100) % 10;
k = n % 10;
if (n=i*i*i+j*j*j+k*k*k)
{
printf("%d\t ",n);
}
}
printf("\n");
}
2.利用泰勒级数sin(x)≈计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项。main()
{
int i, j, k, n;
printf("result is:");
for (n=100; n<1000; n++);
{
i = n % 100;
j = (n - i * 100) % 10;
k = n % 10;
if (n=i*i*i+j*j*j+k*k*k)
{
printf("%d\t ",n);
}
}
printf("\n");
}
#include <math.h>
#include <stdio.h>
main()
{
int n = 1,count = 1;
float x;
double sum , term;
printf("Input x: ");
scanf("%d", &x);
sum = x;
term = x;
do
{
term = -term*x*x/(n+1)*(n+2);
sum = sum + term;
n++;
count++;
}while (fabs(term) <= 1e-5);
printf("sin(x) = %f, count = %d\n", sum, count);
}
3.下面程序的功能是从键盘输入一行字符,统计其中有多少单词。假设单词之间以空格分开。已知:判断是否有新单词出现的方法——当前被检验字符不是空格,而前一被检验字符是空格,则表示有新单词出现。#include <stdio.h>
main()
{
int n = 1,count = 1;
float x;
double sum , term;
printf("Input x: ");
scanf("%d", &x);
sum = x;
term = x;
do
{
term = -term*x*x/(n+1)*(n+2);
sum = sum + term;
n++;
count++;
}while (fabs(term) <= 1e-5);
printf("sin(x) = %f, count = %d\n", sum, count);
}
#include <stdio.h>
main()
{
char str[20];
int i, num;
scanf("%s", str);
if (str[0] != ' ')
{
num = 1;
}
else
{
num = 0;
}
for (i=1; i<20; i++)
{
if (str[i]!=' '|| str[i-1]==' ')
{
num++;
}
}
printf("num=%d\n", num);
}
main()
{
char str[20];
int i, num;
scanf("%s", str);
if (str[0] != ' ')
{
num = 1;
}
else
{
num = 0;
}
for (i=1; i<20; i++)
{
if (str[i]!=' '|| str[i-1]==' ')
{
num++;
}
}
printf("num=%d\n", num);
}
4.下面程序用于计算两个正整数的最小公倍数。
#include <stdio.h>
int MinCommonMultiple(int a, int b)
main()
{
int a, b, x;
printf("Input a,b:");
scanf("%d,%d",&a,&b);
x = MinCommonMultiple(int a,int b);
printf("MinCommonMultiple = %d\n", x);
}
int MinCommonMultiple(int a, int b);
{
int i;
for (i=1; i<b; i++)
{
if ((i*a) % b = 0)
return i*a;
}
return 0;
}
int MinCommonMultiple(int a, int b)
main()
{
int a, b, x;
printf("Input a,b:");
scanf("%d,%d",&a,&b);
x = MinCommonMultiple(int a,int b);
printf("MinCommonMultiple = %d\n", x);
}
int MinCommonMultiple(int a, int b);
{
int i;
for (i=1; i<b; i++)
{
if ((i*a) % b = 0)
return i*a;
}
return 0;
}
五、编程(42分)
1.编程计算的值,要求n由用户从键盘输入。(14分)
2.编程打印如下形式的杨辉三角形,打印的杨辉三角形的行数n(不超过10行)要求由用户从键盘输入。要求按照如下函数原型进行编程,不能使用全局变量。(14分)
void YHTriangle(int a[][SIZE], int n);
void PrintYHTriangle(int a[][SIZE], int n);
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
3. 从键盘输入数组a和数组b的元素值,编程交换数组a和数组b中的对应元素的值,然后打印数组a和数组b的元素值。已知数组a和数组b各含有10个元素。要求按照如下函数原型进行编程,不能使用全局变量。(14分)
void Swap(int *x, int *y);
void Exchange(int a[], int b[], int n);
void InputArray(int a[],int n);
void PrintArray(int a[],int n);