c语言期末考试笔试,哈尔滨工业大学C语言期末试卷(2007秋季笔试A卷)

本文提供了一组C语言的笔试题目,涉及指针、作用域、运算符、结构体等核心概念,并给出了部分程序的运行结果。同时,文章还包含程序填空题和错误修正题,测试读者对C语言语法和逻辑的理解。最后,提出了两个编程任务,分别是计算特定数列的和以及实现字符串连接和查找最高分的功能。
摘要由CSDN通过智能技术生成

下载地址: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.

#include

main()

{

int  x = 12, y = 8;

printf("%d\t%d\t%d\n", !x, x&y, x|y);

}

程序运行结果是:

2.

#include

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

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

main()

{

int  k=4, n=0;

for (;n

{

n++;

if (n%2 == 0)  continue;

k--;

}

printf("k=%d, n=%d\n",k,n);

}

程序运行结果是:

5.

#include

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

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

{

if (score[i] < 60)   sum          ;

}

;

}

void  Sort(float score[], int n)

{

int    i, j, k;

float  temp1;

for (i=0; i

{

k = i;

for (j=     ; 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

#include

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 

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

#include

#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

{

temp = str[i];

str[i] = str[j];

str[j] = temp;

}

}

4.下面程序的功能是求解爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。编程打印这条阶梯共有多少阶。

#include

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表示学生人数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值