恳求各位大佬帮我看看这个排序算法为什么越界了

sinat_34810705 2017-01-14 02:37:43



学校让做一个MFC学生信息管理程序,我已经完成了添加和删除还有修改的功能,到了排序就卡住了!!一直提醒向量越界,我在纸上模拟了过程好多遍都没觉得算法有问题……实在想不出来了!求各位大神帮帮忙解答一下!!!

这是我的排序函数
void management::sort(vector<CStudentInfo>&vecS)
{
CStudentInfo temp;
unsigned int i, j;
for (i = 1; i < vecS.size(); i++)
{
if (vecS[i].getTotal()>vecS[i - 1].getTotal())
{
temp = vecS[i];

for (j = i - 1; temp.getTotal() > vecS[j].getTotal()&&j>=0; j--)
{

vecS[j + 1] = vecS[j];

}
A:
vecS[j+1] = temp;
}

}

}


下面这个是添加向量成员的函数

void management::add(CStudentInfo &A, vector<CStudentInfo>&vecS, int &total, int &posi, CString &strStu)
{
bool hasStudent = false;
CStudentInfo temp(A.GetName(), A.GetSex(), A.Getadd(), A.GetNum(), A.Getmath(), A.Getccc(),A.GetAge());
for (unsigned int i = 0; i < vecS.size(); i++)
{
if (vecS[i].GetName() == A.GetName())
{
hasStudent = true;
}

}
if (!hasStudent)
{

int sortNO = 1;
for (unsigned int i = 0; i < vecS.size(); i++)
{
if (vecS[i].getTotal() > temp.getTotal())
{
sortNO++;
}

}
vecS.push_back(temp);
total = A.Getccc() + A.Getmath();//总分
posi = sortNO;//排名

}
};

然后这个是我用来保存数据的类
class CStudentInfo
{
public:
int getTotal();
CStudentInfo(){};
CStudentInfo(CString str1, int s, CString a, CString str2, int m, int c,int age);
//设置成员
void setName(CString str1);
void setSex(int s);
void setNum(CString str2);
void setmath(int m);
void setccc(int c);
void setaddress(CString a);
void setage(int age);


//读取成员
CString GetName(){ return strName; };
int GetSex(){ return sex; };
int GetAge(){ return age; };
CString Getadd(){ return address; };
CString GetNum(){ return strNum; };
int Getmath(){ return math; };
int Getccc(){ return ccc; };




private:
CString strName;
int sex;
int math;
int ccc;
int age;
CString address;
CString strNum;





};
#endif

这个是每次添加向量后,运行一下打包函数,把刚刚添加的向量内容展示在MFC的列表上用的
CString CstuuuuuuuuudentDlg::pack(std::vector<CStudentInfo>& vec)
{
CString str;
str = " 姓名 性别 学号 地址 年龄 数学 C++ 总分 名次 ";
CString temp;
for (unsigned int i = 0; i < vec.size(); i++)
{
str += "\r\n ";
str += vec[i].GetName();
if ((vec[i].GetName()).GetLength() ==2)
{
str += "-";
}
else if ((vec[i].GetName()).GetLength() == 1)
{
str += "--";
}
if (vec[i].GetSex())
{
temp = " 女";
}
else
{
temp = " 男";
};
str += temp;
str += " ";
str += vec[i].GetNum();
if ((vec[i].GetNum()).GetLength() != 10)
{
int a;
a = (vec[i].GetNum()).GetLength();
for (int i = a; i < 10; i++)
{
str += "-";
}
}
str += " ";
str += vec[i].Getadd();
temp.Format(_T(" %d %d %d %d"),vec[i].GetAge(), vec[i].Getmath(), vec[i].Getccc(), vec[i].getTotal());
str += temp;
int sortNO = 1;
for (unsigned int j = 1; j < vecStudents.size(); j++)
{
if (vec[j].getTotal() > vec[i].getTotal())
{
sortNO++;
}
}
temp.Format(_T(" 第%d名 "), sortNO);
str += temp;


}
return str;
};
...全文
216 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2017-01-15
  • 打赏
  • 举报
回复
还有,你百度冒泡排序,参考它的代码,把判断条件修改为 vecS[i].getTotal() > vecS[j].getTotal() //降序 vecS[i].getTotal() < vecS[j].getTotal() //升序
幻夢之葉 2017-01-15
  • 打赏
  • 举报
回复

// 升序
bool StudentIncrease(const CStudentInfo &lhs, const CStudentInfo& rhs)
{
	return lhs.getTotal() < rhs.getTotal();
}

// 降序
bool StudentDecrease(const CStudentInfo &lhs, const CStudentInfo& rhs)
{
	return lhs.getTotal() > rhs.getTotal();
}

void management::sort(vector<CStudentInfo>&vecS)
{
	std::sort(vecS.begin(), vecS.end(), StudentIncrease);
}
赵4老师 2017-01-15
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
sinat_34810705 2017-01-14
  • 打赏
  • 举报
回复
引用 2 楼 chenzhp 的回复:
for (j = i - 1; temp.getTotal() > vecS[j].getTotal()&&j>=0; j--)
{
//这个循环里面,当i=1的时候,j是从0开始,第一次循环 j=0,第二次就是j--了,然后j就变成-1
于是第二次,就是 vecS[0]=vecS[-1] ,我觉得应该把j>=0改为j>0吧。
vecS[j + 1] = vecS[j];

}
我改了以后我试着输了几个数据,发现它只有第一个是不会被排序的,其他下面的都会按照顺序来排
sinat_34810705 2017-01-14
  • 打赏
  • 举报
回复
引用 2 楼 chenzhp 的回复:
for (j = i - 1; temp.getTotal() > vecS[j].getTotal()&&j>=0; j--)
{
//这个循环里面,当i=1的时候,j是从0开始,第一次循环 j=0,第二次就是j--了,然后j就变成-1
于是第二次,就是 vecS[0]=vecS[-1] ,我觉得应该把j>=0改为j>0吧。
vecS[j + 1] = vecS[j];

}
谢谢回复,我立刻去试试
chenzhp 2017-01-14
  • 打赏
  • 举报
回复
for (j = i - 1; temp.getTotal() > vecS[j].getTotal()&&j>=0; j--)
{
//这个循环里面,当i=1的时候,j是从0开始,第一次循环 j=0,第二次就是j--了,然后j就变成-1
于是第二次,就是 vecS[0]=vecS[-1] ,我觉得应该把j>=0改为j>0吧。
vecS[j + 1] = vecS[j];

}
sinat_34810705 2017-01-14
  • 打赏
  • 举报
回复
自顶
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧