北航计算机机试2017

1.查找中位数
先输入一个整形数字N,接着输入N个无序的数字。要求输出升序排列后的中位数,以及该中位数输入的次序。如果N为偶数,则输出有二个中位数,如果N为奇数,输出最中间的数即可。

样例1:
输入:5
9 2 7 1 6
输出:6 5
样例2:
输入:6
9 6 7 1 2 3
输出:3 6
6 2

#include<stdio.h>
#include<algorithm>
using namespace std;
struct num{//结构体
	int value;
	int index;
}a[200];
bool cmp(num a,num b){//cmp函数
	if(a.value<=b.value)return 1;
	else return 0;
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%d",&a[i].value);
			a[i].index=i+1;
		}
		sort(a,a+n,cmp);//使用排序函数
		int m=n/2;
		if(n%2==0){//偶数
			printf("%d %d\n",a[m-1].value,a[m-1].index);
			printf("%d %d\n",a[m].value,a[m].index);
		}
		else printf("%d %d\n",a[m].value,a[m].index);
	}
return 0;
}
//当不使用sort函数,自己写排序函数
#include<stdio.h>
struct num{
	int value;
	int index;
}a[200];
void sort(int n){
	for(int i=0;i<n;i++){//冒泡
		for(int j=0;j<n-i-1;j++){
			num temp;
			if(a[j].value>a[j+1].value){
				temp=a[j+1];
				a[j+1]=a[j];
				a[j]=temp;		
			}		
		}	
	}
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%d",&a[i].value);
			a[i].index=i+1;
		}
		//sort(a,a+n,cmp);
		sort(n);
		int m=n/2;
		if(n%2==0){//偶数
			printf("%d %d\n",a[m-1].value,a[m-1].index);
			printf("%d %d\n",a[m].value,a[m].index);
		}
		else printf("%d %d\n",a[m].value,a[m].index);
	}
return 0;
}

2.词法分析,查找未定义变量
输入两个C语言语句,第一句为正常的C语言变量定义语句,符合C语言语法要求,变量间可以有多个空格,包含数组,指针定义等。第二句为变量运算语句,要求输出第二个C语言语句中未定义的变量。
样例:
输入:
int x12, y=1, num_stu=89, a[30], p; int x12, y=1;
Sum=num+x12
y;
输出:
Sum num

3.找家谱成员
输入若干行,每一行的第一个输入为家谱中的某成员,该行接着输入的信息为每个孩子姓名。最后一行的输入为要求查找的两个家谱成员的关系。要求:根据输入的家谱成员信息,建立二叉树家谱关系图,并输出二位待查找成员在家谱中的关系,包括输出他们最邻近的共同祖先以及在家谱中相差的层次数。

样例:

输入:

YE SHU MEI

SHU GE MEI1

BA SELF MEI2

GE SON1 SON2

SON2 MEI1

输出:

SHU 1

//代码是参考别人的,也有不严谨的地方
#include<stdio.h>
#include<string.h>
const int namesize=20;


 struct treenode{
	char name[namesize];
	char parent[namesize];
	int gradation;
	treenode* leftchild;
	treenode* rightchild;
};
 treenode* findtreenode(treenode* root,char parent[]);
int getname(char str[],char parent[],char leftc[],char rightc[] ){
	int len=strlen(str);
	int index=0;
	int flag=0;//标记输入的格式,输入了两个还是三个名字。
	for(int i=0;i<len;){
		while(str[i]==' ') i++;
		while(str[i]!=' ')
			parent[index++]=str[i++];
		parent[index]='\0';//勿忘!
		
		while(str[i]==' ') i++;
		index=0;
		while(str[i]!=' '&&i<len)
			leftc[index++]=str[i++];
		leftc[index]='\0';
		
		while(str[i]==' ') i++;
		index=0;
		while(str[i]!=' '&&i<len){
			rightc[index++]=str[i++];
			flag=1;
		}
		rightc[index]='\0';
		while(str[i]==' ') i++;
	}
	return flag;	
}

treenode* addtreenode(treenode* root,char parent[],char leftc[],char rightc[]){
	if(root==NULL){//根节点
		root=new treenode;
		strcpy(root->name,parent);
		root->parent[0]='\0';
		root->gradation=0;
		root->leftchild=NULL;
		root->rightchild=NULL;	
	}
	
	treenode* temp=findtreenode(root,parent);//调用函数,根据结点双亲名寻找结点temp;
	
	treenode *lc=new treenode;//创建左孩子
	strcpy(lc->name,leftc);
	strcpy(lc->parent,parent);
	lc->gradation=temp->gradation+1;//父节点的层数+1
	lc->leftchild=NULL;
	lc->rightchild=NULL;

	treenode *rc=new treenode;//创建右孩子
	strcpy(rc->name,rightc);
	strcpy(rc->parent,parent);
	rc->gradation=temp->gradation+1;
	rc->leftchild=NULL;
	rc->rightchild=NULL;

	temp->leftchild=lc;//连接
	temp->rightchild=rc;

	return root;//返回根节点	
}

treenode* findtreenode(treenode* root,char parent[]){
	if(root==NULL) return NULL;
	if(strcmp((root->name),parent)==0) return root;
	else{
		treenode* result =findtreenode(root->leftchild,parent);
		if(result==NULL) 
			result=findtreenode(root->rightchild,parent);
		return result;
	}
}
void findrelation(treenode* root,char person1[],char person2[]){
	treenode* position1=findtreenode(root,person1);
	treenode* position2=findtreenode(root,person2);
	treenode* min,*max;
	if(position1->gradation>position2->gradation){//第一个位置的深度大
		min=position1;max=position2;}
	else {
		min=position2;max=position1;
	}
	int level=min->gradation-max->gradation;//层数差
	while(min->gradation>max->gradation){//层数高的晚辈向上爬,直到层数相同
		char parent[namesize];
		strcpy(parent,min->parent);
		min=findtreenode(root,parent);		
	}
	while(strcmp(min->parent,max->parent)!=0){
		char parent[namesize];
		strcpy(parent,min->parent);
		min=findtreenode(root,parent);//寻找根节点
		strcpy(parent,max->parent);
		max=findtreenode(root,parent);
	}
	if(min->gradation==0)
		printf("没有共同祖先");
	else
		printf("%s %d\n",min->parent,level);
}
int main(){
treenode* root=NULL;
char parent[namesize],leftc[namesize],rightc[namesize];
	char str[namesize*3];//存放一行字符串
while(gets(str)!=0){
	parent[0]=leftc[0]=rightc[0]='\0';
	int flag;
	flag=getname(str,parent,leftc,rightc);//调用函数
	if(flag==1)
		root=addtreenode(root,parent,leftc,rightc);//调用函数向树中添加结点
	if(flag==0){//输出关系
		findrelation(root,parent,leftc);	
	}
}

return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值