C++购书系统问题测试&功能补充

Posted Marisa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++购书系统问题测试&功能补充相关的知识,希望对你有一定的参考价值。

代码来源:舍友大一的C++作业
【代码存在的问题】

在菜单界面选择对应序号时,若输入值非数字,而是字母等其它符号,会导致程序陷入循环,无法正常进入功能的下一步

 

 

 

 

 原代码展示:

int main() 

    system("color 8E");
    int k,i,choose,orderflag=1;
    double t_sum;
    book* head = new book;
    trolley* head2 = new trolley;
    layfolk* l_head = new layfolk;
    member* m_head = new member;
    honoured_guest* h_head = new honoured_guest;
    historyorder* o_head = new historyorder;
    
    head->Loaddata(head);
    l_head->loaddata(l_head);
    m_head->loaddata(m_head);
    h_head->loaddata(h_head); 
    string ch;
    while (1)
    
        system("color 8E");
        system("cls");
        printf("\\n\\n\\n");
        printf("\\t\\t\\t\\t+-----------TouhouBookStore-----------+\\n");
        printf("\\t\\t\\t\\t|--------------东方铃奈庵-------------|\\n");
        printf("\\t\\t\\t\\t+-------------网上购书系统------------+\\n");
        printf("\\t\\t\\t\\t+-------------------------------------+\\n");
        printf("\\t\\t\\t\\t|\\t1 查看历史订单\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t2 查看个人会员信息\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t3 查看店内书籍\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t4 搜索店内书籍\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t5 购买书籍\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t6 结算\\t\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t7 退出\\t\\t\\t      |\\n");
        printf("\\t\\t\\t\\t+-------------------------------------+\\n");
        printf("\\n\\n\\n");
        printf("\\t\\t\\t\\t请输入你想实现的功能前的代号:\\n");
        printf("\\t\\t\\t\\t");

        cin >> k;
switch(k)
        
    case 1:
             
               cout<<"您的身份是:"<<endl;
            cout<<"1)会员\\t2)贵宾\\t3)普通顾客"<<endl;
            cin>>choose;
    
            switch(choose)
              
                case 1:
                    
                        o_head->m_display(head2,m_head);break;
                    
            
                case 2:
                    
                        o_head->h_display(head2,h_head);break;
                    
            
                case 3:
                   
                     o_head->l_display(head2,l_head);break;
                 
                
                default:break;
               
               
               
               break;
             
            
    case 2:
                
                    system("cls");
                    cout<<"\\n请选择您的会员身份:\\n"<<endl;
                    cout<<"1.我是会员\\t2.我是贵宾\\t3.我是普通顾客\\n\\n";
                    cout<<"请输入对应的身份序号:";
                    cin>>k; 
            while(!k)
            
            cin.clear();
            cin.sync();
            k=-1;
            break;
            
            
            system("cls");
            if(k==1) 
             m_head->find(m_head);system("pause");  
            else if(k==2)
             h_head->find(h_head);system("pause");  
            else if(k==3)
             l_head->find(l_head);system("pause");  
            else
            
            cout<<"请输入正确的序号!"<<endl;system("pause");  
            break;
                
            
    case 3:     system("cls");head->display(head);system("pause");break;
            
    case 4:
            
            cout<<"请选择搜索方式:"<<"\\n\\n";
            cout<<"1.按照书名搜索\\t2.按照作者名字搜索\\t3.按关键字搜索"<<"\\n\\n";
            cout<<"请输入你想要选择的方式序号:";
            cin>>k;
            while(!k)
            
            cin.clear();
            cin.sync();
            k=-1;
            break;
            
            system("cls");
            if(k==1) 
             head->find_name(head);system("pause");  
            else if(k==2)
             head->find_author(head);system("pause");  
            else if(k==3)
             head->find_critical(head);system("pause");  
            else
            
            cout<<"请输入正确的序号!"<<endl;system("pause");  
            break;
             
            
            
    case 5:        head2->Addbook(head2,head);system("pause");break;
            
    case 6:
            
              t_sum=head2->count(head2);
              if(t_sum==-1)
              
                  system("pause");
                  break;
              
            cout<<"您的身份是:"<<endl;
            cout<<"1)会员\\t2)贵宾\\t3)普通顾客"<<endl;
            cin>>choose;
    

            switch(choose)
              
                case 1:
                       
                orderflag=o_head->m_storage(head2,m_head,t_sum);
                if(orderflag!=-1)
                 
                cout<<"请进行下一步支付步骤"<<"\\n\\n"; 
                system("pause");
                head2->pay();
                head2->remake(head2);
                 
                break;
                  
            
                case 2:
                       
                orderflag=o_head->h_storage(head2,h_head,t_sum);
                if(orderflag!=-1)
                 
                cout<<"请进行下一步支付步骤"<<"\\n\\n"; 
                system("pause");
                head2->pay();
                head2->remake(head2);
                 
                break;
                  
            
                case 3:
                   
                orderflag=o_head->l_storage(head2,l_head,t_sum);
                if(orderflag!=-1)
                 
                cout<<"请进行下一步支付步骤"<<"\\n\\n"; 
                system("pause");
                head2->pay();
                head2->remake(head2);
                 
                break;
                  
                default:break;
               
            
            break;
            
            
            
    case 7:        head->Savedata(head);return 0;       
            
    case 8:        head->Addbook(head);break;
            
    case 9:
             
            system("cls");
            cout<<"\\n请选择要进行添加的顾客信息:\\n\\n";
            cout<<"1.添加新会员\\t2.添加新贵宾\\t3.添加普通顾客信息\\n\\n";
            cout<<"请输入对应序号:";
            cin>>k; 
            
            while(!k)
            
            cin.clear();
            cin.sync();
            k=-1;
            break;
            
            
            system("cls");
            
            if(k==1) 
             m_head->addm(m_head);m_head->savedata(m_head);system("pause");  
            
            else if(k==2)
             h_head->addh(h_head);h_head->savedata(h_head);system("pause"); 
             
            else if(k==3)
             l_head->addl(l_head);l_head->savedata(l_head);system("pause");  
            
            else
            cout<<"请输入正确的序号!"<<endl;system("pause");  
        
            break;
             
            
    default:
            
            cout<<"请输入正确序号!"<<endl;
            system("pause");
            break;
            
        
    
    return 0;

 

【问题产生的原因】

由于接收数值的变量k为int类型,在接收字母或其它字符等char类型时,导致程序出现问题

 

【解决方案】

应用cin.clear()更改cin的异常状态标识,再用cin.sync()函数对缓冲区中的数据流进行清理,然后给变量k赋值为-1,进入switch选择后将跳转至default一列,随后结束此次循环。后续代码运行将恢复正常。

 

//将这几行代码嵌入至给变量k赋值的 cin>>k; 之后即可
while(!k)
        
            cin.clear();
            cin.sync();
            k=-1;
            break;
        

【修改后的代码】

int main() 

    system("color 8E");
    int k,i,choose,orderflag=1;
    double t_sum;
    book* head = new book;
    trolley* head2 = new trolley;
    layfolk* l_head = new layfolk;
    member* m_head = new member;
    honoured_guest* h_head = new honoured_guest;
    historyorder* o_head = new historyorder;
    
    head->Loaddata(head);
    l_head->loaddata(l_head);
    m_head->loaddata(m_head);
    h_head->loaddata(h_head); 
    string ch;
    while (1)
    
        system("color 8E");
        system("cls");
        printf("\\n\\n\\n");
        printf("\\t\\t\\t\\t+-----------TouhouBookStore-----------+\\n");
        printf("\\t\\t\\t\\t|--------------东方铃奈庵-------------|\\n");
        printf("\\t\\t\\t\\t+-------------网上购书系统------------+\\n");
        printf("\\t\\t\\t\\t+-------------------------------------+\\n");
        printf("\\t\\t\\t\\t|\\t1 查看历史订单\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t2 查看个人会员信息\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t3 查看店内书籍\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t4 搜索店内书籍\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t5 购买书籍\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t6 结算\\t\\t\\t      |\\n");
        printf("\\t\\t\\t\\t|\\t7 退出\\t\\t\\t      |\\n");
        printf("\\t\\t\\t\\t+-------------------------------------+\\n");
        printf("\\n\\n\\n");
        printf("\\t\\t\\t\\t请输入你想实现的功能前的代号:\\n");
        printf("\\t\\t\\t\\t");

        cin >> k;

  while(!k)
    cin.clear();
    cin.sync();
    k=-1; break;
  

switch(k) case 1: cout<<"您的身份是:"<<endl; cout<<"1)会员\\t2)贵宾\\t3)普通顾客"<<endl; cin>>choose; switch(choose) case 1: o_head->m_display(head2,m_head);break; case 2: o_head->h_display(head2,h_head);break; case 3: o_head->l_display(head2,l_head);break; default:break; break; case 2: system("cls"); cout<<"\\n请选择您的会员身份:\\n"<<endl; cout<<"1.我是会员\\t2.我是贵宾\\t3.我是普通顾客\\n\\n"; cout<<"请输入对应的身份序号:"; cin>>k; while(!k) cin.clear(); cin.sync(); k=-1; break; system("cls"); if(k==1) m_head->find(m_head);system("pause"); else if(k==2) h_head->find(h_head);system("pause"); else if(k==3) l_head->find(l_head);system("pause"); else cout<<"请输入正确的序号!"<<endl;system("pause"); break; case 3: system("cls");head->display(head);system("pause");break; case 4: cout<<"请选择搜索方式:"<<"\\n\\n"; cout<<"1.按照书名搜索\\t2.按照作者名字搜索\\t3.按关键字搜索"<<"\\n\\n"; cout<<"请输入你想要选择的方式序号:"; cin>>k; while(!k) cin.clear(); cin.sync(); k=-1; break; system("cls"); if(k==1) head->find_name(head);system("pause"); else if(k==2) head->find_author(head);system("pause"); else if(k==3) head->find_critical(head);system("pause"); else cout<<"请输入正确的序号!"<<endl;system("pause"); break; case 5: head2->Addbook(head2,head);system("pause");break; case 6: t_sum=head2->count(head2); if(t_sum==-1) system("pause"); break; cout<<"您的身份是:"<<endl; cout<<"1)会员\\t2)贵宾\\t3)普通顾客"<<endl; cin>>choose; switch(choose) case 1: orderflag=o_head->m_storage(head2,m_head,t_sum); if(orderflag!=-1) cout<<"请进行下一步支付步骤"<<"\\n\\n"; system("pause"); head2->pay(); head2->remake(head2); break; case 2: orderflag=o_head->h_storage(head2,h_head,t_sum); if(orderflag!=-1) cout<<"请进行下一步支付步骤"<<"\\n\\n"; system("pause"); head2->pay(); head2->remake(head2); break; case 3: orderflag=o_head->l_storage(head2,l_head,t_sum); if(orderflag!=-1) cout<<"请进行下一步支付步骤"<<"\\n\\n"; system("pause"); head2->pay(); head2->remake(head2); break; default:break; break; case 7: head->Savedata(head);return 0; case 8: head->Addbook(head);break; case 9: system("cls"); cout<<"\\n请选择要进行添加的顾客信息:\\n\\n"; cout<<"1.添加新会员\\t2.添加新贵宾\\t3.添加普通顾客信息\\n\\n"; cout<<"请输入对应序号:"; cin>>k; while(!k) cin.clear(); cin.sync(); k=-1; break; system("cls"); if(k==1) m_head->addm(m_head);m_head->savedata(m_head);system("pause"); else if(k==2) h_head->addh(h_head);h_head->savedata(h_head);system("pause"); else if(k==3) l_head->addl(l_head);l_head->savedata(l_head);system("pause"); else cout<<"请输入正确的序号!"<<endl;system("pause"); break; default: cout<<"请输入正确序号!"<<endl; system("pause"); break; return 0;

 

【二次开发所添加的功能】

 

 

 在功能5购买书籍中,用户在使用的过程体验并不佳,因为无法直观看到自己已经选中了哪些书籍,故在此添加一个“购物车”形式的展示功能

【代码实现】

void trolley::display(trolley* t)

    if (t->next == NULL)
    
        cout << "目前购物车内无信息!\\t\\t" << endl;
        cout << "—————————————————————————————————————————————————————————\\n";
    
    else
    
        cout << "\\n您的购物车中目前有以下书籍:" << endl;
        cout << "—————————————————————————————————————————————————————————\\n";
        t = t->next;
        int n = 1;
        while (1)
        
            cout << "NO." << n << ":" << \'\\t\' << endl;
            cout << "—————————————————————————————————————————————————————————\\n";
            cout << "书号:" << t->book_ID << \'\\t\';
            cout << "书名:《" << t->book_name << "" << \'\\t\';
            cout << "作者:" << t->author << \'\\t\';
            cout << "出版社:" << t->publishing << \'\\t\';
            cout << "定价:" << t->price << \'\\t\';
            cout << "购买份数:" << t->num << endl;
            cout << "—————————————————————————————————————————————————————————\\n";
            if (t->next == NULL)
                break;
            else
            
                t = t->next;
                n++;
            
        
    


void trolley::Addbook(trolley* t, book* m)

    trolley* hd = t;
    book* hd2 = m;
    trolley* p;
    trolley* p1;
    string t_name, ch;
    int n=0, flag = 0;
    while (1)
    
        system("cls");
        flag = 0;
        t->display(hd);

        cout << "\\n是否继续添加书籍?\\n";
        cout << "Y)继续添加\\tN)返回主菜单\\tD)删除订单" << endl;
        cin >> ch;
        if (ch == "Y" || ch == "y");
        else if (ch == "N" || ch == "n")return;
        else if (ch == "D" || ch == "d")
        
            hd->Delete_t(hd);
            system("pause");
            continue;
        
        else 
            cout << "请输入正确指令" << endl; system("pause"); continue;
        

        while (t->next != NULL)
        
            t = t->next;
        

        p = new trolley;
        t->next = p;
        p->next = NULL;

        cout << "请输入想购买的书名:" << endl;
        cin >> t_name;
        m = hd2;
        while (1)
        
            if (m->book_name == t_name)
            
                ++n;
                cout << "NO." << n << ":" << \'\\t\' << endl;
                cout << "—————————————————————————————————————————————————————————\\n";
                cout << "书号:" << m->book_ID << \'\\t\';
                cout << "书名:《" << m->book_name << "" << \'\\t\';
                cout << "作者:" << m->author << \'\\t\';
                cout << "出版社:" << m->publishing << \'\\t\';
                cout << "定价:" << m->price << \'\\n\';
                cout << "—————————————————————————————————————————————————————————\\n\\n";
                cout << "请问是否确认购买该书籍?" << "\\n\\n";
                cout << "1)Y\\t2)N" << "\\n\\n";
                cin >> ch;
                if (ch == "N" || ch == "n")
                
                    t->next = t->next->next;
                
                if (ch == "Y" || ch == "y")
                
                    cout << "请输入您想要购买的份数:";
                    cin >> n;
                    p1 = hd;
                    while (p1 != t)
                    
                        if (p1->next->book_name == t_name)
                        
                            p1->next->num += n;
                            t->next = t->next->next;
                            flag = 1;
                            break;
                        
                        p1 = p1->next;
                    
                    if (flag == 1)break;

                    p->book_ID = m->book_ID;
                    p->book_name = t_name;
                    p->author = m->author;
                    p->publishing = m->publishing;
                    p->price = m->price;
                    p->num = n;
                    t = p;
                
            

            if (m->next == NULL && n == 0)
            
                cout << "没有名为《" << t_name << "》的书籍" << endl;
                break;
            
            if (m->next == NULL)
            
                break;
            
            m = m->next;
        

        cout << "是否继续购买?" << endl;
        cout << "Y)继续购买\\tN)返回主菜单" << endl;
        cin >> ch;
        if (ch == "Y" || ch == "y");
        if (ch == "N" || ch == "n")break;

    

 

 

 

 

 

如此一来,用户便能够清楚地看到自己所购买的书籍内容了

 

以上是关于C++购书系统问题测试&功能补充的主要内容,如果未能解决你的问题,请参考以下文章

《软件工程综合实践专题》

项目源码JavaWeb网上购书系统

亲测可用!在线购书系统项目分享(Java)

网上购书系统网站的设计与实现(SSM)毕业论文+开题报告+答辩PPT+项目源码及数据库

OpenJudge百炼习题解答(C++)--题4040:买书问题

免费下载全套最新004JavaWEB购书系统视频教程+教学资料+学习课件+源代码+软件开发工具