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

(单词翻译:单击)

/*===========================================================================*/
/*程序名称:2004_1.c */
/*程序目的:计算一个“零幺串”当中最长的零/幺串  */
/*Writen by Apechn ,Soft Lab of JLU */
/*===========================================================================*/#include#define MAX 100void main(void){ char s[MAX]; /* 用来保存用户输入的"零/幺串" */ int i = 0; /* 计数器 */ int n0 = 0; /* 保存最长"零串"数0的个数 */ int n1 = 0; /* 保存最长"幺串"中1的个数 */ int temp0 = 0,temp1 = 0; printf("请输入一个仅由0/1组成的字符串:/n"); scanf("%s",s); /* 由用户输入"零幺串" */ while (s[i]) { if (s[i] == '0') temp0++; if (temp0 > n0) /* n0取已经扫描过的"零串"中0个数最多者 */ { n0 = temp0; temp1 = 0; /* 处理"零串"时将"幺串"计数的临时变量置零 */ } if (s[i] == '1') temp1++; if (temp1 > n1) /* n1取已经扫描过的"零串"中1个数最多者 */ { n1 = temp1; temp0 = 0; /* 处理"幺串"时将"零串"计数的临时变量置零 */ } i++; } printf("最长的/"零串/"中零的个数即n0 = %d ./n",n0); /* 输出结果 */ printf("最长的/"幺串/"中幺的个数即n1 = %d ./n",n1);}


考研试题
/*====================================================================================*/
/*程序名称:2004_2.c                      */
/*程序目的:两个多项式相加                  */
/*Writen by Apechn ,Soft Lab of JLU                */
/*====================================================================================*/
#include
#include

struct list /* 节点结构声明 */
{
int power; /* 多项式中变量的幂 */
int coeff; /* 多项式中变量的系数 */
struct list *next;
};
typedef struct list node;
typedef node *poly;

/*-------------------------------------*/
/* 打印出一个多项式的各项       */
/*-------------------------------------*/
void printPoly(poly head)
{
poly pointer; /* 临时指针变量 */
pointer = head;

while (pointer != NULL) /* 打印各节点 */
{
printf("[%d,%d] ",pointer->coeff,pointer->power);

pointer = pointer->next;
}

printf("/n");
}

/*------------------------------------------------------------------------------*/
/* 从键盘输入一个多项式的项数和各项的幂和系数,多项式的系数不能为零       */
/*------------------------------------------------------------------------------*/
poly createPoly(poly head) /* 从键盘输入一个多项式的项数和各项的幂和系数 */
{
poly newNode; /* 临时节点 */
poly pointer;
int n,i;
int coeffTemp,powerTemp; /* 临时变量 */

head = (poly) malloc(sizeof(node)); /* 内存配置 */
if (head == NULL)
printf("Memory allocate Failure!!/n"); /* 内存配置失败 */
else
{
printf("请输入要创建的多项式的项数:/n");
scanf("%d",&n);

if (n == 0)
return NULL;
printf("请按x降幂依次输入各项的系数和幂:/n");

scanf("%d%d",&coeffTemp,&powerTemp);/* 输入多项式一项的系数和幂 */

head->coeff = coeffTemp; /* 定义首节点 */
head->power = powerTemp;
head->next = NULL;

pointer = head;
for (i = 1;i < n;i++) /* 依次定义其它节点 */
{
scanf("%d%d",&coeffTemp,&powerTemp); /* 输入各项的系数和幂 */
newNode = (poly) malloc(sizeof(node));

newNode->coeff = coeffTemp;
newNode->power = powerTemp;
newNode->next = NULL;

pointer->next = newNode; /* 将新定义的节点连接到原链表的表尾 */
pointer = newNode; /* pointer指针后移 */
}
}

printPoly(head);

return head;
}


/*-----------------------------------*/
/* 释放一个链表的空间 */
/*-----------------------------------*/
void freeList(poly head)
{
poly pointer; /* 临时指针变量 */

while (head != NULL)
{
pointer = head;
head = head->next;
free(pointer);
}
}

/*--------------------------------------------*/
/* 计算两个多项式的和,并将结果存入另一个链表 */
/*--------------------------------------------*/
poly addPoly(poly head1,poly head2)
{
poly pointer1,pointer2,pointer,newNode,head;/* 临时指针变量 */

pointer1 = head1;
pointer2 = head2;
head = (poly) malloc(sizeof(node));
pointer = head;

while ((pointer1 != NULL) || (pointer2 != NULL)) /* 若两个多项式至少有一个没有访问结束 */
{
if (pointer1 !=NULL && pointer2 != NULL &&(pointer1->power > pointer2->power))
{/* 若两个多项式当前指针指向的项的幂不相等 */
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer1->power;
newNode->coeff = pointer1->coeff;
newNode->next = NULL;

pointer->next = newNode;
pointer = newNode;

pointer1 = pointer1->next;
}

if (pointer1 !=NULL && pointer2 != NULL &&(pointer1->power < pointer2->power))
{/* 若两个多项式当前指针指向的项的幂不相等 */
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer2->power;
newNode->coeff = pointer2->coeff;
newNode->next = NULL;

pointer->next = newNode;
pointer = newNode;/* 指向存储结果的链表的指针后移 */
pointer2 = pointer2->next;
}

if (pointer1 !=NULL && pointer2 != NULL &&(pointer1->power == pointer2->power))
{ /* 若两个多项式当前指针指向的项的幂相等 */
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer1->power;
newNode->coeff = pointer1->coeff + pointer2->coeff;
newNode->next = NULL;

pointer->next = newNode;
pointer = newNode;/* 指向存储结果的链表的指针后移 */

pointer1 = pointer1->next;
pointer2 = pointer2->next;
}

if (pointer1 == NULL && pointer2 != NULL)
{
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer2->power;
newNode->coeff = pointer2->coeff;
newNode->next = NULL;

pointer->next = newNode;
pointer = newNode;/* 指向存储结果的链表的指针后移 */

pointer2 = pointer2->next;
}

if (pointer2 == NULL && pointer1 != NULL)
{
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer1->power;
newNode->coeff = pointer1->coeff;
newNode->next = NULL;

pointer->next = newNode;
pointer = newNode;

pointer1 = pointer1->next;
}

}


pointer = head; /* 由于多用了一个节点,这3行代码将多出的节点释放 */
head = head->next;
free(pointer);

return (head);
}

/*------------------------------------------------------------------------------*/
/* 主程序                   */
/*------------------------------------------------------------------------------*/
void main()
{
poly p,q,r; /* 定义三个代表多项式的链表 */

printf("这是多项式p:/n"); /* 创建多项式p */
p = createPoly(p);

printf("这是多项式q:/n"); /* 创建多项式q */
q = createPoly(q);

r = (poly) malloc(sizeof(node));
printf("这是多项式p与多项式q的和r:/n");
r = addPoly(p,q); /* 将多项式p和多项式q的和赋值给r */
printPoly(r);

freeList(p); /* 释放程序中使用过的链表所占用的空间 */
freeList(q);
freeList(r);
}


考研试题
/*=============================================================================*/
/*程序名称:2004_3.c */
/*程序目的:求sin(x)的近似值 */
/*Writen by Apechn ,Soft Lab of JLU */
/*=============================================================================*/
#include
#include
#define MIN 0.00005 /* 设置运算停止条件 */

/*------------------------------------------------------------------------------*/
/* 计算弧度数为angle的角的正弦值第i项 */
/*------------------------------------------------------------------------------*/
float spill(int i,float angle) /* 计算第i项 */
{
int symbol,j;
float temp = angle; /* 临时变量 */

if (i % 2) /* 设置该项的符号 */
symbol = 1;
else
symbol = -1;

if (i == 1) /* 若只需要计算一项,直接返回角度值 */
return (angle);

for (j = 2;j <= i;j++) /* 循环计算一项的值 */
{
temp *= angle * angle / ((2 * j - 2) * (2 * j - 1));
}

temp *= symbol;

return (temp);
}

/*------------------------------------------------------------------------------*/
/* 递归求解sin(angle)的近似值,其中angle表示用户输入的弧度值 */
/*------------------------------------------------------------------------------*/
float f(int i,float angle)
{
float temp; /* 临时变量 */

if (i == 1) /* 递归出口 */
return angle;

temp = spill(i,angle); /* 需要加上的项 */

return (f((i - 1),angle) + temp); /* 递归运算 */
}

/*------------------------------------------------------------------------------*/
/* 计算需要的级数的项数,其中angle表示用户输入的弧度值 */
/*------------------------------------------------------------------------------*/
int loopTime(float angle)
{
int i = 1;
float seed = angle; /* 临时变量 */
while ((seed >= MIN) || (seed <= (-1 * MIN))) /* 循环条件 */
{
i++;
seed *= angle * angle /((2 * i -1) * (2 * i - 2)) * (-1);
}

return i;
}

/*------------------------------------------------------------------------------*/
/* 主程序                   */
/*------------------------------------------------------------------------------*/
void main()
{
float x; /* 用来保存用户输入的弧度数 */
int count = 1; /* 用来保存需要递归的次数 */
float sinOfAngle = 0; /* 用来保存最终结果 */

printf("请输入一个浮点数,它代表一个弧度值:");
scanf("%f",&x); /* 用户从键盘输入一个弧度数 */

count = loopTime(x);
sinOfAngle = f(count,x);

printf("sin %f 的近似值为 %f./n",x,sinOfAngle); /* 在屏幕上打印出最终结果 */
}


考研试题
/*=============================================================================*/
/*函数名称:2004_4.c */
/*函数目的:递归的求出一个给定结构树的高度、节点数和路径个数         */
/*Writen by Siyee ,Soft Lab of JLU */
/*=============================================================================*/
int depth = 0; /* 用来保存深度的变量 */

void H(tree *T, int *h, int *n, int *k)
{
++*n;
++depth;
*h = max(*h, depth); /* 如果h比depth小,则更新h */
if(T->kind=='two'){ /* 若节点有两个子节点 */
H(T->son1, h, n, k); /* 递归计算两个子节点 */
H(T->son2, h, n, k);
}
else if(T->kind=='one'){ /* 若节点有一个子节点 */
H(T->son, h, n, k); /* 递归计算这一个子节点 */
}
else{
++*k; /* 如果是叶节点,则路径数k增一 */
}
--depth; /* 回溯,深度减一 */
}


考研试题
/*=============================================================================*/
/*程序名称:2004_5.c */
/*程序目的:删除整数单链表中重复的节点    */
/*Writen by Apechn ,Soft Lab of JLU */
/*=============================================================================*/
#include
#include
#define N 6 /* 节点个数 */

struct list /* 节点结构声明 */
{
int number;
struct list *next;
};
typedef struct list node;
typedef node *link;

int data[N] = {0,3,0,3,1,3}; /* 输入数据 */

/*------------------------------------------------------------------------------*/
/* 以已有的数组为基础建立单链表        */
/*------------------------------------------------------------------------------*/
link createList(link head)
{
link newNode;
link pointer; /* 函数中需要用到的临时变量 */
int i;

head = (link) malloc(sizeof(node));

if (head == NULL) /* 若分配内存失败 */
printf("Memory allocate Failure!!/n");
else
{
head->number = data[0]; /* 设置首节点 */
head->next = NULL;

pointer = head;

for (i = 1;i < N;i++) /* 依次设置其它节点 */
{
newNode = (link) malloc(sizeof(node));

newNode->number = data[i];
newNode->next = NULL;

pointer->next = newNode;
pointer = newNode;
}
}

return head;
}

/*------------------------------------------------------------------------------*/
/* 递归地删除链表中的重复节点        */
/*------------------------------------------------------------------------------*/
link delSame(link head)
{
link pointer,temp = head; /* 函数中需要用到的临时变量 */

if (head->next == NULL) /* 若head为空则直接返回 */
return head;

head->next = delSame(head->next); /* 递归地删除重复节点 */
pointer = head->next;

while (pointer != NULL)
{
if (head->number == pointer->number) /* 删除重复节点 */
{
temp->next = pointer->next;
free(pointer); /* 释放被删除节点所占用的空间 */
pointer = temp->next;

}
else
{
pointer = pointer->next; /* 如果没有重复节点则指针后移 */
temp = temp->next;
}
}

return head;
}

/*------------------------------------------------------------------------------*/
/* 释放链表所占用的空间        */
/*------------------------------------------------------------------------------*/
void freeList(link head)
{
link pointer; /* 临时变量 */

while (head != NULL)
{
pointer = head;
head = head->next;
free(pointer); /* 一次释放一个节点所占的空间 */
}
}

/*------------------------------------------------------------------------------*/
/* 打印链表各项 */
/*------------------------------------------------------------------------------*/
void printList(link head)
{
link pointer; /* 临时变量 */
pointer = head;

while (pointer != NULL)
{
printf("%d ",pointer->number);
pointer = pointer->next;
}
printf("/n");
}
/*------------------------------------------------------------------------------*/
/* 主程序 */
/*------------------------------------------------------------------------------*/
void main()
{
link head;
link pointer;

head = createList(head); /* 以已有的数组为基础建立一个链表 */

if (head != NULL) /* 打印未删除重复节点前的数组 */
{
printf("初始链表中各元素依次如下所示:/n");
printList(head);
}

pointer = delSame(head); /* 递归地删除链表中的重复节点 */
printf("删除重复节点后的链表中各元素依次如下所示:/n");
printList(pointer); /* 打印删除重复节点后的数组 */

freeList(head);
}

分享到
重点单词
  • definev. 定义,解释,限定,规定
  • symboln. 符号,标志,象征
  • spillv. 溢出,洒,使 ... 流出,泄漏 n. 溢出,流
  • voidadj. 空的,无效的,空虚的 n. 真空,空虚,空白
  • allocatevt. 分派,分配,分配额
  • sinn. 原罪 v. 犯罪,违反(教规)