哈尔滨工业大学C语言期末试卷(2007春季笔试B卷)
下载地址:http://115.com/file/be9ww7jx#2007春季笔试B卷.doc
一、单项选择题:(10分,每题2分)
1.若有定义“int *p[5];”,则以下叙述中正确的是 。
A) 定义了一个基类型为int的指针变量p,该变量有5个指针
B) 定义了一个指针数组p,该数组含有5个元素,每个元素都是基类型为int的指针变量
C) 定义了一个名为*p的整型数组,该数组含有5个int类型元素
D) 定义了一个可指向一维数组的指针变量p,所指一维数组应具有5个int类型元素
2.下列对字符串的定义中,错误的是 。
A) char str[7] = "FORTRAN";
B) char str[] = "FORTRAN";
C) char *str = "FORTRAN";
D) char str[] ={’F’,’O’,’R’,’T’,’R’,’A’,’N’,0};
3.判断字符串s1是否大于s2,应当使用 。
A) if(s1 > s2)
B) if(strcmp(s1, s2))
C) if(strcmp(s2, s1) > 0)
D) if(strcmp(s1, s2) > 0)
4.若二维数组a m列,则在a[i][j]之前的元素个数为 。
A) j*m+i B) i*m+j
C) i*m+j-1 D) i*m+j+1
5. 如果int i = 3, 则printf("%d", -i++ )的输出结果是 ,i的值是 。
A) -3 4 B) -4 4
C) -4 3 D) -3 3
二、写出下列程序的运行结果。(10分,每题2分)
1.
2.
3.
4.
5.
三、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空1分)
1. 从键盘输入任意一个学生的学号,查找该学号是否存在,存在打印其学号,否则打印没找到。(注:学号是按升序排列的,班级最多30人)
1.下面程序的功能是从键盘输入一行字符,统计其中有多少单词。假设单词之间以空格分开。[提示:判断是否有新单词出现的方法是------当前被检验的字符不是空格,而前一被检验字符是空格,则表示有新单词出现。]
4.该程序的作用是将一个字符串str2连接到字符串str1后,然后输出连接后的字符串str1。
1.编程计算:1-1/2+1/3-1/4+…+1/99-1/100+…,直到最后一项的绝对值小于10-5为止。(14分)
2.编写一个函数,将一个字符串中的元音字母复制到另一字符串。要求在主函数中读入一个字符串,复制后的字符串在主函数中输出。(元音字母有:a、A、e、E、i、I、o、O、u、U)(14分)
请按以下给定的函数原形编写程序。
void Cpy( char s[ ], char c[]);
或
void Cpy( char *p, char c[]);
或
void Cpy( char s[], char *q);
或
void Cpy( char *p, char *q);
注:不按给定的函数原形或使用全局变量编写程序不给分。
3.编写一个函数,实现一组数(最多10个)按逆序存放(如:13,7,9,11,0,6,7,5,4,2经过函数调用变为2,4, 5,7,0,6,11,9,7,13)。要求在主函数输入这组数,交换后的一组数也在主函数输出。(14分)
请按以下给定的函数原形编写程序。
void Change(int a[], int n);
或
void Change(int *p, int n);
注:不按给定的函数原形或使用全局变量编写程序不给分
一、单项选择题:(10分,每题2分)
1.若有定义“int *p[5];”,则以下叙述中正确的是 。
A) 定义了一个基类型为int的指针变量p,该变量有5个指针
B) 定义了一个指针数组p,该数组含有5个元素,每个元素都是基类型为int的指针变量
C) 定义了一个名为*p的整型数组,该数组含有5个int类型元素
D) 定义了一个可指向一维数组的指针变量p,所指一维数组应具有5个int类型元素
2.下列对字符串的定义中,错误的是 。
A) char str[7] = "FORTRAN";
B) char str[] = "FORTRAN";
C) char *str = "FORTRAN";
D) char str[] ={’F’,’O’,’R’,’T’,’R’,’A’,’N’,0};
3.判断字符串s1是否大于s2,应当使用 。
A) if(s1 > s2)
B) if(strcmp(s1, s2))
C) if(strcmp(s2, s1) > 0)
D) if(strcmp(s1, s2) > 0)
4.若二维数组a m列,则在a[i][j]之前的元素个数为 。
A) j*m+i B) i*m+j
C) i*m+j-1 D) i*m+j+1
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 a = 2, b = 3 ;
float x = 3.5, y = 2.5 ;
printf("%f", (float)(a + b) / 2 + (int)x % (int)y);
}
程序运行结果是:main()
{
int a = 2, b = 3 ;
float x = 3.5, y = 2.5 ;
printf("%f", (float)(a + b) / 2 + (int)x % (int)y);
}
2.
#include<stdio.h>
#include<string.h>
main()
{
char food[]="Yummy";
char *ptr;
ptr = food + strlen(food);
while( --ptr >= food )
{
puts(ptr);
}
}
程序运行结果是:#include<string.h>
main()
{
char food[]="Yummy";
char *ptr;
ptr = food + strlen(food);
while( --ptr >= food )
{
puts(ptr);
}
}
3.
#include <stdio.h>
main()
{
int i = 0;
while(i < 10)
{
if(i++ < 1)
continue;
if(i == 5)
break;
i++;
}
printf("i = %d", i);
}
程序运行结果是:main()
{
int i = 0;
while(i < 10)
{
if(i++ < 1)
continue;
if(i == 5)
break;
i++;
}
printf("i = %d", i);
}
4.
#include <stdio.h>
void count(int n);
main()
{
int i;
for(i = 1; i <= 3; i++)
{
count(i);
}
}
void count(int n)
{
static int x=1;
printf("%d:x=%d", n, x);
x += 2;
printf(" x+2=%d\n", x);
}
程序运行结果是:void count(int n);
main()
{
int i;
for(i = 1; i <= 3; i++)
{
count(i);
}
}
void count(int n)
{
static int x=1;
printf("%d:x=%d", n, x);
x += 2;
printf(" x+2=%d\n", x);
}
5.
#include <stdio.h>
main()
{
static int a[][3]={9,7,5,3,1,2,4,6,8};
int i,j,s1=0,s2=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(i==j)
{
s1=s1+a[i][j];
}
if(i+j==2)
{
s2=s2+a[i][j];
}
}
}
printf("%d,%d\n",s1,s2);
}
程序运行结果是:main()
{
static int a[][3]={9,7,5,3,1,2,4,6,8};
int i,j,s1=0,s2=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(i==j)
{
s1=s1+a[i][j];
}
if(i+j==2)
{
s2=s2+a[i][j];
}
}
}
printf("%d,%d\n",s1,s2);
}
三、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空1分)
1. 从键盘输入任意一个学生的学号,查找该学号是否存在,存在打印其学号,否则打印没找到。(注:学号是按升序排列的,班级最多30人)
#include <stdio.h>
#define ARR_SIZE 30
void Input(long num[], int n );
int Binsearch( long a[ ], int n, long x );
main()
{
long num[ARR_SIZE], x;
int n, pos;
printf("输入班级实际人数:");
scanf("%d", &n);
Input(num, n);
printf("输入待查找学号:");
scanf("%ld", &x );
pos = Binsearch(num, n, x);
if(pos + 1)
printf("NUM=%ld\n ", num[ pos ] );
else
printf(" Not find!\n ");
}
void Input(long num[], int n )
{
int i;
for(i=0; i<n; i++)
{
scanf("%ld", &num[i]);
}
}
int Binsearch( long a[ ], int n, long x )
{
int low, high, mid;
low = 0;
high = ;
do
{
mid = ( low + high ) / 2;
if( )
low = mid + 1;
else if ( )
high = mid - 1;
else
return mid;
}while( );
;
}
2. 下面程序的功能是删除字符串s中所出现的与变量c相同的字符。#define ARR_SIZE 30
void Input(long num[], int n );
int Binsearch( long a[ ], int n, long x );
main()
{
long num[ARR_SIZE], x;
int n, pos;
printf("输入班级实际人数:");
scanf("%d", &n);
Input(num, n);
printf("输入待查找学号:");
scanf("%ld", &x );
pos = Binsearch(num, n, x);
if(pos + 1)
printf("NUM=%ld\n ", num[ pos ] );
else
printf(" Not find!\n ");
}
void Input(long num[], int n )
{
int i;
for(i=0; i<n; i++)
{
scanf("%ld", &num[i]);
}
}
int Binsearch( long a[ ], int n, long x )
{
int low, high, mid;
low = 0;
high = ;
do
{
mid = ( low + high ) / 2;
if( )
low = mid + 1;
else if ( )
high = mid - 1;
else
return mid;
}while( );
;
}
#include <stdio.h>
void Squeeze(char s[], char c);
main()
{
char s[80],c;
gets(s);
scanf("%c",&c);
Squeeze(s, c);
puts(s);
}
void Squeeze(char s[], char c)
{
;
for(i = 0; s[i] != '\0'; i++)
{
if( )
{
s[j] = s[i];
;
}
}
s[j] = '\0';
}
四、在下面给出的4个程序中,共有16处错误(包括语法错误和逻辑错误),请找出其中的错误,并改正之。(30分,每找对1个错误,加1分,每修改正确1个错误,再加1分。只要找对15个即可,多找不加分。)void Squeeze(char s[], char c);
main()
{
char s[80],c;
gets(s);
scanf("%c",&c);
Squeeze(s, c);
puts(s);
}
void Squeeze(char s[], char c)
{
;
for(i = 0; s[i] != '\0'; i++)
{
if( )
{
s[j] = s[i];
;
}
}
s[j] = '\0';
}
1.下面程序的功能是从键盘输入一行字符,统计其中有多少单词。假设单词之间以空格分开。[提示:判断是否有新单词出现的方法是------当前被检验的字符不是空格,而前一被检验字符是空格,则表示有新单词出现。]
#include<stdio.h>
#define ARR_SIZE 80;
main()
{
char str[ARR_SIZE];
int i, num;
gets(str);
if(str[0] != ' ')
{
num = 1;
}
else
{
num = 0;
}
for(i = 1 ; str[i] != '\0'; i++)
{
if(str[i] != ' ' && str[i-1] = ' ')
{
num++;
}
}
printf("num=%d\n", num);
}
2.在一个3x4矩阵中找出最大数及最大数所在元素的下标。#define ARR_SIZE 80;
main()
{
char str[ARR_SIZE];
int i, num;
gets(str);
if(str[0] != ' ')
{
num = 1;
}
else
{
num = 0;
}
for(i = 1 ; str[i] != '\0'; i++)
{
if(str[i] != ' ' && str[i-1] = ' ')
{
num++;
}
}
printf("num=%d\n", num);
}
#include <stdio.h>
#define M 3
#define N 4
int FindMax( int (*p)[N], int m, int n,int *pRow, int *pCol)
main()
{
int score[M][N], i, j, maxScore, row, col;
for ( i=0; i<M; i++ )
{
for ( j=0; j<N; j++ )
{
scanf("%d", &score[i][j]);
}
}
maxScore = FindMax(*score, M, N, &row, &col);
printf("%d %d %d\n", maxScore, row+1, col+1);
}
int FindMax( int (*p)[N], int m, int n,int *pRow, int *pCol)
{
int i, j, max;
max = *(p);
pRow = 0;
pCol = 0;
for (i=0; i<m; i++)
{
for (j = 0; j<n; j++)
{
if ( *(*(p+i)+j) > max )
{
max = *(*(p+i)+j) ;
*pRow = i;
*pCol = j;
}
}
}
}
3.以下程序用于打印输出结构体数组的所有元素。#define M 3
#define N 4
int FindMax( int (*p)[N], int m, int n,int *pRow, int *pCol)
main()
{
int score[M][N], i, j, maxScore, row, col;
for ( i=0; i<M; i++ )
{
for ( j=0; j<N; j++ )
{
scanf("%d", &score[i][j]);
}
}
maxScore = FindMax(*score, M, N, &row, &col);
printf("%d %d %d\n", maxScore, row+1, col+1);
}
int FindMax( int (*p)[N], int m, int n,int *pRow, int *pCol)
{
int i, j, max;
max = *(p);
pRow = 0;
pCol = 0;
for (i=0; i<m; i++)
{
for (j = 0; j<n; j++)
{
if ( *(*(p+i)+j) > max )
{
max = *(*(p+i)+j) ;
*pRow = i;
*pCol = j;
}
}
}
}
#include <stdio.h>
struct s
{
char name[10];
int age;
}
main()
{
struct s a[3] = {"John",19,"Paul",17,"Marry",18};
int *p;
for(p = a; p < 3; p++)
{
printf("%s,%d\n", p->name, p->age );
}
}
struct s
{
char name[10];
int age;
}
main()
{
struct s a[3] = {"John",19,"Paul",17,"Marry",18};
int *p;
for(p = a; p < 3; p++)
{
printf("%s,%d\n", p->name, p->age );
}
}
4.该程序的作用是将一个字符串str2连接到字符串str1后,然后输出连接后的字符串str1。
#include<stdio.h>
void Link(char s[],char c[]);
main()
{
char str1[80], str2[80];
gets(str1);
gets(str2);
Link(str1, str2);
printf("输出连接后的字符串:");
puts(str1);
}
void Link(char s[], char c[]);
{
int i, j;
for(i = 0; s[i] !='\0'; i++);
while(c[j] != '\0' );
{
s[ j ] = c[ i ];
i++;
j++;
}
}
五、编程(42分)void Link(char s[],char c[]);
main()
{
char str1[80], str2[80];
gets(str1);
gets(str2);
Link(str1, str2);
printf("输出连接后的字符串:");
puts(str1);
}
void Link(char s[], char c[]);
{
int i, j;
for(i = 0; s[i] !='\0'; i++);
while(c[j] != '\0' );
{
s[ j ] = c[ i ];
i++;
j++;
}
}
1.编程计算:1-1/2+1/3-1/4+…+1/99-1/100+…,直到最后一项的绝对值小于10-5为止。(14分)
2.编写一个函数,将一个字符串中的元音字母复制到另一字符串。要求在主函数中读入一个字符串,复制后的字符串在主函数中输出。(元音字母有:a、A、e、E、i、I、o、O、u、U)(14分)
请按以下给定的函数原形编写程序。
void Cpy( char s[ ], char c[]);
或
void Cpy( char *p, char c[]);
或
void Cpy( char s[], char *q);
或
void Cpy( char *p, char *q);
注:不按给定的函数原形或使用全局变量编写程序不给分。
3.编写一个函数,实现一组数(最多10个)按逆序存放(如:13,7,9,11,0,6,7,5,4,2经过函数调用变为2,4, 5,7,0,6,11,9,7,13)。要求在主函数输入这组数,交换后的一组数也在主函数输出。(14分)
请按以下给定的函数原形编写程序。
void Change(int a[], int n);
或
void Change(int *p, int n);
注:不按给定的函数原形或使用全局变量编写程序不给分