求助关于 如何分开对链表数据排序
班级排名:计算每个学生总成绩在班级中的名次。然后班级又有很多个,怎么对有多个数据的动态链表的学生数据进行排序并记入链表??
譬如: 计算机软件工程 网络工程 3个专业 各有3个学生录入学生的数据顺序是随机的,我该怎么把每个学生的班级排名数据写入链表??? 动态输入的版本 “完成了”
只完成了动态输入部分,其他部分没有完成,也不会被完成了
^_^
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <windows.h>
// 本科生
struct Undergraduate
{
int num; // 学号
std::string name; // 姓名
std::string sex1; // 性别
int Undergraduate_math; // 本科生 高数
int Undergraduate_English; // 本科生 英语
int Undergraduate_Cscore; // 本科生 c语言
int TotalScore; // 总成绩
int Classrank; // 班级排名
int Schoolrank; // 校排名
};
// 班级
struct Classroom
{
std::string classroom_name; // 班级名
std::vector<Undergraduate> u; // 本科生
};
// 专业
struct Profession
{
std::string profession_name; // 专业名
std::vector<Classroom> c; // 班级
};
// 学校
struct School
{
std::string school_name; // 校名
std::vector<Profession> pro; // 专业
};
//// 录入数据
//void InputDataDebug(School &dest, const std::vector<UndergraduateDebug> &src) // debug版本
//{
// for(auto iterator = src.begin(); iterator != src.end(); ++iterator)
// {
// // 确定专业
// std::vector<Profession>::iterator i = dest.pro.end();
// for(auto iter = dest.pro.begin(); iter != dest.pro.end(); ++iter)
// {
// if(iterator->profession == iter->profession_name)
// {
// i = iter;
// break;
// }
// }
//
// // 没有就加一个
// if(i == dest.pro.end())
// {
// // 在添加时确保专业是有序的
// for(auto iter = dest.pro.begin(); iter != dest.pro.end(); ++iter)
// {
// if(iter->profession_name > iterator->profession)
// {
// i = dest.pro.insert(iter, Profession({iterator->profession, std::vector<Classroom>()}));
// break;
// }
// }
//
// // i 任然等于dest.pro.end(),添加到最后
// if(i == dest.pro.end())
// {
// dest.pro.push_back(Profession({iterator->profession, std::vector<Classroom>()}));
// i = dest.pro.end() - 1;
// }
// }
//
// // 确定班级
// std::vector<Classroom>::iterator j = i->c.end();
// for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
// {
// if(iterator->classroom == iter->classroom_name)
// {
// j = iter;
// break;
// }
// }
//
// // 没有就加一个
// if(j == i->c.end())
// {
// // 在添加时确保班级是有序的
// for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
// {
// if(iter->classroom_name > iterator->classroom)
// {
// j = i->c.insert(iter, Classroom({iterator->classroom, std::vector<Undergraduate>()}));
// break;
// }
// }
//
// // j 任然等于i->c.end(),添加到最后
// if(j == i->c.end())
// {
// i->c.push_back(Classroom({iterator->classroom, std::vector<Undergraduate>()}));
// j = i->c.end() - 1;
// }
// }
//
// // 确定学生在班级中的位置
// std::vector<Undergraduate>::iterator k = j->u.end();
// int TotalScore = iterator->Undergraduate_math + iterator->Undergraduate_English + iterator->Undergraduate_Cscore;
// for(auto iter = j->u.begin(); iter != j->u.end(); ++iter)
// {
// if(iter->TotalScore < TotalScore)
// {
// k = iter;
// break;
// }
// }
//
// Undergraduate u;
// u.num = iterator->num;
// u.name = iterator->name;
// u.sex1 = iterator->sex1;
// u.Undergraduate_math = iterator->Undergraduate_math;
// u.Undergraduate_English = iterator->Undergraduate_English;
// u.Undergraduate_Cscore = iterator->Undergraduate_Cscore;
// u.TotalScore = TotalScore; // 上面已经计算过了
// u.Classrank = 0; // 暂时填0
// u.Schoolrank = 0; // 暂时填0
//
// j->u.insert(k, u);
// }
//}
// 录入数据
void InputData(School &s, const std::string profession_name, const std::string classroom_name, const Undergraduate &u)
{
// 确定专业
std::vector<Profession>::iterator i = s.pro.end();
for(auto iter = s.pro.begin(); iter != s.pro.end(); ++iter)
{
if(profession_name == iter->profession_name)
{
i = iter;
break;
}
}
// 没有就加一个
if(i == s.pro.end())
{
// 在添加时确保专业是有序的
for(auto iter = s.pro.begin(); iter != s.pro.end(); ++iter)
{
if(iter->profession_name > profession_name)
{
i = s.pro.insert(iter, Profession{profession_name, std::vector<Classroom>()});
break;
}
}
// i 任然等于dest.pro.end(),添加到最后
if(i == s.pro.end())
{
s.pro.push_back(Profession{profession_name, std::vector<Classroom>()});
i = s.pro.end() - 1;
}
}
// 确定班级
std::vector<Classroom>::iterator j = i->c.end();
for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
{
if(classroom_name == iter->classroom_name)
{
j = iter;
break;
}
}
// 没有就加一个
if(j == i->c.end())
{
// 在添加时确保班级是有序的
for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
{
if(iter->classroom_name > classroom_name)
{
j = i->c.insert(iter, Classroom{classroom_name, std::vector<Undergraduate>()});
break;
}
}
// j 任然等于i->c.end(),添加到最后
if(j == i->c.end())
{
i->c.push_back(Classroom{classroom_name, std::vector<Undergraduate>()});
j = i->c.end() - 1;
}
}
// 确定学生在班级中的位置
std::vector<Undergraduate>::iterator k = j->u.end();
for(auto iter = j->u.begin(); iter != j->u.end(); ++iter)
{
if(iter->TotalScore < u.TotalScore)
{
k = iter;
break;
}
}
j->u.insert(k, u);
}
bool Compare(const std::vector<Undergraduate>::iterator &a, const std::vector<Undergraduate>::iterator &b)
{
return a->TotalScore > b->TotalScore;
}
std::string AlignString(std::string s, int length)
{
while(s.length() != length)
s.push_back(' ');
return s;
}
void DebugPrint(School &s)
{
#if 1
int length = 15;
std::cout << AlignString("校名:", length) << s.school_name << std::endl;
for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
{
std::cout << "-------------------------" << std::endl;
std::cout << AlignString("专业名:", length) << i->profession_name << std::endl;
std::cout << "-------------------------" << std::endl;
for(auto j = i->c.begin(); j != i->c.end(); ++j)
{
std::cout << "*************************" << std::endl;
std::cout << AlignString("班级名:", length) << j->classroom_name << std::endl;
for(auto k = j->u.begin(); k != j->u.end(); ++k)
{
std::cout << AlignString("学号:", length) << k->num << std::endl;
std::cout << AlignString("姓名:", length) << k->name << std::endl;
std::cout << AlignString("性别:", length) << k->sex1 << std::endl;
std::cout << AlignString("本科生 高数:", length) << k->Undergraduate_math << std::endl;
std::cout << AlignString("本科生 英语:", length) << k->Undergraduate_English << std::endl;
std::cout << AlignString("本科生 c语言:", length) << k->Undergraduate_Cscore << std::endl;
std::cout << AlignString("总成绩:", length) << k->TotalScore << std::endl;
std::cout << AlignString("班级排名:", length) << k->Classrank << std::endl;
std::cout << AlignString("校排名:", length) << k->Schoolrank << std::endl;
std::cout << std::endl;
}
std::cout << std::endl;
}
}
#else
// 另一种输出,按校级排名输出
std::vector<std::vector<Undergraduate>::iterator> tmp;
for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
{
for(auto j = i->c.begin(); j != i->c.end(); ++j)
{
for(auto k = j->u.begin(); k != j->u.end(); ++k)
{
tmp.push_back(k);
}
}
}
// 排序
std::sort(tmp.begin(), tmp.end(), Compare);
int length = 15;
for(auto iter = tmp.begin(); iter != tmp.end(); ++iter)
{
std::cout << AlignString("学号:", length) << (*iter)->num << std::endl;
std::cout << AlignString("姓名:", length) << (*iter)->name << std::endl;
std::cout << AlignString("性别:", length) << (*iter)->sex1 << std::endl;
std::cout << AlignString("本科生 高数:", length) << (*iter)->Undergraduate_math << std::endl;
std::cout << AlignString("本科生 英语:", length) << (*iter)->Undergraduate_English << std::endl;
std::cout << AlignString("本科生 c语言:", length) << (*iter)->Undergraduate_Cscore << std::endl;
std::cout << AlignString("总成绩:", length) << (*iter)->TotalScore << std::endl;
std::cout << AlignString("班级排名:", length) << (*iter)->Classrank << std::endl;
std::cout << AlignString("校排名:", length) << (*iter)->Schoolrank << std::endl;
std::cout << std::endl;
}
#endif
}
// ********************************************************************************************
// 排名
void Rank(School &s)
{
// 处理班级排名
// 学生在班级中已经是有序的
for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
{
for(auto j = i->c.begin(); j != i->c.end(); ++j)
{
int count = 0;
for(auto k = j->u.begin(); k != j->u.end(); ++k)
{
k->Classrank = ++count;
}
}
}
// 处理校级排名
// 我也没有什么好办法^_^
std::vector<std::vector<Undergraduate>::iterator> tmp;
for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
{
for(auto j = i->c.begin(); j != i->c.end(); ++j)
{
for(auto k = j->u.begin(); k != j->u.end(); ++k)
{
tmp.push_back(k);
}
}
}
// 排序
std::sort(tmp.begin(), tmp.end(), Compare);
// 填序号就可以了
int count = 0;
for(auto iter = tmp.begin(); iter != tmp.end(); ++iter)
{
(*iter)->Schoolrank = ++count;
}
}
// 为了方便,就把所有函数挤在一个cpp文件了
// 这样好像并不“方便”,目前就这样了
//static void SetXY(int x, int y)
//{
// SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), COORD({(short)x, (short)y}));
//}
//
//static COORD GetXY()
//{
// CONSOLE_SCREEN_BUFFER_INFO csbi;
// GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
// return COORD{csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y};
//}
//
//static void HideCursor()
//{
// HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
// CONSOLE_CURSOR_INFO cci;
// GetConsoleCursorInfo(hOut, &cci);
// cci.bVisible = false;
// SetConsoleCursorInfo(hOut, &cci);
//}
//void DrawMenu()
//{
// const int WINDOW_X = 180;
// const int WINDOW_Y = 45;
// const std::string menu_select[] =
// {
// "1.添加 --- 添加学生信息",
// "2.删除 --- 删除学生信息",
// "3.修改 --- 修改学生信息",
// "4.查看 --- 查看学生信息"
// };
//
// for(int y = 0; y < WINDOW_Y - 1; ++y)
// {
// for(int x = 0; x < WINDOW_X; ++x)
// {
// if(((y == 0) || (y == WINDOW_Y - 2)) || ((x == 0) || (x == WINDOW_X - 1)))
// {
// SetXY(x, y);
// std::cout.put('*');
// }
// }
// }
//
//
//}
int main()
{
School s = {"校名", std::vector<Profession>()};
int count = 5;
while(count--)
{
std::string profession_name;
std::string classroom_name;
Undergraduate u;
std::cout << "学号:";
std::cin >> u.num;
std::cout << "姓名:";
std::cin >> u.name;
std::cout << "性别:";
std::cin >> u.sex1;
std::cout << "专业:";
std::cin >> profession_name;
std::cout << "班级:";
std::cin >> classroom_name;
std::cout << "本科生 高数:";
std::cin >> u.Undergraduate_math;
std::cout << "本科生 英语:";
std::cin >> u.Undergraduate_English;
std::cout << "本科生 c语言:";
std::cin >> u.Undergraduate_Cscore;
u.TotalScore = u.Undergraduate_math + u.Undergraduate_English + u.Undergraduate_Cscore;
u.Classrank = 0;
u.Schoolrank = 0;
InputData(s, profession_name, classroom_name, u);
}
Rank(s);
DebugPrint(s);
//HideCursor();
//DrawMenu();
//// 学号我就不管了,有重复也不管了,^_^
//std::vector<UndergraduateDebug> info_tab =
//{
// {0, "学生1", "女", "专业3", "班级2", 70, 50, 20, 0, 0, 0},
// {1, "学生2", "男", "专业1", "班级3", 99, 45, 80, 0, 0, 0},
// {2, "学生3", "男", "专业2", "班级1", 30, 20, 80, 0, 0, 0},
// {3, "学生4", "男", "专业2", "班级2", 20, 40, 60, 0, 0, 0},
// {4, "学生5", "女", "专业1", "班级1", 10, 58, 70, 0, 0, 0},
// {5, "学生6", "女", "专业3", "班级3", 55, 60, 90, 0, 0, 0},
// {6, "学生7", "男", "专业1", "班级1", 75, 57, 62, 0, 0, 0},
// {7, "学生8", "女", "专业3", "班级2", 75, 52, 18, 0, 0, 0},
// {8, "学生9", "男", "专业1", "班级3", 97, 89, 55, 0, 0, 0},
// {9, "学生10", "男", "专业2", "班级1", 35, 21, 88, 0, 0, 0},
// {10, "学生11", "男", "专业2", "班级2", 13, 18, 64, 0, 0, 0},
// {11, "学生12", "女", "专业1", "班级1", 19, 59, 53, 0, 0, 0},
// {12, "学生13", "女", "专业3", "班级3", 59, 51, 52, 0, 0, 0},
// {13, "学生14", "男", "专业1", "班级1", 70, 68, 30, 0, 0, 0}
//};
//
//School s = {"校名", std::vector<Profession>()};
//InputDataDebug(s, info_tab);
//Rank(s);
//DebugPrint(s);
return 0;
}
学号:0
姓名:姓名0
性别:男
专业:专业0
班级:班级0
本科生 高数:99
本科生 英语:10
本科生 c语言:30
学号:1
姓名:姓名1
性别:女
专业:专业1
班级:班级0
本科生 高数:10
本科生 英语:2
本科生 c语言:32
学号:2
姓名:姓名2
性别:女
专业:专业1
班级:班级0
本科生 高数:12
本科生 英语:32
本科生 c语言:34
学号:3
姓名:姓名3
性别:男
专业:专业0
班级:班级0
本科生 高数:12
本科生 英语:45
本科生 c语言:78
学号:4
姓名:姓名4
性别:女
专业:专业0
班级:班级1
本科生 高数:87
本科生 英语:65
本科生 c语言:43
校名: 校名
-------------------------
专业名: 专业0
-------------------------
*************************
班级名: 班级0
学号: 0
姓名: 姓名0
性别: 男
本科生 高数:99
本科生 英语:10
本科生 c语言: 30
总成绩: 139
班级排名: 1
校排名: 2
学号: 3
姓名: 姓名3
性别: 男
本科生 高数:12
本科生 英语:45
本科生 c语言: 78
总成绩: 135
班级排名: 2
校排名: 3
*************************
班级名: 班级1
学号: 4
姓名: 姓名4
性别: 女
本科生 高数:87
本科生 英语:65
本科生 c语言: 43
总成绩: 195
班级排名: 1
校排名: 1
-------------------------
专业名: 专业1
-------------------------
*************************
班级名: 班级0
学号: 2
姓名: 姓名2
性别: 女
本科生 高数:12
本科生 英语:32
本科生 c语言: 34
总成绩: 78
班级排名: 1
校排名: 4
学号: 1
姓名: 姓名1
性别: 女
本科生 高数:10
本科生 英语:2
本科生 c语言: 32
总成绩: 44
班级排名: 2
校排名: 5
请按任意键继续. . . 没有人吗??? 来人啊{:10_266:} ssg 发表于 2018-4-29 11:25
来人啊
这个不难吧^_^
先把你自己写的那部分贴上来,你要对链表排序,首先你先把链表写好 人造人 发表于 2018-4-29 13:05
这个不难吧^_^
先把你自己写的那部分贴上来,你要对链表排序,首先你先把链表写好
我 不会写 这个函数 我只要实现void classrank(struct *undergraduate);并写入数据 struct Undergraduate { //本科生
int num; //学号
char name; //姓名
char sex1; //性别
char profession; //专业
char classroom; //班级
int TotalScore; //总成绩
int Undergraduate_math; //本科生 高数
int Undergraduate_English; //本科生 英语
int Undergraduate_Cscore; //本科生 c语言
int Classrank; //班级排名
int Schoolrank; //校排名
struct Undergraduate *next;
}*under_head; ssg 发表于 2018-4-29 13:26
只有这些吗? 人造人 发表于 2018-4-30 00:53
只有这些吗?
void luru() {
int flag;
struct Undergraduate *head1, *p1, *p2;
struct Postgraduate *head2, *p3, *p4;
int yy;
int n;
char xx;
FILE *p_file;
head1 = NULL;
p1 = NULL;
p2 = NULL;
head2 = NULL;
p3 = NULL;
p4 = NULL;
printf("\t\t_____________________________\n");
printf("\t\t| 学生管理系统 |\n");
printf("\t\t_____________________________\n");
printf("\t\t| |\n");
printf("\t\t| 输入1添加 |\n");
printf("\t\t| 输入0退出 |\n");
printf("\t\t|___________________________|\n");
xx = getch();
while (xx != '1'&& xx != '0') {
printf("重新输入:");
xx = getch();
}
if (xx == '1')
flag = 1;
else
flag = 0;
while (flag == 1) {
system("CLS");
printf("\t\t_____________________________\n");
printf("\t\t| 学生管理系统 |\n");
printf("\t\t_____________________________\n");
printf("\t\t| |\n");
printf("\t\t| 1.添加本科生信息 |\n");
printf("\t\t| 2.添加研究生信息 |\n");
printf("\t\t| "); color(4); printf("0.退出"); color(16); printf(" |\n");
printf("\t\t|___________________________|\n");
xx = getch();
if (xx == '1') {
n = 0;
p1 = p2;
while (xx == '1') {
p1 = (structUndergraduate *)malloc(LEN1);
printf("请输入学生的姓名:");
scanf("%s", p1->name);
printf("请输入学生的性别(1.男/2.女):");
scanf("%d", &yy);
switch (yy) {
case 1:
strcpy(p1->sex1,"男");
break;
case 2:
strcpy(p1->sex1,"女");
break;
}
printf("请输入学生的专业:");
scanf("%s", &p1->profession);
printf("请输入学生的班级:");
scanf("%s", &p1->classroom);
printf("请输入高数成绩:");
scanf("%d", &p1->Undergraduate_math);
while (p1->Undergraduate_math < -1 || p1->Undergraduate_math>100) {
printf("输入错误,请重新输入:");
scanf("%d", &p1->Undergraduate_math);
}
printf("请输入英语成绩:");
scanf("%d", &p1->Undergraduate_English);
while (p1->Undergraduate_English < -1 || p1->Undergraduate_English>100) {
printf("输入错误,请重新输入:");
scanf("%d", &p1->Undergraduate_English);
}
printf("请输入C语言成绩:");
scanf("%d", &p1->Undergraduate_Cscore);
while (p1->Undergraduate_Cscore < -1 || p1->Undergraduate_Cscore>100) {
printf("输入错误,请重新输入:");
scanf("%d", &p1->Undergraduate_Cscore);
}
if (p1->Undergraduate_Cscore == -1 || p1->Undergraduate_English == -1 || p1->Undergraduate_math == -1)
p1->TotalScore = -1;
else
p1->TotalScore = p1->Undergraduate_math + p1->Undergraduate_English + p1->Undergraduate_Cscore;
n++;
if (n == 1)
{
head1 = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
/*
count1++;
p2->num = count1;
*/
printf("\n\t\t1.继续添加 0.退出\n\n");
getchar();
xx = getch();
if (xx == '0') {
p2->next = NULL;
if (under_head == NULL)
under_head = head1;
else
{
under_head = insert_U(under_head, head1); //插入
}
break;
}
}
}
else if (xx == '2') {
n = 0;
p3 = p4;
while (xx == '2') {
p3=(structPostgraduate *)malloc(LEN2);
printf("请输入学生的姓名:");
scanf("%s", p3->name);
printf("请输入学生的性别(1.男/2.女):");
scanf("%d", &yy);
switch (yy) {
case 1:
strcpy(p3->sex1, "男");
break;
case 2:
strcpy(p3->sex1, "女");
break;
}
printf("请输入学生的专业:");
scanf("%s", &p3->profession);
printf("请输入学生的班级:");
scanf("%s", &p3->classroom);
printf("请输入研究方向:");
scanf("%s",&p3->Postgraduate_direction);
while (p3->Postgraduate_direction == NULL) {
printf("输入错误,请重新输入:");
scanf("%s", &p3->Postgraduate_direction);
}
printf("请输入导师姓名:");
scanf("%s", &p3->Postgraduate_tutor);
while (p3->Postgraduate_tutor==NULL) {
printf("输入错误,请重新输入:");
scanf("%s", &p3->Postgraduate_tutor);
}
printf("请输入论文成绩:");
scanf("%d", &p3->Postgraduate_Thesismark);
while (p3->Postgraduate_Thesismark< -1 || p3->Postgraduate_Thesismark>100) {
printf("输入错误,请重新输入:");
scanf("%d", &p3->Postgraduate_Thesismark);
}
printf("请输入课程综合成绩:");
scanf("%d", &p3->Postgraduate_sum);
while (p3->Postgraduate_sum< -1 || p3->Postgraduate_sum>500) {
printf("输入错误,请重新输入:");
scanf("%d", &p3->Postgraduate_sum);
}
if (p3->Postgraduate_Thesismark == -1 || p3->Postgraduate_sum == -1)
p3->TotalScore = -1;
else
p3->TotalScore = p3->Postgraduate_Thesismark + p3->Postgraduate_sum;
n++;
/*
count2++;
p3->num = count2;
*/
if (n == 1)
{
head2 = p3;
}
else
{
p4->next = p3;
}
p4 = p3;
printf("\n\t\t2.继续添加 0.退出\n\n");
getchar();
xx = getch();
if (xx == '0') {
p4->next = NULL;
if (post_head == NULL)
post_head = head2;
else {
post_head = insert_P(post_head, head2);//插入
}
break;
}
}
}
else if(xx = '0')
break;
}
} 人造人 发表于 2018-4-30 00:53
只有这些吗?
emmm 这是录入信息的 录入完 后就怎样 分班排名?? ssg 发表于 2018-5-3 18:45
emmm 这是录入信息的 录入完 后就怎样 分班排名??
我看看 ssg 发表于 2018-5-3 18:45
emmm 这是录入信息的 录入完 后就怎样 分班排名??
把代码发完整
人造人 发表于 2018-5-3 18:53
把代码发完整
#define LEN1 sizeof(struct Undergraduate)//本科生
enum sex { 男 = 1, 女 }; ssg 发表于 2018-5-3 22:43
我的代码写得乱。。。。不好意思大佬 ssg 发表于 2018-5-3 22:46
我的代码写得乱。。。。不好意思大佬
把代码发完整
^_^
这个程序必须用C语言写吗?
我想用C++
我需要一些输入数据
专业 有哪些选项?
班级 有哪些选项?
成绩最高100分最低0分?
专业 我百度到了,有好多选项
班级 应该如何填?
人造人 发表于 2018-5-4 00:21
专业 我百度到了,有好多选项
班级 应该如何填?
这张表不完整,没办法继续向下写了,需要先完成这张表
人造人 发表于 2018-5-4 00:00
这个程序必须用C语言写吗?
我想用C++
emmm 我修c 和 Java没修c++成绩0-100就行,其他我自己修改下 人造人 发表于 2018-5-4 00:21
专业 我百度到了,有好多选项
班级 应该如何填?
可以写专业1专业2 班级写1班,2班这样,比较简洁
页:
[1]
2