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

  • Post author:
  • Post category:其他


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

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

1.输入学生信息,姓名 成绩(成绩的数目不一定)

输出每个学生的姓名和平均成绩,按不及格课程数从大到小排好序输出,以及不及格课程数超过2的学生。

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

struct stu{
	string name;
	int score[100];
	int number;
	double avg;
	int unum;
};

// 定义学生按不及格科目数量的排序规则 
bool cmp(stu x,stu y){
	return x.unum>y.unum;
} 

int main()
{
	string str[100];	// 记录原始输入情况
	int n=0;			// 用于记录学生的数量
	// 读取原始数据
	while(getline(cin,str[n++]));
	n--;
	// 整理数据
	stu s[100];
	for(int i=0;i<n;i++){
		int j=0;
		// 提取姓名
		while(str[i][j]!=' '&&str[i][j]!='\0')
			s[i].name+=str[i][j++];
		// 提取成绩
		int count=0;		// 记录成绩的数量
		while(str[i][j]!='\0'){
			int temp=0;		// 存储局部成绩
			while(str[i][++j]!=' '&&str[i][j]!='\0'){
				temp=temp*10+(str[i][j]-'0');
			}
			s[i].score[count++]=temp;
		}
		s[i].number=count;	// 记录每个学生的成绩数量
	}

	/*// 测试数据的输入及处理正确性 
	for(int i=0;i<n;i++){
		cout<<s[i].name<<": ";
		int t=0;
		while(t<s[i].number)
			cout<<s[i].score[t++]<<" ";
		cout<<s[i].number;
		cout<<endl;
	}*/
	
	// 计算学生的平均成绩及不及格科目数量 
	for(int i=0;i<n;i++){
		int t=0,	// 科目游标 
		sum=0,		// 局部总成绩 
		u=0;		// 不及格科目数量 
		while(t<s[i].number){
			if(s[i].score[t]<60)
				u++; 
			sum+=s[i].score[t++];
		}
		s[i].avg=sum/(s[i].number*1.0);
		s[i].unum=u; 
	}
	
	// 按照不及格成成数量从大到小排序
	sort(s,s+n,cmp); 
	
	// 按照不及格成绩数量从大到小输出学生信息 
	for(int i=0;i<n;i++){
		cout<<s[i].name<<": "<<s[i].avg<<endl;
	}
	
	// 输出不及格成绩超过两门的学生姓名 
	cout<<"不及格成绩超过两门的学生姓名为:"<<endl;
	bool f=true;		// 用于记录无不及格成绩超过两门的学生的情况 
	for(int i=0;i<n;i++){
		if(s[i].unum>2){
			f=false;
			cout<<s[i].name<<" ";
		}		
	}
	if(f)
		cout<<"无不及格成绩超过两门的学生!"; 
	cout<<endl;
	
	return 0;
}

2.输入字符串,输出字符串中包含的数字,比如2.3ABC0-2.3  输出 2.3 0 -2.3。

注意一些特殊的情况如+004.500值为+4.5。

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

void f(int &op,string &temp,int &t){
	if(temp==""){
		if(t==1)
			cout<<0<<" ";
		op=0;
		t=0;
		return;
	}
	// 之前有有效数字
	if(op==1){
		cout<<"+"<<temp<<" ";
	}
	else if(op==-1){
		cout<<"-"<<temp<<" ";
	}
	else
		cout<<temp<<" ";
	temp="";
	op=0;
	t=0;
}

int main(){
	string str[100];
	int n=0,k=0;
	while(getline(cin,str[n++]));
	n--;

	while(k<n){
		int i=0;			// 字符串游标
		int op=0;			// 存储运算符
		string temp="";		// 存储临时数值
		string zero="";		// 存储连续的0
		int flag=0;			// 记录是否是小数部分
		int t=0;			// 记录是否有全0的特殊情况
		while(str[k][i]!='\0'){
			// 如果不是数字元素,直接忽略。
			if((str[k][i]>='0'&&str[k][i]<='9')||str[k][i]=='+'||str[k][i]=='-'||str[k][i]=='.'){
				/*
				* 第一部分处理数字中的特殊符号。
				*/
				if(str[k][i]=='+'){
					// 输出之前的数值
					f(op,temp,t);
					flag=0;
					zero="";
					op=1;
				}
				else if(str[k][i]=='-'){
					// 输出之前的数值
					f(op,temp,t);
					flag=0;
					zero="";
					op=-1;
				}
				else if(str[k][i]=='.'){
					// 处理+.123的特殊情况
					if(temp=="")
						op=0;
					// 有多余的小数点
					if(flag==1){
						f(op,temp,t);
						flag=0;
						zero="";
					}
					// 有效的小数点
					if(temp!=""){
						// 标记一下,之后到达了小数部分。小数点不知道是否有效,先暂存。
						flag=1;
					}
					if(temp==""&&t==1){
						temp+='0';
						flag=1;
					}
				}
				/*
				* 第二部分处理纯数字。
				*/
				else{
					// 首部的无效0
					if(temp==""&&str[k][i]=='0')
						t=1;
					// 小数点之后
					else if(flag){
						// 小数部分的0,不知道是否有效,先暂存
						if(str[k][i]=='0'){
							zero+='0';
						}
						// 小数点之后第一位非零数
						else if(flag==1){
							// 把之前暂存的小数点,0都加上
							temp+='.';
							temp+=zero;
							zero="";
							temp+=str[k][i];
							flag++;
						}
						// 小数点之后多位
						else{
							temp+=zero;
							zero="";
							temp+=str[k][i];
						}
					}
					// 整数部分
					else{
						temp+=str[k][i];
					}
				}
			}
			// 非字符忽略,并输出其前面的数字
			else{
				f(op,temp,t);
				flag=0;
				zero="";
			}
			// 向后检索
			i++;
		}
		// 输出最后一个数
		f(op,temp,t);
		// 处理下一个字符串
		k++;
		cout<<endl;
	}
	

	return 0;
}

测试用例及运行结果:




版权声明:本文为The_Wind_Rises原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。