北理计算机学院2012年机试真题

北京理工大学计算机学院复试上机题目

  由于编者水平有限,如有错误,请多多包涵。欢迎各位指正,转载请注明,谢谢合作!

1. 输入十个正整数数字 从小到大排序

输入: : 1,2,5,7,9,10,45,67,24,26

输出: : 1,2,5,7,9,10,24,26,45,67

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int data[10];
	for(int i=0;i<10;i++)
		cin>>data[i];
	sort(data,data+10);
	for(i=0;i<10;i++)
		cout<<data[i]<<" ";
	cout<<endl;

	return 0;
}

2.学生有(学号,姓名,性别,年龄),初始化三个学生的信息

( 10,wes,f,23 ) (20,ert,f,45)(30,str,t,89), 然后对学生信息进行插入和删除处理

例如:    I12,rt,f,67  表示插入12,rt,f,67

D10  表示删除学号为10的学生的信息

每次操作完成以后输出所有学生的信息按学号从大到小排序

输入: I12,rt,f,67

输出:(10,wes,f,23),(12,rt,f,67),(20,ert,f,45),(30,str,t,89)

输入:D10

输出: (12,rt,f,67),(20,ert,f,45),(30,str,t,89)

#include<iostream>
#include<string>
#include<list>
using namespace std;

class stu{
public:
	int no;
	string name;
	char sex;
	int age;
	// 重载运算符<,定义排序规则
	bool operator < (const stu & A) const{
		return no<A.no;
	}
	// 重载运算符==,定义比较规则
	bool operator == (const int & A) const{
		return no==A;
	}
	// 重载运算符<<,方便输出stu对象
	friend ostream& operator <<(ostream&,stu&);
};

ostream& operator <<(ostream& output,stu& A){
	output <<A.no<<" "<<A.name<<" "<<A.sex<<" "<<A.age;
	return output;
}

int main()
{
	list<stu> l;		// 使用链表list插入、删除比较方便
	stu temp;			// 暂存临时学生信息
	// 初始化
	temp.no=10; temp.name="wes"; temp.sex='f'; temp.age=23;
	l.insert(l.begin(),temp);
	temp.no=20; temp.name="ert"; temp.sex='f'; temp.age=45;
	l.insert(l.begin(),temp);
	temp.no=30; temp.name="str"; temp.sex='t'; temp.age=89;
	l.insert(l.begin(),temp);
	// 按学号从小到大的顺序排列
	l.sort();
	
	// 测试输出
	list<stu>::iterator i;
	for(i=l.begin();i!=l.end();i++){
		cout<<(*i)<<endl;
	}

	cout<<"输入(以空格隔开数据):";
	string m;
	while(cin>>m){
		int j=1;
		int number=0;
		// 提取学号
		while(m[j]!='\0'){
			number=(number*10)+m[j++]-'0';
		}
		// 插入数据
		if(m[0]=='I'||m[0]=='i'){
			temp.no=number;
			cin>>temp.name;
			cin>>temp.sex;
			cin>>temp.age;
			l.insert(l.begin(),temp);
		}
		// 删除数据
		else if(m[0]=='D'||m[0]=='d'){
			list<stu>::iterator i;
			for(i=l.begin();i!=l.end();i++){
				if((*i)==number){
					l.erase(i);
					break;
				}
			}
		}
		// 不合法输入
		else{
			cout<<"输入不合法!"<<endl;
			cout<<"输入(以空格隔开数据):";
			continue;
		}
		// 重新排序
		l.sort();
		// 遍历输出
		list<stu>::iterator i;
		for(i=l.begin();i!=l.end();i++)
			cout<<(*i)<<endl;
		
		cout<<"输入(以空格隔开数据):";
	}
	

	return 0;
}

3. 利用后序和中序确定前序遍历结果

示例:

输入 ( 按后序、中序) ) : CHBEDA CBHADE

输出:ABCHDE

#include<iostream>
#include<string>
using namespace std;

/**
* 后序遍历的最后一个节点,为当前树的根节点,
* 由此划分中序遍历的左右子树的所属节点
*/

string pre="";	// 前序遍历结果
string in;		// 中序遍历结果
string post;	// 后序遍历结果

void f(int lowIn,int highIn,int lowPost,int highPost){
	// 递归出口
	if(lowIn==highIn&&lowPost==highPost){
		pre+=post[highPost];
		return;
	}
	if(lowIn>=highIn||lowPost>=highPost)
		return;	
	
	int i=100;
	char temp=post[highPost];		// 当前后序遍历节点集中最后一个元素,为根节点
	pre+=temp;						// 根节点为此子树前序遍历的第一个节点
	// 找出两棵树,以temp为根节点的左子树、右子树的节点,由此划分开来
	// 找出根节点temp,在中序遍历中的位置
	for(i=lowIn;i<=highIn;i++)
		if(in[i]==temp)
			break;

	// 分析左子树
	f(lowIn,i-1,lowPost,lowPost+i-lowIn-1);
	// 分析右子树
	f(i+1,highIn,lowPost+i-lowIn,highPost-1);
	
}

int main()
{
	cout<<"输入中序遍历顺序:";
	cin>>in;
	cout<<"输入后序遍历顺序:";
	cin>>post;
	// 分析两种遍历
	f(0,in.length()-1,0,post.length()-1);
	
	// 输出结果
	cout<<pre<<endl;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值