哈尔滨工业大学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.
则程序运行结果是:
2.
3.
4.
5.
三、阅读程序,在标有下划线的空白处填入适当的表达式或语句,使程序完整并符合题目要求。(8分,每空1分)
1.下面这个程序的功能是对含有n个元素(最多10个)的一维数组按升序进行排序。
1.在给定的一组书名中,从键盘任意输入一个书名(书名可以有空格)。若找到,则打印该书名,否则打印”没找到”。
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 );
注:不按给定的函数原型或使用全局变量编写程序不给分。
一、单项选择题:(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ㄌmain()
{
int x, y;
scanf("%2d%*2s%1d", &x, &y);
printf("%d", x/y);
}
则程序运行结果是:
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');
}
}
运行结果是: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;
}
程序运行结果是: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;
}
}
程序运行结果: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);
}
运行结果是: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. 下面程序的功能是从键盘输入一行字符,统计其中有多少单词。假设单词之间以空格分开。[提示:判断是否有新单词出现的方法是------当前被检验的字符不是空格,而前一被检验字符是空格,则表示有新单词出现。]#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");
}
#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个即可,多找不加分。)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);
}
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>
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");
}
}
#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 <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);
}
}
}
#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.该程序的作用是将一个字符串中的元音字母复制到另一个字符串,然后输出。#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
}
#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分)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++;
}
}
}
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 );
注:不按给定的函数原型或使用全局变量编写程序不给分。