吉林大学2001年c语言程序设计专业课考研真题试卷及答案(回忆版)
日期:2014-05-04 12:19

(单词翻译:单击)

第一题
(1).返回数组a前n+1个元素中最大的元素。
(2).f(109)=99,
  f(97)=91.
(3). g(1,10)=4.
/*====================================================================================*/
/*函数名称:2001_2.c                                  */
/*程序目的:将Ackrman函数改写为非递归函数                       */
/*Writen by Apechn ,Soft Lab of JLU                          */
/*====================================================================================*/
//[解题思想]:用一个堆栈来实现递归过程。
long ack(int m,int n)
{
 int a[2000],top=-1; //a[2000]用来模拟堆栈,top为栈顶指针


 top++; //把m和n压入堆栈
 a[top]=m;
 top++;
 a[top]=n;


 while(top!=0) //直到堆栈中只剩下一个元素为止
 {
  n=a[top];
  top--;
  m=a[top];
  top--;


  if(m==0)
  {
   top++;
   a[top]=n+1;
   continue;
  }


  if(n==0)
  {
   top++;
   a[top]=m-1;
   top++;
   a[top]=1;
   continue;
  }


  top++;
  a[top]=m-1;
  top++;
  a[top]=m;
  top++;
  a[top]=n-1;
 }


 return a[top]; //返回堆栈中最后一个数
}
/*====================================================================================*/
/*函数名称:2001_3.c                                  */
/*程序目的:求给定字符表的对偶表                            */
/*Writen by Apechn ,Soft Lab of JLU                          */
/*====================================================================================*/
[解题思想]:把 L1和 L2两个表分别扫描一遍,把扫描得到的数对放到对偶表中。最后再把对偶表中的相同元素删除即可。
struct node //对偶表的结点结构
{
char x;
char y;
node* next;
}
node* head; //对偶表的头指针
void del() //删除函数,删除相同元素
{
node *p=head,*q,*r;
whiel(p!=NULL)
{
q=p->next;
r=p;
while(q!=NULL)
{
if(p->x==q->x&&p->y==q->y)
{
r->next=q->next;
delete q;
q=r->next;
break;
}
else
{
r=q;
q=q->next;
}
}
p=p->next;
}
}
void fun(char L1[],char L2[]) //题目所求的函数
{
int i,j;
node* p;
for(i=0;i<m;i++) //把两个表分别扫描一次
for(j=0;j{
p=new node; //从表头插入结点
p->x=L1[i];
p->y=L2[j];
p->next=head;
head=p;
p=new node; //从表头插入结点
p->x=L2[j];
p->y=L1[i];
p->next=head;
head=p;
}
del(); //删除相同的元素
}

/*====================================================================================*/
/*函数名称:2001_4.c                                  */
/*程序目的:写出给定数组的螺旋数组                           */
/*Writen by Apechn ,Soft Lab of JLU                          */
/*====================================================================================*/
//[解题思想]:设一个方向变量orient,取值0、1、2、3分别代表往右、往下、往左、往上。当遇到边界或当前//位置已经有东西时,调整方向。
//否则一直顺着当前方向走下去。走到一个位置,把a数组的相应位置的字符写到b上。
const int n=4;
void fun(char a[][n],char b[][n])
{
 int i=0,j=0,p=0,orient=0;

 while(p {
  if(orient==0) //如果当前方向为向右
  {
   if(j==n||b[i][j]!=32) //如果已经到达边界或当前位置已经有字符
   {
    i++; //调整方向
    j--;
    orient=(orient+1)%4;
    continue;
   }
   else
   {
    b[i][j]=a[p/n][p%n]; //否则把a的相同字符填到b中
    p++; //a和b都指向下一个位置
    j++;
   }
  }

  if(orient==1) //如果当前方向为向下
  {
   if(i==n||b[i][j]!=32)
   {
    i--;
    j--;
    orient=(orient+1)%4;
    continue;
   }
   else
   {
    b[i][j]=a[p/n][p%n];
    p++;
    i++;
   }
  }

  if(orient==2) //如果当前方向为向左
  {
   if(j==-1||b[i][j]!=32)
   {
    i--;
    j++;
    orient=(orient+1)%4;
    continue;
   }
   else
   {
    b[i][j]=a[p/n][p%n];
    p++;
    i--;
   }
  }

  if(orient==3) //如果当前方向为向上
  {
   if(i==-1||b[i][j]!=32)
   {
    i++;
    j++;
    orient=(orient+1)%4;
    continue;
   }
   else
   {
    b[i][j]=a[p/n][p%n];
    p++;
    i--;
   }
  }
}

分享到