等女友一起吃晚饭,等了半天都没等到,程序乱七八糟了写了一部分,先贴上来去五餐吃“夜宵”,吃完才有力气继续写。
专业任选课“面向对象程序设计”期末作业:
1.成绩统计:
功能设计:
(1)录入学生学号、姓名、各科成绩;
(2)对已录入成绩的浏览、根据学号查询成绩、删除数据;
(3)对已录入的成绩按学号(默认)、指定科目的成绩、总成绩排名;
(4))对已录入的成绩统计分析;
程序代码:
/**
* Student Performance Manage System
*
* @Author Jin Weiqing <jinmmd@gmail.com>
* @Version 2011-11-23 19:31:13 Mumu.
*/
#include <iostream>//包含标准输入输出函数
#include <cstdlib>//包含数字文本互相转换及各种工具函数
#include <string>//包含字符串处理函数,string::getline
#include <fstream>//包含磁盘文件读写相关的函数
//#include <sstream>
#include <iomanip>//包含能格式化数据流的流操纵算子的函数
using namespace std;
//声明结构体类型
struct Student
{
int id;
string name;
float score[3];
float sum;
};
//声明函数
void Insert(Student *S);
//void Update(Student *S);
void Delete(Student *S, int pid);
int Search(Student *S, int pid);
void Find(Student *S, int pid);
void Clear(Student *S);
void View(Student *S);
void Load(Student *S);
void Save(Student *S);
void Statistic(Student *S);
void Rank(Student *S, char item);
void Exit(Student *S);
void ShowMenu();
void ShowTip();
void DoMenu(Student *S, char num);
//定义全局变量
int studentnum=0;
bool flag=true;
//声明MAXNUM为符号变量并初始化
const int MAXNUM=60;
void main()
{
Student stu[MAXNUM];//定义保存学生数据的数组
Load(stu);//载入学生成绩数据
char ch;
ShowMenu();
cout<<"Select the corresponding number to operate:";
while(1)
{
cin>>ch;
system("cls");
ShowMenu();
DoMenu(stu, ch);
ShowTip();
}
}
int Search(Student *S, int pid)
{
int i;
for(i=1; i<=studentnum; i++)
if(S[i].id == pid)
return i;
return 0;
}
void Insert(Student *S)//学生成绩数据录入
{
Student t;
cout<<"Student ID is an integer, enter 0 to terminate."<<endl;
while(1)//循环录入,输入0结束
{
//输入前检测数据
if(studentnum >= MAXNUM-1)//人数是否超过设置的最大人数
{
cout<<"Has reached the maximum number of students."<<endl;
return;
}
cout<<"Please enter the student number(enter 0 to terminate):";
if(!(cin>>t.id))
{
cout<<"Student ID is an integer, Please enter the student number:"<<endl;
cin.clear();//清除状态标志,重置为0
cin.sync();//清空输入缓冲区
continue;
}
if(Search(S, t.id)>0)//查看是否已经存在该学号
{
cout<<"The Student ID already exists."<<endl;
continue;
}
if(t.id == 0)//输入为0时结束录入
{
cout<<"Completed entry."<<endl;
return;
}
cin.sync();
cout<<"Please enter the student Name:";
getline(cin, t.name);//读取一行,string::getline
//将输入流is中读到的字符存入t.name中,直到遇到终结符delim结束
//函数终结符delim默认为 '\n'
while(t.name == "")//检测输入的姓名是否为空
{
cin.sync();
cout<<"Student Name can not be empty, please enter the student Name:"<<endl;
getline(cin, t.name);
}
cout<<"Please enter the results of three subjects."<<endl;
cin>>t.score[0]>>t.score[1]>>t.score[2];
t.sum=t.score[0]+t.score[1]+t.score[2];
//cout<<t.sum;
++studentnum;
S[studentnum]=t;//将新录入的学生成绩数据加入数组中
flag=true;//数据已改变
}
}
void Delete(Student *S)//删除指定学号的学生成绩数据
{
if(studentnum == 0)
{
cout<<"There is no student."<<endl;
return;
}
else
{
int n,r=0;
char q;
cout<<"Please enter the number of the student who need to be removed.";
cin>>n;
r=Search(S, n);
if(r == 0)
{
cout<<"Can not find the student who need to be removed.";
return;
}
else
{
cout<<"Confirm to delete: y/n?";
cin>>q;
if(q == 'y' || q == 'Y')
{
for(int i=r; i<studentnum; i++)//删除学生成绩数据并将后面的数据向前覆盖
S[i]=S[i+1];
--studentnum;//同时减少学生总数
flag=true;
cout<<"Successfully removed the student which Student ID is: "<<n<<endl;
}
else
return;
}
}
}
void Clear(Student *S)//将学生总数重置为0
{
studentnum=0;
}
void Find(Student *S)//查找并显示指定学号的学生成绩数据
{
if(studentnum == 0)
{
cout<<"There is no student."<<endl;
return;
}
else
{
int n,i;
cout<<"Please enter the number of the student who need to be found."<<endl;
cin>>n;
i=Search(S, n);
if(i == 0)
cout<<"Can not find the student."<<endl;
else
{
cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 1"<<setw(6)<<"Subject 2"<<setw(6)<<"Subject 3"<<endl;
cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[0]<<setw(6)<<S[i].score[1]<<setw(6)<<S[i].score[2]<<endl;
}
}
}
void View(Student *S)//查看所有学生成绩信息
{
if(studentnum == 0)
{
cout<<"There is no student."<<endl;
return;
}
else
{
char n,w;
//float average;
Student u;
cout<<"There are a total of "<<studentnum<<" of student records"<<endl;
//选择需要查询的信息类型
cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
cin>>n;
while(n != 'n')
{
cin.sync();
if(n == 's' || n == 'S')
{
Statistic(S);
cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
cin>>n;
}
else if(n == 'r' || n == 'R')
{
cout<<"View student rankings sort by: subject1/subject2/subject3/sum/back?"<<endl;
cin>>w;
if(w == 'b' || w == 'B')
{
cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
cin>>n;
}
Rank(S, w);
flag=true;
}
else
{
cin.sync();
cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
cin>>n;
}
}
return;
}
}
void Rank(Student *S, char item)//根据项目种类排序
{
int i,j,k=1;
Student r;
switch(item)
{
case '1':
for(j=1; j<=studentnum; j++)
for(i=1; i<=studentnum-j; i++)
if(S[i].score[0] < S[i+1].score[0])
{
r=S[i];
S[i]=S[i+1];
S[i+1]=r;
}
cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 1"<<setw(6)<<"Ranking"<<endl;
for(i=1; i<=studentnum; i++)
{
if(S[i].score[0] > S[i+1].score[0])
k=i;
cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[0]<<setw(6)<<k<<endl;
}
break;
case '2':
for(j=1; j<=studentnum; j++)
for(i=1; i<=studentnum-j; i++)
if(S[i].score[1] < S[i+1].score[1])
{
r=S[i];
S[i]=S[i+1];
S[i+1]=r;
}
cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 2"<<setw(6)<<"Ranking"<<endl;
for(i=1; i<=studentnum; i++)
{
if(S[i].score[1] > S[i+1].score[1])
k=i;
cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[1]<<setw(6)<<k<<endl;
}
break;
case '3':
for(j=1; j<=studentnum; j++)
for(i=1; i<=studentnum-j; i++)
if(S[i].score[2] < S[i+1].score[2])
{
r=S[i];
S[i]=S[i+1];
S[i+1]=r;
}
cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 3"<<setw(6)<<"Ranking"<<endl;
for(i=1; i<=studentnum; i++)
{
if(S[i].score[2] > S[i+1].score[2])
k=i;
cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[2]<<setw(6)<<k<<endl;
}
break;
case 's':
for(j=1; j<=studentnum; j++)
for(i=1; i<=studentnum-j; i++)
if(S[i].sum < S[i+1].sum)
{
r=S[i];
S[i]=S[i+1];
S[i+1]=r;
}
cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Total Score"<<setw(6)<<"Ranking"<<endl;
for(i=1; i<=studentnum; i++)
{
if(S[i].sum > S[i+1].sum)
k=i;
cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].sum<<setw(6)<<k<<endl;
}
break;
case 'i':
for(j=1; j<=studentnum; j++)
for(i=1; i<=studentnum-j; i++)
if(S[i].id > S[i+1].id)
{
r=S[i];
S[i]=S[i+1];
S[i+1]=r;
}
cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 1"<<setw(6)<<"Subject 2"<<setw(6)<<"Subject 3"<<setw(6)<<"Total Score"<<endl;
for(i=1; i<=studentnum; i++)
{
cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[0]<<setw(6)<<S[i].score[1]<<setw(6)<<S[i].score[2]<<setw(6)<<S[i].sum<<endl;
}
break;
}
}
void Load(Student *S)//从文件载入学生成绩数据
{
int i;
Student t;
ifstream infile("data.txt");//创建文件输入流,文件相对位置在同一目录下
if(!infile)
{
cerr<<"Error:File can not open.\n";
exit(1);
}
else
{
for(i=1; infile>>S[i].id; i++)
{
infile>>S[i].name>>S[i].score[0]>>S[i].score[1]>>S[i].score[2]>>S[i].sum;
//cout<<S[i].name<<S[i].score[0]<<S[i].score[1]<<S[i].score[2]<<S[i].sum<<endl;
++studentnum;
}
}
flag=false;
infile.close();
}
void Save(Student *S)//保存学生成绩数据到文件
{
int i;
ofstream outfile("data.txt");
if(!outfile)
{
cerr<<"Error:File can not open.\n";
}
else
{
for(i=1; i<=studentnum; i++)
{
outfile<<S[i].id<<' '<<S[i].name<<' '<<S[i].score[0]<<' '<<S[i].score[1]<<' '<<S[i].score[2]<<' '<<S[i].sum<<endl;
}
flag=false;
cout<<"Successfully Saved."<<endl;
}
flag=false;
outfile.close();
}
void Exit(Student *S)
{
char s;
if(flag)//检测数据是否改变
{
cout<<"Data has been changed, whether to save: y/n?";
cin>>s;
if(s == 'y' || s == 'Y')
Save(S);
}
cout<<"Successfully exit."<<endl;
exit(0);
}
void ShowMenu()//显示功能菜单
{
cout<<"|---------------------------------------------------|"<<endl;
cout<<"| Student Performance Manage System |"<<endl;
cout<<"|---------------------------------------------------|"<<endl;
cout<<"| 1.Clear |"<<endl;
cout<<"| 2.Insert |"<<endl;
cout<<"| 3.Delete |"<<endl;
cout<<"| 4.Find |"<<endl;
cout<<"| 5.View |"<<endl;
cout<<"| 6.Update |"<<endl;
cout<<"| 7.Save |"<<endl;
cout<<"| 0.Exit |"<<endl;
cout<<"|---------------------------------------------------|"<<endl;
return;
}
void ShowTip()//显示友好提示
{
cout<<"|---------------------Finshed.----------------------|"<<endl;
cout<<"|--------------Enter 0-7 to continue.---------------|"<<endl;
cout<<"Enter number:"<<endl;
return;
}
void DoMenu(Student *S, char num)//关联与菜单对应的功能函数
{
switch(num)
{
case '1':
Clear(S);
//cout<<"Functions are under development."<<endl;
break;
case '2':
Insert(S);
break;
case '3':
Delete(S);
break;
case '4':
Find(S);
break;
case '5':
View(S);
break;
case '6':
//Update(S);
cout<<"Functions are under development."<<endl;
break;
case '7':
Save(S);
break;
case '0':
Exit(S);
break;
default:
cout<<"Please enter a number between 0 to 7:"<<endl;
}
}
/*
void Update(Student *S)
{
}
*/
void Statistic(Student *S)//对学生各科成绩数据统计分析
{
//system("cls");
//ShowMenu();
cout<<setw(14)<<"Subject 1"<<setw(12)<<"Subject 2"<<setw(12)<<"Subject 3"<<endl;
int i,j;
float average[3]={0.0,0.0,0.0}, high[3]={0.0,0.0,0.0}, low[3]={0.0,0.0,0.0};
int excellent[3]={0,0,0}, good[3]={0,0,0}, pass[3]={0,0,0};
for(j=0; j<3; j++)
{
high[j]=S[1].score[j];
low[j]=S[1].score[j];
}
for(i=1; i<=studentnum; i++)
{
for(j=0; j<3; j++)
{
average[j]=(S[i].score[j]+average[j])/studentnum;
if(S[i].score[j] >= 90)
excellent[j]++;
else if(S[i].score[j] >= 75)
good[j]++;
else if(S[i].score[j] >= 60)
pass[j]++;
if(S[i].score[j] > high[j])
high[j]=S[i].score[j];
if(S[i].score[j] < low[j])
low[j]=S[i].score[j];
}
}
cout<<setw(8)<<"Excellent:"<<setw(7)<<excellent[0]<<setw(12)<<excellent[1]<<setw(12)<<excellent[2]<<endl;
cout<<setw(8)<<"Good:"<<setw(12)<<good[0]<<setw(12)<<good[1]<<setw(12)<<good[2]<<endl;
cout<<setw(8)<<"Pass:"<<setw(12)<<pass[0]<<setw(12)<<pass[1]<<setw(12)<<pass[2]<<endl;
cout<<setw(8)<<"Fail:"<<setw(12)<<studentnum-pass[0]-good[0]-excellent[0]<<setw(12)<<studentnum-pass[1]-good[1]-excellent[1]<<setw(12)<<studentnum-pass[2]-good[2]-excellent[2]<<endl;
cout<<setw(8)<<"Average:"<<setw(9)<<average[0]<<setw(12)<<average[1]<<setw(12)<<average[2]<<endl;
cout<<setw(8)<<"Highest:"<<setw(9)<<high[0]<<setw(12)<<high[1]<<setw(12)<<high[2]<<endl;
cout<<setw(8)<<"Lowest:"<<setw(10)<<low[0]<<setw(12)<<low[1]<<setw(12)<<low[2]<<endl;
return;
}
加了点注释,方便回答老师的问题。