现在的位置: 首页 > 综合 > 正文

商场家电库存模型

2014年02月21日 ⁄ 综合 ⁄ 共 5959字 ⁄ 字号 评论关闭

主要练习链表操作,插入排序。

#include <iostream>
#include <string>
#include <cstdlib>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;

void menu()
{
    system("color 5f");
    cout<<"商场家电的库存模型"<<endl<<endl;
    cout<<"1.插入"<<endl<<endl;
    cout<<"2.修改"<<endl<<endl;
    cout<<"3.删除"<<endl<<endl;
    cout<<"4.清空表"<<endl<<endl;
    cout<<"5.打表"<<endl<<endl;
    cout<<"e 退出系统"<<endl;
}

void help()
{
    system("color 5f");
    cout<<"功能介绍: "<<endl<<endl;
    cout<<"开始营业:读入文件恢复链表数据"<<endl;
    cout<<"进货:新增一个结点,如果表中有这项则累加amount,否则新建结点进行存储"<<endl;
    cout<<"进货输入的格式为 string name,string brand,double price,int amount."<<endl;
    cout<<"提货:更新或者删除某个结点,通过家电的名称和品牌来查找"<<endl;
    cout<<"提货的输入格式为:string name,string brand,int amount.(注意此时不用输入单价)"<<endl;
    cout<<"查询信息:升序顺序输出链表所有数据"<<endl;
    cout<<"营业结束: 将该链表中的数据以文件形式保存"<<endl;
    cout<<endl<<endl<<endl<<endl;
    cout<<"                                                        Created by FanTasy "<<endl;
    cout<<"                                                         2012.11.16"<<endl;
}

struct node
{
    string name;
    string brand;
    double price;
    int amount;

    node *next;
};

typedef node *list;
typedef node *position;

int isEmpty(list l);//判断链表是否为空
void makeEmpty(list l);//清空链表
list creatList();//创建链表
position end(list l);//返回链表的尾结点指针
void display(list l);//输出链表所有元素
void insert(list l,string name,string brand,double price,int amount,position p);//插入某个结点
void delet(list l,string,string);//删除某个结点
position locate(list l,string,string);//确定某个元素位置
//void sort(list l);//链表的选择升序排序
void insertsort(list l,string name,string brand,double price,int amount);//链表的插入排序

//--------------------------------对仓库模型进行操作的函数--------------------------------------------------------------------------
void jinhuo(list l)
{
    node *t=new node;
    cout<<"please input the name、brand、price and amount of goods."<<endl;
    cin>>t->name>>t->brand>>t->price>>t->amount;
    position p=l;
    while(p->next!=NULL)
    {
        //如果原来就有这样的产品累加数量即可
        if(p->next->name==t->name && p->next->brand==t->brand)
        {
            p->next->amount+=t->amount;
            break;
        }
        else
            p=p->next;
    }
    //没有这样的产品则创建一个新的结点并升序插入链表中
    if(p->next==NULL)
    {
        insertsort(l,t->name,t->brand,t->price,t->amount);
    }
    delete t;
}

void tihuo(list l)
{
    node *t=new node;
    int flag=0;
    cout<<"please input the name、brand and amount of goods."<<endl;
    cin>>t->name>>t->brand>>t->amount;
    position p=l;
    while(p->next!=NULL)
    {
        //如果原来就有这样的产品累加数量即可
        if(p->next->name==t->name && p->next->brand==t->brand)
        {
            p->next->amount-=t->amount;
            if(p->next->amount<=0)
            {
                delet(l,t->name,t->brand);
                flag=1;
            }
            break;
        }
        else
            p=p->next;
    }
    if(p->next==NULL &&flag==0)
    {
        cout<<"there is not such goods that you want."<<endl;
    }
    delete t;
}


//开始营业(读取文件)
void readfile(list l)
{
    cout<<"请输入完整的路径名文件名:"<<endl;
    char wenjianming[200];
    cin.getline(wenjianming,200);
    //路径名两边" "处理
    int i=0;
    int len=strlen(wenjianming);
    if(wenjianming[0]=='"')
    {
        for(i=0;i<len-1;i++)
        {
            wenjianming[i]=wenjianming[i+1];
        }
        wenjianming[len]='0';
    }
    fstream input(wenjianming, ios::in);
    node *t=new node;
    while(1)
    {
        input>>t->name>>t->brand>>t->price>>t->amount;
        insertsort(l,t->name,t->brand,t->price,t->amount);
        if(input.eof())
            break;
    }
    input.close();
    delete t;
}

//结束营业(保存文件)
void savefile(list l)
{
    system("cls");
    cout<<"请输出要存的位置:  "<<endl;
    char weizhi[200];
    cin.getline(weizhi,200);
    //路径名两边" "处理
    int i=0;
    int len=strlen(weizhi);
    if(weizhi[0]=='"')
    {
        for(i=0;i<len-1;i++)
        {
            weizhi[i]=weizhi[i+1];
        }
        weizhi[len]='0';
    }
    fstream output(weizhi,ios::out);
    position p=l->next;

    while(p->next!=NULL)
    {
        output<<left<<setw(14)<<p->name<<setw(11)<<p->brand<<setw(10)<<p->price<<setw(6)<<p->amount<<endl;
        p=p->next;
    }
    output.close();
}
//---------------------------------------------------------------------------------------------------------------
int main()
{
    //创建仓库表
    list storage=creatList();
    //node *t=new node;
    while(1)
    {
        system("cls");
        menu();
        char a=getch();
        switch(a)
        {
        case '1':
        {
            system("cls");
            readfile(storage);
            system("pause");
            break;
        }
        case '2':
        {
            system("cls");
            display(storage);
            jinhuo(storage);
            //display(storage);
            system("pause");
            break;
        }
        case '3':
        {
            system("cls");
            display(storage);
            tihuo(storage);
            system("pause");
            break;
        }
        case '4':
        {
            system("cls");
            display(storage);
            system("pause");
            break;
        }
        case '5':
        {
            system("cls");
            savefile(storage);
            system("pause");
            break;
        }
        case 'h':
        {
            system("cls");
            help();
            system("pause");
            break;
        }
        case 'e':
        {
            cout<<"thanks for using."<<endl;
            system("pause");
            goto end;
        }
        default:
        {
            system("cls");
            cout<<"false commond!"<<endl;
            system("pause");
        }
        }
    }
end:
    return 0;
}


//-----------------------------------------链表的实现----------------------------------------------------
//判断链表是否为空
int isEmpty(list l)
{
    return l->next==NULL;
}

//清空链表
void makeEmpty(list l)
{
    position p=end(l);
    while(p!=l)
    {
        delet(l,p->name,p->brand);
        p=end(l);
    }
}

//创建链表(不使用头结点)
list creatList()
{
    list l=new node;
    l->next=NULL;
    return l;
}

//返回指向l中最后一个结点的指针
position end(list l)
{
    //q初值为头结点
    position q=l;
    while(q->next!=NULL)
        q=q->next;
    return q;
}

//输出链表中的元素
void display(list l)
{
    cout<<"名称          品牌       单价      数量"<<endl;
    if(l->next==NULL)
    {
        cout<<"list is empty."<<endl;
        return;
    }
    else
    {
        position q=l;
        while(q->next!=NULL)
        {
            q=q->next;
            cout<<left<<setw(14)<<q->name<<setw(11)<<q->brand<<setw(10)<<q->price<<setw(6)<<q->amount<<endl;
        }
    }
}

//头插尾插中间插都行
void insert(list l,string name,string brand,double price,int amount,position p)
{
    position temp;
    temp = p->next;
    p->next=new node;
    p->next->name=name;
    p->next->brand=brand;
    p->next->price=price;
    p->next->amount=amount;
    p->next->next=temp;
}
//删除结点
void delet(list l,string name,string brand)
{
    position q;
    if(locate(l,name,brand)==NULL)
        return;
    else
        q=locate(l,name,brand);
    position p;
    for(p=l; p->next!=q && p->next!=NULL; p=p->next)
    {

    }
    if(p->next==q)
    {
        p->next=q->next;
        cout<<"delete "<<name<<"  "<<brand<<" successfully."<<endl;
        delete q;
    }
    else
    {
        cout<<"can' find the element."<<endl;
    }
}
//返回结点位置
position locate(list l,string name,string brand)
{
    position p;
    p=l;
    while(p->next!=NULL)
    {
        if(p->next->name==name && p->next->brand==brand)
            return p->next;
        else
            p=p->next;
    }
    cout<<"can't find the node."<<endl;
    return NULL;
}
/*
void sort(list l)//链表的选择排序
{
    position p,q,h;
    h=l;
    if(l->next==NULL)
    {
        cout<<"list is empty"<<endl;
        return;
    }
    //选择排序
    for(p=l->next;p->next->next!=NULL;p=p->next,h=h->next)
    {
        for(q=p->next;q->next!=NULL;q=q->next)
        {

            if(p->data>q->data)
            {
                p->next=q->next;
                q->next=p;
                h->next=q;
            }
        }
    }
}*/
//按升序插入
void insertsort(list l,string name,string brand,double price,int amount)
{
    position p=l->next;
    position q=l;
    while(p!=NULL)
    {
        //以单价的升序插入
        if(p->price>price && p==l->next)
        {
            insert(l,name,brand,price,amount,l);
            return;
        }
        else if(p->price>price)
        {
            insert(l,name,brand,price,amount,q);
            return;
        }
        else
            {
                p=p->next;
                q=q->next;
            }
    }
    insert(l,name,brand,price,amount,end(l));
}

 

抱歉!评论已关闭.