📄 xscj.cpp
字号:
//*********************************************************************************************
// *******学生成绩管理系统************************
#include<iostream>
#include<fstream>
#include<cstring>
#include<iomanip>
using namespace std;
struct Student
{
char class_x[21];
char num[7];
char name[9];
float elec;
float c_prog;
float media;
float eng;
float math;
float sport;
float polity;
float ave;
int order;
};
void Create(istream &,Student &); //输入学生信息
float Statistic(Student); //计算平均成绩
void Sort(); //按平均分对学生成绩记录项进行降序排序
int Lookup(char []); //查询指定学号学生成绩记录
void Modify(int); //修改指定学号学生成绩记录
void Delete(int); //删除指定学号学生记录
void Insert(); //按平均分顺序插入新记录
void Order(); //为已排好序的student[]的成员顺序赋值
void Equal(Student &,Student &); //为前一位学生赋予后一位学生的一切信息
void Print(Student, ostream); //打印学生信息
const int MAX=100;
Student student[MAX];
int numstu=0;
int main()
{
cout<<"*******************************************************************************"<<endl;
cout<<setw(50)<<"欢迎进入学生成绩管理系统\n\n\n";
cout<<"请确定数据输入的途径:1、文件输入。2、键盘输入。"<<endl;
char inway;
cin>>inway; //用户选择输入方式
int ordstu;
ifstream infile;
switch(inway)
{
case '1':
ordstu=0;
infile.open("GradeInput.txt");
if(!infile)
{
cout<<"文件打开失败,程序结束。请检查文件后再试。"<<endl; //I/O错误提示
return 1;
}
while( !infile.eof() ) //按文件结束为标志控制循环
{
Create(infile,student[ordstu]);
ordstu++;
numstu++;
}
infile.close();
numstu--; //排除循环干扰,调整学生人数至准确值
Sort();
cout<<"输入完成。"<<endl<<endl;
break;
case '2':
int innum;
cout<<"请输入学生个数:"<<endl;
cin>>innum;
cout<<"请输入学生资料(按人数依次输入):"<<endl;
cout<<"班级 "<<setw(14)<<"学号 "<<setw(8)<<"姓名 "<<setw(5)<<"电子"
<<setw(5)<<"C++"<<setw(7)<<"多媒体"<<setw(5)<<"英语"<<setw(5)<<"高数"
<<setw(5)<<"体育"<<setw(5)<<"政治"<<endl;
for(int x=0;x<innum;x++)
{
Create(cin,student[x]); // 调用Create函数,不断创建新的学生信息
numstu++;
}
Sort();
cout<<"\n输入完成."<<endl;
break;
}
while(1)
{
cout<<"\n接下来要进行的操作是:"<<endl
<<"1、查询指定学号学生成绩记录。"<<endl
<<"2、按平均分顺序插入一个新的学生成绩。"<<endl
<<"3、删除指定学号学生记录。"<<endl
<<"4、修改指定学号学生成绩记录。"<<endl
<<"5、在屏幕上输出所有学生的成绩。"<<endl
<<"6、将学生成绩输出到文件。"<<endl
<<"7、结束程序。"<<endl<<endl;
char opr;
cin>>opr; // 用户选择指令
char id[20];
int order;
ofstream outfile;
int x,y;
switch(opr)
{
case '1':
cout<<"\n请输入学生的学号(六位):"<<endl;
cin>>id;
order=Lookup(id); //调用有返回值函数Lookup
if(order==-1)
{
cout<<"\n无此学号的学生。"<<endl;
break;
}
cout<<"\n该学生的资料为:"<<endl;
cout<<"\n班级 "<<setw(14)<<"学号 "<<setw(8)<<"姓名 "<<setw(5)<<"电子"
<<setw(5)<<"C++"<<setw(7)<<"多媒体"<<setw(5)<<"英语"<<setw(5)<<"高数"
<<setw(5)<<"体育"<<setw(5)<<"政治"<<setw(9)<<"平均成绩"<<setw(5)<<"名次"
<<endl;
Print(student[order],cout);
break;
case '2':
cout<<"\n请输入该学生资料:"<<endl;
cout<<"\n班级 "<<setw(12)<<"学号 "<<setw(8)<<"姓名 "<<setw(7)<<"电子"
<<setw(7)<<"C++"<<setw(9)<<"多媒体"<<setw(7)<<"英语"<<setw(7)<<"高数"
<<setw(7)<<"体育"<<setw(7)<<"政治"<<endl;
Insert(); // 调用插入函数
cout<<"\n插入完成。"<<endl;
break;
case '3':
cout<<"\n请输入要删除的学生纪录的学号(六位):"<<endl;
cin>>id;
order=Lookup(id);
if(order==-1)
{
cout<<"\n无此学号的学生。"<<endl;
break;
}
Delete(order);
cout<<"\n删除完成。"<<endl;
break;
case'4':
cout<<"\n请输入要修改的学生纪录的学号(六位):"<<endl;
cin>>id;
order=Lookup(id);
if(order==-1)
{
cout<<"\n无此学号的学生。"<<endl;
break;
}
cout<<"\n请输入新的资料:"<<endl;
cout<<"\n班级 "<<setw(14)<<"学号 "<<setw(8)<<"姓名 "<<setw(5)<<"电子"
<<setw(5)<<"C++"<<setw(7)<<"多媒体"<<setw(5)<<"英语"<<setw(5)<<"高数"
<<setw(5)<<"体育"<<setw(5)<<"政治"<<endl;
Modify(order);
cout<<"\n修改完成。"<<endl;
break;
case '5':
cout<<"\n班级 "<<setw(14)<<"学号 "<<setw(8)<<"姓名 "<<setw(5)<<"电子"
<<setw(5)<<"C++"<<setw(7)<<"多媒体"<<setw(5)<<"英语"<<setw(5)<<"高数"
<<setw(5)<<"体育"<<setw(5)<<"政治"<<setw(9)<<"平均成绩"<<setw(5)<<"名次"
<<endl;
Sort();
for( x=0;x<numstu;x++)
{
Print(student[x],cout);
}
break;
case '6':
outfile.open("GradeOutput.txt"); // 初始化输出文件
Sort();
for( y=0;y<numstu;y++)
{
Print(student[y],outfile);
}
cout<<"\n文件输出完成。"<<endl;
break;
case '7':
cout<<"\n程序结束...\n\n"<<"谢谢使用!\n\n";
return 0;
default: cout<<"非法输入,请重试!\n";
}
cout<<endl;
}
return 0;
}
//*********************************************************************************************
void Create(istream & in,Student & student)
{
in>>student.class_x>>student.num>>student.name>>student.elec>>student.c_prog>>student.media
>>student.eng>>student.math>>student.sport>>student.polity;
}
//*********************************************************************************************
float Statistic(Student student)
{
float aver;
aver=(student.elec+student.c_prog+student.media+student.eng
+student.math+student.sport+student.polity)/7.0; //求平均分
aver=float(int(aver*1000+0.5))/1000; //四舍五入并保留三位小数
return aver;
}
//*********************************************************************************************
void Sort()
{
Student temp; // 创建Student型临时变量
temp.class_x[21]=0;
temp.num[7]=0;
temp.name[9]=0;
temp.elec=0;
temp.c_prog=0;
temp.media=0; // 初始化临时变量temp
temp.eng=0;
temp.math=0;
temp.sport=0;
temp.polity=0;
temp.ave=0;
temp.order=0;
for(int n=0;n<numstu;n++) // 扫描每个学生信息
{
for(int m=0;m<numstu-1;m++) // 将当前学生信息与之前每个学生信息进行比较
{
if( Statistic(student[m])<Statistic(student[m+1]) )
{
Equal(temp,student[m]);
Equal(student[m],student[m+1]); //将student[m]与student[m+1]信息互换
Equal(student[m+1],temp);
}
}
}
Order(); // 顺序排名
}
//*********************************************************************************************
int Lookup(char num[20])
{
int i=0;
while(i<numstu)
{
if( strcmp(student[i].num,num )==0 ) break; // 与查找目标进行比较
i++;
}
if(i==numstu)return -1;
else return i;
}
//*********************************************************************************************
void Modify(int x)
{
Create(cin,student[x]); // 赋予新的值
Sort();
}
//*********************************************************************************************
void Insert()
{
Create(cin,student[numstu]);
numstu++;
Student temp;
temp.class_x[21]=0;
temp.num[7]=0;
temp.name[9]=0;
temp.elec=0;
temp.c_prog=0;
temp.media=0;
temp.eng=0;
temp.math=0;
temp.sport=0;
temp.polity=0;
temp.ave=0;
temp.order=0;
for(int i=numstu-1;i>0;i--)
{
if( Statistic(student[i])>Statistic(student[i-1]) )
{
Equal(temp,student[i]);
Equal(student[i],student[i-1]);
Equal(student[i-1],temp); // 重新按平均分排序
}
else break;
}
Order();
}
//*********************************************************************************************
void Order()
{
for(int j=0;j<numstu;j++)
{
student[j].order=j+1;; // 顺序排名(从1开始)
}
}
//*********************************************************************************************
void Delete(int i)
{
for(int k=i;k<numstu-1;k++)
{
Equal(student[k],student[k+1]);
}
Order();
numstu--;
}
//*********************************************************************************************
void Equal(Student & stud1,Student & stud2)
{
strcpy(stud1.class_x,stud2.class_x);
strcpy(stud1.num,stud2.num);
strcpy(stud1.name,stud2.name);
stud1.elec=stud2.elec;
stud1.c_prog=stud2.c_prog;
stud1.media=stud2.media;
stud1.eng=stud2.eng;
stud1.math=stud2.math;
stud1.sport=stud2.sport;
stud1.polity=stud2.polity;
stud1.ave=stud2.ave;
stud1.order=stud2.order; //为前一位学生赋予后一位学生的一切信息
}
//*********************************************************************************************
void Print(Student studx,ostream out)
{
studx.ave=Statistic(studx);
out<<left; // 左对齐输出
out<<setw(13)<<studx.class_x<<setw(9)<<studx.num<<setw(8)<<studx.name<<setw(5)<<studx.elec
<<setw(5)<<studx.c_prog<<setw(7)<<studx.media<<setw(5)<<studx.eng<<setw(5)<<studx.math
<<setw(5)<<studx.sport<<setw(5)<<studx.polity<<setw(9)<<studx.ave<<setw(5)<<studx.order
<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -