系列文章目录
内蒙古大学892程序设计与数据结构-2022年真题(回忆版)解析(C语言版)
内蒙古大学892程序设计与数据结构-2021年真题(回忆版)解析(C语言版)
内蒙古大学892程序设计与数据结构-2020年真题(回忆版)解析(C语言版)
内蒙古大学892程序设计与数据结构-2019年真题解析(C语言版)
内蒙古大学892程序设计与数据结构-2018年真题解析(C语言版)
内蒙古大学892程序设计与数据结构-2017年真题解析(C语言版)
内蒙古大学892程序设计与数据结构-2016年真题解析(C语言版)
内蒙古大学892程序设计与数据结构-2017年真题解析(C语言版)
一、程序设计(本大题9小题,每小题10分,共90分),程序设计语言可选用C、C++或Java。
1、编写一个程序,输入a、b、c三个值,输出其中最大值。(10分)
#include <stdio.h>
void main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
printf("%f\n",a>b?(a>c?a:c):(b>c?b:c));
}
2、编写一个程序,输入m与n两个整数,计算并输出m 与n的绝对值的最大公约数及最小公倍数。(10分)
#include <stdio.h>
#include <math.h>
void main()
{
int m,n,r,gys,gbs;
scanf("%d%d",&m,&n);
m=abs(m);
n=abs(n);
gbs=m*n;
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
gys=n;
gbs=gbs/gys;
printf("%d %d\n",gys,gbs);
}
3、编写一个程序,输入自然数a和 b,输出a和 b之间的素数。(10分)
#include <stdio.h>
void main()
{
int a,b,i,t;
scanf("%d%d",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
while(a<b)
{
for(i=2;i<=a/2;i++)
if(a%i==0)
break;
if(i>a/2)
printf("%d\n",a);
a++;
}
}
4、有一分数序列:2/1、3/2、5/3、8/5、13/8、21/13…请编写程序,根据用户的输入N,求出这个数列的前N项之和。(10分)
#include <stdio.h>
void main()
{
float m=1,n=1,num=0;
int i,N;
scanf("%d",&N);
for(i=0;i<N;i++)
{
m=m+n;
n=m-n;
num+=m/n;
}
printf("%f\n",num);
}
5、定义一个计算字符串有效长度的函数int MyStrlen(char * str),其功能是统计字符串中的英文字符的个数。(10分)
#include <stdio.h>
int MyStrlen(char *str)
{
int num=0;
while(*str!='\0')
{
if(*str>='a'&&*str<='z'||*str>='A'&&*str<='Z')
num++;
str++;
}
return num;
}
void main()
{
char *str="I Love You!";
printf("%d",MyStrlen(str));
}
6、编写一个采用递归方式实现的程序,其功能是对输入的一个以“.”结束的字符串,进行反序输出。(10分)
#include <stdio.h>
void reverse(char *p)
{
if(*p!='.')
reverse(p+1);
putchar(*p);
}
void main()
{
reverse("ABCDE.");
}
7、学者A去国外求学,假定离开祖国的日子为公元A年B月C日,返回的日子为公元X年Y月Z日。请计算A出国求学的总天数(含离开和返回当天)。(10分)
#include <stdio.h>
int isleap(int y)
{ //闰年返回1 平年返回0
return (y%4==0&&y%100!=0||y%400==0);
}
int YearNum(int A,int X)
{ //该函数计算A年1月1日 至 X年1月1日总天数
int num=0;
for(int i=A;i<X;i++)
{
if(isleap(i))
num+=366;
else
num+=365;
}
return num;
}
int MonNum(int A,int B,int C)
{ //该函数计算A年1月1日至A年B月C日的总天数
int num=0;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
for(int i=1;i<B;i++)
num+=mon[i];
if(isleap(A))
num++;
return num+C;
}
void main()
{
int A,B,C;
int X,Y,Z;
scanf("%d %d %d",&A,&B,&C);
scanf("%d %d %d",&X,&Y,&Z);
int num1=0,num2=0;
//num1中记录A年1月1日至A年B月C日总天数
num1=MonNum(A,B,C)-1;
//num2中记录A年1月1日至X年Y月Z日总天数
num2=YearNum(A,X)+MonNum(X,Y,Z);
printf("%d\n",num2-num1);//两个天数相减即为相隔天数
}
8、输入两个有序数列,设计算法将二者合并成一个有序数列。(10分)
#include <stdio.h>
#define N 5
void input(int arr[])
{
for(int i=0;i<N;i++)
scanf("%d",&arr[i]);
}
void main()
{
int arr1[N],arr2[N],arr[2*N];
int i,j,k;
input(arr1);
input(arr2);
for(i=0,j=0,k=0;i<N&&j<N;)
{
if(arr1[i]<arr2[j])
{
arr[k]=arr1[i];
k++,i++;
}
else
{
arr[k]=arr2[j];
k++,j++;
}
}
while(i<N)
arr[k++]=arr1[i++];
while(j<N)
arr[k++]=arr2[j++];
for(int i=0;i<2*N;i++)
printf("%d ",arr[i]);
}
9、有n人围成一圈,顺序排号。现从第i个人开始,由1至k不断报数,凡报到k的人出列。重复报数的过程,直到所有人都出列为止。请编写程序模拟这n个人出列的顺序。(10分)
#include <stdio.h>
void BS(int n,int i,int k)
{
int temp[10]={0}; //记录出队情况 未出队:0 出队:1
int count=0; //记录报数情况
int j=0;
int num=n;
while(num!=0)
{
if(temp[j]==0)
{
if(++count==k)
{
printf("%d ",j+1);
count=0;
temp[j]=1;
num--;
}
}
j=(j+1)%n;
}
}
void main()
{
BS(5,1,2);
}
二、数据结构 (本大题6小题,每小题10分,共60分)
1、已知某二叉树前序遍历的结点序列为ABDFCEG,中序遍历的结点序列为DFBACGE,请完成以下两项任务:
(1)画出该二叉树的示意图;
(2)给出该二又树后序遍历的结点序列。
(10分)
2、假设有如下图所示的无向连通网。请使用Kruskal算法获得该无向连通网的最小生成树,写出Kruskal算法依次挑选出的边及权值,格式如下: 顶点编号-顶点编号: 权值(例如: 2: 27)。(10分)
3、关键码集合为{15,7,22,18,3,11,26,16,24、29},散列表表长为13,散列函数为H(key)=key mod 13,用线性探测法处理冲突,请按照关键码的给定次序,在如下散列表中填入相应关键码,并计算查找成功情况下,这组关键码的平均查找长度(ASL)。(10分)
4、给定如下所示有向图,请完成以下四项任务:
(1)给出该有向图的邻接表;
(2)给出该有向图的邻接矩阵;
(3)从顶点1开始,给出该有向图所有可能的深度优先遍历序列;
(4)从顶点1开始,给出该有向图所有可能的广度优先遍历列。
(10分)
5、设待排序数据表T=(90,50,80,70,12,44,120,66,88,135)。如果从小到大排序这组数据,请完成以下两项任务:
(1)若相邻元素的比较次序是从前往后依次进行的,给出冒泡排序算法第一趟排序后的结果;
(2)如果以第一个数据90作为基准点,给出快速排序算法第一次划分后的结果。
(10分)
6、设有如下AOE(边表示活动)网络,请填写以下两个表格,并写出该AOE网络中所有关键活动。(10分)