别染黑发 2021-12-15 17:31 采纳率: 100%
浏览 72
已结题

求看看代码有什么问题c++


#include <iostream>  
#include <fstream>   
using namespace std;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
const int Msize_Person=100;  //学生人数上限
const int Msize_Music=100;   //歌曲数目上限
const int Msize_End=1000;  //配对上限
struct Person  //学生
{
    char name_p[30];  //姓名
    int num_p;  //学生编号
    char sex[6];  //性别b/g(男/女)
};

struct Music //音乐
{
    int number_m;//歌曲编号
    int order;//歌序号
    char name_m[30];//歌曲名
    char singer[30];//歌手名
};

struct MatchList//配对列表
{
    int num_b;//男编号
    int num_g;//女编号
    char name_b[30];//男姓名
    char name_g[30];//女姓名
    char sex_b[6];//男性别
    char sex_g[6];//女性别
    char neme_me[30];//歌名
    char singer_e[30];//歌手
    int number_me;//歌编号
    int order_e;//歌曲序号
};

class Dance  //舞伴类
{
public:
    Dance(); //构造函数
    void Menu();  //主界面
    void Display_e();//2、显示每曲配对
    void Chaxun(); //3、查询配对
    void Add();//4、添加信息
    void Reset(); //配对列表重置
    void Match(); //自动配
    void Add_P();//添加学生
    void Add_M();//添加歌曲
    void Display_p();//显示学生
    void Display_m();//显示歌曲
    void Menu_c();//查询配对
    void Menu_xinximo();//音乐录入
    void Menu_xinxipo();//学生录入
    void Menu_add();//添加信息主界面
private:
    int front_b,rear_b;//队头,队尾
    int front_g,rear_g;
    int front_m,rear_m;
    int front_e,rear_e;
    int Num_B; 
    int Num_G; 
    int Num_M;
    int Min;//较少队列人数
    int count;//学生总人数 用于学生编号
    int FLOG;//
    Person Que_Boy[Msize_Person]; //1 男生队列
    Person Que_Girl[Msize_Person]; //2 女生队列
    Music Que_Music[Msize_Music]; //3 歌曲队列
    MatchList Que_End[Msize_End]; //4 配对队列
};

Dance::Dance() 
{
    Num_B=Num_G=Num_M=count=0;//男女生、歌曲数初始化为0
    front_b=rear_b=Msize_Person-1;//初始化队列
    front_g=rear_g=Msize_Person-1;
    front_m=rear_m=Msize_Music-1;
    front_e=rear_e=Msize_End-1;
}

void Dance::Menu()  //主界面 *
{
    cout<<"\t\t-----------------------------------------"<<endl;
    cout<<"\t\t---        欢迎进入舞池配对系统       ---"<<endl;
    cout<<"\t\t---   1、添加信息       2、每曲配对   ---"<<endl;
    cout<<"\t\t---   3、查询信息       4、退出系统   ---"<<endl;
    cout<<"\t\t-----------------------------------------"<<endl;
}


void Dance::Menu_xinximo()//手动录入歌曲 *
{
    cout<<"\t\t*************************************"<<endl;
    cout<<"\t\t*****    歌曲信息已保存至系统   *****"<<endl;
    cout<<"\t\t*****    请选择您的操作         *****"<<endl;
    cout<<"\t\t*****    1、继续添加            *****"<<endl;
    cout<<"\t\t*****    2、返回上一级          *****"<<endl;
    cout<<"\t\t*************************************"<<endl;
}

void Dance::Menu_xinxipo()//手动录入学生 *
{
    cout<<"\t\t*************************************"<<endl;
    cout<<"\t\t*****    学生信息已保存至系统   *****"<<endl;
    cout<<"\t\t*****    请选择您的操作         *****"<<endl;
    cout<<"\t\t*****    1、继续添加            *****"<<endl;
    cout<<"\t\t*****    2、返回上一级          *****"<<endl;
    cout<<"\t\t*************************************"<<endl;
}

void Dance::Add_P()//添加学生
{
    int flog_p1,flog_po,i,n_p;
    char sel_po;
    flog_p1=1;
    while(flog_p1)
    {//_
        cout<<"请输入添加人数:"<<endl;
        cin>>n_p;
        if(n_p>0)
            cout<<"姓名\t性别(b/g)"<<endl;  //录入信息完成
        for(i=0;i<n_p;i++) //添加学生信息
        {//+
            char name_i[30],sex_i[6];
            cin>>name_i>>sex_i;
            if((strcmp(sex_i,"b"))==0)//男生入队
            {
                int rear_ab;
                rear_ab=(rear_b+1)%Msize_Person;
                rear_b=(rear_b+1)%Msize_Person;
                if(front_b!=rear_b)
                {
                    strcpy(Que_Boy[rear_b].name_p,name_i);
                    strcpy(Que_Boy[rear_b].sex,sex_i);
                    Que_Boy[rear_b].num_p=count+1;//1开始编号
                    Num_B=Num_B+1;//男队人数加一
                    count++;
                    ofstream outfile("student1.txt",ios::app);//男生写入文件
                    if(!outfile)
                    {cout<<"open error!"<<endl;    exit(1);    
                    }
                    else//写入到文件
                    {
                        outfile.write((char*)&Que_Boy[rear_ab],sizeof(Que_Boy));
                    }
                }
                else{cout<<"\t队列已满"<<endl;}
            }
            else if((strcmp(sex_i,"g"))==0)//女生入队
            {
                int rear_ag;
                rear_ag=(rear_g+1)%Msize_Person;
                rear_g=(rear_g+1)%Msize_Person;
                if(front_b!=rear_b)
                {
                    strcpy(Que_Girl[rear_g].name_p,name_i);
                    strcpy(Que_Girl[rear_g].sex,sex_i);
                    Que_Girl[rear_g].num_p=count+1;//1开始编号
                    Num_G=Num_G+1;//加一
                    count++;//女队人数
                    ofstream outfile("student1.txt",ios::app);//女生写入文件
                    if(!outfile)
                    {cout<<"open error!"<<endl;    exit(1);
                    }
                    else//写入到文件
                    {
                        outfile.write((char*)&Que_Girl[rear_ag],sizeof(Que_Girl));
                    }
                }
                else{cout<<"\t队列已满"<<endl;}
            }
            else
            {
                cout<<"\t信息录入错误,请重新输入学生信息"<<endl;
                i--;
            }
        }//+
        Min=(Num_G<=Num_B)?Num_G:Num_B;//较少队列人数
        flog_po=1;
        while(flog_po)
        {//=
            Menu_xinxipo();//是否继续添加菜单
            cin>>sel_po;
            switch(sel_po)
            {
            case '1'://继续添加
                flog_po=0;
                break;
            case '2'://返回上一级  学生录入
                flog_p1=0;//退出手动录入
                flog_po=0;//返回上一级
                break;
            default:
                cout<<"输入错误,请重新输入"<<endl;
                break;
            }
        }//=
    }//_
}

void Dance::Add_M()//添加歌曲
{
    int j;
    int flog_m1,flog_mo,n_m;
    char sel_mo;
    flog_m1=1;
    while(flog_m1)
    {
        cout<<"输入歌曲数目"<<endl;
        cin>>n_m;
        char name_mi[30],singeri[30];
        if(n_m>0)
            cout<<"歌名"<<"\t歌手"<<endl;
        for(j=0;j<n_m;j++)
        {
            int rear_am;
            rear_am=(rear_m+1)%Msize_Music;
            cin>>name_mi>>singeri;
            rear_m=(rear_m+1)%Msize_Music;
            if(rear_m!=front_m)
            {
                strcpy(Que_Music[rear_m].name_m,name_mi);
                strcpy(Que_Music[rear_m].singer,singeri);
                Que_Music[rear_m].number_m=1+Num_M;//歌曲从1编号
                Que_Music[rear_m].order=Num_M=Num_M+1;//歌曲序号
                ofstream outfile("music1.txt",ios::app);//歌曲写入文件
                if(!outfile)
                {
                    cout<<"open error!"<<endl;
                    //exit(1);
                }
                else//写入到文件
                {
                    outfile.write((char*)&Que_Music[rear_am],sizeof(Que_Music));
                }
            }
            else
            {cout<<"\t队列已满"<<endl;}
        }
        flog_mo=1;
        while(flog_mo)
        {
            Menu_xinximo();
            cin>>sel_mo;
            switch(sel_mo)
            {
            case '1'://继续添加
                flog_mo=0;
                break;
            case '2'://返回上一级  歌曲录入
                flog_m1=0;//退出手动录入
                flog_mo=0;//返回上一级
                break;
            default:
                cout<<"输入错误,请重新输入"<<endl;
                break;
            }
        }
    }
}

void Dance::Menu_add()//4、添加信息 *
{
    cout<<"\t\t*********************************"<<endl;
    cout<<"\t\t****       添加信息类别      ****"<<endl;
    cout<<"\t\t****    1、添加歌曲信息      ****"<<endl;//系统提供
    cout<<"\t\t****    2、添加学生信息      ****"<<endl;
    cout<<"\t\t****    3、返回上一级菜单    ****"<<endl;
    cout<<"\t\t*********************************"<<endl;
}

void Dance::Add()//4、添加信息
{
    char sel_a;
    int flog_a=1;
    while(flog_a==1)
    {
        Menu_add();
        cin>>sel_a;
        switch(sel_a)
        {
        case '1'://添加歌曲
            Add_M();
            break;
        case '2'://添加学生
            Add_P();
            break;
        case '3'://返回上一级
            flog_a=0;
            break;
        default:
            cout<<"\t输入错误,请重新输入"<<endl;
            break;
        }
    }
}

void Dance::Reset() //匹配列表重置*
{
    front_e=rear_e=Msize_End-1;
}

void Dance::Display_e()//2、显示每曲配对信息
{
    int p,q;
    int f_d,min_d;
    min_d=Min;
    f_d=(front_e+1)%Msize_End;
    if(FLOG!=0)
    {
        Match();//匹配
        for(q=f_d;q<=rear_e;q=(q+min_d)%Msize_End)
        {
            cout<<"\t**********************************************************************"<<endl;
            cout<<"\t\t\t\t歌序号\t歌名\t演唱者                              "<<endl;
            cout<<"\t\t\t\t"<<Que_End[q].number_me<<"\t"<<Que_End[q].neme_me<<"\t"<<Que_End[q].singer_e<<endl;//cout<<"\t\t男生\t\t女生"<<endl;
            cout<<"\t----------------------------------------------------------------------"<<endl;
            cout<<"\t编号\t\t姓名\t性别\t\t编号\t\t姓名\t性别                  "<<endl;
            for(p=f_d;p<min_d+f_d;p=(p+1)%Msize_End)
                cout<<"\t"<<Que_End[p].num_b<<"\t"<<Que_End[p].name_b<<"\t"<<Que_End[p].sex_b<<"\t\t"<<Que_End[p].num_g<<"\t"<<Que_End[p].name_g<<"\t"<<Que_End[p].sex_g<<endl;
            cout<<"\t**********************************************************************"<<endl;
            f_d=(f_d+min_d)%Msize_End;
        }
        Reset();//匹配队列归零
    }
    else
    {
        if(Num_B==0)
            cout<<"\t\t男生列表为空!"<<endl;
        if(Num_G==0)
            cout<<"\t\t女生列表为空!"<<endl;
        if(Num_M==0)
            cout<<"\t\t音乐列表为空!"<<endl;
        cout<<"\t\t无法进行配对!"<<endl;
    }
}

void Dance::Menu_c()////3、查询配对主界面 *
{
    cout<<"\t\t*************************************"<<endl;
    cout<<"\t\t****     选择查询信息            ****"<<endl;
    cout<<"\t\t****   1、第K曲配对              ****"<<endl;
    cout<<"\t\t****   2、男女配对情况           ****"<<endl;
    cout<<"\t\t****   3、学生信息               ****"<<endl;
    cout<<"\t\t****   4、歌曲信息               ****"<<endl;
    cout<<"\t\t****   5、返回上一级             ****"<<endl;
    cout<<"\t\t*************************************"<<endl;
    
}

void Dance::Display_m()//显示歌曲列表
{
    int m,i;//,x;
    m=(front_m+1)%Msize_Music;
    if(Num_M==0)
        cout<<"\t歌曲列表为空"<<endl;
    else
    {
        cout<<"歌曲列表"<<endl;
        for(i=0;i<Num_M;i++)
        {
            cout<<"\t\t歌名"<<"\t\t歌手"<<"\t\t编号"<<endl;
            cout<<"\t\t"<<Que_Music[m].name_m<<"\t\t"<<Que_Music[m].singer<<"\t\t"<<Que_Music[m].number_m<<endl;
            m=(m+1)%Msize_Music;
        }
    }
}

void Dance::Display_p()//显示学生信息
{
    int m,x,i;
    m=(front_b+1)%Msize_Person;
    x=(front_g+1)%Msize_Person;
    if(Num_B==0)
        cout<<"\t男生列表为空"<<endl;
    else
    {
        cout<<"\t\t男生名单"<<endl;
        for(i=0;i<Num_B;i++)
        {
            cout<<"\t\t编号\t\t姓名\t性别"<<endl;
            cout<<"\t\t"<<Que_Boy[m].num_p<<"\t"<<Que_Boy[m].name_p<<"\t"<<Que_Boy[m].sex<<endl;
            m=(m+1)%Msize_Person;
        }
    }
    if(Num_G==0)
        cout<<"\t女生列表为空"<<endl;
    else
    {
        cout<<"\t\t女生名单"<<endl;
        for(i=0;i<Num_G;i++)
        {
            cout<<"\t\t编号\t\t姓名\t性别"<<endl;
            cout<<"\t\t"<<Que_Girl[x].num_p<<"\t"<<Que_Girl[x].name_p<<"\t"<<Que_Girl[x].sex<<endl;
            x=(x+1)%Msize_Person;
        }
    }
}

void Dance::Chaxun() //3、查询信息 *
{
    char sel_c;
    int flog_c,flog_k,k1,k,x,y;
    int i,p;//j,,q;
    flog_c=1;
    Match();//注:每次配对都需要对配对队列清零
    while(flog_c==1)
    {
        Menu_c();
        cin>>sel_c;
        switch(sel_c)
        {
        case '1'://第K曲配对情况
            cout<<"输入k:";//<<endl;
            cin>>k1;
            int n_k;
            n_k=k1;
            if(k1>Num_M)
                cout<<"找不到该歌曲,可能是超出已有歌曲范围,请重新输入"<<endl;
            else
            {
                flog_k=0;
                for(i=(front_e+1)%Msize_End;i<=rear_e;i=(i++)%Msize_End)
                    if(k1==Que_End[i].order_e)
                    {
                        flog_k=1;
                        k1=i;
                        break;
                    }
                    if(flog_k==1)
                    {
                        cout<<"\t**********************************************************************"<<endl;
                        cout<<"\t\t\t\t第"<<n_k<<"曲配对情况如下:                                "<<endl;
                        cout<<"\t\t\t\t歌编号\t歌序号\t歌名\t演唱者                        "<<endl;
                        cout<<"\t\t\t\t"<<Que_End[k1].number_me<<"\t"<<Que_End[k1].order_e<<"\t"<<Que_End[k1].neme_me<<"\t"<<Que_End[k1].singer_e<<endl;//cout<<"\t\t男生\t\t女生"<<endl;
                        cout<<"\t----------------------------------------------------------------------"<<endl;
                        cout<<"\t编号\t\t姓名\t性别\t\t编号\t\t姓名\t性别                  "<<endl;
                        for(p=k1;p<(k1+Min)%Msize_End;p=(p+1)%Msize_End)
                            cout<<"\t"<<Que_End[p].num_b<<"\t"<<Que_End[p].name_b<<"\t"<<Que_End[p].sex_b<<"\t\t"<<Que_End[p].num_g<<"\t"<<Que_End[p].name_g<<"\t"<<Que_End[p].sex_g<<endl;
                        cout<<"\t**********************************************************************"<<endl;
                    }
                    
                    else
                        cout<<"\t未找到第k曲配对信息"<<endl;
            }
            break;
        case '2'://男生(编号X)任意女生(编号Y), 在第K曲配对跳舞的情况
            int count_c,k_b,k_g,k_m,n;
            count_c=0;
            cout<<"输入男(x)女(y)生及歌曲(k)编号"<<endl;
            cin>>x>>y>>k;
            n=k;
            k_g=k_b=k_m=0;
            for(i=(front_e+1)%Msize_End;i<=rear_e;i=(i++)%Msize_End)
                if(k==Que_End[i].order_e)
                {
                    k=i;
                    k_m=1;
                    break;
                }
                for(i=(front_e+1)%Msize_End;i<=rear_e;i=(i++)%Msize_End)
                {
                    if(x==Que_End[i].num_b)
                        k_b=1;
                    if(y==Que_End[i].num_g)
                        k_g=1;
                }
                if(k_b!=1)
                    cout<<"找不到该男生,可能是超出范围"<<endl;
                if(k_g!=1)
                    cout<<"找不到该女生,可能是超出范围"<<endl;
                if(k_m!=1)
                    cout<<"找不到该歌曲,可能是超出范围"<<endl;
                if(k_g==1&&k_b==1&&k_m==1)
                {
                    for(i=k;i<(k+Min)%Msize_End;i=(i++)%Msize_End)
                        if(Que_End[i].num_b==x&&Que_End[i].num_g==y)
                            count_c=1;
                        if(count_c==1)
                            cout<<"编号为"<<x<<"的男生与"<<"编号为"<<y<<"的女生在第"<<n<<"曲中为一对舞伴"<<endl;
                        else
                            cout<<"编号为"<<x<<"的男生与"<<"编号为"<<y<<"的女生不能在第"<<n<<"曲中结成舞伴跳舞"<<endl;
                }
                break;
        case '3'://学生信息
            Display_p();
            break;
        case '4'://歌曲信息
            Display_m();
            break;
        case '5'://返回上一级
            flog_c=0;
            break;
        default:
            cout<<"\t输入错误,请重新输入"<<endl;
            break;
        }
    }
    Reset();//注:每次配对都需要对配对队列清零
}

void Dance::Match() //自动配对
{
    int i,j,flog_e;//flog_e传出配对队列队尾
    int f_b,f_g,f_m;//,f_e;//临时变量 男/女/歌队头
    int min,n_m;//,max;//n_m临时歌曲数
    int front_bl,rear_bl;
    int front_gl,rear_gl;//int flog_lb,flog_lg;//控制将数据传入临时队列
    f_b=front_b;
    f_g=front_g;
    f_m=front_m;
    n_m=Num_M;//歌曲数
    front_bl=rear_bl=Msize_Person-1;//临时队列初始化
    front_gl=rear_gl=Msize_Person-1;//
    Person Qb_lin[Msize_Person]; //1 临时男队列
    Person Qg_lin[Msize_Person]; //2 临时女队列
    if(Num_G!=0&&Num_B!=0&&Num_M!=0)//如果一方信息为空,中止操作
    {
        FLOG=1;//没有列表为空
        while(f_b!=rear_b)//复制男生信息到临时队列
        {
            rear_bl=(rear_bl+1)%Msize_Person;
            f_b=(f_b+1)%Msize_Person;
            strcpy(Qb_lin[rear_bl].name_p,Que_Boy[f_b].name_p);
            strcpy(Qb_lin[rear_bl].sex,Que_Boy[f_b].sex);
            Qb_lin[rear_bl].num_p=Que_Boy[f_b].num_p;
        }
        while(f_g!=rear_g)//复制女生信息到临时队列
        {
            rear_gl=(rear_gl+1)%Msize_Person;
            f_g=(f_g+1)%Msize_Person;
            strcpy(Qg_lin[rear_gl].name_p,Que_Girl[f_g].name_p);
            strcpy(Qg_lin[rear_gl].sex,Que_Girl[f_g].sex);
            Qg_lin[rear_gl].num_p=Que_Girl[f_g].num_p;
        }
        f_b=front_bl;//f_b/f_g重新赋初值
        f_g=front_gl;
        for(j=0;j<Num_M;j++)
        {
            min=Min;//较少队人数
            int rear_p;
            rear_p=(f_m+1)%Msize_Music;
            f_m=(f_m+1)%Msize_Music;
            for(i=0;i<min;i++)//配对,未完成
            {
                rear_e=(rear_e+1)%Msize_End;//配对循环加一
                strcpy(Que_End[rear_e].neme_me,Que_Music[f_m].name_m);//歌曲//cout<<"歌曲:"<<Que_End[rear_e].neme_me<<endl;
                strcpy(Que_End[rear_e].singer_e,Que_Music[f_m].singer);//歌手//cout<<"歌手:"<<Que_End[rear_e].singer_e<<endl;
                Que_End[rear_e].number_me=Que_Music[f_m].number_m;//歌曲编号======
                Que_End[rear_e].order_e=Que_Music[f_m].order;
                front_bl=(front_bl+1)%Msize_Person;//男、女“出队”  临时男女队列
                front_gl=(front_gl+1)%Msize_Person;//
                rear_bl=(rear_bl+1)%Msize_Person;//匹配完毕 入临时队列
                rear_gl=(rear_gl+1)%Msize_Person;//0=0=0=0=0=0=0=
                strcpy(Que_End[rear_e].name_b,Qb_lin[front_bl].name_p);//配对 男---------
                strcpy(Que_End[rear_e].sex_b,Qb_lin[front_bl].sex);
                Que_End[rear_e].num_b=Qb_lin[front_bl].num_p;
                strcpy(Que_End[rear_e].name_g,Qg_lin[front_gl].name_p);//女
                strcpy(Que_End[rear_e].sex_g,Qg_lin[front_gl].sex);
                Que_End[rear_e].num_g=Qg_lin[front_gl].num_p;//配对完毕-------------
                strcpy(Qb_lin[rear_bl].name_p,Qb_lin[front_bl].name_p);//入队++++++++
                strcpy(Qb_lin[rear_bl].sex,Qb_lin[front_bl].sex);
                Qb_lin[rear_bl].num_p=Qb_lin[front_bl].num_p;
                strcpy(Qg_lin[rear_gl].name_p,Qg_lin[front_gl].name_p);
                strcpy(Qg_lin[rear_gl].sex,Qg_lin[front_gl].sex);
                Qg_lin[rear_gl].num_p=Qg_lin[front_gl].num_p;//++++++++++
                flog_e=rear_e;//配对 队尾
                ofstream outfile("match.txt",ios::app);
                if(!outfile)
                {
                    cout<<"学生文件打开失败!"<<endl;//exit(1);
                }
                else
                {
                    outfile.write((char*)&Qg_lin[rear_p],sizeof(Qg_lin));//二进制保存
                }
                outfile.close();
            }
        }
    }
    else
        FLOG=0;//有空列表
}

int main()
{
    int flog;
    char selection;
    flog=1;
    Dance dancer;
    while(flog)
    {
        dancer.Menu();
        cin>>selection;
        switch(selection)
        {
        case '1'://1、信息录入
            dancer.Add();
            break;
        case '2'://2、显示配对信息
            dancer.Display_e();
            break;
        case '3'://3、查询配对
            dancer.Chaxun();
            break;
        case '4'://退出
            cout<<"谢谢使用系统界面,按任意键退出系统……"<<endl;
            flog=0;
            break;
        default:
            cout<<"\t输入错误,请重新输入"<<endl;
            break;
        }
    }
    return 0;
}

为什么查询男女配对这个部分我无法运行 输入编号之后按回车程序没有反应 也退出不了

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2021-12-15 17:34
    关注

    case '3'://3、查询配对
    dancer.Chaxun();
    是指这个吗?那Chaxun函数代码在哪?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 修改了问题 12月16日
  • 修改了问题 12月15日
  • 展开全部

悬赏问题

  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表