吉林大学历年C语言程序设计试题及答案
吉林大学历年C语言程序设计试题及答案(5)END
2000年试题答案
一、(1)解题思想: 用5个数 a,b,c,d,e,来回替换,最终f(n)算出。
设计程序如下:
int F(int n)
{ if(n <=5) return n ;
int temp,a=1;b=2;c=3;d=4;e=5;
for(int i=6;i <=n;i++) {
temp=e-c-a; a=b; b=c; c=d; d=e; e=temp; }
return e;
}
(2)解题思想: 根据园相切的定义: 圆心之间的距离等于半径之和或半径之差,判断一下即可。设圆心坐标和园的半径已经存在数组x[100],y[100],r[100]中。注意,相切包括内切和外切。
设计程序如下:
#include
#include
struct node
{ int m ; int n ;
node *next; };
double d(int i,int j)
{ return sqrt((x-x[j])*(x-x[j])+(y-y[j])*(y-y[j])); }
node *fun(void)
{ node *head=NULL;
node *p;
for(int i=0;i for(int j=i+1;j
if((d(i,j)==r+r[j])||(d(i,j)==r-r[j])||(d(i,j)==r[j]-r)) {
p=new node;
p- >m=i;
p- >n=j;
p- >next=head;
head=p; }
return head;
}
(3) #include
const int N=10;
int fun()
{ int i,j,k,a[N][N],b[N][N],m,s,p;
for(i=0;i for(j=0;j for(i=0;i for(j=0;j
p=1;
for(i=0;i m=1; for(j=0;j s=0;
for(k=0;k <10;k++) s+=a[k]*b[k][k];
p*=b*(m+s); }
return p;
}
(4)解题思想:根据题目要求把数组a和b扫描一次,即可求c。
#include
const int m=3,n=4;
void fun(float a[],float b[],float c[])
{ float p;
p=0;
for(int k=0;k
p=0;
for(int i=0;i <=m;i++)
for(int j=0;j <=n;j++)
if(i+j==k) p+=a*b[j];
c[k]=p; }
}
二、解题思想:这实际上是积分过程的模拟,在区间[o,N]上,可以先划分出N个小区间,如果不能满足题目的精确度,则继续划分成2×N个区间,那么当区间个数足够多时,总可以满足精确度要求。在判断误差时,可以使用积分大和与积分小和相减的方法。
设计程序如下:
#include
#include
double function(int N,double e)
{ double s1=0,s2=10;
float M=N;
while (fabs(s2-s1) >=e) {
s1=0;s2=1;
for(int i=0;i
s1=F(i*N/M)*N/M+s1;
s2=F((i+1)*N/M)*N/M+s2; }
N=M*2; }
return s1;
}
三、解题思想:用直接插入排序法进行集合的并运算,可以保证集合中没有相同的元素。其中集合元素产生时用到了函数指针。
#include
typedef int(*MenuFun)(int);
int F1(int x){return x*x+1;}
int F2(int x){return 2*x*x+1;}
int F3(int x){return 3*x*x+1;}
int F4(int x){return 4*x*x+1;}
int F5(int x){return 5*x*x+1;}
int F6(int x){return 6*x*x+1;}
int F7(int x){return 7*x*x+1;}
int F8(int x){return 8*x*x+1;}
int F9(int x){return 9**x+1;}
int F10(int x){return 10*x*x+1;}
MenuFun F