(向量练习)c++建立一个动态可扩充的向量完成成绩或者身高管理系统

利用向量将常规的数组动态化,也就是可以自行扩充。内有插入排序函数和二分查找返回秩。

#include <iostream>
using namespace std;
class Vector
{
private:
    int *elem;
    int _size;
    int capcity;
public:
    Vector();
    void expand();
    void inserthei(int &e);
    int insertsort();
    void removehei(int &x);
    int doublefind(int &x);
    int ifexist(int &x);
    int getsize();
};
Vector::Vector()
{
    capcity=3;
    elem = new (int)(capcity);
    _size=0;
}
void Vector::expand()
{
    if(_size==capcity)
    {
        int *oldelem=elem;
        capcity=capcity*2;
        elem=new (int)(capcity);
        for(int i=0; i<_size; i++)
        {
            elem[i]=oldelem[i];
        }
        delete oldelem;
    }
}
void Vector::inserthei(int &e)
{
    elem[_size]=e;
    _size++;
}
int Vector::insertsort()
{
    int m=_size-1;
    int n=_size-2;
    while(n-->=0)
    {
        if(elem[n]>elem[m])
        {
            swap(elem[n],elem[m]);
            m=n;
        }
        else
        {
            break;
        }
    }
    return m;
}
void Vector::removehei(int &x)
{
    int n;
    if(ifexist(x)==1)
    {
        n=doublefind(x);
    }
    for(n=x; n<_size; n++)
    {
        elem[n]=elem[n+1];
    }
    _size--;
}
int Vector::doublefind(int &x)
{
    if(x<elem[0])
    {
        return _size+1;
    }
    else
    {
        int lo=0;
        int hi=_size;
        while(hi-lo>1)
        {
            int mid=(lo+hi)/2;
            if(x<elem[mid])
            {
                hi=mid;
            }
            else
            {
                lo=mid+1;
            }
        }
        return _size-lo;
    }
}
int Vector::ifexist(int &x)
{
    if(elem[doublefind(x)]==x)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int Vector::getsize()
{
    return _size;
}
void cininformation(Vector *V)
{
    int x;
    cin>>x;
    V->inserthei(x);
    V->insertsort();
}
void menuhead()
{
    cout<<"\t欢迎使用红太阳幼儿园身高系统\n";
    cout<<"\t---------------------------------\n";
    cout<<"\t按1插入小朋友身高\n";
    cout<<"\t按2删除指定小朋友身高\n";
    cout<<"\t按3查询小朋友身高所处位置\n";
    cout<<"\t按0退出系统\n";
    cout<<"\t---------------------------------\n";
}
void menu(Vector *v)
{
    int a,n;
    cout<<"请输入所需服务:";
    cin>>a;
    while(a)
    {
        switch(a)
        {
        case 1:
            cout<<"请输入小朋友身高:";
            cininformation(v);
            cout<<"输入成功"<<endl;
            break;
        case 2:
            cout<<"请输入删除的小朋友身高:";//一次删除一个
            cin>>n;
            v->removehei(n);
            cout<<"删除成功"<<endl;
            break;
        case 3:
            cout<<"请输入查询小朋友身高(返回的是小朋友在不大于前面的身高情况下最靠前的位置):";
            cin>>n;
            cout<<v->doublefind(n)<<endl;
            break;
        default:
            cout<<"输入错误"<<endl;
        }
        cout<<"目前系统中共有"<<v->getsize()<<"名小朋友的身高"<<endl;
        cout<<"请输入所需服务:";
        cin>>a;
    }
}
int main()
{
    Vector *v=new Vector();
    menuhead();
    menu(v);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值