天天看点

2016年北理复试上机题

历年北京理工大学复试上机题题目汇总:

http://blog.csdn.net/u014552756/article/details/78505845

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

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

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

struct Stu
{
    string name;
    int a[105];//各科成绩
    int n;//成绩数目
    int num;//不及格科目数
};

bool cmp(Stu a,Stu b)
{
    return a.num>b.num;
}

int main()
{
    Stu stu[105];

    int n=0,m=0;
    string str,ss[105],s[105];

    while(getline(cin,ss[m]))//读取字符串
    {
        m++;
    }

    for(int l=0; l<m; l++)
    {
        str=ss[l];

        int num=0;//成绩有几个
        int st=-1;
        int ed=-1;
        int flag=0;//是否找到名字
        for(int i=0; i<str.length(); i++)//提取名字
        {
            if(flag==0)//没开始记录名字
            {
                if(str[i]!=' ')
                {
                    st=i;
                    flag=1;
                }
            }
            else if(flag==1)
            {
                if(str[i]==' ')
                {
                    ed=i;
                    break;
                }
            }
        }
        stu[n].name=str.substr(st,ed-st);//获取名字


        flag=0;
        str[str.length()]='A';
        for(int j=ed+1; j<str.length()+1; j++)//提取每一个科目分数
        {
            if(flag==0)//还没开始记录数字
            {
                if(str[j]>='0'&&str[j]<='9')
                {
                    st=j;
                    flag=1;
                }
            }
            else if(flag==1)
            {
                if(str[j]==' '||str[j]=='A')
                {
                    ed=j;
                    int sum=0;
                    string t=str.substr(st,ed-st);
                    for(int k=0; k<t.length(); k++)
                    {
                        sum=sum*10+(t[k]-'0');
                    }
                    stu[n].a[num++]=sum;
                    flag=0;
                    st=-1;
                    ed=-1;
                }
            }
        }
        stu[n].n=num;
        n++;
    }

    for(int i=0; i<n; i++)
    {
        stu[i].num=0;
        for(int j=0; j<stu[i].n; j++)
        {
            if(stu[i].a[j]<60)
                stu[i].num++;
        }
    }

    string aa[105];
    int tt=0;//不及格科目超过2人数
    //查找不及格科目数超过2的学生
    for(int i=0; i<n; i++)
    {
        if(stu[i].num>2)
        {
            aa[tt++]=stu[i].name;
        }
    }
    if(tt>0)
    {
        cout<<"不及格科目数超过2的学生为:";
        for(int i=0; i<tt; i++)
            cout<<aa[i]<<" ";
        cout<<endl;
    }
    else if(tt==0)
        cout<<"没有不及格的学生"<<endl;

    //按照不及格科目数从大到小排序后
    sort(stu,stu+n,cmp);
    for(int i=0; i<n; i++)
        cout<<stu[i].name<<"不及格科目数"<<stu[i].num<<endl;
    return 0;
}
           
2016年北理复试上机题
2016年北理复试上机题

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

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

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

int main()
{
    string str,s[105];
    getline(cin,str);

    int i,j,k,n=0,flag=0,st=-1,dot=0;
    str[str.length()]='A';
    for(i=0; i<str.length()+1; i++)
    {
        if(flag==0)//没开始存数
        {
            if(str[i]=='.')
            {
                flag=1;
                dot=1;
                st=i;
            }
            else if(str[i]=='+'||str[i]=='-'||(str[i]>='0'&&str[i]<='9'))
            {
                flag=1;
                st=i;
            }
        }
        else if(flag==1)
        {
            if(str[i]=='.')
            {
                if(dot==1)
                {
                    s[n++]=str.substr(st,i-st);
                    flag=0;
                    dot=0;
                    st=-1;
                    i--;
                }
                else
                    dot=1;
            }
            else if(str[i]=='+'||str[i]=='-')
            {
                s[n++]=str.substr(st,i-st);
                flag=0;
                st=-1;
                dot=0;
                i--;
            }
            else if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')||str[i]==' ')
            {
                s[n++]=str.substr(st,i-st);
                flag=0;
                st=-1;
                dot=0;
            }
        }
    }

    for(i=0; i<n; i++)//处理提取出来的字符串
    {
        st=0;
        str=s[i];
        if(str[0]=='+'||str[0]=='-')//若第一个字符为符号则从第二个开始分析
        {
            cout<<str[0];
            st=1;
        }
        int t;

        for(j=st; j<str.length(); j++)//找到第一个不为0的数字或小数点
        {
            if((str[j]>='1'&&str[j]<='9')||str[j]=='.')
            {
                t=j;
                break;
            }
        }
        if(str[t]=='.')//第一个为小数点
        {
            cout<<"0.";
            for(j=str.length()-1; j>=0; j--)
                if(str[j]>='1'&&str[j]<='9')
                    break;
            for(k=t+1; k<=j; k++)
                cout<<str[k];
            cout<<endl;
        }
        else//第一个为数字1--9
        {
            for(j=str.length()-1; j>=0; j--)
                if(str[j]>='1'&&str[j]<='9')
                    break;
            for(k=t; k<=j; k++)
                cout<<str[k];
            cout<<endl;
        }
    }
    cout<<endl;

    return 0;
}
           
2016年北理复试上机题