鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: ssg

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

[复制链接]
 楼主| 发表于 2018-5-4 07:58:35 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-5-3 23:54
把代码发完整
^_^

只需实现x==1那里的排序就行,剩下的选项2我自己参考着写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-4 08:01:53 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-5-3 23:54
把代码发完整
^_^

把这部分代码删除了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-4 13:38:50 | 显示全部楼层
ssg 发表于 2018-5-4 07:56
可以写专业1  专业2    班级写1班,2班这样,比较简洁

好主意
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 11:59:25 | 显示全部楼层
debug 版本已经完成
我还需要花些时间,修改一下,把输入数据改成动态输入,而不是使用info_tab

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>

  5. // 本科生
  6. // debug版本
  7. struct UndergraduateDebug
  8. {
  9.         int                num;                        // 学号
  10.         std::string        name;                        // 姓名
  11.         std::string        sex1;                        // 性别
  12.         std::string        profession;                // 专业
  13.         std::string        classroom;                // 班级
  14.         int                Undergraduate_math;        // 本科生 高数
  15.         int                Undergraduate_English;        // 本科生 英语
  16.         int                Undergraduate_Cscore;        // 本科生 c语言
  17.         int                TotalScore;                // 总成绩
  18.         int                Classrank;                // 班级排名
  19.         int                Schoolrank;                // 校排名
  20. };


  21. // 本科生
  22. struct Undergraduate
  23. {
  24.         int                num;                        // 学号
  25.         std::string        name;                        // 姓名
  26.         std::string        sex1;                        // 性别
  27.         int                Undergraduate_math;        // 本科生 高数
  28.         int                Undergraduate_English;        // 本科生 英语
  29.         int                Undergraduate_Cscore;        // 本科生 c语言
  30.         int                TotalScore;                // 总成绩
  31.         int                Classrank;                // 班级排名
  32.         int                Schoolrank;                // 校排名
  33. };

  34. // 班级
  35. struct Classroom
  36. {
  37.         std::string        classroom_name;                // 班级名
  38.         std::vector<Undergraduate> u;                // 本科生
  39. };

  40. // 专业
  41. struct Profession
  42. {
  43.         std::string        profession_name;        // 专业名
  44.         std::vector<Classroom> c;                // 班级
  45. };

  46. // 学校
  47. struct School
  48. {
  49.         std::string        school_name;                // 校名
  50.         std::vector<Profession> pro;                // 专业
  51. };

  52. // 录入数据
  53. void InputDataDebug(School &dest, const std::vector<UndergraduateDebug> &src)        // debug版本
  54. {
  55.         for(auto iterator = src.begin(); iterator != src.end(); ++iterator)
  56.         {
  57.                 // 确定专业
  58.                 std::vector<Profession>::iterator i = dest.pro.end();
  59.                 for(auto iter = dest.pro.begin(); iter != dest.pro.end(); ++iter)
  60.                 {
  61.                         if(iterator->profession == iter->profession_name)
  62.                         {
  63.                                 i = iter;
  64.                                 break;
  65.                         }
  66.                 }

  67.                 // 没有就加一个
  68.                 if(i == dest.pro.end())
  69.                 {
  70.                         // 在添加时确保专业是有序的
  71.                         for(auto iter = dest.pro.begin(); iter != dest.pro.end(); ++iter)
  72.                         {
  73.                                 if(iter->profession_name > iterator->profession)
  74.                                 {
  75.                                         i = dest.pro.insert(iter, Profession({iterator->profession, std::vector<Classroom>()}));
  76.                                         break;
  77.                                 }
  78.                         }

  79.                         // i 任然等于dest.pro.end(),添加到最后
  80.                         if(i == dest.pro.end())
  81.                         {
  82.                                 dest.pro.push_back(Profession({iterator->profession, std::vector<Classroom>()}));
  83.                                 i = dest.pro.end() - 1;
  84.                         }
  85.                 }

  86.                 // 确定班级
  87.                 std::vector<Classroom>::iterator j = i->c.end();
  88.                 for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
  89.                 {
  90.                         if(iterator->classroom == iter->classroom_name)
  91.                         {
  92.                                 j = iter;
  93.                                 break;
  94.                         }
  95.                 }

  96.                 // 没有就加一个
  97.                 if(j == i->c.end())
  98.                 {
  99.                         // 在添加时确保班级是有序的
  100.                         for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
  101.                         {
  102.                                 if(iter->classroom_name > iterator->classroom)
  103.                                 {
  104.                                         j = i->c.insert(iter, Classroom({iterator->classroom, std::vector<Undergraduate>()}));
  105.                                         break;
  106.                                 }
  107.                         }

  108.                         // j 任然等于i->c.end(),添加到最后
  109.                         if(j == i->c.end())
  110.                         {
  111.                                 i->c.push_back(Classroom({iterator->classroom, std::vector<Undergraduate>()}));
  112.                                 j = i->c.end() - 1;
  113.                         }
  114.                 }

  115.                 // 确定学生在班级中的位置
  116.                 std::vector<Undergraduate>::iterator k = j->u.end();
  117.                 int TotalScore = iterator->Undergraduate_math + iterator->Undergraduate_English + iterator->Undergraduate_Cscore;
  118.                 for(auto iter = j->u.begin(); iter != j->u.end(); ++iter)
  119.                 {
  120.                         if(iter->TotalScore < TotalScore)
  121.                         {
  122.                                 k = iter;
  123.                                 break;
  124.                         }
  125.                 }

  126.                 Undergraduate u;
  127.                 u.num = iterator->num;
  128.                 u.name = iterator->name;
  129.                 u.sex1 = iterator->sex1;
  130.                 u.Undergraduate_math = iterator->Undergraduate_math;
  131.                 u.Undergraduate_English = iterator->Undergraduate_English;
  132.                 u.Undergraduate_Cscore = iterator->Undergraduate_Cscore;
  133.                 u.TotalScore = TotalScore;        // 上面已经计算过了
  134.                 u.Classrank = 0;                // 暂时填0
  135.                 u.Schoolrank = 0;                // 暂时填0

  136.                 j->u.insert(k, u);
  137.         }
  138. }


  139. bool Compare(const std::vector<Undergraduate>::iterator &a, const std::vector<Undergraduate>::iterator &b)
  140. {
  141.         return a->TotalScore > b->TotalScore;
  142. }

  143. std::string AlignString(std::string s, int length)
  144. {
  145.         while(s.length() != length)
  146.                 s.push_back(' ');

  147.         return s;
  148. }
  149. void DebugPrint(School &s)
  150. {
  151. #if 1
  152.         int length = 15;

  153.         std::cout << AlignString("校名:", length) << s.school_name << std::endl;
  154.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  155.         {
  156.                 std::cout << "-------------------------" << std::endl;
  157.                 std::cout << AlignString("专业名:", length) << i->profession_name << std::endl;
  158.                 std::cout << "-------------------------" << std::endl;
  159.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  160.                 {
  161.                         std::cout << "*************************" << std::endl;
  162.                         std::cout << AlignString("班级名:", length) << j->classroom_name << std::endl;
  163.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  164.                         {
  165.                                 std::cout << AlignString("学号:", length)                << k->num << std::endl;
  166.                                 std::cout << AlignString("姓名:", length)                << k->name << std::endl;
  167.                                 std::cout << AlignString("性别:", length)                << k->sex1 << std::endl;
  168.                                 std::cout << AlignString("本科生 高数:", length)        << k->Undergraduate_math << std::endl;
  169.                                 std::cout << AlignString("本科生 英语:", length)        << k->Undergraduate_English << std::endl;
  170.                                 std::cout << AlignString("本科生 c语言:", length)        << k->Undergraduate_Cscore << std::endl;
  171.                                 std::cout << AlignString("总成绩:", length)                << k->TotalScore << std::endl;
  172.                                 std::cout << AlignString("班级排名:", length)                << k->Classrank << std::endl;
  173.                                 std::cout << AlignString("校排名:", length)                << k->Schoolrank << std::endl;
  174.                                 std::cout << std::endl;
  175.                         }
  176.                         std::cout << std::endl;
  177.                 }
  178.         }
  179. #else
  180.         // 另一种输出,按校级排名输出
  181.         std::vector<std::vector<Undergraduate>::iterator> tmp;
  182.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  183.         {
  184.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  185.                 {
  186.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  187.                         {
  188.                                 tmp.push_back(k);
  189.                         }
  190.                 }
  191.         }

  192.         // 排序
  193.         std::sort(tmp.begin(), tmp.end(), Compare);

  194.         int length = 15;
  195.         for(auto iter = tmp.begin(); iter != tmp.end(); ++iter)
  196.         {
  197.                 std::cout << AlignString("学号:", length) << (*iter)->num << std::endl;
  198.                 std::cout << AlignString("姓名:", length) << (*iter)->name << std::endl;
  199.                 std::cout << AlignString("性别:", length) << (*iter)->sex1 << std::endl;
  200.                 std::cout << AlignString("本科生 高数:", length) << (*iter)->Undergraduate_math << std::endl;
  201.                 std::cout << AlignString("本科生 英语:", length) << (*iter)->Undergraduate_English << std::endl;
  202.                 std::cout << AlignString("本科生 c语言:", length) << (*iter)->Undergraduate_Cscore << std::endl;
  203.                 std::cout << AlignString("总成绩:", length) << (*iter)->TotalScore << std::endl;
  204.                 std::cout << AlignString("班级排名:", length) << (*iter)->Classrank << std::endl;
  205.                 std::cout << AlignString("校排名:", length) << (*iter)->Schoolrank << std::endl;
  206.                 std::cout << std::endl;
  207.         }
  208. #endif
  209. }
  210. // ********************************************************************************************


  211. // 排名
  212. void Rank(School &s)
  213. {
  214.         // 处理班级排名
  215.         // 学生在班级中已经是有序的
  216.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  217.         {
  218.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  219.                 {
  220.                         int count = 0;
  221.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  222.                         {
  223.                                 k->Classrank = ++count;
  224.                         }
  225.                 }
  226.         }

  227.         // 处理校级排名
  228.         // 我也没有什么好办法^_^
  229.         std::vector<std::vector<Undergraduate>::iterator> tmp;
  230.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  231.         {
  232.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  233.                 {
  234.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  235.                         {
  236.                                 tmp.push_back(k);
  237.                         }
  238.                 }
  239.         }

  240.         // 排序
  241.         std::sort(tmp.begin(), tmp.end(), Compare);

  242.         // 填序号就可以了
  243.         int count = 0;
  244.         for(auto iter = tmp.begin(); iter != tmp.end(); ++iter)
  245.         {
  246.                 (*iter)->Schoolrank = ++count;
  247.         }
  248. }

  249. int main()
  250. {
  251.         // 学号我就不管了,有重复也不管了,^_^
  252.         std::vector<UndergraduateDebug> info_tab =
  253.         {
  254.                 {0, "学生1", "女", "专业3", "班级2", 70, 50, 20, 0, 0, 0},
  255.                 {1, "学生2", "男", "专业1", "班级3", 99, 45, 80, 0, 0, 0},
  256.                 {2, "学生3", "男", "专业2", "班级1", 30, 20, 80, 0, 0, 0},
  257.                 {3, "学生4", "男", "专业2", "班级2", 20, 40, 60, 0, 0, 0},
  258.                 {4, "学生5", "女", "专业1", "班级1", 10, 58, 70, 0, 0, 0},
  259.                 {5, "学生6", "女", "专业3", "班级3", 55, 60, 90, 0, 0, 0},
  260.                 {6, "学生7", "男", "专业1", "班级1", 75, 57, 62, 0, 0, 0},
  261.                 {7, "学生8", "女", "专业3", "班级2", 75, 52, 18, 0, 0, 0},
  262.                 {8, "学生9", "男", "专业1", "班级3", 97, 89, 55, 0, 0, 0},
  263.                 {9, "学生10", "男", "专业2", "班级1", 35, 21, 88, 0, 0, 0},
  264.                 {10, "学生11", "男", "专业2", "班级2", 13, 18, 64, 0, 0, 0},
  265.                 {11, "学生12", "女", "专业1", "班级1", 19, 59, 53, 0, 0, 0},
  266.                 {12, "学生13", "女", "专业3", "班级3", 59, 51, 52, 0, 0, 0},
  267.                 {13, "学生14", "男", "专业1", "班级1", 70, 68, 30, 0, 0, 0}
  268.         };
  269.        
  270.         School s = {"校名", std::vector<Profession>()};
  271.         InputDataDebug(s, info_tab);
  272.         Rank(s);
  273.         DebugPrint(s);

  274.         return 0;
  275. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-5 12:59:06 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-5-5 11:59
debug 版本已经完成
我还需要花些时间,修改一下,把输入数据改成动态输入,而不是使用info_tab

好厉害,大佬学c多少年了,羡慕嫉妒恨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 13:16:56 | 显示全部楼层
ssg 发表于 2018-5-5 12:59
好厉害,大佬学c多少年了,羡慕嫉妒恨

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

使用道具 举报

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

我看了半天没看懂你的c++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 18:12:49 | 显示全部楼层
ssg 发表于 2018-5-5 18:08
我看了半天没看懂你的c++

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

使用道具 举报

发表于 2018-5-5 18:13:18 | 显示全部楼层
ssg 发表于 2018-5-5 18:08
我看了半天没看懂你的c++

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

使用道具 举报

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

添加专业那些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

.end()  是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 19:53:41 | 显示全部楼层
ssg 发表于 2018-5-5 18:53
.end()  是什么意思

C++迭代器iterator
  1. #include <iostream>
  2. #include <vector>

  3. int main()
  4. {
  5.         std::vector<int> v = {1, 2, 3, 4, 5};
  6.         for(auto iter = v.begin(); iter != v.end(); ++iter)
  7.         {
  8.                 std::cout << *iter << std::endl;
  9.         }
  10.         return 0;
  11. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <windows.h>

  6. // 本科生
  7. struct Undergraduate
  8. {
  9.         int                num;                        // 学号
  10.         std::string        name;                        // 姓名
  11.         std::string        sex1;                        // 性别
  12.         int                Undergraduate_math;        // 本科生 高数
  13.         int                Undergraduate_English;        // 本科生 英语
  14.         int                Undergraduate_Cscore;        // 本科生 c语言
  15.         int                TotalScore;                // 总成绩
  16.         int                Classrank;                // 班级排名
  17.         int                Schoolrank;                // 校排名
  18. };

  19. // 班级
  20. struct Classroom
  21. {
  22.         std::string        classroom_name;                // 班级名
  23.         std::vector<Undergraduate> u;                // 本科生
  24. };

  25. // 专业
  26. struct Profession
  27. {
  28.         std::string        profession_name;        // 专业名
  29.         std::vector<Classroom> c;                // 班级
  30. };

  31. // 学校
  32. struct School
  33. {
  34.         std::string        school_name;                // 校名
  35.         std::vector<Profession> pro;                // 专业
  36. };

  37. //// 录入数据
  38. //void InputDataDebug(School &dest, const std::vector<UndergraduateDebug> &src)        // debug版本
  39. //{
  40. //        for(auto iterator = src.begin(); iterator != src.end(); ++iterator)
  41. //        {
  42. //                // 确定专业
  43. //                std::vector<Profession>::iterator i = dest.pro.end();
  44. //                for(auto iter = dest.pro.begin(); iter != dest.pro.end(); ++iter)
  45. //                {
  46. //                        if(iterator->profession == iter->profession_name)
  47. //                        {
  48. //                                i = iter;
  49. //                                break;
  50. //                        }
  51. //                }
  52. //
  53. //                // 没有就加一个
  54. //                if(i == dest.pro.end())
  55. //                {
  56. //                        // 在添加时确保专业是有序的
  57. //                        for(auto iter = dest.pro.begin(); iter != dest.pro.end(); ++iter)
  58. //                        {
  59. //                                if(iter->profession_name > iterator->profession)
  60. //                                {
  61. //                                        i = dest.pro.insert(iter, Profession({iterator->profession, std::vector<Classroom>()}));
  62. //                                        break;
  63. //                                }
  64. //                        }
  65. //
  66. //                        // i 任然等于dest.pro.end(),添加到最后
  67. //                        if(i == dest.pro.end())
  68. //                        {
  69. //                                dest.pro.push_back(Profession({iterator->profession, std::vector<Classroom>()}));
  70. //                                i = dest.pro.end() - 1;
  71. //                        }
  72. //                }
  73. //
  74. //                // 确定班级
  75. //                std::vector<Classroom>::iterator j = i->c.end();
  76. //                for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
  77. //                {
  78. //                        if(iterator->classroom == iter->classroom_name)
  79. //                        {
  80. //                                j = iter;
  81. //                                break;
  82. //                        }
  83. //                }
  84. //
  85. //                // 没有就加一个
  86. //                if(j == i->c.end())
  87. //                {
  88. //                        // 在添加时确保班级是有序的
  89. //                        for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
  90. //                        {
  91. //                                if(iter->classroom_name > iterator->classroom)
  92. //                                {
  93. //                                        j = i->c.insert(iter, Classroom({iterator->classroom, std::vector<Undergraduate>()}));
  94. //                                        break;
  95. //                                }
  96. //                        }
  97. //
  98. //                        // j 任然等于i->c.end(),添加到最后
  99. //                        if(j == i->c.end())
  100. //                        {
  101. //                                i->c.push_back(Classroom({iterator->classroom, std::vector<Undergraduate>()}));
  102. //                                j = i->c.end() - 1;
  103. //                        }
  104. //                }
  105. //
  106. //                // 确定学生在班级中的位置
  107. //                std::vector<Undergraduate>::iterator k = j->u.end();
  108. //                int TotalScore = iterator->Undergraduate_math + iterator->Undergraduate_English + iterator->Undergraduate_Cscore;
  109. //                for(auto iter = j->u.begin(); iter != j->u.end(); ++iter)
  110. //                {
  111. //                        if(iter->TotalScore < TotalScore)
  112. //                        {
  113. //                                k = iter;
  114. //                                break;
  115. //                        }
  116. //                }
  117. //
  118. //                Undergraduate u;
  119. //                u.num = iterator->num;
  120. //                u.name = iterator->name;
  121. //                u.sex1 = iterator->sex1;
  122. //                u.Undergraduate_math = iterator->Undergraduate_math;
  123. //                u.Undergraduate_English = iterator->Undergraduate_English;
  124. //                u.Undergraduate_Cscore = iterator->Undergraduate_Cscore;
  125. //                u.TotalScore = TotalScore;        // 上面已经计算过了
  126. //                u.Classrank = 0;                // 暂时填0
  127. //                u.Schoolrank = 0;                // 暂时填0
  128. //
  129. //                j->u.insert(k, u);
  130. //        }
  131. //}

  132. // 录入数据
  133. void InputData(School &s, const std::string profession_name, const std::string classroom_name, const Undergraduate &u)
  134. {
  135.         // 确定专业
  136.         std::vector<Profession>::iterator i = s.pro.end();
  137.         for(auto iter = s.pro.begin(); iter != s.pro.end(); ++iter)
  138.         {
  139.                 if(profession_name == iter->profession_name)
  140.                 {
  141.                         i = iter;
  142.                         break;
  143.                 }
  144.         }

  145.         // 没有就加一个
  146.         if(i == s.pro.end())
  147.         {
  148.                 // 在添加时确保专业是有序的
  149.                 for(auto iter = s.pro.begin(); iter != s.pro.end(); ++iter)
  150.                 {
  151.                         if(iter->profession_name > profession_name)
  152.                         {
  153.                                 i = s.pro.insert(iter, Profession{profession_name, std::vector<Classroom>()});
  154.                                 break;
  155.                         }
  156.                 }

  157.                 // i 任然等于dest.pro.end(),添加到最后
  158.                 if(i == s.pro.end())
  159.                 {
  160.                         s.pro.push_back(Profession{profession_name, std::vector<Classroom>()});
  161.                         i = s.pro.end() - 1;
  162.                 }
  163.         }

  164.         // 确定班级
  165.         std::vector<Classroom>::iterator j = i->c.end();
  166.         for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
  167.         {
  168.                 if(classroom_name == iter->classroom_name)
  169.                 {
  170.                         j = iter;
  171.                         break;
  172.                 }
  173.         }

  174.         // 没有就加一个
  175.         if(j == i->c.end())
  176.         {
  177.                 // 在添加时确保班级是有序的
  178.                 for(auto iter = i->c.begin(); iter != i->c.end(); ++iter)
  179.                 {
  180.                         if(iter->classroom_name > classroom_name)
  181.                         {
  182.                                 j = i->c.insert(iter, Classroom{classroom_name, std::vector<Undergraduate>()});
  183.                                 break;
  184.                         }
  185.                 }

  186.                 // j 任然等于i->c.end(),添加到最后
  187.                 if(j == i->c.end())
  188.                 {
  189.                         i->c.push_back(Classroom{classroom_name, std::vector<Undergraduate>()});
  190.                         j = i->c.end() - 1;
  191.                 }
  192.         }

  193.         // 确定学生在班级中的位置
  194.         std::vector<Undergraduate>::iterator k = j->u.end();
  195.         for(auto iter = j->u.begin(); iter != j->u.end(); ++iter)
  196.         {
  197.                 if(iter->TotalScore < u.TotalScore)
  198.                 {
  199.                         k = iter;
  200.                         break;
  201.                 }
  202.         }

  203.         j->u.insert(k, u);
  204. }

  205. bool Compare(const std::vector<Undergraduate>::iterator &a, const std::vector<Undergraduate>::iterator &b)
  206. {
  207.         return a->TotalScore > b->TotalScore;
  208. }

  209. std::string AlignString(std::string s, int length)
  210. {
  211.         while(s.length() != length)
  212.                 s.push_back(' ');

  213.         return s;
  214. }
  215. void DebugPrint(School &s)
  216. {
  217. #if 1
  218.         int length = 15;

  219.         std::cout << AlignString("校名:", length) << s.school_name << std::endl;
  220.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  221.         {
  222.                 std::cout << "-------------------------" << std::endl;
  223.                 std::cout << AlignString("专业名:", length) << i->profession_name << std::endl;
  224.                 std::cout << "-------------------------" << std::endl;
  225.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  226.                 {
  227.                         std::cout << "*************************" << std::endl;
  228.                         std::cout << AlignString("班级名:", length) << j->classroom_name << std::endl;
  229.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  230.                         {
  231.                                 std::cout << AlignString("学号:", length)                << k->num << std::endl;
  232.                                 std::cout << AlignString("姓名:", length)                << k->name << std::endl;
  233.                                 std::cout << AlignString("性别:", length)                << k->sex1 << std::endl;
  234.                                 std::cout << AlignString("本科生 高数:", length)        << k->Undergraduate_math << std::endl;
  235.                                 std::cout << AlignString("本科生 英语:", length)        << k->Undergraduate_English << std::endl;
  236.                                 std::cout << AlignString("本科生 c语言:", length)        << k->Undergraduate_Cscore << std::endl;
  237.                                 std::cout << AlignString("总成绩:", length)                << k->TotalScore << std::endl;
  238.                                 std::cout << AlignString("班级排名:", length)                << k->Classrank << std::endl;
  239.                                 std::cout << AlignString("校排名:", length)                << k->Schoolrank << std::endl;
  240.                                 std::cout << std::endl;
  241.                         }
  242.                         std::cout << std::endl;
  243.                 }
  244.         }
  245. #else
  246.         // 另一种输出,按校级排名输出
  247.         std::vector<std::vector<Undergraduate>::iterator> tmp;
  248.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  249.         {
  250.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  251.                 {
  252.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  253.                         {
  254.                                 tmp.push_back(k);
  255.                         }
  256.                 }
  257.         }

  258.         // 排序
  259.         std::sort(tmp.begin(), tmp.end(), Compare);

  260.         int length = 15;
  261.         for(auto iter = tmp.begin(); iter != tmp.end(); ++iter)
  262.         {
  263.                 std::cout << AlignString("学号:", length) << (*iter)->num << std::endl;
  264.                 std::cout << AlignString("姓名:", length) << (*iter)->name << std::endl;
  265.                 std::cout << AlignString("性别:", length) << (*iter)->sex1 << std::endl;
  266.                 std::cout << AlignString("本科生 高数:", length) << (*iter)->Undergraduate_math << std::endl;
  267.                 std::cout << AlignString("本科生 英语:", length) << (*iter)->Undergraduate_English << std::endl;
  268.                 std::cout << AlignString("本科生 c语言:", length) << (*iter)->Undergraduate_Cscore << std::endl;
  269.                 std::cout << AlignString("总成绩:", length) << (*iter)->TotalScore << std::endl;
  270.                 std::cout << AlignString("班级排名:", length) << (*iter)->Classrank << std::endl;
  271.                 std::cout << AlignString("校排名:", length) << (*iter)->Schoolrank << std::endl;
  272.                 std::cout << std::endl;
  273.         }
  274. #endif
  275. }
  276. // ********************************************************************************************


  277. // 排名
  278. void Rank(School &s)
  279. {
  280.         // 处理班级排名
  281.         // 学生在班级中已经是有序的
  282.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  283.         {
  284.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  285.                 {
  286.                         int count = 0;
  287.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  288.                         {
  289.                                 k->Classrank = ++count;
  290.                         }
  291.                 }
  292.         }

  293.         // 处理校级排名
  294.         // 我也没有什么好办法^_^
  295.         std::vector<std::vector<Undergraduate>::iterator> tmp;
  296.         for(auto i = s.pro.begin(); i != s.pro.end(); ++i)
  297.         {
  298.                 for(auto j = i->c.begin(); j != i->c.end(); ++j)
  299.                 {
  300.                         for(auto k = j->u.begin(); k != j->u.end(); ++k)
  301.                         {
  302.                                 tmp.push_back(k);
  303.                         }
  304.                 }
  305.         }

  306.         // 排序
  307.         std::sort(tmp.begin(), tmp.end(), Compare);

  308.         // 填序号就可以了
  309.         int count = 0;
  310.         for(auto iter = tmp.begin(); iter != tmp.end(); ++iter)
  311.         {
  312.                 (*iter)->Schoolrank = ++count;
  313.         }
  314. }

  315. // 为了方便,就把所有函数挤在一个cpp文件了
  316. // 这样好像并不“方便”,目前就这样了

  317. //static void SetXY(int x, int y)
  318. //{
  319. //        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), COORD({(short)x, (short)y}));
  320. //}
  321. //
  322. //static COORD GetXY()
  323. //{
  324. //        CONSOLE_SCREEN_BUFFER_INFO csbi;
  325. //        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
  326. //        return COORD{csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y};
  327. //}
  328. //
  329. //static void HideCursor()
  330. //{
  331. //        HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  332. //        CONSOLE_CURSOR_INFO cci;
  333. //        GetConsoleCursorInfo(hOut, &cci);
  334. //        cci.bVisible = false;
  335. //        SetConsoleCursorInfo(hOut, &cci);
  336. //}

  337. //void DrawMenu()
  338. //{
  339. //        const int WINDOW_X = 180;
  340. //        const int WINDOW_Y = 45;
  341. //        const std::string menu_select[] =
  342. //        {
  343. //                "1.添加 --- 添加学生信息",
  344. //                "2.删除 --- 删除学生信息",
  345. //                "3.修改 --- 修改学生信息",
  346. //                "4.查看 --- 查看学生信息"
  347. //        };
  348. //
  349. //        for(int y = 0; y < WINDOW_Y - 1; ++y)
  350. //        {
  351. //                for(int x = 0; x < WINDOW_X; ++x)
  352. //                {
  353. //                        if(((y == 0) || (y == WINDOW_Y - 2)) || ((x == 0) || (x == WINDOW_X - 1)))
  354. //                        {
  355. //                                SetXY(x, y);
  356. //                                std::cout.put('*');
  357. //                        }
  358. //                }
  359. //        }
  360. //
  361. //
  362. //}

  363. int main()
  364. {
  365.         School s = {"校名", std::vector<Profession>()};
  366.         int count = 5;
  367.         while(count--)
  368.         {
  369.                 std::string profession_name;
  370.                 std::string classroom_name;
  371.                 Undergraduate u;
  372.                 std::cout << "学号:";
  373.                 std::cin >> u.num;
  374.                 std::cout << "姓名:";
  375.                 std::cin >> u.name;
  376.                 std::cout << "性别:";
  377.                 std::cin >> u.sex1;
  378.                 std::cout << "专业:";
  379.                 std::cin >> profession_name;
  380.                 std::cout << "班级:";
  381.                 std::cin >> classroom_name;
  382.                 std::cout << "本科生 高数:";
  383.                 std::cin >> u.Undergraduate_math;
  384.                 std::cout << "本科生 英语:";
  385.                 std::cin >> u.Undergraduate_English;
  386.                 std::cout << "本科生 c语言:";
  387.                 std::cin >> u.Undergraduate_Cscore;
  388.                 u.TotalScore = u.Undergraduate_math + u.Undergraduate_English + u.Undergraduate_Cscore;
  389.                 u.Classrank = 0;
  390.                 u.Schoolrank = 0;

  391.                 InputData(s, profession_name, classroom_name, u);
  392.         }
  393.         Rank(s);
  394.         DebugPrint(s);

  395.         //HideCursor();
  396.         //DrawMenu();

  397.         //// 学号我就不管了,有重复也不管了,^_^
  398.         //std::vector<UndergraduateDebug> info_tab =
  399.         //{
  400.         //        {0, "学生1", "女", "专业3", "班级2", 70, 50, 20, 0, 0, 0},
  401.         //        {1, "学生2", "男", "专业1", "班级3", 99, 45, 80, 0, 0, 0},
  402.         //        {2, "学生3", "男", "专业2", "班级1", 30, 20, 80, 0, 0, 0},
  403.         //        {3, "学生4", "男", "专业2", "班级2", 20, 40, 60, 0, 0, 0},
  404.         //        {4, "学生5", "女", "专业1", "班级1", 10, 58, 70, 0, 0, 0},
  405.         //        {5, "学生6", "女", "专业3", "班级3", 55, 60, 90, 0, 0, 0},
  406.         //        {6, "学生7", "男", "专业1", "班级1", 75, 57, 62, 0, 0, 0},
  407.         //        {7, "学生8", "女", "专业3", "班级2", 75, 52, 18, 0, 0, 0},
  408.         //        {8, "学生9", "男", "专业1", "班级3", 97, 89, 55, 0, 0, 0},
  409.         //        {9, "学生10", "男", "专业2", "班级1", 35, 21, 88, 0, 0, 0},
  410.         //        {10, "学生11", "男", "专业2", "班级2", 13, 18, 64, 0, 0, 0},
  411.         //        {11, "学生12", "女", "专业1", "班级1", 19, 59, 53, 0, 0, 0},
  412.         //        {12, "学生13", "女", "专业3", "班级3", 59, 51, 52, 0, 0, 0},
  413.         //        {13, "学生14", "男", "专业1", "班级1", 70, 68, 30, 0, 0, 0}
  414.         //};
  415.         //
  416.         //School s = {"校名", std::vector<Profession>()};
  417.         //InputDataDebug(s, info_tab);
  418.         //Rank(s);
  419.         //DebugPrint(s);

  420.         return 0;
  421. }
复制代码

  1. 学号:0
  2. 姓名:姓名0
  3. 性别:男
  4. 专业:专业0
  5. 班级:班级0
  6. 本科生 高数:99
  7. 本科生 英语:10
  8. 本科生 c语言:30
  9. 学号:1
  10. 姓名:姓名1
  11. 性别:女
  12. 专业:专业1
  13. 班级:班级0
  14. 本科生 高数:10
  15. 本科生 英语:2
  16. 本科生 c语言:32
  17. 学号:2
  18. 姓名:姓名2
  19. 性别:女
  20. 专业:专业1
  21. 班级:班级0
  22. 本科生 高数:12
  23. 本科生 英语:32
  24. 本科生 c语言:34
  25. 学号:3
  26. 姓名:姓名3
  27. 性别:男
  28. 专业:专业0
  29. 班级:班级0
  30. 本科生 高数:12
  31. 本科生 英语:45
  32. 本科生 c语言:78
  33. 学号:4
  34. 姓名:姓名4
  35. 性别:女
  36. 专业:专业0
  37. 班级:班级1
  38. 本科生 高数:87
  39. 本科生 英语:65
  40. 本科生 c语言:43
  41. 校名:         校名
  42. -------------------------
  43. 专业名:       专业0
  44. -------------------------
  45. *************************
  46. 班级名:       班级0
  47. 学号:         0
  48. 姓名:         姓名0
  49. 性别:         男
  50. 本科生 高数:  99
  51. 本科生 英语:  10
  52. 本科生 c语言: 30
  53. 总成绩:       139
  54. 班级排名:     1
  55. 校排名:       2

  56. 学号:         3
  57. 姓名:         姓名3
  58. 性别:         男
  59. 本科生 高数:  12
  60. 本科生 英语:  45
  61. 本科生 c语言: 78
  62. 总成绩:       135
  63. 班级排名:     2
  64. 校排名:       3


  65. *************************
  66. 班级名:       班级1
  67. 学号:         4
  68. 姓名:         姓名4
  69. 性别:         女
  70. 本科生 高数:  87
  71. 本科生 英语:  65
  72. 本科生 c语言: 43
  73. 总成绩:       195
  74. 班级排名:     1
  75. 校排名:       1


  76. -------------------------
  77. 专业名:       专业1
  78. -------------------------
  79. *************************
  80. 班级名:       班级0
  81. 学号:         2
  82. 姓名:         姓名2
  83. 性别:         女
  84. 本科生 高数:  12
  85. 本科生 英语:  32
  86. 本科生 c语言: 34
  87. 总成绩:       78
  88. 班级排名:     1
  89. 校排名:       4

  90. 学号:         1
  91. 姓名:         姓名1
  92. 性别:         女
  93. 本科生 高数:  10
  94. 本科生 英语:  2
  95. 本科生 c语言: 32
  96. 总成绩:       44
  97. 班级排名:     2
  98. 校排名:       5


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 12:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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