--------------------------------------------------------------------------------
作者: 飘翎 时间: 2003-7-9 14:38 标题: [原创][连载]吉林大学计算机系考研试题答案,全部上传完毕(98-2002)
到家里两天了,东西也收拾的差不多了。现在才开始有工夫静下心来将资料整理出来,希望大家不要觉得等得太久,更不要874我呀~~嘻嘻。去年的招生简章好像是7月末左右出的吧,希望今年不要有太多的变化才好。希望大家努力复习基础课,耐心等待吧。
由于我打字比较慢,因此,争取以一天一套的速度更新,希望大家不要嫌我慢哈……
复习要点:尽量多理解解题的思路,不要就题论题,尽量多举一反三。
答题方式:在答题之前能够尽量用简捷明了的语言写清楚你的思路以及你变量的用法。然后写出程序,少写程序注释以避免程序看起来比较乱。注意,思路是最重要的!!!!
2002年试题
说明: 这个据传说是02年的标准答案,是已经上机验证过的。(我也没有验证过,最近还没有重新装系统,.net近似挂掉了……!>_<!)在答题过程中,不必写出main函数,只要能够写出功能实现的函数即可。注释均为飘翎在考研复习过程中写的,如果有错误请指正,欢迎大家修改以及增加注释。
(一)
#include <stdio.h>
int a[100];
void insert(int i ,int b[])
{
int k;
if(i==0) return;//递归出口,注意对异常情况的处理
if(b[i-1]>b)
{
k=b[i-1];
b[i-1]=b;
b=k;
insert(i-1,b);
}
void main(void)//是用来测试用的,不是很重要,在考试过程中可以不用写的……
{
for(i=0;i<20;i++)
a=2*i+5;
j=10;
a[j]=20;
insert(j,a)
for(i=0;i<20;i++)
printf("%d",a);
printf("\n";
}
(二)
#include <stdio.h>
int a[100]={1,2,3,4,2,2,5};
int sublen(int a[])
{
int i,ll,lmax;
ll=1;lmax=1;
for(i=0;i<20;i++)
{
if(a<=a[i+1])
{ll=ll+1;continue;}//记录当前递增子序列长度,否则当前递增子序列已经结束
if(lmax<ll) lmax=ll;
ll=1;//表忘了初始化
}
return lmax;
}
void main()
{
printf("\n";
printf("len=%d",sublen(a));
for(i=5;i<20;i++)//为了上机测试赋值,不必理会……
a=2*i+5;
a[0]=1;
a[4]=33;
a[6]=100;
for(i=0;i<20;i++)
printf("%d",a);
printf("\n";
printf("len=%d,sublen(a)";
}
(三)
#include <iostream.h>
typedef struct elem{
int val;
struct elem *next;
} intNode;
int member(int a, intNode *head)
{int sg=0;
intNode *p;
p=head;
while(p!=NULL)
{
if(p->val==a)
{sg=1;break;}
p=p->next;
}
return (sg);
}
intNode *SetAdd(intNode *p,intNode *q)
{
int n;intNode *r,*a,*b1,*b2;
if(!p) return q;
if(!q) return p;//特殊状况处理,采分点……
r=p;
while(p)
{a=p;
p=p->next;
}
p=r;
while(member(q->val,p))
q=q->next;
b2=q;
b1=q->next;
while(b1)
{
n=b1->next;
if(member(n,p))
b2->next=b1->next;
else b2=b1;
b1=b1->next;
}
a->next=q;
return r;
}
(四)
#include <iostream.h>
typedef struct elem{
int val;
struct elem *next;
}intNode;
intNode *inverse(intNode *head,int *n)//作用:调转指针
{
intNode *f,*g,*h;
int i=0;
if(head!=NULL)
{
f=head;
g=NULL;
while(f->next!=NULL)
{h=f;f=f->next;h->next=g;g=h;i++;}//注意指针的变化
f->next=g;
head=f;
}
*n=i+1;
return head;
}
intNode *Add88(intNode *p,intNode *q)
{
intNode *p1,*q1,*p2,*q2,*r1,*r2,*r;
int i,m,n,k,t,sg,jw;//jw为jinWei,呵呵,进位……
if(!p) return q;
if(!q) return p;
p1=inverse(p,&m);
q1=inverse(q,&n);//根据链表的特点,只有先调转,然后才能进行计算……
jw=0;
sg=1;
k=m;
if(m>n)
{sg=2,k=n;}
for(i=0;i<k;i++)
{t=p1->val+jw;
r=new intNode;
r->val=t%8;
jw=(int)(t/8);
r->next=NULL;
r1->next=r;
r1=r;
p1=p1->next;
}
if(jw){r=new intNode;r->val=jw;r->next=NULL;
r1->next=r ;}
r2=inverse(r2,&i);
}
void main() //验证程序
{
intNode *aa,*bb,*p1,*p2,*q1,*q2;
aa= new intNode;
aa->val=5;
q1=aa;
bb=new intNode;
bb->val=7;
a2=bb;
for(int i=3,i<57,i+=9)
{
p1=new intNode;
p1->val=i%8;
pq->next=NULL;
q1->next=p1;
q1=p1;}
p1=aa;
while(p1)
{cout<<p1->val<<",";
p1=p1->next;}
cout<<endl;
for(i=2;i<12;i+=3)
{p1=new intNode;p1->val=i%8;p1->next=NULL;q2->next=p1;
q2=p1;}
p1=bb;
while(p1)
{cout<<p1->val<<" ,";
p1=p1->next;}
cout <<endl<<endl;
p2=Add88(aa,bb)
p1=p2;
while(p1)
{cout<<p1->val<<" ,";
p1=p1->next;}
cout<<endl;
}
(五)
double f(double x,double y)
{l1: x=x+1.5
y=y+x;
if(y<=100) goto l1;
return y;}
double g(double x, double y )
{
s1;
s2;
if(y>100) return y;
return (g(x+1.5,x+y+1.5));
}
98年试题答案(辅导班讲义)
二。(1)解题思想:用p,q,k分别纪录A,B,C,三个数组正在访问的位置。如果,A[P]<=B[q],那么将A[P]赋给c[k].否则,将B[q]赋给
C[k].如果A先访问完,把B的剩余部分复制到C中。同样,如果B先访问完,把A的剩余部分复制到C中。
设计函数如下:
Void fun (int a[],int b[],int c[])
{
int i,p=0,q=0,k=0;
while((p<=m-1)&&(q<=n-1))
{if(a[p]<=b[q])
{
c[k]=a[p];
p++;}
else
{
c[k]=b[q];
q++;}
k++;
}
if(p==m)
{
for(i=q;i<=n-1;i++)
{
c[k]=b;
k++;}
}
if(q==n)
{
for(i=p;i<=n-1;i++)
{
c[k]=a;
k++;}
}
} |