2011年潮南大学招收硕土研究生入学考试试题
一、简答题
- 请简述函数参数传递时传值与传地址的区别。
传值:把实参的值赋给形参,形参数值的变化对实参无影响。 传地址:传递的是地址,实参和形参指向同一个对象,形参的值的改变可以引起实参的值的变化。
- 请问#include<filename.h>和#include "filename.h"有什么区别?
用< >时,编译系统从存放C编译系统的子目录中寻找所要包含的文件。 用“ ”时,编译系统首先在用户的当前目录中寻找包含文件,若无,再按照前者方式查找。
- 下面的代码在32位的windows操作系统下运行
int main()
{
char str[]= "Hello";
char*p = str;
printf("1-----%d\n", sizeof(str));
printf("2-----%d\n" ,sizeof(p));
return 0
}
请问其输出的结果是什么?如果在主程序中调用下面的自定义函数Func,输出的结果又是什么?简述理由。
void Func(char str[100])
{
printf("3------%d\n",sizeof(str));
}
1 ----- 6 ,str 有6个元素"Hello\0" . 2 ----- 4,p 是指针,存放的是地址,地址大小为4个字节。 3 ----- 4,这里的函数接收的 str 是数组首元素地址,地址大小为4个字节。
- 下面的程序存在逻辑错误。如果Test函数运行。会有什么结果?简述理由。
char *GetMemory(void)
{
char p[ ] = “Hello world”;
return p;
}
void Test(void)
{
char *str = NULL ;
str = GetMemory();
printf(str);
}
*GetMemory函数中的p变量是局部变量,函数运行结束即释放,这时候返回的指针p变成野指针,指向未知数据,可能导致不可预料的后果。
二、程序改错
- 下面的程序根据整型形参m,计算如下公式的值:y=1+1/3+1/5+1/7+…+1/(2m-3),此程序共含三处错误(包括语法错误和逻辑错误)。请找出这三处错误。
#include<stdio.h>
double fun(int m)
{
double y=1;
int i;
for(i=3;i<m;i++)
y+=1.0/(2i-3);
return y;
}
void main( )
{
int n;
scanf("%d" ,&n);
printf("\nThe result is %1f\n", fun(n));
}
- 下面是一一个用于计算阶乘的递归函数。其中包含逻辑错误。请指出该错误,说明错误的原因,并更正使函数的功能正确。
long func(int n)
{
long s;
s = n*func(n-1);
return s;
if(n==0 || n==1)
return 1;
}
递归出口应放在递归计算前面 改:
long func(int n)
{
long s;
if(n==0 || n==1)
{
s = 1;
}
else
{
s = n*func(n-1);
}
return s;
}
- 下面的程序用于计算正整数num的各位上的数字之积。,此程序共含三处错误(包括语法错误和逻辑错误)。请找出这三处错误。
例如:输入252 ,则输出的应该是20.
#include<stdio.h>
long fun( long num)
{
long k;
do {
k*=num%10;
num\=10;
}while(num);
return k;
}
void main( )
{
1ong n;
printf("\nPlease enter a number:");
scanf("%ld",&n);
printf("\n%d\n",fun(n));
}
- 下面的函数用于求数组a中最大数和次最大数,并把最大数和a[0]中的数对调,次最大数和a[1]中的数对调,其中n为数组中包含元素的个数。函数中共有三处逻辑错误。请指出井更正错误,使程序的功能正确。
void fun(int*a ,int n)
{
int i,m,t,k;
for(i=0;i<2;i++)
{
m=0;
for(k=1;i<2;i++)
if(a[k]>a[m])
k=m;
t=a[i];
a[i]=a[m];
a[m]=t;
}
}
三、程序改造和程序阅读
- 阅读下面的程序:
#include<stdio. h>
main( )
{
char ch;
ch = getchar();
if(ch=='A'||ch=='a')
printf( "Abort\n");
else if(ch=='R'||ch=='r')
printf("Retry\n");
else
printf('Sorry you are wrong.\n");
}
请改写程序,将程序中的 if 分支结构改写成 switch 分支结构。 改:
#include<stdio. h>
int main()
{
char ch;
ch = getchar();
switch(ch)
{
case 'A':
case 'a':
printf( "Abort\n");
break;
case 'R':
case 'r':
printf("Retry\n");
break;
default:
printf('Sorry you are wrong.\n");
}
return 0;
}
- 阅读下面的程序,写出程序的运行行结果。
#include<stdio.h>
int main()
{
int i, j, width = 6;
for (i = 1; i < width; i++)
{
for (j = 1; j <= i; j++)
printf("*");
printf("\n");
}
return 0;
}
运行结果
*
**
***
****
*****
四、编程题
- 编写程序,计算并输出1-100内的素数,要求判断是否素数用函数实现,函数的声明如下:
int isprime(int);
【仅供参考】
#include<stdio.h>
int isprime(int n)
{
if (n == 1)
return 0;
int i;
for (i = 2; i * i <= n; i++)
{
if (n % i == 0)
return 0;
}
return 1;
}
int main()
{
int i;
for (i = 1; i <= 100; i++)
{
if (isprime(i))
printf("%d ", i);
}
return 0;
}
- 下面的程序是将随机函数生成50个100以内的整数,存入数组a中,然后从键盘输入一个整数作为关键字
key ,用线性查找方法在数组中查找,如果输入的数(key)在数组中存在,则输出在数组中的下标值,否则输出1,测试程序如下,其中函数void createdata(int al].int size); 的作用是: 将随机生成的size个100 以内的数放入数组a中,函数int linesearch(int al].intsize,int keyword); 的作用是:在数组中查找是否含有keyword 的值。根据下面的程序,请完成这两个函数的定义。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int linesearch(int a[],int size,int keyword);
void createdata(int a[],int size);
main()
{
int i,a[50],key,sub;
srand (time(NULL));
createdata(a,50);
printf("Please input keyword:");
scanf("%d",&key);
sub = linesearch(a, 50,key);
if(sub != - 1)
printf("the sub is %d\n",sub);
else
printf("not found\n");
}
【仅供参考】
int linesearch(int a[], int size, int keyword)
{
int i;
for (i = 0; i < size; i++)
{
if (keyword == a[i])
return i;
}
return - 1;
}
void createdata(int a[], int size)
{
int i;
for (i = 0; i < size; i++)
a[i] = rand() % 101;
}
3.下面的程序可将字符串进行反转。函数char*reverse(char * str) 的作用是将str所指的字符串反转(例如字符串"abcdfg" 反转后成为"gfdcba" ) ,根据下面的程序,请完成函数的定义。
#include<stdio.h>
char* reverse(char*str);
main( )
{
char*str;
printf(" input reversing characer string:");
gets(str);
str=reverse(str);
printf("\noutput reversed character string:");
puts(str);
}
【仅供参考】
char* reverse(char* str)
{
if (!str)
return NULL;
char* right = str;
char* left = str;
char tmp;
while (*right)
right++;
right--;
while (left < right)
{
tmp = *left;
*left++ = *right;
*right-- = tmp;
}
return(str);
}
|