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

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

一、程序设计(本大题9小题,每小题10分,共90分),程序设计语言可选用C、C++或Java。

1、设计函数,输入两个身份证号码,比较两人的年龄大小,前者比后者大则输出-1,后者比前者大则输出1,两人一样大则输出0。

#include "stdio.h"
int compare(char str1[],char str2[])
{
	for(int i=6;i<14;i++)
	{
		if(str1[i]<str2[i])
			return -1;
		else if(str1[i]>str2[i])
			return 1;
	}
	return 0;
}
void main()
{
	char str1[20],str2[20];
	gets(str1);gets(str2);
	printf("%d\n",compare(str1,str2));
}

2、输入一整数数列,计算-an12+an22-an32+an42…并输出该结果。

#include "stdio.h"
#define N 5
int fun(int arr[],int n)
{
	int sum=0;
	int flag=-1;
	for(int i=0;i<5;i++)
	{
		sum+=flag*arr[i]*arr[i];
		flag=-flag;
	}
	return sum;
}
void main()
{
	int arr[10];
	for(int i=0;i<N;i++)
		scanf("%d",&arr[i]);
	printf("%d\n",fun(arr,N));
}

3、将一整数数列中连续数字的最后一位改为该连续数字个数的负数,其余元素保持不变,输出转换后的结果。
【例如】输入:1,3,1,3,3,3,3,1,1,1,1   输出:1,3,1,3,3,3,-4,1,1,1,-4
【数字3连续出现了4次,则最后一个3改为-4,数字1也连续出现4次,则最后一个1改为-4。】

#include "stdio.h"
void fun(int arr[],int n)
{
	int flag=1;
	for(int i=0;i<n;i++)
	{
		if(i==n-1)
		{
			if(flag!=1)
				printf("%d",-flag);
			else
				printf("%d",arr[i]);
			break;
		}
		if(arr[i]==arr[i+1])
		{
			flag++;
			printf("%d ",arr[i]);
		}
		else
		{
			printf("%d ",flag==1?arr[i]:-flag);
			flag=1;
		}
	}
}
void main()
{
	int arr[11]={1,3,1,3,3,3,3,1,1,1,1};
	fun(arr,11);
}

4、输入整数n,输出n是2的几次方,向上取整。
【例如】输入:2049  输出:12

#include "stdio.h"
#include "math.h"
int fun(int n)
{
	int i=0;
	while(n>pow(2.0,i))
		i++;
	return i;
}
void main()
{
	int n;
	scanf("%d",&n);
	printf("%d",fun(n));
}

5、给出标准差公式,设计程序输入一维数组,求其标准差值。

#include <stdio.h>
#include <math.h>
#define N 5
double mean(double a[128],double len)
{
	double sum=0;
	double mean=0;
	for(int i=0;i<len;i++)
		sum += a[i];
	mean=sum/len;
	return mean;
}
double std_c(double a[128],double len)
{
	double mean_std;
	mean_std=mean(a,len);
	double temp=0;
	double spow=0;
	for (int i=0;i<len;i++)
	{
		spow+=(a[i]-mean_std)*(a[i]-mean_std);//平方累加
	}
	return sqrt(spow/(len-1));
}
void main()
{
	double a[N];
	for(int i=0;i<N;i++)
		scanf("%lf",&a[i]);
	printf("%lf",std_c(a,N));
}

6、给定一时间戳,从1970年开始计算,输出该时间戳对应的格式化日期时间,考虑闰年不考虑闰秒。

#include "stdio.h"
#include "math.h"
#include "time.h"
int isleap(int year)
{
	return year%4==0&&year%100!=0||year%400==0;
}
int sumDay(int timecount)
{//计算该时间戳是多少天
	return timecount/(3600*24)+1;
}
int YearMonDay(int n)
{//计算n天是几几年几月几日
	int year,mon,day;
	for(year=1970;n>=366;year++)
	{
		if(isleap(year))
			n-=366;
		else
			n-=365;
	}
	int a[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年
	int b[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
	if(isleap(year))
	{
		for(int i=0;i<12&&n>a[i];i++)
		{
			n-=a[i];
			mon=i+1;
		}
	}
	else
		for(int i=0;i<12&&n>a[i];i++)
		{
			n-=b[i];
			mon=i+1;
		}
	mon++;
	day=n;
	printf("%d-%d-%d\n",year,mon,day);
	return 1;
}
void main()
{
	int timecount=1664100697;//2022-09-25 18:11:37
	YearMonDay(sumDay(timecount));
}

  另外三道程序设计题目我这里没有资源,如果大家手里有题目或者其他任何问题,欢迎大家私信我,我一定会努力为大家解答,大家共同进步!祝各位一战成硕!

二、数据结构 (本大题6小题,每小题10分,共60分)

1、给定一组序列其中包括两个重复的数字
(1) 画出初始 大根堆,并统计调整次数,求出WPL;
(2) 画出初始小根堆,并统计调整次数,求出WPL。
2、给出AOV网
(1)根据迪杰斯特拉算法的顺序,写出起点到各结点的最短路径,并求出最短路径长度;
(2判断给出的AOV网中是否包含环路,并给出理由。
3、给定一张有向图画出带有出度的领接表的存储结构。
4、给出森林的先根和后根遍历顺序,画出该森林转化后的二叉树。
5、给定一个结构体定义,并假设只有头结点的单链表已存在,用C/C++写出从小到大排列的冒泡排序算法。
6、无

你可能感兴趣的:(c语言,数据结构,算法)