鱼C论坛

 找回密码
 立即注册
查看: 2773|回复: 32

[已解决]求助关于 如何分开对链表数据排序

[复制链接]
发表于 2018-4-28 16:47:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
班级排名:计算每个学生总成绩在班级中的名次。

然后班级又有很多个,怎么对有多个数据的动态链表的学生数据进行排序并记入链表??

譬如: 计算机  软件工程 网络工程 3个专业   各有3个学生  录入学生的数据顺序是随机的  ,我该怎么把每个学生的班级排名数据写入链表???
最佳答案
2018-5-5 21:15:23
动态输入的版本 “完成了”
只完成了动态输入部分,其他部分没有完成,也不会被完成了
^_^
#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


请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-5 21:15:23 | 显示全部楼层    本楼为最佳答案   
动态输入的版本 “完成了”
只完成了动态输入部分,其他部分没有完成,也不会被完成了
^_^
#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


请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-4-28 17:07:09 | 显示全部楼层
没有人吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-29 11:25:56 | 显示全部楼层
来人啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-29 13:05:25 | 显示全部楼层

这个不难吧^_^
先把你自己写的那部分贴上来,你要对链表排序,首先你先把链表写好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-29 13:19:59 | 显示全部楼层
人造人 发表于 2018-4-29 13:05
这个不难吧^_^
先把你自己写的那部分贴上来,你要对链表排序,首先你先把链表写好

我 不会写 这个函数 我只要实现void classrank(struct *undergraduate);并写入数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-29 13:26:40 | 显示全部楼层
struct Undergraduate {                                                        //本科生
        int num;                                                                        //学号
        char name[10];                                                                //姓名
        char sex1[4];                                                            //性别
        char profession[20];                                                //专业
        char classroom[20];                                                        //班级
        int TotalScore;                                                                //总成绩
        int Undergraduate_math;                                                //本科生 高数  
        int Undergraduate_English;                                        //本科生 英语 
        int Undergraduate_Cscore;                                        //本科生 c语言  
        int Classrank;                                                                //班级排名
        int Schoolrank;                                                                //校排名
        struct Undergraduate *next;
}*under_head;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-30 00:53:31 | 显示全部楼层

只有这些吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-3 18:44:32 | 显示全部楼层
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 = (struct  Undergraduate *)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=(struct  Postgraduate *)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;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-3 18:45:18 | 显示全部楼层

emmm 这是录入信息的 录入完 后就怎样 分班排名??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-3 18:47:07 | 显示全部楼层
ssg 发表于 2018-5-3 18:45
emmm 这是录入信息的 录入完 后就怎样 分班排名??

我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-3 18:53:52 | 显示全部楼层
ssg 发表于 2018-5-3 18:45
emmm 这是录入信息的 录入完 后就怎样 分班排名??


把代码发完整

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-3 22:43:28 | 显示全部楼层
#define LEN1 sizeof(struct Undergraduate)//本科生
enum sex { 男 = 1, 女 };
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-3 22:46:11 | 显示全部楼层

我的代码写得乱。。。。不好意思大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-3 23:54:18 | 显示全部楼层
ssg 发表于 2018-5-3 22:46
我的代码写得乱。。。。不好意思大佬

把代码发完整
^_^

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-4 00:00:43 | 显示全部楼层
这个程序必须用C语言写吗?
我想用C++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-4 00:11:09 | 显示全部楼层
我需要一些输入数据

专业 有哪些选项?
班级 有哪些选项?
成绩最高100分最低0分?


无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-4 00:21:39 | 显示全部楼层
专业 我百度到了,有好多选项
班级 应该如何填?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-4 00:45:29 | 显示全部楼层
人造人 发表于 2018-5-4 00:21
专业 我百度到了,有好多选项
班级 应该如何填?

这张表不完整,没办法继续向下写了,需要先完成这张表

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-4 07:54:52 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-5-4 00:00
这个程序必须用C语言写吗?
我想用C++

emmm 我修c 和 Java  没修c++成绩0-100就行,其他我自己修改下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-4 07:56:53 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-5-4 00:21
专业 我百度到了,有好多选项
班级 应该如何填?

可以写专业1  专业2    班级写1班,2班这样,比较简洁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 20:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表