用C++写学生成绩管理系统


直接上代码

首先定义两个类Student类和Node类

Student类用于表示学生信息

[cpp]  view plain  copy
 
  1. class Student//学生类  
  2. {  
  3. public:  
  4.     Student();//构造函数  
  5.     void SetInfo(string N, int A);//设置学生的信息(设置姓名、年龄)  
  6.     void SetNo(int N);//设置学生的编号  
  7.     void SetScore(int C, int M, int E);//设置学生的成绩(C++、高数、英语)  
  8.     void CountTotal();//计算总分  
  9.     void CountAve();//计算平均分  
  10.     void SetS(int S);//设置序号(用于排名)  
  11.     void GetInfo(string *pN, int *pA);//得到学生的信息(得到姓名、年龄)  
  12.     int GetNo();//得到学生的编号  
  13.   
  14.     //得到学生的分数(C++ 高数 英语 总分 平均分)  
  15.     void GetScore(int *pC, int *pM, int *pE, int *pT, int *pA);  
  16.     int GetS();//得到序号(用于排名)  
  17.   
  18. private:  
  19.     int len;          //学生的人数  
  20.     string Name;     //姓名  
  21.     int Age;         //年龄  
  22.     int No;          //学号  
  23.     int Cpp;         //C++成绩  
  24.     int Math;       //高数成绩  
  25.     int English;    //英语成绩  
  26.     int Total;     //总分  
  27.     float Ave;      //平均分  
  28.     int Sort;     //排名  
  29. };  


定义Student类中的成员函数

[cpp]  view plain  copy
 
  1. //构造函数  
  2. Student::Student()  
  3. {  
  4.     Sort = 0;  
  5. }  
  6.   
  7.   
  8. void Student::SetInfo(string N, int A)//设置学生的信息(设置姓名、年龄)  
  9. {  
  10.     Name = N;  
  11.     Age = A;  
  12. }  
  13.   
  14.   
  15. void Student::SetNo(int N)//设置学生的编号  
  16. {  
  17.     No = N;  
  18. }  
  19.   
  20.   
  21. void Student::SetScore(int C, int M, int E)//设置学生的成绩(C++、高数、英语)  
  22. {  
  23.     Cpp = C;  
  24.     Math = M;  
  25.     English = E;  
  26. }  
  27.   
  28. void Student::CountTotal()//计算总分  
  29. {  
  30.     Total = Cpp + Math + English;  
  31. }  
  32.   
  33.   
  34. void Student::CountAve()//计算学生的平均分  
  35. {  
  36.     Ave = Total / 3;  
  37. }  
  38.   
  39.   
  40. void Student::SetS(int s)//设置序号(用于排名)  
  41. {  
  42.     Sort = s;  
  43. }  
  44.   
  45.   
  46. void Student::GetInfo(string *pN, int *pA)//得到学生的信息(得到姓名、年龄)  
  47. {  
  48.     *pN = Name;  
  49.     *pA = Age;  
  50. }  
  51.   
  52.   
  53. int Student::GetNo()//得到学生的编号  
  54. {  
  55.     return No;  
  56. }  
  57.   
  58.   
  59. //得到学生的分数(C++ 高数 英语 总分 平均分)  
  60. void Student::GetScore(int *pC, int *pM, int *pE, int *pT, int *pA)  
  61. {  
  62.     *pC = Cpp;//得到C++成绩  
  63.     *pM = Math;//得到数学成绩  
  64.     *pE = English;//得到英语成绩  
  65.     *pT = Total;//得到总分  
  66.     *pA = Ave;//得到平均分  
  67. }  
  68.   
  69.   
  70. int Student::GetS()//得到序号(用于排名)  
  71. {  
  72.     return Sort;  
  73. }  

定义Node类用于处理学生信息

[cpp]  view plain  copy
 
  1. class Node//结点类  
  2. {  
  3. public:  
  4.     void InputStudent();//输入学生信息  
  5.     void OutputStudent();//输出学生信息  
  6.     Node* AddStudent();//增加学生信息  
  7.     bool DeleteStudent();//删除学生信息  
  8.     void ChangeStudent();//修改学生信息  
  9.     void SearchStudent();//查找学生信息  
  10.     void SortCpp();//将C++成绩按照从大到小排序  
  11.     void SortMath();//将高数成绩按照从大到小排序  
  12.     void SortEnglish();//将英语成绩按照从大到小排序  
  13.     void SortTotal();//将总分按照从大到小排序  
  14.     void SetScort();//设置排名  
  15.     void ChangeNo(Node *p);//修改学生的学号  
  16.   
  17. private:  
  18.     Student st;//数据域  
  19.     Node *pNext;//指针域  
  20.     Node *pHead;//头结点  
  21. };  
  22. typedef Node NODE;  
  23. typedef Node* PNODE;  
  24. /* 
  25. NODE 相当于  Node 
  26. PNODE 相当于 Node* 
  27. */  


定义Node类的成员函数

[cpp]  view plain  copy
 
  1. //输入学生信息  
  2. void Node::InputStudent()  
  3. {  
  4.     //创建一个头结点  
  5.     pHead =  new NODE[sizeof(NODE)];  
  6.   
  7.     if(NULL == pHead)  
  8.     {  
  9.         cout<<"动态内存分配失败,程序终止!"<
  10.   
  11.         exit(0);  
  12.     }  
  13.   
  14.     PNODE pTail = pHead;//创建一个指向头结点的指针  
  15.     pTail->pNext = NULL;//初始化指针的指针域为NULL  
  16.   
  17.     //将文件中的数据输入到程序中  
  18.     ifstream infile("score.dat", ios::in);  
  19.   
  20.     if(!infile)  
  21.     {  
  22.         cout<<"文件打开失败,程序终止!"<
  23.   
  24.         exit(0);  
  25.     }  
  26.   
  27.     int l;//人数  
  28.     string name;//姓名  
  29.     int age;//年龄  
  30.     int no;//学号  
  31.     int cpp;//C++成绩  
  32.     int math;//数学成绩  
  33.     int english;//英语成绩  
  34.   
  35.     cout<<"请输入学生的人数:";  
  36.     cin>>l;  
  37.   
  38.   
  39.     for(int i=1; i<=l; i++)  
  40.     {  
  41.         //创建一个保存数据的新结点  
  42.         PNODE pNew = new NODE[sizeof(NODE)];  
  43.   
  44.         if(NULL == pNew)  
  45.         {  
  46.             cout<<"动态内存分配失败,程序终止!"<
  47.   
  48.             exit(0);  
  49.         }  
  50.   
  51.         //读取文件中的数据  
  52.         infile>>name>>age>>no>>cpp>>math>>english;  
  53.   
  54.         //初始化结点  
  55.         //pNew->st.SetLen(l);//学生的人数  
  56.         pNew->st.SetInfo(name, age);//学生的姓名和年龄  
  57.         pNew->st.SetNo(no);//学生的编号  
  58.         pNew->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)  
  59.         pNew->st.CountTotal();//计算学生的总分  
  60.         pNew->st.CountAve();//计算学生的平均分  
  61.   
  62.         pTail->pNext = pNew;//将pNew挂在老结点的后面  
  63.         pTail = pNew;//将指针pTail移到pNew上  
  64.         pTail->pNext = NULL;//清空指针域  
  65.     }  
  66.   
  67.     //关闭文件  
  68.     infile.close();  
  69.   
  70.     cout<<"已经成功的向程序中输入了"<"个学生的信息"<
  71. }  
  72.   
  73.   
  74. //遍历链表  
  75. void Node::OutputStudent()  
  76. {  
  77.     PNODE p = pHead->pNext;  
  78.   
  79.     cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  80.   
  81.     string name;  
  82.     int age;  
  83.     int cpp;  
  84.     int math;  
  85.     int english;  
  86.     int total;  
  87.     int ave;  
  88.   
  89.     //遍历学生信息  
  90.     while(NULL != p)  
  91.     {  
  92.         p->st.GetInfo(&name, &age);  
  93.         p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  94.   
  95.         cout<"\t"<"\t"<st.GetNo()<<"\t"<
  96.         <<"\t"<"\t"<"\t"<"\t"<"\t"<st.GetS()<
  97.   
  98.         p = p->pNext;  
  99.     }  
  100. }  
  101.   
  102.   
  103. PNODE Node::AddStudent(void)//增加学生信息  
  104. {  
  105.     PNODE p = pHead->pNext;  
  106.     Student st;//定义一个学生类  
  107.     int i = 1000;  
  108.     int pos;  
  109.     string name;//姓名  
  110.     int age;//年龄  
  111.     int no;//学号  
  112.     int cpp;//C++成绩  
  113.     int math;//数学成绩  
  114.     int english;//英语成绩  
  115.   
  116.     cout<<"请输入一个学生的学号:";  
  117.     cin>>pos;  
  118.   
  119.     cout<<"你将在学号为"<"的学生后增加一个学生"<
  120.   
  121.     st.SetNo(pos+1);//设置需要添加的学生的学号  
  122.   
  123.     cout<<"增加的学生的学号为"<
  124.     
  125.     cout<<"请输入学号为"<"的学生的姓名:";  
  126.     cin>>name;  
  127.   
  128.     cout<<"请输入学号为"<"的学生的年龄:";  
  129.     cin>>age;  
  130.   
  131.     cout<<"请输入学号为"<"的学生的C++成绩:";  
  132.     cin>>cpp;  
  133.   
  134.      cout<<"请输入学号为"<"的学生的数学成绩:";  
  135.      cin>>math;  
  136.       
  137.     cout<<"请输入学号为"<"的学生的英语成绩:";  
  138.     cin>>english;  
  139.   
  140.     while(NULL != p && i
  141.     {  
  142.         p = p->pNext;  
  143.         i++;  
  144.     }  
  145.   
  146.     if(NULL == p || i>pos)  
  147.     {  
  148.         cout<<"程序错误!"<
  149.   
  150.         exit(1);  
  151.     }  
  152.   
  153.     PNODE pt = new NODE[sizeof(NODE)];  
  154.   
  155.     if(NULL == pt)  
  156.     {  
  157.         printf("动态内存分配失败,程序终止!\n");  
  158.         exit(-1);  
  159.     }  
  160.   
  161.     //初始化结点  
  162.     pt->st.SetInfo(name, age);//学生的姓名和年龄  
  163.     pt->st.SetNo(pos+1);//学生的学号  
  164.     pt->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)  
  165.     pt->st.CountTotal();//计算学生的总分  
  166.     pt->st.CountAve();//计算学生的平均分  
  167.   
  168.     PNODE q = p->pNext;  
  169.     p->pNext = pt;  
  170.     pt->pNext = q;  
  171.   
  172.     return p->pNext;  
  173. }  
  174.   
  175.   
  176. bool Node::DeleteStudent()//删除学生信息  
  177. {  
  178.     int i = 1000;  
  179.     int pos;  
  180.     PNODE p = pHead;  
  181.   
  182.     cout<<"请输入要删除的学生的学号:";  
  183.     cin>>pos;  
  184.   
  185.     cout<<"\n删除学号为"<"后的学生信息:"<
  186.   
  187.     while(NULL != p && i
  188.     {  
  189.         p = p->pNext;  
  190.         i++;  
  191.     }  
  192.   
  193.     if(NULL == p || i>pos)  
  194.     {  
  195.         return true;  
  196.     }  
  197.   
  198.     PNODE q = p->pNext;  
  199.   
  200.     p->pNext = p->pNext->pNext;  
  201.   
  202.     delete []q;  
  203.   
  204.     return true;  
  205. }  
  206.   
  207.   
  208. void Node::ChangeStudent()//修改学生信息  
  209. {  
  210.     PNODE p = pHead->pNext;  
  211.   
  212.     string name;//姓名  
  213.     int age;//年龄  
  214.     int no;//学号  
  215.     int cpp;//C++成绩  
  216.     int math;//数学成绩  
  217.     int english;//英语成绩  
  218.     int total;//总分  
  219.     int ave;//平均分  
  220.   
  221.     int flag = 0;//标识符,初始化表示没找到  
  222.   
  223.     cout<<"请输入你需要修改的学生的姓名:";  
  224.     cin>>name;  
  225.   
  226.     string nm;//姓名  
  227.   
  228.     //遍历学生信息  
  229.     while(NULL != p)  
  230.     {  
  231.         //得到学生的姓名和年龄  
  232.         p->st.GetInfo(&nm, &age);  
  233.         p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  234.   
  235.         if(name == nm)  
  236.         {  
  237.             flag = 1;  
  238.   
  239.             cout<<"\n修改前的学生信息:"<
  240.   
  241.             cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  242.   
  243.             cout<"\t"<"\t"<st.GetNo()<<"\t"<
  244.             <<"\t"<"\t"<"\t"<"\t"<
  245.           
  246.             break;  
  247.         }  
  248.   
  249.         p = p->pNext;  
  250.     }  
  251.   
  252.     if(0 == flag)  
  253.     {  
  254.         cout<<"没找到你需要修改的学生信息!\n"<
  255.   
  256.         return;  
  257.     }  
  258.   
  259.     cout<<"\n你将修改学号为"<st.GetNo()<<"的学生信息"<
  260.   
  261.     no = p->st.GetNo();//得到学生的学号  
  262.   
  263.     cout<<"请输入学号为"<st.GetNo()<<"的学生的姓名:";  
  264.     cin>>name;  
  265.   
  266.     cout<<"请输入学号为"<st.GetNo()<<"的学生的年龄:";  
  267.     cin>>age;  
  268.   
  269.     cout<<"请输入学号为"<st.GetNo()<<"的学生的C++成绩:";  
  270.     cin>>cpp;  
  271.   
  272.      cout<<"请输入学号为"<st.GetNo()<<"的学生的数学成绩:";  
  273.      cin>>math;  
  274.       
  275.     cout<<"请输入学号为"<st.GetNo()<<"的学生的英语成绩:";  
  276.     cin>>english;  
  277.       
  278.     //初始化结点  
  279.     p->st.SetInfo(name, age);//学生的姓名和年龄  
  280.     p->st.SetNo(no);//学生的编号  
  281.     p->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)  
  282.     p->st.CountTotal();//计算学生的总分  
  283.     p->st.CountAve();//计算学生的平均分  
  284.   
  285.     cout<<"\n修改后的学生信息:"<
  286.     cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  287.   
  288.     //得到学生的姓名和年龄吧  
  289.     p->st.GetInfo(&name, &age);  
  290.   
  291.     //得到学生的成绩  
  292.     p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  293.       
  294.     cout<"\t"<"\t"<st.GetNo()<<"\t"<
  295.    <<"\t"<"\t"<"\t"<"\t"<
  296. }  
  297.   
  298.   
  299. void Node::SearchStudent()//查找学生信息  
  300. {  
  301.     PNODE p = pHead->pNext;  
  302.   
  303.     string name;//姓名  
  304.   
  305.     int flag = 0;//标识符,初始化表示没找到  
  306.   
  307.     cout<<"请输入你需要查找的学生的姓名:";  
  308.     cin>>name;  
  309.   
  310.     cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  311.   
  312.     string nm;//姓名  
  313.     int age;//年龄  
  314.     int no;//学号  
  315.     int cpp;//C++成绩  
  316.     int math;//数学成绩  
  317.     int english;//英语成绩  
  318.     int total;//总分  
  319.     int ave;//平均分  
  320.   
  321.     //遍历学生信息  
  322.     while(NULL != p)  
  323.     {  
  324.         //得到学生的姓名和年龄  
  325.         p->st.GetInfo(&nm, &age);  
  326.   
  327.         //得到学生的成绩  
  328.         p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  329.   
  330.         if(name == nm)  
  331.         {  
  332.             flag = 1;  
  333.   
  334.              cout<"\t"<"\t"<st.GetNo()<<"\t"<
  335.             <<"\t"<"\t"<"\t"<"\t"<
  336.               
  337.              break;//退出循环  
  338.         }  
  339.   
  340.         p = p->pNext;  
  341.     }  
  342.   
  343.     if(0 == flag)  
  344.     {  
  345.         cout<<"没找到你需要的学生信息!"<
  346.     }  
  347. }  
  348.   
  349.   
  350. void Node::SortCpp()//将C++成绩按照从大到小排序  
  351. {  
  352.     PNODE p, q;//定义两个指针  
  353.       
  354.       
  355.     NODE temp;//定义一个临时结点  
  356.   
  357.     int cpp1, cpp2;//C++成绩  
  358.     int math1, math2;//数学成绩  
  359.     int english1, english2;//英语成绩  
  360.     int total1, total2;//总分  
  361.     int ave1, ave2;//平均分  
  362.   
  363.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  364.     {  
  365.         for(q = p->pNext; NULL != q; q = q->pNext)  
  366.         {  
  367.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  368.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  369.   
  370.             if(cpp1 < cpp2)//当前一个学生的C++成绩小于后一个学生的C++成绩时  
  371.             {  
  372.                 temp.st  = p->st;//交换学生的位置  
  373.                 p->st =  q->st;  
  374.                 q->st = temp.st;  
  375.             }  
  376.         }  
  377.     }  
  378. }  
  379.   
  380.   
  381. void Node::SortMath()//将高数成绩按照从大到小排序  
  382. {  
  383.      PNODE p, q;//定义两个指针  
  384.       
  385.     NODE temp;//定义一个临时结点  
  386.   
  387.     int cpp1, cpp2;//C++成绩  
  388.     int math1, math2;//数学成绩  
  389.     int english1, english2;//英语成绩  
  390.     int total1, total2;//总分  
  391.     int ave1, ave2;//平均分  
  392.   
  393.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  394.     {  
  395.         for(q = p->pNext; NULL != q; q = q->pNext)  
  396.         {  
  397.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  398.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  399.               
  400.             if(math1 < math2)//当前一个学生的高数成绩小于后一个学生的高数成绩时  
  401.             {  
  402.                 temp.st  = p->st;//交换学生的位置(交换结点中的数据域)  
  403.                 p->st = q->st;  
  404.                 q->st = temp.st;  
  405.             }  
  406.         }  
  407.     }  
  408. }  
  409.   
  410.   
  411. void Node::SortEnglish()//将英语成绩按照从大到小排序  
  412. {  
  413.     PNODE p, q;//定义两个指针  
  414.        
  415.     NODE temp;//定义一个临时结点  
  416.        
  417.     int cpp1, cpp2;//C++成绩  
  418.     int math1, math2;//数学成绩  
  419.     int english1, english2;//英语成绩  
  420.     int total1, total2;//总分  
  421.     int ave1, ave2;//平均分  
  422.       
  423.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  424.     {  
  425.         for(q = p->pNext; NULL != q; q = q->pNext)  
  426.         {  
  427.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  428.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  429.               
  430.             if(english1 < english2)//当前一个学生的英语成绩小于后一个学生的英语成绩时  
  431.             {  
  432.                 temp.st  = p->st;//交换学生的位置(交换结点中的数据域)  
  433.                 p->st = q->st;  
  434.                 q->st = temp.st;  
  435.             }  
  436.         }  
  437.     }  
  438. }  
  439.   
  440.   
  441. void Node::SortTotal()//将总分按照从大到小排序  
  442. {  
  443.     PNODE p, q;//定义两个指针  
  444.       
  445.     NODE temp;//定义一个临时结点  
  446.   
  447.     int cpp1, cpp2;//C++成绩  
  448.     int math1, math2;//数学成绩  
  449.     int english1, english2;//英语成绩  
  450.     int total1, total2;//总分  
  451.     int ave1, ave2;//平均分  
  452.       
  453.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  454.     {  
  455.         for(q = p->pNext; NULL != q; q = q->pNext)  
  456.         {  
  457.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  458.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  459.               
  460.             if(total1 < total2)//当前一个学生的总分小于后一个学生的总分时  
  461.             {  
  462.                 temp.st  = p->st;//交换学生的位置(交换结点中的数据域)  
  463.                 p->st = q->st;  
  464.                 q->st = temp.st;  
  465.             }  
  466.         }  
  467.     }  
  468. }  
  469.   
  470.   
  471. void Node::SetScort()//设置排名  
  472. {  
  473.     PNODE p;//定义一个指向结点的指针  
  474.     int i;//保存排名  
  475.   
  476.     //给学生的排名赋值  
  477.     for(p=pHead->pNext, i=1; NULL !=p; p=p->pNext, i++)  
  478.     {  
  479.         p->st.SetS(i);  
  480.     }  
  481. }  
  482.   
  483.   
  484. //修改学生的学号  
  485. void Node::ChangeNo(PNODE p)  
  486. {  
  487.     int i = p->st.GetNo();//提供修改的数据  
  488.   
  489.     //遍历学生信息  
  490.     while(NULL != p)  
  491.     {  
  492.         p->st.SetNo(i);  
  493.   
  494.         i++;  
  495.   
  496.         p = p->pNext;  
  497.     }  
  498. }  

首先定义两个类Student类和Node类

Student类用于表示学生信息

[cpp]  view plain  copy
 
  1. class Student//学生类  
  2. {  
  3. public:  
  4.     Student();//构造函数  
  5.     void SetInfo(string N, int A);//设置学生的信息(设置姓名、年龄)  
  6.     void SetNo(int N);//设置学生的编号  
  7.     void SetScore(int C, int M, int E);//设置学生的成绩(C++、高数、英语)  
  8.     void CountTotal();//计算总分  
  9.     void CountAve();//计算平均分  
  10.     void SetS(int S);//设置序号(用于排名)  
  11.     void GetInfo(string *pN, int *pA);//得到学生的信息(得到姓名、年龄)  
  12.     int GetNo();//得到学生的编号  
  13.   
  14.     //得到学生的分数(C++ 高数 英语 总分 平均分)  
  15.     void GetScore(int *pC, int *pM, int *pE, int *pT, int *pA);  
  16.     int GetS();//得到序号(用于排名)  
  17.   
  18. private:  
  19.     int len;          //学生的人数  
  20.     string Name;     //姓名  
  21.     int Age;         //年龄  
  22.     int No;          //学号  
  23.     int Cpp;         //C++成绩  
  24.     int Math;       //高数成绩  
  25.     int English;    //英语成绩  
  26.     int Total;     //总分  
  27.     float Ave;      //平均分  
  28.     int Sort;     //排名  
  29. };  


定义Student类中的成员函数

[cpp]  view plain  copy
 
  1. //构造函数  
  2. Student::Student()  
  3. {  
  4.     Sort = 0;  
  5. }  
  6.   
  7.   
  8. void Student::SetInfo(string N, int A)//设置学生的信息(设置姓名、年龄)  
  9. {  
  10.     Name = N;  
  11.     Age = A;  
  12. }  
  13.   
  14.   
  15. void Student::SetNo(int N)//设置学生的编号  
  16. {  
  17.     No = N;  
  18. }  
  19.   
  20.   
  21. void Student::SetScore(int C, int M, int E)//设置学生的成绩(C++、高数、英语)  
  22. {  
  23.     Cpp = C;  
  24.     Math = M;  
  25.     English = E;  
  26. }  
  27.   
  28. void Student::CountTotal()//计算总分  
  29. {  
  30.     Total = Cpp + Math + English;  
  31. }  
  32.   
  33.   
  34. void Student::CountAve()//计算学生的平均分  
  35. {  
  36.     Ave = Total / 3;  
  37. }  
  38.   
  39.   
  40. void Student::SetS(int s)//设置序号(用于排名)  
  41. {  
  42.     Sort = s;  
  43. }  
  44.   
  45.   
  46. void Student::GetInfo(string *pN, int *pA)//得到学生的信息(得到姓名、年龄)  
  47. {  
  48.     *pN = Name;  
  49.     *pA = Age;  
  50. }  
  51.   
  52.   
  53. int Student::GetNo()//得到学生的编号  
  54. {  
  55.     return No;  
  56. }  
  57.   
  58.   
  59. //得到学生的分数(C++ 高数 英语 总分 平均分)  
  60. void Student::GetScore(int *pC, int *pM, int *pE, int *pT, int *pA)  
  61. {  
  62.     *pC = Cpp;//得到C++成绩  
  63.     *pM = Math;//得到数学成绩  
  64.     *pE = English;//得到英语成绩  
  65.     *pT = Total;//得到总分  
  66.     *pA = Ave;//得到平均分  
  67. }  
  68.   
  69.   
  70. int Student::GetS()//得到序号(用于排名)  
  71. {  
  72.     return Sort;  
  73. }  

定义Node类用于处理学生信息

[cpp]  view plain  copy
 
  1. class Node//结点类  
  2. {  
  3. public:  
  4.     void InputStudent();//输入学生信息  
  5.     void OutputStudent();//输出学生信息  
  6.     Node* AddStudent();//增加学生信息  
  7.     bool DeleteStudent();//删除学生信息  
  8.     void ChangeStudent();//修改学生信息  
  9.     void SearchStudent();//查找学生信息  
  10.     void SortCpp();//将C++成绩按照从大到小排序  
  11.     void SortMath();//将高数成绩按照从大到小排序  
  12.     void SortEnglish();//将英语成绩按照从大到小排序  
  13.     void SortTotal();//将总分按照从大到小排序  
  14.     void SetScort();//设置排名  
  15.     void ChangeNo(Node *p);//修改学生的学号  
  16.   
  17. private:  
  18.     Student st;//数据域  
  19.     Node *pNext;//指针域  
  20.     Node *pHead;//头结点  
  21. };  
  22. typedef Node NODE;  
  23. typedef Node* PNODE;  
  24. /* 
  25. NODE 相当于  Node 
  26. PNODE 相当于 Node* 
  27. */  


定义Node类的成员函数

[cpp]  view plain  copy
 
  1. //输入学生信息  
  2. void Node::InputStudent()  
  3. {  
  4.     //创建一个头结点  
  5.     pHead =  new NODE[sizeof(NODE)];  
  6.   
  7.     if(NULL == pHead)  
  8.     {  
  9.         cout<<"动态内存分配失败,程序终止!"<
  10.   
  11.         exit(0);  
  12.     }  
  13.   
  14.     PNODE pTail = pHead;//创建一个指向头结点的指针  
  15.     pTail->pNext = NULL;//初始化指针的指针域为NULL  
  16.   
  17.     //将文件中的数据输入到程序中  
  18.     ifstream infile("score.dat", ios::in);  
  19.   
  20.     if(!infile)  
  21.     {  
  22.         cout<<"文件打开失败,程序终止!"<
  23.   
  24.         exit(0);  
  25.     }  
  26.   
  27.     int l;//人数  
  28.     string name;//姓名  
  29.     int age;//年龄  
  30.     int no;//学号  
  31.     int cpp;//C++成绩  
  32.     int math;//数学成绩  
  33.     int english;//英语成绩  
  34.   
  35.     cout<<"请输入学生的人数:";  
  36.     cin>>l;  
  37.   
  38.   
  39.     for(int i=1; i<=l; i++)  
  40.     {  
  41.         //创建一个保存数据的新结点  
  42.         PNODE pNew = new NODE[sizeof(NODE)];  
  43.   
  44.         if(NULL == pNew)  
  45.         {  
  46.             cout<<"动态内存分配失败,程序终止!"<
  47.   
  48.             exit(0);  
  49.         }  
  50.   
  51.         //读取文件中的数据  
  52.         infile>>name>>age>>no>>cpp>>math>>english;  
  53.   
  54.         //初始化结点  
  55.         //pNew->st.SetLen(l);//学生的人数  
  56.         pNew->st.SetInfo(name, age);//学生的姓名和年龄  
  57.         pNew->st.SetNo(no);//学生的编号  
  58.         pNew->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)  
  59.         pNew->st.CountTotal();//计算学生的总分  
  60.         pNew->st.CountAve();//计算学生的平均分  
  61.   
  62.         pTail->pNext = pNew;//将pNew挂在老结点的后面  
  63.         pTail = pNew;//将指针pTail移到pNew上  
  64.         pTail->pNext = NULL;//清空指针域  
  65.     }  
  66.   
  67.     //关闭文件  
  68.     infile.close();  
  69.   
  70.     cout<<"已经成功的向程序中输入了"<"个学生的信息"<
  71. }  
  72.   
  73.   
  74. //遍历链表  
  75. void Node::OutputStudent()  
  76. {  
  77.     PNODE p = pHead->pNext;  
  78.   
  79.     cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  80.   
  81.     string name;  
  82.     int age;  
  83.     int cpp;  
  84.     int math;  
  85.     int english;  
  86.     int total;  
  87.     int ave;  
  88.   
  89.     //遍历学生信息  
  90.     while(NULL != p)  
  91.     {  
  92.         p->st.GetInfo(&name, &age);  
  93.         p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  94.   
  95.         cout<"\t"<"\t"<st.GetNo()<<"\t"<
  96.         <<"\t"<"\t"<"\t"<"\t"<"\t"<st.GetS()<
  97.   
  98.         p = p->pNext;  
  99.     }  
  100. }  
  101.   
  102.   
  103. PNODE Node::AddStudent(void)//增加学生信息  
  104. {  
  105.     PNODE p = pHead->pNext;  
  106.     Student st;//定义一个学生类  
  107.     int i = 1000;  
  108.     int pos;  
  109.     string name;//姓名  
  110.     int age;//年龄  
  111.     int no;//学号  
  112.     int cpp;//C++成绩  
  113.     int math;//数学成绩  
  114.     int english;//英语成绩  
  115.   
  116.     cout<<"请输入一个学生的学号:";  
  117.     cin>>pos;  
  118.   
  119.     cout<<"你将在学号为"<"的学生后增加一个学生"<
  120.   
  121.     st.SetNo(pos+1);//设置需要添加的学生的学号  
  122.   
  123.     cout<<"增加的学生的学号为"<
  124.     
  125.     cout<<"请输入学号为"<"的学生的姓名:";  
  126.     cin>>name;  
  127.   
  128.     cout<<"请输入学号为"<"的学生的年龄:";  
  129.     cin>>age;  
  130.   
  131.     cout<<"请输入学号为"<"的学生的C++成绩:";  
  132.     cin>>cpp;  
  133.   
  134.      cout<<"请输入学号为"<"的学生的数学成绩:";  
  135.      cin>>math;  
  136.       
  137.     cout<<"请输入学号为"<"的学生的英语成绩:";  
  138.     cin>>english;  
  139.   
  140.     while(NULL != p && i
  141.     {  
  142.         p = p->pNext;  
  143.         i++;  
  144.     }  
  145.   
  146.     if(NULL == p || i>pos)  
  147.     {  
  148.         cout<<"程序错误!"<
  149.   
  150.         exit(1);  
  151.     }  
  152.   
  153.     PNODE pt = new NODE[sizeof(NODE)];  
  154.   
  155.     if(NULL == pt)  
  156.     {  
  157.         printf("动态内存分配失败,程序终止!\n");  
  158.         exit(-1);  
  159.     }  
  160.   
  161.     //初始化结点  
  162.     pt->st.SetInfo(name, age);//学生的姓名和年龄  
  163.     pt->st.SetNo(pos+1);//学生的学号  
  164.     pt->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)  
  165.     pt->st.CountTotal();//计算学生的总分  
  166.     pt->st.CountAve();//计算学生的平均分  
  167.   
  168.     PNODE q = p->pNext;  
  169.     p->pNext = pt;  
  170.     pt->pNext = q;  
  171.   
  172.     return p->pNext;  
  173. }  
  174.   
  175.   
  176. bool Node::DeleteStudent()//删除学生信息  
  177. {  
  178.     int i = 1000;  
  179.     int pos;  
  180.     PNODE p = pHead;  
  181.   
  182.     cout<<"请输入要删除的学生的学号:";  
  183.     cin>>pos;  
  184.   
  185.     cout<<"\n删除学号为"<"后的学生信息:"<
  186.   
  187.     while(NULL != p && i
  188.     {  
  189.         p = p->pNext;  
  190.         i++;  
  191.     }  
  192.   
  193.     if(NULL == p || i>pos)  
  194.     {  
  195.         return true;  
  196.     }  
  197.   
  198.     PNODE q = p->pNext;  
  199.   
  200.     p->pNext = p->pNext->pNext;  
  201.   
  202.     delete []q;  
  203.   
  204.     return true;  
  205. }  
  206.   
  207.   
  208. void Node::ChangeStudent()//修改学生信息  
  209. {  
  210.     PNODE p = pHead->pNext;  
  211.   
  212.     string name;//姓名  
  213.     int age;//年龄  
  214.     int no;//学号  
  215.     int cpp;//C++成绩  
  216.     int math;//数学成绩  
  217.     int english;//英语成绩  
  218.     int total;//总分  
  219.     int ave;//平均分  
  220.   
  221.     int flag = 0;//标识符,初始化表示没找到  
  222.   
  223.     cout<<"请输入你需要修改的学生的姓名:";  
  224.     cin>>name;  
  225.   
  226.     string nm;//姓名  
  227.   
  228.     //遍历学生信息  
  229.     while(NULL != p)  
  230.     {  
  231.         //得到学生的姓名和年龄  
  232.         p->st.GetInfo(&nm, &age);  
  233.         p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  234.   
  235.         if(name == nm)  
  236.         {  
  237.             flag = 1;  
  238.   
  239.             cout<<"\n修改前的学生信息:"<
  240.   
  241.             cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  242.   
  243.             cout<"\t"<"\t"<st.GetNo()<<"\t"<
  244.             <<"\t"<"\t"<"\t"<"\t"<
  245.           
  246.             break;  
  247.         }  
  248.   
  249.         p = p->pNext;  
  250.     }  
  251.   
  252.     if(0 == flag)  
  253.     {  
  254.         cout<<"没找到你需要修改的学生信息!\n"<
  255.   
  256.         return;  
  257.     }  
  258.   
  259.     cout<<"\n你将修改学号为"<st.GetNo()<<"的学生信息"<
  260.   
  261.     no = p->st.GetNo();//得到学生的学号  
  262.   
  263.     cout<<"请输入学号为"<st.GetNo()<<"的学生的姓名:";  
  264.     cin>>name;  
  265.   
  266.     cout<<"请输入学号为"<st.GetNo()<<"的学生的年龄:";  
  267.     cin>>age;  
  268.   
  269.     cout<<"请输入学号为"<st.GetNo()<<"的学生的C++成绩:";  
  270.     cin>>cpp;  
  271.   
  272.      cout<<"请输入学号为"<st.GetNo()<<"的学生的数学成绩:";  
  273.      cin>>math;  
  274.       
  275.     cout<<"请输入学号为"<st.GetNo()<<"的学生的英语成绩:";  
  276.     cin>>english;  
  277.       
  278.     //初始化结点  
  279.     p->st.SetInfo(name, age);//学生的姓名和年龄  
  280.     p->st.SetNo(no);//学生的编号  
  281.     p->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)  
  282.     p->st.CountTotal();//计算学生的总分  
  283.     p->st.CountAve();//计算学生的平均分  
  284.   
  285.     cout<<"\n修改后的学生信息:"<
  286.     cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  287.   
  288.     //得到学生的姓名和年龄吧  
  289.     p->st.GetInfo(&name, &age);  
  290.   
  291.     //得到学生的成绩  
  292.     p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  293.       
  294.     cout<"\t"<"\t"<st.GetNo()<<"\t"<
  295.    <<"\t"<"\t"<"\t"<"\t"<
  296. }  
  297.   
  298.   
  299. void Node::SearchStudent()//查找学生信息  
  300. {  
  301.     PNODE p = pHead->pNext;  
  302.   
  303.     string name;//姓名  
  304.   
  305.     int flag = 0;//标识符,初始化表示没找到  
  306.   
  307.     cout<<"请输入你需要查找的学生的姓名:";  
  308.     cin>>name;  
  309.   
  310.     cout<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<
  311.   
  312.     string nm;//姓名  
  313.     int age;//年龄  
  314.     int no;//学号  
  315.     int cpp;//C++成绩  
  316.     int math;//数学成绩  
  317.     int english;//英语成绩  
  318.     int total;//总分  
  319.     int ave;//平均分  
  320.   
  321.     //遍历学生信息  
  322.     while(NULL != p)  
  323.     {  
  324.         //得到学生的姓名和年龄  
  325.         p->st.GetInfo(&nm, &age);  
  326.   
  327.         //得到学生的成绩  
  328.         p->st.GetScore(&cpp, &math, &english, &total, &ave);  
  329.   
  330.         if(name == nm)  
  331.         {  
  332.             flag = 1;  
  333.   
  334.              cout<"\t"<"\t"<st.GetNo()<<"\t"<
  335.             <<"\t"<"\t"<"\t"<"\t"<
  336.               
  337.              break;//退出循环  
  338.         }  
  339.   
  340.         p = p->pNext;  
  341.     }  
  342.   
  343.     if(0 == flag)  
  344.     {  
  345.         cout<<"没找到你需要的学生信息!"<
  346.     }  
  347. }  
  348.   
  349.   
  350. void Node::SortCpp()//将C++成绩按照从大到小排序  
  351. {  
  352.     PNODE p, q;//定义两个指针  
  353.       
  354.       
  355.     NODE temp;//定义一个临时结点  
  356.   
  357.     int cpp1, cpp2;//C++成绩  
  358.     int math1, math2;//数学成绩  
  359.     int english1, english2;//英语成绩  
  360.     int total1, total2;//总分  
  361.     int ave1, ave2;//平均分  
  362.   
  363.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  364.     {  
  365.         for(q = p->pNext; NULL != q; q = q->pNext)  
  366.         {  
  367.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  368.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  369.   
  370.             if(cpp1 < cpp2)//当前一个学生的C++成绩小于后一个学生的C++成绩时  
  371.             {  
  372.                 temp.st  = p->st;//交换学生的位置  
  373.                 p->st =  q->st;  
  374.                 q->st = temp.st;  
  375.             }  
  376.         }  
  377.     }  
  378. }  
  379.   
  380.   
  381. void Node::SortMath()//将高数成绩按照从大到小排序  
  382. {  
  383.      PNODE p, q;//定义两个指针  
  384.       
  385.     NODE temp;//定义一个临时结点  
  386.   
  387.     int cpp1, cpp2;//C++成绩  
  388.     int math1, math2;//数学成绩  
  389.     int english1, english2;//英语成绩  
  390.     int total1, total2;//总分  
  391.     int ave1, ave2;//平均分  
  392.   
  393.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  394.     {  
  395.         for(q = p->pNext; NULL != q; q = q->pNext)  
  396.         {  
  397.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  398.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  399.               
  400.             if(math1 < math2)//当前一个学生的高数成绩小于后一个学生的高数成绩时  
  401.             {  
  402.                 temp.st  = p->st;//交换学生的位置(交换结点中的数据域)  
  403.                 p->st = q->st;  
  404.                 q->st = temp.st;  
  405.             }  
  406.         }  
  407.     }  
  408. }  
  409.   
  410.   
  411. void Node::SortEnglish()//将英语成绩按照从大到小排序  
  412. {  
  413.     PNODE p, q;//定义两个指针  
  414.        
  415.     NODE temp;//定义一个临时结点  
  416.        
  417.     int cpp1, cpp2;//C++成绩  
  418.     int math1, math2;//数学成绩  
  419.     int english1, english2;//英语成绩  
  420.     int total1, total2;//总分  
  421.     int ave1, ave2;//平均分  
  422.       
  423.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  424.     {  
  425.         for(q = p->pNext; NULL != q; q = q->pNext)  
  426.         {  
  427.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  428.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  429.               
  430.             if(english1 < english2)//当前一个学生的英语成绩小于后一个学生的英语成绩时  
  431.             {  
  432.                 temp.st  = p->st;//交换学生的位置(交换结点中的数据域)  
  433.                 p->st = q->st;  
  434.                 q->st = temp.st;  
  435.             }  
  436.         }  
  437.     }  
  438. }  
  439.   
  440.   
  441. void Node::SortTotal()//将总分按照从大到小排序  
  442. {  
  443.     PNODE p, q;//定义两个指针  
  444.       
  445.     NODE temp;//定义一个临时结点  
  446.   
  447.     int cpp1, cpp2;//C++成绩  
  448.     int math1, math2;//数学成绩  
  449.     int english1, english2;//英语成绩  
  450.     int total1, total2;//总分  
  451.     int ave1, ave2;//平均分  
  452.       
  453.     for(p = pHead->pNext; NULL != p; p = p->pNext)  
  454.     {  
  455.         for(q = p->pNext; NULL != q; q = q->pNext)  
  456.         {  
  457.             p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);  
  458.             q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);  
  459.               
  460.             if(total1 < total2)//当前一个学生的总分小于后一个学生的总分时  
  461.             {  
  462.                 temp.st  = p->st;//交换学生的位置(交换结点中的数据域)  
  463.                 p->st = q->st;  
  464.                 q->st = temp.st;  
  465.             }  
  466.         }  
  467.     }  
  468. }  
  469.   
  470.   
  471. void Node::SetScort()//设置排名  
  472. {  
  473.     PNODE p;//定义一个指向结点的指针  
  474.     int i;//保存排名  
  475.   
  476.     //给学生的排名赋值  
  477.     for(p=pHead->pNext, i=1; NULL !=p; p=p->pNext, i++)  
  478.     {  
  479.         p->st.SetS(i);  
  480.     }  
  481. }  
  482.   
  483.   
  484. //修改学生的学号  
  485. void Node::ChangeNo(PNODE p)  
  486. {  
  487.     int i = p->st.GetNo();//提供修改的数据  
  488.   
  489.     //遍历学生信息  
  490.     while(NULL != p)  
  491.     {  
  492.         p->st.SetNo(i);  
  493.   
  494.         i++;  
  495.   
  496.         p = p->pNext;  
  497.     }  
  498. }  

你可能感兴趣的:(用C++写学生成绩管理系统)