您好,欢迎来到微智科技网。
搜索
您的当前位置:首页2009年真题

2009年真题

来源:微智科技网
考研算法设计题(交大2009年试题)

2012-09-21 13:13:19| 分类: 考研辅导 | 标签: |字号大中小 订阅

1、有一分数序列2,3/2,5/3,8/5,13/8,21/13,…,请编写程序求这个序列的前30项之和。 2、对于一个整形二维数组A[m][n],其中m<=80,n<=80,先读入m和n,然后读该数组的全部元素,当

m=n时分别求两条对角线上的元素之和(不考虑溢出),否则输出m与n不相等的信息。

3、编写程序用下面公式计算圆周率的近似值:

直到最后一项小于10E-6为止。

4、输入一个字符串,统计一长度不超过2的子串在该字符串中出现的次数。例如:输入字符串为:asd

asasdfg asd as zx67 mklo,子串为:as,程序返回值为6。编写程序实现此功能。

5、编写程序求方程:2sin(x)-x=0在x=1附近的根。

6、有两个磁盘文件A和B,各存放一行字母,试编写程序,要求把这两个文件中的信息合并(按字母表顺

序排列,每个字符只出现一次)后输出到新文件C中去。

7、n人围成一圈,并顺序编号,从第一个人开始按1,2,3顺序,报到3者退出圈子,再从下一个人重新

开始报数,依次类推…。请编写程序找出最后留在圈子中人的原序号。

8、对10个候选人进行选举,现有一个100条记录的选票数据文件in.dat,其数据存放的格式是每条记录的长度为10,记录中第一位表示对第一个人的选举情况,第二位表示对第二个人的选举情况,依次类推,每一位的取值为字符\"0\"或\"1\",分别表示未选中和选中,全选不选均为无效选票。请编写程序统计每个人的选票情况并输出。

参:

//1、有一分数序列2,3/2,5/3,8/5,13/8,21/13,…,请编写程序求这个序列的前30项之和。

#include \"stdio.h\"

void main()

{

}

int i; fz=2; fm=1; { sum+=fz/fm; newfz=fz+fm;

fm=fz; fz=newfz; }

double fz,fm,newfz,sum=0;

for(i=1;i<=30;i++)

printf(\"Sum=%f\\n\

//2、对于一个整形二维数组A[m][n],其中m<=80,n<=80,先读入m和n,然后读该数组的全部元素,

//当m=n时分别求两条对角线上的元素之和(不考虑溢出),否则输出m与n不相等的信息。

#include \"stdio.h\" #define MAX 80 void main()

{

int i,j,m,n,he1=0,he2=0,a[MAX][MAX];

do {

printf(\"输入数组的行数及列数(1-%d):\

scanf(\"%d%d\

}while(n<1||n>MAX||m<1||m>MAX);

for(i=0;i{

printf(\"第%2d行:\

for(j=0;j} else } }

printf(\"请按行输入数组各元素的值:\\n\");

printf(\"原数组如下:\\n\");

for(i=0;i{

for(j=0;j} if(m==n)

{ {

he1+=a[i][i]; he2+=a[i][n-1-i];

}

for(i=0;iprintf(\"两对角线之和分别为:%d %d\\n\

printf(\"m!=n\\n\");

//3、编写程序用下面公式计算圆周率的近似值:直到最后一项小于10E-6为止。

#include \"stdio.h\" #include \"math.h\"

void main()

{

int i=0; double sum=0;

do { i++;

sum+=1.0/(i*i);

}while(1.0/(i*i)>=1e-6);

}

printf(\"圆周率的近似值为:%f\\n\

//4、输入一个字符串,统计一长度不超过2的子串在该字符串中出现的次数。

//例如:输入字符串为:asd asasdfg asd as zx67 mklo,子串为:as,程序返回值为6。编写程序实现此功能。

//实质为字符串匹配问题

#include #include #define N 80

void main()

{

char str[N+1],substr[N+1]; unsigned i,j,k,count=0; printf(\"请输入原字符串:\");

scanf(\"%s\ scanf(\"%s\ for(i=0;str[i]!='\\0';i++)

}

//5、编写程序求方程:2sin(x)-x=0在x=1附近的根。

//用牛顿迭代法

//设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L, //L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为

r的一次近似值。

{ j=0; k=i; { j++; k++; } count++; }

printf(\"请输入子字符串(长度不超过2):\");

while(jif(j==strlen(substr))

printf(\"共出现%d次!\\n\

//过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),

称x2为r的

//二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的

n+1次近似值, //上式称为牛顿迭代公式。

#include #include

void main()

{

double x0=1.99,x1,oldx0;

do { oldx0=x0; x0=x1;

x1=x0-(2*sin(x0)-x0)/(2*cos(x0)-1);

}while(fabs(x1-oldx0)>=0.0000001); printf(\"方程近似根为:%.10f\\n\

}

//用二分法求方程根

过程如下图:

#include #include double f(double x) { }

void main() { 度

double a=0.1,b=2,c,fa,fb,fc,jqd=0.00001; int count=0;//统计迭代次数 fa=f(a); fb=f(b);

//a,b分别存放区间下界及上界,c存放区间中点,fa,fb,fc分别存放对应各点函数值,jqd存放精确return 2*sin(x)-x;

}

if(fa*fb==0) else

if(fa*fb>0) else { }

while(b-a>jqd) { }

printf(\"方程根为:%f,迭代次数:%d次!\\n\

count++; c=(a+b)/2; fa=f(a); fc=f(c); if(fc==0) { } else

if(fa*fc<0) else

a=c; b=c; b=c; a=c;

printf(\"所给定的范围[%f,%f]内不能保证有实根\\n\ if(fa==0) else

printf(\"方程根为:%f\\n\ printf(\"方程根为:%f\\n\

//6、有两个磁盘文件A和B,各存放一行字母,试编写程序,要求把这两个文件中的信息合并

//(按字母表顺序排列,每个字符只出现一次)后输出到新文件C中去。

//实质为归并排序 #include #include

#define N 100 //假设最大长度为100

void main()

{

char str[2][N+1],fn[10],ch,prech;

unsigned i,j,k; FILE *fp; for(k=0;k<2;k++)

{ strcpy(fn,\"A\"); fn[0]=fn[0]+k; strcat(fn,\".txt\"); //打开文件 fp=fopen(fn,\"r\"); if(fp==NULL)

else {

//以下三条语句用于生成文件名

printf(\"文件无法打开!\\n\");

fgets(str[k],N+1,fp);//读取文件内容

} fclose(fp); }

}

puts(str[k]);

{

if(str[k][j]>str[k][j+1])

{ ch=str[k][j]; str[k][j]=str[k][j+1]; str[k][j+1]=ch;

}

printf(\"File %d:\以下两条语句输出原文件内容 for(i=1;ifor(j=0;jfp=fopen(\"C.txt\

if(fp==NULL)

else { prech='\\0';

{

if(str[0][i]=='\\0')

ch=str[1][j++]; else if(str[1][j]=='\\0')

ch=str[0][i++];

else

if(str[0][i]ch=str[0][i++];

printf(\"文件无法打开,数据不能保存!\\n\");

//以下代码实现开重复归并

for(i=0,j=0;str[0][i]!='\\0' || str[1][j]!='\\0';)

else ch=str[1][j++]; {

if(prech!=ch) fprintf(fp,\"%c\

prech=ch; } } } fclose(fp); //输出结果

fp=fopen(\"c.txt\

if(fp==NULL)

else {

while(!feof(fp))

} } fclose(fp);

{

printf(\"%c\ fscanf(fp,\"%c\

} printf(\"\\n\");

printf(\"文件无法打开!\\n\");

fscanf(fp,\"%c\

//7、n人围成一圈,并顺序编号,从第一个人开始按1,2,3顺序,报到3者退出圈子,再从下一个人重新

开始报数,

//依次类推…。请编写程序找出最后留在圈子中人的原序号。

#include \"stdio.h\" #include \"stdlib.h\" #define MAXN 100 //最大个数

struct Node

{

int data; struct Node *next;

}; void main()

{

struct Node *head, *s, *q, *t;

int n, m, count=0, i; do//输入总个数

{

printf(\"请输入总个数(1-%d):\

scanf(\"%d\

}while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数

{

scanf(\"%d\

printf(\"要数到的个数(1--%d):\

}while((n<1)||(n>m));

{ s->data=i+1; s->next=NULL;

}

if(i==0) { head=s; q=head; } else { q->next=s; q=q->next; }

for(i=0;iq->next=head;//形成圈 //以下代码输出原始状态 printf(\"原始状态:\\n\");

q=head;

{ q=q->next; }

while(q->next!=head) printf(\"%4d\

printf(\"%4d\\n\ q=head;//以下代码实现出圈 printf(\"出圈顺序:\\n\");

do { count++; if(count==n-1)

{ t=q->next; q->next=t->next;

count=0;

printf(\"%4d\

free(t); } q=q->next;

}while(q->next!=q);

}

#include #include

printf(\"\\n剩下的是%4d\\n\

#define MAXN 100 //最大个数

void main()

{

int i,j,k,temp,*a,m,n; do//输入总个数

{

scanf(\"%d\

printf(\"请输入总个数(1-%d):\

}while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数

{

scanf(\"%d\

printf(\"要数到的个数(1--%d):\

}while((n<1)||(n>m)); a=(int *)malloc(sizeof(int));

if(a==NULL)

else {

for(i=0;ia[i]=i+1;

printf(\"程序无法继续运行......\\n\");

printf(\"原始顺序如下:\\n\");

for(i=0;i=0;i--) { { temp=a[0]; for(j=0;ja[j]=a[j+1]; a[i]=temp; }

for(k=1;k<=n;k++)

}

printf(\"出圈的顺序如下,最后一个即为留下来的那一个:\\n\");

for(i=m-1;i>=0;i--) printf(\"%4d\ printf(\"\\n\"); } }

#include #include #define MAXN 100 //最大个数

void main()

{

int i,j,*a,m,n,s1,w; do//输入总个数

{

scanf(\"%d\

printf(\"请输入总个数(1-%d):\

}while((m<1)||(m>MAXN)); do//输入出圈时要数到的个数

{

scanf(\"%d\

printf(\"要数到的个数(1--%d):\

}while((n<1)||(n>m)); a=(int *)malloc(sizeof(int));

s1=1; if(a==NULL)

else {

for(i=0;ia[i]=i+1;

printf(\"程序无法继续运行......\\n\");

printf(\"原始顺序如下:\\n\");

for(i=0;i//进行(n-2+1)=(n-1)轮处理,每次把第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,

//而原来第i+1个至倒数第i个元素依次向前移动一个位置。

for(i=m;i>=2;i--)

{ if(s1==0)

s1=(s1+n-1)%i; //定位那个出圈的人的顺序号i s1=i; //若s1=0表示本测出圈的队列中的最后一个人

w=a[s1-1]; //w为出圈的那个人的真实序号,因为1-n保存在p[i-1]中 for(j=s1;j}

a[j-1]=a[j]; }

a[i-1]=w; //则将p[i]置于数组的倒数第i个位置上

printf(\"猴子出列的顺序如下:\\n\");

for(i=m-1;i>=0;i--) printf(\"%4d\ printf(\"\\n\"); }

//8、对N个候选人进行选举,现有一个N0条记录的选票数据文件in.dat,其数据存放的格式是每条记录的

长度为N,

//记录中第一位表示对第一个人的选举情况,第二位表示对第二个人的选举情况,依次类推,每一位的取值

为字符

//\"0\"或\"1\",分别表示未选中和选中,全选不选均为无效选票。请编写程序统计每个人的选票情况并输出。

#include \"stdio.h\" #include \"string.h\" #define N 10 void main(void)

{

FILE *fp; char str[N+1]; int i,count,jg[N]={0}; fp=fopen(\"in.dat\

if(fp==NULL)

printf(\"文件无法打开!\\n\");

}

else {

while(!feof(fp)) { { count=0; for(i=0;ijg[i]++;

if(strlen(str)==N)//没有不选的

//统计当前行选中的票数

fgets(str,N+1,fp);//读首行

if(countfgets(str,N+1,fp);//读下一行

} fclose(fp); for(i=0;iprintf(\"%4d\

printf(\"\\n\"); }

printf(\"各人得票结果如下:\\n\");

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务