# include <iostream>    
# include <fstream>    
# include <string.h>    
#include <conio.h>//用getch();  
using namespace std;  
#define _CRT_SECURE_NO_WARNINGS  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
class Student  
{  
public:  
    char name[20];  
    char Id[20];  
    int Cnum;       //C++课程得分    
    int Mnum;       //汇编课程得分    
    int Enum;       //嵌入式操作系统课程得分    
    int sum;        //总分         
    Student * Next;  
    void Input()  
    {  
        cout << "\t\t请输入学生的姓名:";  cin >> name;  
        cout << "\t\t请输入学生的学号:";  cin >> Id;  
        cout << "\t\t请输入C++课程的成绩:";  cin >> Cnum;  
        cout << "\t\t请输入汇编课程的成绩:";  cin >> Mnum;  
        cout << "\t\t请输入嵌入式操作系统课程的成绩:";  cin >> Enum;  
        sum = Cnum + Mnum + Enum;  
    }  
    void ReadFile(istream & in)//函数完成的作用是,依次将标准输入流中的数据读入到变量  
    {  
        in >> name >> Id >> Cnum >> Mnum >> Enum >> sum;  
    }  
    void Show()  
    {  
        cout << "姓名:" << name << endl << "学号:" << Id << endl << "C++:" << Cnum << endl  
            << "汇编:" << Mnum << endl << "嵌入式操作系统:" << Enum << endl << "总成绩:" << sum << endl << endl << endl;  
    }  
};  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
class Studentmassage  
{  
public:  
    Studentmassage();  
    ~Studentmassage();  
    void ShowMenu();  
    void Find();  
    void Save();  
    void ModifyItem();  
    void RemoveItem();  
    void Swap(Student *, Student *);  
    void Sort();  
    //void Unpass();    
    int ListCount();  
    //void Average();   
    void delay()  
    {  
        int n = 1000000000;  
        while (n--)  
            ;  
    }  
    void Display()  
    {  
  
        for (Student * p = Head->Next; p != End; p = p->Next)  
            p->Show();  
        delay();  
        cout << "输入任意字符!继续……";  
        
getchar();  
    }  
    void AddItem()//添加一个学生信息  
    {  
        End->Input();  
        End->Next = new Student;  
        End = End->Next;  
        cout << "添加成功!" << endl;  
        cout << "输入任意字符!继续……";  
        getchar();  
    }  
private:  
    Student * Head, *End;  
    ifstream in;  
    ofstream out;  
    Student *FindItem(char * name)  
    {  
        for (Student * p = Head; p->Next != End; p = p->Next)//匹配成功则返回上一个指针,不成功就返回空    
        if (!strcmp(p->Next->name, name))return p;  
        return NULL;  
    }  
    Student *FindID(char * Id)  
    {  
        for (Student * p = Head; p->Next != End; p = p->Next)//匹配成功则返回上一个指针,不成功就返回空    
        if (!strcmp(p->Next->Id, Id))return p;  
        return NULL;  
    }  
};  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
Studentmassage::Studentmassage()  
{  
    Head = new Student;  
    Head->Next = new Student;  
    End = Head->Next;  
    in.open("sort.txt");  
    if (!in)  
        cout << "这是一个新系统,无学生信息。请先输入。" << endl;  
    else  
    {  
        while (!in.eof())  
        {  
            End->ReadFile(in);  
            if (End->name[0] == '\0')
break;  
            End->Next = new Student;  
            End = End->Next;  
        }  
        in.close();  
        cout << "\t\t读取学生信息成功!" << endl;  
    }  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
Studentmassage::~Studentmassage()  
{  
    Save();  
    for (Student * temp; Head->Next != End;)  
    {  
        temp = Head->Next;  
        Head->Next = Head->Next->Next;  
        delete temp;  
    }  
    delete Head, End;  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
void Studentmassage::ShowMenu()  
{  
    cout << "********************************************************************************" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓〓  ☆   学 生 成 绩 管 理 系  统     ☆  〓〓〓〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓★★★★★         ★★★★★★★         ★★★★★〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓★  ☆          1.增加学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓★  ☆          2.显示学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓★  ☆          3.排序统计成绩        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓★  ☆          4.查找学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓★  ☆          5.删除学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓★  ☆          6.修改学生信息        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;  
    cout << "〓〓〓〓〓〓〓〓〓★  ☆          0.安全退出系统        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;  
  
    cout << "\n\t\t\n\t\t请选择:";  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
void Studentmassage::Find()  
{  
    char name[20], Id[10];  
    int x;  
    Student * p = NULL;  
    cout << "\n\t\t*********************************\n";  
    cout << "\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";  
    cout << "\n\t\t*********************************\n请选择:";  
    cin >> x;  
    switch (x)  
    {  
    case 1:{cout << "\t\t请输入要查找的学生的姓名:"; cin >> name;  
        if (p = FindItem(name))  
        {  
            p->Next->Show();  
            delay();  
            cout << "输入任意字符!继续……";  
            getchar();  
        }  
        else  
        {  
            cout << "\t\t没有找到该姓名的学生!" << '\n' << endl;  
            delay();  
            cout << "输入任意字符!继续……";  
            getchar();  
        }  
    }break;  
    case 2:  
    {  
              cout << "\t\t请输入要查找的学生的学号:"; cin >> Id;  
              if (p = FindID(Id))  
              {  
                  p->Next->Show();  
                  delay();  
                  cout << "输入任意字符!继续……";  
                  getchar();  
              }  
              else  
              {  
                  cout << "\t\t没有找到该学好的学生!" << '\n' << endl;  
                  delay();  
                  cout << "输入任意字符!继续……";  
                  getchar();  
              }  
    }break;  
    }  
  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
void Studentmassage::ModifyItem()     //修改信息    
{  
    char name[20];  
    Student * p = NULL;  
    cout << "\t\t请输入要修改的人的姓名:"; cin >> name;  
    if (p = FindItem(name))  
    {  
        cout << "\t\t已找到学生的信息,请输入新的信息!" << endl;  
        p->Next->Input();  
        cout << "修改成功!" << endl;  
        cout << "输入任意字符!继续……";  
        getchar();  
    }  
    else  
    {  
        cout << "\t\t没有找到!" << endl;  
        delay();  
        cout << "输入任意字符!继续……";  
        getchar();  
    }  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
void Studentmassage::RemoveItem()         // 删除信息    
{  
    char name[20];  
    Student * p = NULL, *temp = NULL;  
    cout << "\t\t请输入要删除的学生的姓名:" << endl; cin >> name;  
    if (p = FindItem(name))  
    {  
        temp = p->Next;  
        p->Next = p->Next->Next;  
        delete temp;  
        delay();  
        cout << "\t\t删除成功!" << endl;  
        cout << "输入任意字符!继续……";  
        getchar();  
    }  
    else  
    {  
        cout << "\t\t没有找到!" << endl;  
        delay();  
        cout << "输入任意字符!继续……";  
        getchar();  
    }  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域    
{  
    Student *temp = new Student;  
    strcpy(temp->name, p1->name);  
    strcpy(temp->Id, p1->Id);  
    temp->Cnum = p1->Cnum;  
    temp->Mnum = p1->Mnum;  
    temp->Enum = p1->Enum;  
    temp->sum = p1->sum;  
  
    strcpy(p1->name, p2->name);  
    strcpy(p1->Id, p2->Id);  
    p1->Cnum = p2->Cnum;  
    p1->Mnum = p2->Mnum;  
    p1->Enum = p2->Enum;  
    p1->sum = p2->sum;  
  
    strcpy(p2->name, temp->name);  
    strcpy(p2->Id, temp->Id);  
    p2->Cnum = temp->Cnum;  
    p2->Mnum = temp->Mnum;  
    p2->Enum = temp->Enum;  
    p2->sum = temp->sum;  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数    
{  
    if (!Head)  
        return 0;  
    int n = 0;  
    for (Student * p = Head->Next; p != End; p = p->Next)  
    {  
        n++;  
    }  
    return n;  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
void Studentmassage::Sort()//对当前链表进行排序    
{  
    cout << "Sorting..." << endl;  
    Student *p = NULL, *p1 = NULL, *k = NULL;  
    int n = Studentmassage::ListCount();  
    if (n<2)  
        return;  
    for (p = Head->Next; p != End; p = p->Next)  
    for (k = p->Next; k != End; k = k->Next)  
    {  
        if (p->sum>k->sum)  
        {  
            Studentmassage::Swap(p, k);  
        }  
    }  
    delay();  
    cout << "排序完成!" << endl;  
    getchar();  
    return;  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
void Studentmassage::Save()  
{  
    out.open("sort.txt");  
    for (Student *p = Head->Next; p != End; p = p->Next)  
        out << p->name << "\t" << p->Id << "\t" << p->Cnum << "\t"  
        << p->Mnum << "\t" << p->Enum << "\t" << p->sum << '\n';  
    out.close();  
}  
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌    
int main()  
{  
    int x, i = 0;  
    bool quit = false;  
    cout << "\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§" << endl;  
    for (i = 0; i<3; i++)  
        cout << "\t\t◎\t\t\t\t\t\t  ◎" << endl;  
    cout << "\t\t◎★★★★【  欢迎进入学生成绩管理系统  】★★★★◎" << endl;  
    for (i = 0; i<3; i++)  
        cout << "\t\t◎\t\t\t\t\t\t  ◎" << endl;  
    cout << "\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§\n" << endl;;  
    Studentmassage Grade;  
    cout << "按任意键开始……";  
    getchar();  
    while (1)  
    {  
        
system("cls");  
        Grade.ShowMenu();  
        cin >> x;  
        switch (x)  
        {  
        case 0:quit = true; break;  
        case 1:Grade.AddItem(); break;  
        case 2:Grade.Display(); break;  
        case 3:Grade.Sort(); break;  
        case 4:Grade.Find(); break;  
        case 5:Grade.RemoveItem(); break;  
        case 6:Grade.ModifyItem(); break;  
        }  
    }  
    return 0;  
}