哈尔滨工业大学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.
#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);
}
程序运行结果为
 
 
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时,完整的(包括输入)程序运行结果是:
 
 
 
 
当程序输入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);
}
运行结果是:
 
 
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);
}
运行结果是:
 
 
 
 
 
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));
   }
}
运行结果是:
 
 
 
 
、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(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");
   }
}
 
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';
}
 
 
 
、在下面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,并统计出此时累加了多少项。
#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()
{
   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;                    
}
 
五、编程(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);