yhfrxd 2021-11-02 10:28 采纳率: 50%
浏览 36
已结题

为什么我的程序无限循环输出导致最后vector都装不下了


#include<iostream>
#include<string>
#include"speechManager.h"
using namespace std;

int main() {
    speechManager sm;
    sm.ShowMenu();
    //测试选手创建
    /*for (map<int, Speaker>::iterator it = sm.m_Speaker.begin(); it != sm.m_Speaker.end(); it++) {
        cout << "选手编号: " << it->first << "姓名:" << it->second.m_Name << "分数 :" << it->second.m_Score[0]<< endl;
    }*/

    int choice = 0;
    cin >> choice;
    while (true) {
        switch (choice) {
        case 1://开始比赛
            sm.startSpeech();
            break;
        case 2://查看记录
            break;
        case 3://清空记录
            break;
        case 0://退出系统
            sm.exitSystem();
            break;
        default:
            system("cls");//清屏
            break;
        }
    }

    system("pause");
    return 0;
}

#include"speechManager.h"

speechManager::speechManager() {
    this->initSpeech();//初始化容器属性
    this->creatSpeaker();//创建12名选手
    this->loadRecord();
}
void speechManager::ShowMenu() {
    cout << "**********************" << endl;
    cout << "***欢迎参加演讲比赛***" << endl;
    cout << "****1.开始演讲比赛****" << endl;
    cout << "****2.查看往届比赛****" << endl;
    cout << "****3.清空比赛记录****" << endl;
    cout << "****0.退出比赛程序****" << endl;
    cout << "**********************" << endl;
    cout << endl;
}
void speechManager::initSpeech() {
    this->v1.clear();
    this->v2.clear();
    this->vVictory.clear();
    this->m_Speaker.clear();

    this->m_Index = 1;
    //将记录的容器 也清空
    this->m_Record.clear();

};
void speechManager::creatSpeaker() {
    string nameSeed = "ABCDEFGHIJKL";
    for (int i = 0; i < nameSeed.size(); i++) {
        string name = "选手";
        name += nameSeed[i];

        Speaker s;
        s.m_Name = name;
        for (int j = 0; j < 2; j++) {
            s.m_Score[j] = 0;
        }
        //创建选手编号并放入v1
        this->v1.push_back(i + 10001);
        //选手编号以及对应选手放入map
        this->m_Speaker.insert(make_pair(i+10001, s));


    }

};
void speechManager::startSpeech() {
    //第一轮比赛
    //1.抽签
    this->speechDraw();
    //2.比赛
    this->speechContest();
    //3.显示晋级结果
    this->showScore();
    //第二轮开始比赛
    this->m_Index++;
    //1.抽签
    this->speechDraw();
    //2.比赛
    this->speechContest();
    //3.显示晋级结果
    this->showScore();
    //4.保存信息
    this-> saveRecord();

    cout << "本届比赛完毕: " << endl;
    system("pause");
    system("cls");
}
//抽签
void speechManager::speechDraw() {
    cout << "第" << this->m_Index << "轮比赛正在抽签" << endl;
    cout << "-----------------------------------" << endl;
    cout << "第" << this->m_Index << "轮比赛抽签结果如下:" << endl;
    if (this->m_Index == 1) {
        random_shuffle(v1.begin(), v1.end());
        for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    else {
        random_shuffle(v2.begin(), v2.end());
        for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    cout << "-----------------------------------" << endl;
    system("pause");
    cout << endl;
};
void speechManager::speechContest() {
    cout << "-------第" << this->m_Index << "轮比赛正式开始-------" << endl;
    //临时准备容器 存放小组成绩
    multimap<double, int, greater<double>>groupScore;
    //记录人员
    int num = 0;

    vector<int>v_Src;//比赛选手容器
    if (this->m_Index == 1) {
        v_Src = v1;
    }
    else {
        v_Src = v2;
    }
    //遍历所有选手
    for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++) {
        num++;
        //打分
        deque<double>d;
        for (int i = 0; i < 10; i++) {
            double score = (rand() % 401 + 600) / 10.f;//600-1000;10.f代表小数
            //cout << score << " ";
            d.push_back(score);
        }
        //cout << endl;

        sort(d.begin(), d.end(), greater<double>());
        d.pop_front();
        d.pop_back();

        double sum = accumulate(d.begin(), d.end(), 0.0f);
        double avg = sum / (double)d.size();
            //打印平均分
            //cout << "编号:" << *it << "姓名: " << this->m_Speaker[*it].m_Name << "得分: " << avg;
        //平均分放到map中
        this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;
        //将打分数据放到临时小组容器
        groupScore.insert(make_pair(avg, *it));//key是得分,value是编号
        //每6人取出前三名
        if (num % 6 == 0) {
            cout << "第" << num / 6 << "小组比赛名次 :" << endl;
            for (multimap<double, int, greater<double>>::iterator it = groupScore.begin(); it != groupScore.end(); it++) {
                    cout << "编号: " << it->second << "姓名 :" << this->m_Speaker[it->second].m_Name << "成绩:"
                        << this->m_Speaker[it->second].m_Score[this->m_Index - 1] << endl;

            }
            //取走前三名放入下一个容器
            int count = 0;
            for (multimap<double, int, greater<double>>::iterator it = groupScore.begin(); it != groupScore.end() && count <3; it++,count++) {
                if (this->m_Index == 1) {
                        v2.push_back((*it).second);
                    }
                else {
                        vVictory.push_back((*it).second);
                    }
                }
                groupScore.clear();
                cout << endl;
        }
            
    }
    cout << "第" << this->m_Index << "轮比完了" << endl;
    system("pause");
}
void speechManager::showScore() {
    cout << "-------第" << this->m_Index << "轮晋级选手信息如下------" << endl;
    vector<int>v;
    if (this->m_Index == 1) {
        v = v2;
    }
    else {
        v = vVictory;
    }
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << "编号: " << *it << "姓名:" << this->m_Speaker[*it].m_Name << "得分: "
            <<this-> m_Speaker[*it].m_Score[this->m_Index -1] << endl;
        
    }
    cout << endl;
    system("pause");
    system("cls");
    this->ShowMenu();
}
void speechManager::saveRecord() {
    ofstream ofs;
    ofs.open("speech.csv", ios::out | ios::app);//追加的方式写文件
    //将每个人的数据写入
    for (vector<int>::iterator it = vVictory.begin(); it != vVictory.end(); it++) {
        ofs << *it << ", " << this->m_Speaker[*it].m_Score[1] << ", ";
    }
    ofs << endl;
    //关闭
    ofs.close();
    cout << "记录已经保存" << endl;
    this->fileIsEmpty = false;
}

void speechManager::loadRecord() {
    ifstream ifs("speech.csv",ios::in);//读文件
    //文件不存在
    if (!ifs.is_open()) {
        this->fileIsEmpty = true;
        //cout << "文件不存在" << endl;
        ifs.close();
        return;
    }
    //文件清空的情况
    char ch;
    ifs >> ch;
    if (ifs.eof()) {//C++ eof()函数返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符。
        cout << "文件为空" << endl;
        this->fileIsEmpty = true;
        ifs.close();
        return;
    }
    //文件不为空
    this->fileIsEmpty = false;
    ifs.putback(ch);//将上面读取的单个字符放回来
    int index = 0;
    string data;

    while (ifs >> data) {
        //cout << data << endl;
        vector<string>v;
        int pos = -1;//查找“,“未知的变量
        int start = 0;
        while (true) {
            
            pos = data.find(",", start);
            if (pos == -1) {
                //没找到情况
                break;
            }
            string temp = data.substr(start, pos - start);
            //cout << temp << endl;
            v.push_back(temp);
            start = pos + 1;
        }
        this->m_Record.insert(make_pair(index, v));
        index++;
    }
    ifs.close();
    for (map<int, vector<string>>::iterator it = m_Record.begin(); it != m_Record.end(); it++) {
        cout << it->first << "冠军编号" << it->second[0] << "分数: " << it->second[1] << endl;
    }
}
void speechManager::exitSystem() {
    cout << "欢迎下次使用" << endl;
    system("pause");
    exit(0);

}

speechManager::~speechManager() {}

  • 写回答

1条回答 默认 最新

  • 於黾 2021-11-02 10:30
    关注

    你的while(true)里面没写break,可不死循环了吗
    你所有break都是给switch用的,没有一个是给while用的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月10日
  • 已采纳回答 11月2日
  • 创建了问题 11月2日

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料