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

下载地址:http://115.com/file/be9wwhs8#2007春季笔试A卷.doc

一、单项选择题:(10分,每题2分)
1.设有以下定义:
       int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
       int (*ptr)[3] = a, *p = a[0];
   则以下能够正确表示数组元素a[1][2]的表达式是          。
A) *((*ptr + 1)[2])
B) *(*(p + 5))
C) (*ptr + 1)
D) *(*(a + 1) + 2)
2.有如下程序片段:
int i = 0;
while(i++ <= 2);
printf("%d", i);
则正确的执行结果是:
A)  2                        B)  3     
C)  4                        D)  无结果
3.合法的数组定义是              。
A) int a[] = "language";
B) int a[5] = {0,1,2,3,4,5};
C) char a = "string";
D) char a[] = {"0,1,2,3,4,5"};
4.设有如下定义:
   struct st
    {
       int a;
       float b;
}st1, *pst;
若有pst = &st1; 则下面引用正确的是________
A) (*pst.st1.b)        B) (*pst).b
C) pst->st1.b          D) pst.st1.b
5.如果int i = 3, 则printf("%d", -i++ )的输出结果是             ,i的值是                 。
A) -3  4                       B) -4  4
C) -4  3                       D) -3  3
、写出下列程序的运行结果。(10每题2)
1.
#include <stdio.h>
main()
{
   int  x, y;
   scanf("%2d%*2s%1d", &x, &y);
   printf("%d", x/y);
}
程序运行时输入:2345678
则程序运行结果是:
 
 
 
2.
#include<stdio.h>
main()
{
   int i = 0;
   while(i < 3)
   {
       switch(i++)
       {
          case 0:
              printf("fat");
              break;
          case 1:
              printf("hat");
          case 2:
              printf("cat");
          default:
              printf("Oh no! ");
       }
       putchar('\n');
   }
}
运行结果是:
 
 
 
 
3.
#include<stdio.h>
int Square(int i);
main()
{
   int i=0;
   i = Square(i);
   for( ; i<5; i+=2 )
   {
       static int i = 1;
       i += Square(i);
       printf("%d\t", i);
   }
   printf("%d\n", i);
}
 
int Square(int i)
{
   return i*i;
}
程序运行结果是:
 
 
 
4.
#include<stdio.h>
void inv(int *p, int n);
main()
{
   int i;
   int a[10]={13,7,9,11,0,6,7,5,4,2};
   for(i=0; i<10; i++)
   {
       printf("%d,",a[i]);
   }
   printf("\n");
   inv(a,10);
   for(i=0; i<10; i++)
   {
       printf("%d,",a[i]);
   }
}
 
void inv(int *p, int n)
{
   int *i, *j, m = (n - 1) / 2, t;
   j = p + n - 1;
   for(i = p; i <= p + m; i++, j--)
   {
       t = *i; *i = *j; *j = t;
   }
}
程序运行结果:
 
 
 
 
5.
#include <stdio.h>
struct name
{
   char first[20];
   char last[20];
};
struct beam
{
   int limbs;
   struct name title;
   char ty[30];
};
main()
{
   struct beam *pb;
   struct beam deb = {6, {"Berbnazel","Gwolkapwolk"},
"Arcturan"};
  pb=&deb;
  printf("%d\n", deb.limbs);
  printf("%s\n", pb->ty);
  printf("%s\n", pb->ty + 2);
}
运行结果是:
 
 
 
 
 
、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空1分)
1.下面这个程序的功能是对含有n个元素(最多10个)的一维数组按升序进行排序。
#include <stdio.h>
#define ARRAY_SIZE 10
void Sort(int a[], int n);
void InputArray(int a[],int n);
void PrintArray(int a[],int n);
main()
{
   int  a[ARRAY_SIZE], n;
   printf("Input array lenth n<=10: ");
   scanf("%d", &n);
   printf("输入数组 a:\n");
   InputArray(a, n);
   Sort(a, n);
   printf("打印排序后的数组 a:\n");
   PrintArray(a, n);
}
 
void Sort(int a[], int n)   
{
   int  i, j, p, temp;
 
   for(i = 0; i <             ; i++)
   {
       p = i;
       for(j =             ; j < n; j++)
       {
          if(              ) p = j;
       }
       if(              )
       {
          temp = a[p];
          a[p] = a[i];
          a[i] = temp;
       }
   }
}
void InputArray(int a[], int n)
{
   int i;
   for (i = 0; i < n; i++)
   {
                             ;
   }
}
 
void PrintArray(int a[], int n)
{
   int i;
 
   for (i = 0; i < n; i++)
   {
       printf("%d ", a[i]);
   }
   printf("\n");
}
 
2. 下面程序的功能是从键盘输入一行字符,统计其中有多少单词。假设单词之间以空格分开。[提示:判断是否有新单词出现的方法是------当前被检验的字符不是空格,而前一被检验字符是空格,则表示有新单词出现。]
#include<stdio.h>
main()
{
   char str[80];
   int i, num;
 
   gets(str);
   if(str[0] != ' ')
   {
       num = 1;
   }
   else
   {
       num = 0;
   }
   for(i = 1 ; str[i]              ; i++)
   {
       if(str[i]               && str[i-1]               )
       {
          num++;
       }
   }
   printf("num=%d\n", num);
}
、在下面给出的4个程序中,共有16处错误(包括语法错误和逻辑错误),请找出其中的错误,并改正之。(30分,每找对1个错误,加1分,每修改正确1个错误,再加1分。只要找对15个即可,多找不加分。
1.在给定的一组书名中,从键盘任意输入一个书名(书名可以有空格)。若找到,则打印该书名,否则打印”没找到”。
#include <string.h>
#include <stdio.h>
main()
{
    int i, findFlag=0; 
   char x;             
   char str[][13]={ "Pascal","Basic","Fortran", "Java",
                     "Visual C", "Visual Basic" };
 
   printf("请输入一个字符串:");
   gets(x); 
   while(i<6 && !findFlag)
   {  
       if (x == str[i]) 
       {
          findFlag = 1;   
       }
        i++;
   }
   if (findFlag)
   {
      printf("%s\n", x);
   }
   else
   {
      printf("没找到!\n");
   }
}
2.打印100~200之间的所有素数。
#include <stdio.h>
#include <math.h>
main()
{
   int m, i ;
 
   for(m = 100; m <= 200; m++)
   {
       for(i = 2; i < sqrt(m) && flag; i++)
       {
           if(m%i == 0)
              flag = 0;
       }
       if(flag)
       {
          printf("%d ", m);
       }
    }
}
3.从键盘输入任意一个学生的学号,在班级学生表中(学生表的学号是按升序排序的,且班级最多30人 ) 查找该学号是否存在,存在打印其考试成绩,否则打印“Not find!”。
#include <stdio.h>
#define ARR_SIZE 30;
int  Search( long *p,  int  n,  long  x );
main()
{
   long num[ARR_SIZE], x;
   float score[ARR_SIZE];
   int i, n,  pos;
 
   printf("输入班级实际人数:");
   scanf("%d",&n);
   printf("输入学生学号和成绩");
   for(i=0; i<n; i++)
   {
       scanf("%ld %f\n", &num[i], &score[i]);
   }
   printf("输入待查找学号:");
   scanf("%d", &x);
   pos=Search(num,  n, x);
   if ( pos + 1 )
       printf("score=%f\n ", score [pos]);
   else
       printf(" Not find!\n ");
}
int  Search( long *p,  int  n,  long  x );
{
   int i, flag;
   for ( i=0 ; i < n; i++ )
   {
       if ( *( p+i ) == x )
       { 
          flag = i;
          break;
       }
       else
       {    
          flag = -1;
       }
   }
   return flag
}
4.该程序的作用是将一个字符串中的元音字母复制到另一个字符串,然后输出。
#include<stdio.h>
main()
{
   char str1[80], str2[80];
   printf("输入一个字符串:");
   gets(str1);
   Cpy(str1[], str2[]);
   printf("输出一个字符串\n");
   puts(str2);
}
void Cpy(char s[],char c[])
{
   int i, j;
   for(i=0; s[i] != '\0'; i++)
   {
       if(s[i]= 'a'||s[i]= 'A'||s[i]= 'e'||s[i]= 'E'||
          s[i]= 'i'||s[i]= 'I'||s[i]= 'o'||s[i]= 'O'||
s[i]= 'u'||s[i]= 'U')
       {
          s[i]=c[j];
          j++;
       }
   }
}
五、编程(42分)
1.编程计算:1!+3!+5!+…+(2n-1)!的值。其中,n值由键盘输入。(14
2. 不用标准库函数strlen,自己编写一个函数MyStrlen,实现计算字符串长度的功能。要求在主函数中输入一个字符串(可以读入空格),并在主函数中打印字符串的长度。(14
请按以下给定的函数原型编写程序:
int  MyStrlen(char str[])

int  MyStrlen(char *p)
注:不按给定的函数原型或使用全局变量编写程序不给分
3.编写一个函数,求最大值及最大值所在元素的下标。要求在主函数中通过键盘任意输入一组数(最多10个),且在主函数中打印最大数及最大数元素的下标。(14
请按以下给定的函数原型编写程序:
void Findmax(int num[], int n,  int  *pMaxNum, int  *pMaxPos); 

void Findmax(int  *p, int n, int  *pMaxNum, int  *pMaxPos );
注:不按给定的函数原型或使用全局变量编写程序不给分。