学生成绩管理系统 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;
}