学生成绩管理系统 C++

2019-01-08  本文已影响0人  wbxl2000
在这里插入图片描述
/************************************************************/
/*程序名:学生成绩管理系统   作者:SDUQER                                  */
/*主要功能:添加删除修改排序;                                */
/*编制时间:2018年12月13日                                  */
/************************************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <iomanip>
using namespace std;

#define PUT puts("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")

int order; // 用户输入的指令

struct Student {
    string Name;
    string Id;
    long long Idnum;
    double Math;
    double English;
    double Algorithm;
    double Sum;
    Student *nxt;
};

void ShowMenu() // 展示菜单
{
    system("Cls");
    puts("                 **************************************");
    puts("                          学生成绩管理系统v1.0         ");
    puts("                 --------------------------------------");
    puts("                        请输入您要操作的指令<0-6>:    ");
    puts("                 --------------------------------------");
    puts("                              1.录入学生信息           \n");
    puts("                              2.所有学生信息           \n");
    puts("                              3.修改学生信息           \n");
    puts("                              4.删除学生信息           \n");
    puts("                              5.查询学生信息           \n");
    puts("                              6.成绩数据分析           \n");
    puts("                              0.退出系统               ");
    puts("                 **************************************");
}

void ExitSystem() // 退出系统
{
    system("Cls");
    puts("\n\n\n                 **************************************");
    puts("                               感谢您的使用!          ");
    puts("                 **************************************\n\n\n");
    system("pause");
    exit(0);
}

void InputError() // 输入错误
{
    puts("\n                 **************************************");
    puts("                      您输入的指令有误,请重新输入。   ");
    puts("                 **************************************\n");
}

//void update(Student *nw)
//{
//  cout << "EXM " <<endl;
//  nw->Sum = nw->Math + nw->English + nw->Algorithm;
//  return;
//}

void Add() // 录入
{
    system("Cls");
    puts("                 **************************************");
    puts("                                录入学生信息           ");
    puts("                 --------------------------------------");
    puts("                               请输入学生信息          ");
    puts("                 **************************************\n");
    char x = 'Y';
    ofstream fout("data.txt",ios::app);
    if(!fout)
    {
        puts("数据文件打开失败!");
        system("pause");
        exit(0);
    }
    Student *nw;
    nw = new Student; 
    while(x == 'Y' || x == 'y')
    {
        printf("请输入姓名:"); cin >> nw->Name;
        printf("请输入学号:"); cin >> nw->Id;
        printf("请输入数学成绩:"); cin >> nw->Math;
        while(nw->Math < 0 || nw->Math > 100)
        {
            puts("您输入的数据不合法,提示[0-100],请重新输入");
            cin >> nw->Math;
        }
        printf("请输入英语成绩:"); cin >> nw->English;
        while(nw->English < 0 || nw->English > 100)
        {
            puts("您输入的数据不合法,提示[0-100],请重新输入");
            cin >> nw->English;
        }
        printf("请输入计算导论成绩:"); cin >> nw->Algorithm;
        while(nw->Algorithm < 0 || nw->Algorithm > 100)
        {
            puts("您输入的数据不合法,提示[0-100],请重新输入");
            cin >> nw->Algorithm;
        }
        puts("");
        nw->Sum = nw->Math + nw->English + nw->Algorithm;///
        fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " " 
            << nw->Sum << endl;///
        printf("学生信息添加成功!\n"); 
        
        puts("是否继续添加?(Y/N)");
        cin >> x;
        puts("");
    }
    fout.close();
    system("pause");
}

void Display() // 显示所有学生信息 
{
    ifstream fin("data.txt");
    if(!fin)
    {
        puts("数据文件打开失败!");
        system("pause");
        exit(0);
    }
    
    system("Cls");
    puts("*******************************************************");
    puts("                    所有学生信息           ");
    puts("*******************************************************\n");
    cout << "序号\t姓名\t学号\t数学成绩\t英语成绩\t算法导论成绩\t总分\n";
    Student *nw;
    nw = new Student;
    int cnt = 0;
    while(fin >> nw->Name >> nw->Id >> nw->Math >> nw->English >> nw->Algorithm >> nw->Sum)
    {
        cnt ++;
        cout << left << setw(8) << cnt 
            << left << setw(8) << nw->Name 
            << left << setw(8) << nw->Id 
            << left << setw(16) << nw->Math 
            << left << setw(16) << nw->English 
            << left << setw(16) << nw->Algorithm 
            << nw->Sum 
            << endl;
    }
    fin.close();
    puts("");
    system("pause");
}

void Mend() // 修改
{
    char x = 'Y';
    string tmp;
    system("Cls");
    puts("*******************************************************");
    puts("                    修改学生信息           ");
    puts("*******************************************************\n");
    
    while(x == 'Y' || x == 'y')
    {   
        ifstream fin("data.txt");
        ofstream fout("data2.txt");
        if(!fin)
        {
            puts("数据文件打开失败!");
            system("pause");
            exit(0);
        }
        if(!fout)
        {
            puts("临时数据文件打开失败!");
            system("pause");
            exit(0);
        }
        
        puts("         请先按照以下关键字之一查找学生:");
        puts("--------------------------------------");
        puts("            1.姓名\n");
        puts("            2.学号\n");
        puts("            0.返回上一级菜单");
        printf("指令:"); scanf("%d", &order);
        while((order<0)||(order>2))
        {
            puts("");
            InputError();       
            puts("         请先按照以下关键字之一查找学生:");
            puts("--------------------------------------");
            puts("            1.姓名\n");
            puts("            2.学号\n");
            puts("            0.返回上一级菜单");
            printf("指令:"); scanf("%d", &order);
        }
        
        if(order == 0)
            return;
        
        if(order == 1) printf("请输入姓名:"), cin >> tmp;
        else if(order == 2) printf("请输入学号:"), cin >> tmp;
        
        Student *nw;
        nw = new Student;
        bool isFind = false;
        while(fin >> nw->Name >> nw->Id >> nw->Math >> nw->English >> nw->Algorithm >> nw->Sum)
        {
            if((tmp.compare(nw->Name)) && (tmp.compare(nw->Id)))
            {
                fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                    << nw->Sum << endl;
                continue;
            }
            isFind = true;
            
            cout << "\n姓名\t学号\t数学成绩\t英语成绩\t算法导论成绩\t总分\n";
            cout << left << setw(8) << nw->Name 
                << left << setw(8) << nw->Id 
                << left << setw(16) << nw->Math 
                << left << setw(16) << nw->English  
                << left << setw(16) << nw->Algorithm 
                << nw->Sum 
                << endl;
            
            system("Cls");
            puts("\n         请选择要修改学生信息类型:");
            puts("--------------------------------------");
            puts("            1.姓名\n");
            puts("            2.学号\n");
            puts("            3.数学成绩\n");
            puts("            4.英语成绩\n");
            puts("            5.算法导论成绩\n");
            puts("            0.返回上一级菜单");
            printf("指令:"); scanf("%d", &order);
            while((order<0)||(order>5))
            {
                puts("");
                InputError();       
                puts("\n         请选择要修改学生信息类型:");
                puts("--------------------------------------");
                puts("            1.姓名\n");
                puts("            2.学号\n");
                puts("            3.数学成绩\n");
                puts("            4.英语成绩\n");
                puts("            5.算法导论成绩\n");
                puts("            0.返回上一级菜单");
                printf("指令:"); scanf("%d", &order);
            }
        
            if(order == 0)
                return;
            
            if(order == 1)
            {
                string NewName;
                printf("请输入新姓名:"); cin >> NewName;
            
                // 防止用户输入错误
                printf("\n确认修改?(Y/N) "); cin >> x;
                if(x == 'N' || x == 'n') 
                {
                    puts("\n取消修改成功!");
                    fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                }
                else {
                    fout << NewName << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                    puts("\n数据修改成功!");
                }
            }
            else if(order == 2)
            {
                string NewId;
                printf("请输入新学号:"); cin >> NewId;
            
                // 防止用户输入错误
                printf("\n确认修改?(Y/N) "); cin >> x;
                if(x == 'N' || x == 'n') 
                {
                    puts("\n取消修改成功!");
                    fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                }
                else {
                    fout << nw->Name << " " << NewId << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                    puts("\n数据修改成功!");
                }
            }
            else if(order == 3)
            {
                double NewMath;
                printf("请输入新数学成绩:"); cin >> NewMath;
                while(NewMath < 0 || NewMath > 100)
                {
                    puts("您输入的数据不合法,提示[0-100],请重新输入");
                    cin >> NewMath;
                }
            
                // 防止用户输入错误
                printf("\n确认修改?(Y/N) "); cin >> x;
                if(x == 'N' || x == 'n') 
                {
                    puts("\n取消修改成功!");
                    fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                }
                else {
                    nw->Sum = NewMath + nw->English + nw->Algorithm;
                    fout << nw->Name << " " << nw->Id << " " << NewMath << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                    puts("\n数据修改成功!");
                }
            }
            else if(order == 4)
            {
                double NewEng;
                printf("请输入新英语成绩:"); cin >> NewEng;
                while(NewEng < 0 || NewEng > 100)
                {
                    puts("您输入的数据不合法,提示[0-100],请重新输入");
                    cin >> NewEng;
                }
            
                // 防止用户输入错误
                printf("\n确认修改?(Y/N) "); cin >> x;
                if(x == 'N' || x == 'n') 
                {
                    puts("\n取消修改成功!");
                    fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                }
                else {
                    nw->Sum = nw->Math + NewEng + nw->Algorithm;
                    fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << NewEng << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                    puts("\n数据修改成功!");
                }
            }
            else if(order == 5)
            {
                double NewAlgor;
                printf("请输入新算法导论成绩:"); cin >> NewAlgor;
                while(NewAlgor < 0 || NewAlgor > 100)
                {
                    puts("您输入的数据不合法,提示[0-100],请重新输入");
                    cin >> NewAlgor;
                }
            
                // 防止用户输入错误
                printf("\n确认修改?(Y/N) "); cin >> x;
                if(x == 'N' || x == 'n') 
                {
                    puts("\n取消修改成功!");
                    fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                        << nw->Sum << endl;
                }
                else {
                    nw->Sum = nw->Math + nw->English + NewAlgor;
                    fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << NewAlgor << " "
                        << nw->Sum << endl;
                    puts("\n数据修改成功!");
                }
            }
        }
        
        if(!isFind)
            puts("\n未找到该信息!");
        
        
        fin.close();
        fout.close();
        
        remove("data.txt");
        rename("data2.txt","data.txt"); 
        
        puts("\n是否继续修改?(Y/N)");
        cin >> x;
        puts("");
    }
    
    puts("");
    system("pause");
}

void Delete() // 删除
{
    char x = 'Y';
    string tmp;
    system("Cls");
    puts("*******************************************************");
    puts("                    删除学生信息           ");
    puts("*******************************************************\n");
    
    while(x == 'Y' || x == 'y')
    {   
        ifstream fin("data.txt");
        ofstream fout("data2.txt");
        if(!fin)
        {
            puts("数据文件打开失败!");
            system("pause");
            exit(0);
        }
        if(!fout)
        {
            puts("临时数据文件打开失败!");
            system("pause");
            exit(0);
        }
        
        puts("         请选择要删除学生信息的关键字:");
        puts("--------------------------------------");
        puts("            1.姓名\n");
        puts("            2.学号\n");
        puts("            0.返回上一级菜单");
        printf("指令:"); scanf("%d", &order);
        while((order<0)||(order>2))
        {
            puts("");
            InputError();
            puts("         请选择要删除学生信息的关键字:");
            puts("--------------------------------------");
            puts("            1.姓名\n");
            puts("            2.学号\n");
            puts("            0.返回上一级菜单");
            printf("指令:"); scanf("%d", &order);
        }
        
        if(order == 0)
            return;
        
        if(order == 1) printf("请输入姓名:"), cin >> tmp;
        else if(order == 2) printf("请输入学号:"), cin >> tmp;
        
        Student *nw;
        nw = new Student;
        bool isFind = false;
        while(fin >> nw->Name >> nw->Id >> nw->Math >> nw->English >> nw->Algorithm >> nw->Sum)
        {
            if((tmp.compare(nw->Name)) && (tmp.compare(nw->Id)))
            {
                fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                    << nw->Sum << endl;
                continue;
            }
            isFind = true;
            
            cout << "\n姓名\t学号\t数学成绩\t英语成绩\t算法导论成绩\t总分\n";
            cout << left << setw(8) << nw->Name 
                << left << setw(8) << nw->Id 
                << left << setw(16) << nw->Math 
                << left << setw(16) << nw->English 
                << left << setw(16) << nw->Algorithm 
                << nw->Sum 
                << endl;
            
            // 防止用户输入错误
            printf("\n确认删除?(Y/N) "); cin >> x;
            if(x == 'N' || x == 'n') 
            {
                puts("\n取消删除成功!");
                fout << nw->Name << " " << nw->Id << " " << nw->Math << " " << nw->English << " " << nw->Algorithm << " "
                    << nw->Sum << endl;
                continue; 
            }
            puts("\n数据删除成功!");
        }
        
        if(!isFind)
            puts("\n未找到该信息!");
        
        
        fin.close();
        fout.close();
        
        remove("data.txt");
        rename("data2.txt","data.txt"); 
        
        puts("\n是否继续删除?(Y/N)");
        cin >> x;
        puts("");
    }
    
    puts("");
    system("pause");
}

void Query() // 查询
{
    char x = 'Y';
    string tmp;
    system("Cls");
    puts("*******************************************************");
    puts("                    查询学生信息           ");
    puts("*******************************************************\n");
    
    while(x == 'Y' || x == 'y')
    {   
        ifstream fin("data.txt");
        if(!fin)
        {
            puts("数据文件打开失败!");
            system("pause");
            exit(0);
        }
        
        puts("                  请选择查询方式:");
        puts("--------------------------------------");
        puts("                  1.姓名\n");
        puts("                  2.学号\n");
        puts("                  3.返回上一级菜单");
        printf("指令:"); scanf("%d", &order);
        while((order<1)||(order>3))
        {
            puts("");
            InputError();
            puts("                  请选择查询方式:");
            puts("--------------------------------------");
            puts("                  1.姓名\n");
            puts("                  2.学号\n");
            puts("                  3.返回上一级菜单");
            printf("指令:"); scanf("%d", &order);
        }
        
        if(order == 3)
            return;
        
        if(order == 1) printf("请输入要查询的姓名:"), cin >> tmp;
        else if(order == 2) printf("请输入要查询的学号:"), cin >> tmp;
        Student *nw;
        nw = new Student;
        bool isFind = false;
        int cnt = 0;
        while(fin >> nw->Name >> nw->Id >> nw->Math >> nw->English >> nw->Algorithm >> nw->Sum)
        {
            if(order == 1)
            {
                if(!nw->Name.compare(tmp))
                {
                    if(!isFind)
                        cout << "\n序号\t姓名\t学号\t数学成绩\t英语成绩\t算法导论成绩\t总分\n";
                    isFind = true;
                    cnt ++;
                    cout << left << setw(8) << cnt 
                        << left << setw(8) << nw->Name 
                        << left << setw(8) << nw->Id 
                        << left << setw(16) << nw->Math 
                        << left << setw(16) << nw->English 
                        << left << setw(16) << nw->Algorithm 
                        << nw->Sum 
                        << endl; 
                }
            }
            else if(order == 2)
            {
                if(!nw->Id.compare(tmp))
                {
                    if(!isFind)
                        cout << "\n序号\t姓名\t学号\t数学成绩\t英语成绩\t算法导论成绩\t总分\n";
                    isFind = true;
                    cnt ++;
                    cout << left << setw(8) << cnt 
                        << left << setw(8) << nw->Name 
                        << left << setw(8) << nw->Id 
                        << left << setw(16) << nw->Math 
                        << left << setw(16) << nw->English 
                        << left << setw(16) << nw->Algorithm 
                        << nw->Sum 
                        << endl; 
                }
            }
        }
        if(!isFind)
            puts("\n未找到该信息!");
        fin.close();
        puts("\n是否继续查询?(Y/N)");
        cin >> x;
        puts("");
    }
    
    puts("");
    system("pause");
}

void Sort_Tongji() // 统计分数区间 
{
    
    char x = 'Y';
    string tmp;
    system("Cls");
    puts("*******************************************************");
    puts("                    统计学生信息           ");
    puts("*******************************************************\n");
    
    double l, r; 
    while(x == 'Y' || x == 'y')
    {   
        ifstream fin("data.txt");
        if(!fin)
        {
            puts("数据文件打开失败!");
            system("pause");
            exit(0);
        }
        
        system("Cls");
        puts("                  请选择需要统计的科目:");
        puts("--------------------------------------");
        puts("                  1.数学\n");
        puts("                  2.英语\n");
        puts("                  3.算法导论\n");
        puts("                  0.返回上一级菜单");
        printf("指令:"); scanf("%d", &order);
        if(order == 0)
            return;
        puts("请输入两个数字代表要统计的区间,如60 100:");
        cin >> l >> r;
        while((order<0)||(order>3))
        {
            puts("");
            InputError();
            puts("                  请选择需要统计的科目:");
            puts("--------------------------------------");
            puts("                  1.数学\n");
            puts("                  2.英语\n");
            puts("                  3.算法导论\n");
            puts("                  0.返回上一级菜单");
            printf("指令:"); scanf("%d", &order);
            if(order == 0)
                return;
            puts("请输入两个数字代表要统计的区间,如60 100:");
            cin >> l >> r;
        }
        
        if(order == 0)
            return;
        
        Student *Head = NULL, *nw;
        nw = new Student;
        int cnt = 0;
        while(fin >> nw->Name >> nw->Id >> nw->Math >> nw->English >> nw->Algorithm >> nw->Sum)
        {
            if(order == 1 && nw->Math >= l && nw->Math <= r)
            {
                cnt ++;
                nw->nxt = NULL;
                    //空 
                if(Head == NULL)
                {
                    Head = nw;
                    nw = new Student;
                    continue;
                }
                    //第一个就更da
                if(Head->Math <= nw->Math)
                {
                    nw->nxt = Head;
                    Head = nw;
                    nw = new Student;
                    continue;
                }
                    // 开始找
                Student *lst = Head, *p = Head->nxt; // lst 是p 的上一个
                while(p != NULL)
                {
                    if(nw->Idnum < p->Idnum)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间 
                        break;
                }
                // 执行完之后 p->Id >= nw->id, lst->Id <= nw->Id 
                nw->nxt = p;
                lst->nxt = nw;
    
                nw = new Student;
            }
            else if(order == 2 && nw->English >= l && nw->English <= r)
            {
                cnt ++;
            //  Insert(Head, nw);
                nw->nxt = NULL;
                    //空 
                if(Head == NULL)
                {
                    Head = nw;
                    nw = new Student;
                    continue;
                }
                    //第一个就更da
                if(Head->English <= nw->English)
                {
                    nw->nxt = Head;
                    Head = nw;
                    nw = new Student;
                    continue;
                }
                    // 开始找
                Student *lst = Head, *p = Head->nxt; // lst 是p 的上一个
                while(p != NULL)
                {
                    if(nw->English < p->English)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间 
                        break;
                }
                nw->nxt = p;
                lst->nxt = nw;
    
                nw = new Student;
            }
            else if(order == 3 && nw->Algorithm >= l && nw->Algorithm <= r)
            {
                cnt ++;
                nw->nxt = NULL;
                    //空 
                if(Head == NULL)
                {
                    Head = nw;
                    nw = new Student;
                    continue;
                }
                    //第一个就更da
                if(Head->Algorithm <= nw->Algorithm)
                {
                    nw->nxt = Head;
                    Head = nw;
                    nw = new Student;
                    continue;
                }
                    // 开始找
                Student *lst = Head, *p = Head->nxt; // lst 是 p 的上一个
                while(p != NULL)
                {
                    if(nw->Algorithm < p->Algorithm)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间
                        break;
                }
                // 执行完之后 p->Id >= nw->id, lst->Id <= nw->Id 
                nw->nxt = p;
                lst->nxt = nw;
    
                nw = new Student;
            }
            
        }
        
        //print
        system("Cls");
        Student *rs = Head;
        puts("*******************************************************");
        if(order == 1)
        {
            puts("              统计学生信息-----数学        ");
            cout << "           分数段" << l << "~" << r << "的总人数为 " << cnt << endl;
        }
        else if(order == 2)
        {
            puts("              统计学生信息-----英语        ");
            cout << "           分数段" << l << "~" << r << "的总人数为 " << cnt << endl;
        }
        else if(order == 3)
        {
            puts("              统计学生信息-----算法导论        ");
            cout << "           分数段" << l << "~" << r << "的总人数为 " << cnt << endl;
        }
        puts("*******************************************************\n"); 
        cout << "\n序号\t姓名\t学号\t数学成绩\t英语成绩\t算法导论成绩\t总分\n";
        cnt = 0;
        while(rs != NULL)
        {
            cnt ++;
            cout << left << setw(8) << cnt 
                << left << setw(8) << rs->Name 
                << left << setw(8) << rs->Id 
                << left << setw(16) << rs->Math 
                << left << setw(16) << rs->English 
                << left << setw(16) << rs->Algorithm 
                << rs->Sum 
                << endl;
            rs = rs->nxt;
        }
        //*******************************************************
        
        fin.close();
        puts("\n是否继续统计?(Y/N)");
        cin >> x;
        puts("");
    }
    
    puts("");
    system("pause");
}


void Sort_fenxi() // 统计分数
{
    
    char x = 'Y';
    string tmp;
    system("Cls");
    puts("*******************************************************");
    puts("                    分析成绩信息           ");
    puts("*******************************************************\n");
    
    while(x == 'Y' || x == 'y')
    {   
        ifstream fin("data.txt");
        if(!fin)
        {
            puts("数据文件打开失败!");
            system("pause");
            exit(0);
        }
        
        system("Cls");
        puts("                  请选择需要分析的科目:");
        puts("--------------------------------------");
        puts("                  1.数学\n");
        puts("                  2.英语\n");
        puts("                  3.算法导论\n");
        puts("                  4.自由选择分数区段\n");
        puts("                  0.返回上一级菜单");
        printf("指令:"); scanf("%d", &order);
        while((order<0)||(order>4))
        {
            puts("");
            InputError();
            puts("                  请选择需要统计的科目:");
            puts("--------------------------------------");
            puts("                  1.数学\n");
            puts("                  2.英语\n");
            puts("                  3.算法导论\n");
            puts("                  4.自由选择分数区段\n");
            puts("                  0.返回上一级菜单");
            printf("指令:"); scanf("%d", &order);
        }
        
        if(order == 0)
            return;
        if(order == 4)
        {
            Sort_Tongji();
            return;
        }
        
        Student *Head = NULL, *nw;
        nw = new Student;
        int cnt = 0, Math_60 = 0, Math_90 = 0, English_60 = 0, English_90 = 0, Algorithm_60 = 0, Algorithm_90 = 0;
        double Math_Max = 0, English_Max = 0, Algorithm_Max = 0;
        double Math_Min = 100, English_Min = 100, Algorithm_Min = 100;
        double Math_average = 0, English_average = 0, Algorithm_average = 0;
        while(fin >> nw->Name >> nw->Id >> nw->Math >> nw->English >> nw->Algorithm >> nw->Sum)
        {
            cnt ++;
            Math_60 += (int)(nw->Math>=60); Math_90 += (int)(nw->Math>=90);
            English_60 += (int)(nw->English>=60); English_90 += (int)(nw->English>=90);
            Algorithm_60 += (int)(nw->Algorithm>=60); Algorithm_90 += (int)(nw->Algorithm>=90);
            
            Math_Min = min(Math_Min, nw->Math);
            English_Min = min(English_Min, nw->English);
            Algorithm_Min = min(Algorithm_Min, nw->Algorithm);
            
            Math_Max = max(Math_Max, nw->Math);
            English_Max = max(English_Max, nw->English);
            Algorithm_Max = max(Algorithm_Max, nw->Algorithm);
            
            Math_average += nw->Math;
            English_average += nw->English; 
            Algorithm_average += nw->Algorithm;
        }
        
        Math_average /= (double)cnt;
        English_average /= (double)cnt;
        Algorithm_average /= (double)cnt;
        
        //print
        system("Cls");
        Student *rs = Head;
        puts("*******************************************************");
        if(order == 1)
        {
            puts("              分析学科信息-----数学        ");
            puts("*******************************************************\n"); 
            cout << "       最高分 : " << Math_Max << endl << endl; 
            cout << "       最低分 : " << Math_Min << endl << endl;
            cout << "       平均分 : " << Math_average << endl << endl; 
            cout << "         极差 : " << Math_Max-Math_Min << endl << endl;
            cout << "及格人数(>60) : " << Math_60 << endl << endl;
            cout << "       及格率 : " << ((double)Math_60/(double)cnt)*100.0 << "%" << endl << endl;
            cout << "优秀人数(>90) : " << Math_90 << endl << endl;
            cout << "       优秀率 : " << ((double)Math_90/(double)cnt)*100.0 << "%" << endl << endl;
        }
        else if(order == 2)
        {
            puts("              分析学科信息-----英语        ");
            puts("*******************************************************\n"); 
            cout << "       最高分 : " << English_Max << endl << endl; 
            cout << "       最低分 : " << English_Min << endl << endl;
            cout << "       平均分 : " << English_average << endl << endl; 
            cout << "         极差 : " << English_Max-English_Min << endl << endl;
            cout << "及格人数(>60) : " << English_60 << endl << endl;
            cout << "       及格率 : " << ((double)English_60/(double)cnt)*100.0 << "%" << endl << endl;
            cout << "优秀人数(>90) : " << English_90 << endl << endl;
            cout << "       优秀率 : " << ((double)English_90/(double)cnt)*100.0 << "%" << endl << endl;
        }
        else if(order == 3)
        {
            puts("              分析学科信息-----算法导论        ");
            puts("*******************************************************\n"); 
        //  cout << Algorithm_Max << " " << Algorithm_Min << endl;
            cout << "       最高分 : " << Algorithm_Max << endl << endl; 
            cout << "       最低分 : " << Algorithm_Min << endl << endl;
            cout << "       平均分 : " << Algorithm_average << endl << endl; 
            cout << "         极差 : " << Algorithm_Max-Algorithm_Min << endl << endl;
            cout << "及格人数(>60) : " << Algorithm_60 << endl << endl;
            cout << "       及格率 : " << ((double)Algorithm_60/(double)cnt)*100.0 << "%" << endl << endl;
            cout << "优秀人数(>90) : " << Math_90 << endl << endl;
            cout << "       优秀率 : " << ((double)Algorithm_90/(double)cnt)*100.0 << "%" << endl << endl;
        }
        //*******************************************************
        
        fin.close();
        puts("\n是否继续分析?(Y/N)");
        cin >> x;
        puts("");
    }
    
    puts("");
    system("pause");
}

void Sort() // 数据分析 
{
    
    char x = 'Y';
    string tmp;
    system("Cls");
    puts("*******************************************************");
    puts("                    分析学生信息           ");
    puts("*******************************************************\n");
    
    while(x == 'Y' || x == 'y')
    {   
        ifstream fin("data.txt");
        if(!fin)
        {
            puts("数据文件打开失败!");
            system("pause");
            exit(0);
        }
        
        system("Cls");
        puts("                  请选择分析方式:");
        puts("--------------------------------------");
        puts("                  1.学号从小到大\n");
        puts("                  2.数学成绩从大到小\n");
        puts("                  3.英语成绩从大到小\n");
        puts("                  4.算法导论成绩从大到小\n");
        puts("                  5.总成绩从大到小\n");
        puts("                  6.查看各科合格率、优秀率等分析数据\n");
        puts("                  0.返回上一级菜单");
        printf("指令:"); scanf("%d", &order);
        while((order<0)||(order>6))
        {
            puts("");
            InputError();
            puts("                  请选择分析方式:");
            puts("--------------------------------------");
            puts("                  1.学号从小到大\n");
            puts("                  2.数学成绩从大到小\n");
            puts("                  3.英语成绩从大到小\n");
            puts("                  4.算法导论成绩从大到小\n");
            puts("                  5.总成绩从大到小\n");
            puts("                  6.查看各科合格率、优秀率等分析数据\n");
            puts("                  0.返回上一级菜单");
            printf("指令:"); scanf("%d", &order);
        }
        
//      cout << "!@#^*()" << order << endl;
        
        if(order == 0)
        {
//          cout << "EXM" <<endl; 
            return;
        } 
        if(order == 6)
        {
            Sort_fenxi();
            Sort();
            return;
        }
        
        Student *Head = NULL, *nw;
        nw = new Student;
        // Insert;
        while(fin >> nw->Name >> nw->Id >> nw->Math >> nw->English >> nw->Algorithm >> nw->Sum)
        {
            if(order == 1)
            {
                int len = nw->Id.length();
                nw->Idnum = 0;
                for(int i = 0; i < len; ++ i)
                {
                    nw->Idnum += (long long)(nw->Id[i]-'0');
                    nw->Idnum *= 10;
                }
                nw->Idnum /= 10;
            }
            nw->nxt = NULL;
                //空 
            if(Head == NULL)
            {
                Head = nw;
                nw = new Student;
                continue;
            }
                //第一个就更小 
            if(order == 1 && Head->Idnum >= nw->Idnum)
            {
            //  cout << Head->Idnum << " " << nw->Idnum << endl;
                nw->nxt = Head;
                Head = nw;
                nw = new Student;
                continue;
            }
                //第一个就更da
            if(order == 2 && Head->Math <= nw->Math)
            {
                nw->nxt = Head;
                Head = nw;
                nw = new Student;
                continue;
            }
                //第一个就更da
            if(order == 3 && Head->English <= nw->English)
            {
                nw->nxt = Head;
                Head = nw;
                nw = new Student;
                continue;
            }
                //第一个就更da
            if(order == 4 && Head->Algorithm <= nw->Algorithm)
            {
                nw->nxt = Head;
                Head = nw;
                nw = new Student;
                continue;
            }
                //第一个就更da
            if(order == 5 && Head->Sum <= nw->Sum)
            {
                nw->nxt = Head;
                Head = nw;
                nw = new Student;
                continue;
            }
                // 开始找
            Student *lst = Head, *p = Head->nxt; // lst 是p 的上一个
            while(p != NULL)
            {
                if(order == 1)
                {
                    if(nw->Idnum > p->Idnum)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间 
                        break;
                }
                else if(order == 2)
                {
                    if(nw->Math < p->Math)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间 
                        break;
                }
                else if(order == 3)
                {
                    if(nw->English < p->English)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间 
                        break;
                }
                else if(order == 4)
                {
                    if(nw->Algorithm < p->Algorithm)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间 
                        break;
                }
                else if(order == 5)
                {
                    if(nw->Sum < p->Sum)
                    {
                        lst = p;
                        p = p->nxt;
                    }
                    else // 找到了要插入的这个刚好不大于的点,这个点位于 r,q之间 
                        break;
                }
            }
            // 执行完之后 p->Id >= nw->id, lst->Id <= nw->Id 
            nw->nxt = p;
            lst->nxt = nw;

            nw = new Student;
        }
        
        //print
        system("Cls");
        Student *r = Head;
        puts("*******************************************************");
        if(order == 1)
            puts("              分析学生信息-----学号从小到大        ");
        else if(order == 2)
            puts("              分析学生信息-----数学成绩从大到小    ");
        else if(order == 3)
            puts("              分析学生信息-----英语成绩从大到小    ");
        else if(order == 4)
            puts("              分析学生信息-----算法导论成绩从大到小");
        else if(order == 5)
            puts("              分析学生信息-----总成绩从大到小");
        puts("*******************************************************\n"); 
        cout << "\n序号\t姓名\t学号\t数学成绩\t英语成绩\t算法导论成绩\t总分\n";
        int cnt = 0; 
        while(r != NULL)
        {
            cnt ++;
            cout << left << setw(8) << cnt 
                << left << setw(8) << r->Name 
                << left << setw(8) << r->Id 
                << left << setw(16) << r->Math 
                << left << setw(16) << r->English 
                << left << setw(16) << r->Algorithm 
                << r->Sum 
                << endl;
            r = r->nxt;
        }
        //*******************************************************
        
        fin.close();
        puts("\n是否继续查看?(Y/N)");
        cin >> x;
        puts("");
    }
    
    puts("");
    system("pause");
}

void MenuOrderAction() // 执行命令
{
    if(order == 1) {
        Add();
    }
    else if(order == 2){
        Display();
    }
    else if(order == 3){
        Mend();
    }
    else if(order == 4){
        Delete();
    }
    else if(order == 5){
        Query();
    }
    else if(order == 6){
        Sort();
    }
    else if(order == 0){
        ExitSystem();
    }
//  cout << "ahha" << endl;
}

int main()
{
    while(1)
    {
        ShowMenu();
        printf("指令:"); scanf("%d", &order);
        while((order<0)||(order>6))
        {
            ShowMenu();
            InputError();
            printf("指令:"); scanf("%d", &order);
        }
        MenuOrderAction();
    }
    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读