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条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥40 python,计算机程序运行结果很奇怪
      • ¥15 有关时间计算器的问题
      • ¥200 Chrome浏览器自动保存密码需要解密!来人
      • ¥18 关于#c语言#的问题:如何把下面几个代码放在一起编序号,然后输入对应数字运行对应代码,还可以返回重输
      • ¥30 windows下无法运行go test的问题
      • ¥15 多个Rigify骨骼 导入一起 后 没有 控制器面板
      • ¥15 想问一下sprak ada语言的pre和post怎么设
      • ¥15 使用python将分子模拟输出.gro文件
      • ¥15 港诡实录的背包系统拆解
      • ¥15 宽带IP网络路由器的初始路由表和最终路由表