内蒙古大学892程序设计与数据结构-2017年真题解析(C语言版)

文章提供了内蒙古大学892科目2016年至2022年的程序设计与数据结构考试真题的C语言版解析,包括程序设计问题如找最大值、计算最大公约数和最小公倍数、输出素数等,以及数据结构相关问题如二叉树遍历、最小生成树、散列表构建和查找效率、有向图的遍历和邻接矩阵等。
摘要由CSDN通过智能技术生成

系列文章目录

内蒙古大学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分)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_考不上研究生不改名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值