【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;

    }
}

 

 

 

 

 

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

 

posted @ 2023-03-08 21:48  超特急凛号列车  阅读(76)  评论(0)    收藏  举报