#include <iostream>
#include <string>
#include <iomanip>
#include <cstdlib>
#include <fstream>
#include <cstring>
#include <cctype>
using namespace std;
const int SIZE=20;
struct student
{
char classnum[SIZE];
char id[SIZE];
char name[SIZE];
int *score;
};
int main()
{
cout<<setw(25)<<" "<<"欢迎使用本学生管理系统!"<<endl;
cout<<""<<endl<<endl;
cout<<"《学生成绩管理系统》"<<endl<<endl;
cout<<""<<endl;
int n=0;
int student_num;//学生数
int semester;//学期
int cour_num;//课程数
cout<<"是否从文档中读取基础信息?(Y/N):";
char first_sel;
cin>>first_sel;
cin.get();
while(tolower(first_sel)!='y'&&tolower(first_sel)!='n')
{
cout<<"输入错误,请重新输入(Y/N):";
cin>>first_sel;
cin.get();
}
if(tolower(first_sel)=='y')
{
ifstream fin;
n=1;
cout<<"说明:"<<endl;
cout<<" 如上次保存的文档名为student.txt"<<endl;
cout<<" 则读取的文档名为basic_student.txt。"<<endl;
cout<<"请输入基本信息文档名:";
char _fname[SIZE];
cin.getline(_fname,SIZE);
fin.open(_fname);
while(!fin.is_open())
{
cout<<"不能打开此文档名的文档,请重新输入:";
cin.getline(_fname,SIZE);
fin.open(_fname);
}
fin>>student_num;
fin.get();
fin>>semester;
fin.get();
fin>>cour_num;
fin.get();
fin.close();
system("pause");
system("cls");
}
else
{
cout<<setfill('=')<<setw(32);
cout<<"请输入学生个数:";
cin>>student_num;
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入学生个数: ";
cin>>student_num;
cin.get();
}
cout<<"================";
cout<<"请输入学期(以数字形式):";
cin>>semester;
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入学期: ";
cin>>student_num;
cin.get();
}
cout<<setfill('=')<<setw(25);
cout<<"请输入第 "<<semester<<" 学期的课程门数: ";
cin>>cour_num;
cin.get();
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入第 "<<semester<<" 学期的课程门数: ";
cin>>cour_num;
cin.get();
}
}
student *p=new student[student_num];
string *cour_name=new string[cour_num];
if(tolower(first_sel)=='y')
{
ifstream fin;
cout<<">>>>>>>>>>>>>>>>《说明: 》<<<<<<<<<<<<<<<<"<<endl;
cout<<">>>>>>>>>>>>>>>>《 如上次保存的文档名为student.txt 》<<<<<<<<<<<<<<<<"<<endl;
cout<<">>>>>>>>>>>>>>>>《 则读取的文档名为course_student.txt。 》<<<<<<<<<<<<<<<<"<<endl;
cout<<"请输入课程信息文档名:";
char _fname[SIZE];
cin.getline(_fname,SIZE);
fin.open(_fname);
while(!fin.is_open())
{
cout<<"不能打开此文档名的文档,请重新输入:";
cin.getline(_fname,SIZE);
fin.open(_fname);
}
for(int i=0;i<cour_num;i++)
{
getline(fin,cour_name[i]);
}
fin.close();
system("pause");
system("cls");
}
else
{
for(int i=0;i<cour_num;i++)
{
cout<<setfill('=')<<setw(25);
cout<<"请输入第 "<<i+1<<" 个课程名:";
getline(cin,cour_name[i]);
}
}
int **all_score=new int*[student_num];
for(int i=0;i<student_num;i++)
all_score[i]=new int[cour_num];
for(int i=0;i<student_num;i++)
p[i].score=&all_score[i][0];
if(tolower(first_sel)=='y')
{
ifstream fin;
cout<<"说明:"<<endl;
cout<<" 如上次保存的文档名为student.txt "<<endl;
cout<<" 则读取的文档名为student_student.txt。"<<endl;
cout<<"请输入学生信息文档名:";
char _fname[SIZE];
cin.getline(_fname,SIZE);
fin.open(_fname);
while(!fin.is_open())
{
cout<<"不能打开此文档名的文档,请重新输入:";
cin.getline(_fname,SIZE);
fin.open(_fname);
}
for(int i=0;i<student_num;i++)
{
fin.get(p[i].classnum,SIZE);
fin.get();
fin.get(p[i].id,SIZE);
fin.get();
fin.getline(p[i].name,SIZE);
for(int j=0;j<cour_num;j++)
{
fin>>*(p[i].score+j);
fin.get();
}
}
fin.close();
}
system("pause");
system("cls");
char select='a';
while(select!='q')
{
cout<<""<<endl;
cout<<"请输入选择:"<<endl;
cout<<"【a】输入基本信息 "<<"【b】显示成绩信息 "<<"【c】成绩统计分析"<<endl;
cout<<"【d】统计各科各分数段人数 "<<"【e】查找某个学生的各科成绩 " <<"【f】由高到低显示成绩"<<endl;
cout<<"【g】更新学生成绩 "<<"【h】保存学生与成绩信息 "<<"【q】结束"<<endl<<endl;
cout<<""<<endl;
cout<<"输入:";
cin.get(select);
cin.get();
while(n==0&&select!='a')
{
cout<<"错误,请先输入基本信息!"<<endl;
select='a';
}
if(select=='a')
input(p,cour_name,student_num,cour_num);
else if(select=='b')
show(p,cour_name,student_num,cour_num);
else if(select=='c')
statistic(p,cour_name,student_num,cour_num);
else if(select=='d')
section(p,cour_name,student_num,cour_num);
else if(select=='e')
search(p,cour_name,student_num,cour_num);
else if(select=='f')
sort(p,cour_name,student_num,cour_num);
else if(select=='g')
update(p,cour_name,student_num,cour_num);
else if(select=='h')
fileout(p,cour_name,student_num,cour_num,semester);
else if(select=='q')
;
else
cout<<"输入错误,请重新输入: "<<endl;
n++;
}
cout<<""<<endl;
cout<<"欢迎使用!"<<endl;
delete p;
delete cour_name;
for(int j=0;j<student_num;j++)
delete[] all_score[j];
delete all_score;
return 1;
}
void input(student p[], string c_name[],int s_num,int c_num);
void show(student p[], string c_name[],int s_num,int c_num);
void statistic(student p[], string c_name[],int s_num,int c_num);
void section(student p[], string c_name[],int s_num,int c_num);
void search(student p[], string c_name[],int s_num,int c_num);
void sort(student p[], string c_name[],int s_num,int c_num);
void update(student p[], string c_name[],int s_num,int c_num);
void quicksort(int s[],int l,int r);
void fileout(student p[], string c_name[],int s_num,int c_num,int semester);
void input(student p[], string c_name[],int s_num,int c_num)
{
for(int i=0;i<s_num;i++)
{
if(i>0)
{
cout<<"《》";
cout<<"《》";
cout<<"《请继续输入》";
cout<<"《》";
cout<<"《》";
cout<<endl;
}
cout<<setfill('=')<<setw(25);
cout<<"请输入第 "<<i+1<<"个学生的班级(例如:自动化1121):";
cin.get(p[i].classnum,SIZE);
cin.get();
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入: ";
cin.get(p[i].classnum,SIZE);
cin.get();
}
cout<<setfill('=')<<setw(14);
cout<<"请输入"<<i+1<<"个学生的学号:";
cin.get(p[i].id,SIZE);
cin.get();
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入: ";
cin.get(p[i].id,SIZE);
cin.get();
}
for(int k=0;k<s_num;k++)
{
if(k==i)
k++;
if(strcmp(p[k].id,p[i].id)==0)
{
cout<<setfill('=')<<setw(25);
cout<<"与已有学生的学号重复,请重新输入:";
cin.get(p[i].id,SIZE);
cin.get();
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入: ";
cin.get(p[i].id,SIZE);
cin.get();
}
}
}
cout<<setfill('=')<<setw(32);
cout<<"请输入其姓名:";
cin.getline(p[i].name,SIZE);
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入: ";
cin.getline(p[i].name,SIZE);
}
for(int j=0;j<c_num;j++)
{
cout<<setfill('=')<<setw(24);
cout<<"请输入"<<c_name[j]<<"的成绩:";
cin>>*(p[i].score+j);
cin.get();
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入: ";
cin>>*(p[i].score+j);
cin.get();
}
while(*(p[i].score+j)>100||*(p[i].score+j)<0)
{
cout<<setfill('=')<<setw(25);
cout<<"输入错误,请输入0到100之内的数:";
cin>>*(p[i].score+j);
cin.get();
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入: ";
cin>>*(p[i].score+j);
cin.get();
}
}
}
system("pause");
system("cls");
}
}
void statistic(student p[], string c_name[],int s_num,int c_num)
{
int sum,ave,max,min,pass,trigger,cl_num;
double pass_rate;
for(int i=0;i<c_num;i++)
{
cout<<"【"<<c_name[i]<<"科目】"<<endl;
for(int k=0;k<s_num;k++)
{
sum=0;
trigger=0;
ave=0;
cl_num=0;
pass_rate=0;
pass=0;
max=*(p[k].score+i);
min=*(p[k].score+i);
for(int j=0;j<k;j++)
if(strcmp(p[k].classnum,p[j].classnum)==0)
trigger=1;
if(trigger==1)
continue;
for(int j=k;j<s_num;j++)
{
if(strcmp(p[k].classnum,p[j].classnum)==0)
{
sum+=*(p[j].score+i);
cl_num++;
if((*p[j].score+i)>max)
max=*(p[j].score+i);
if((*p[j].score+i)<min)
min=*(p[j].score+i);
if(*(p[j].score+i)>=60)
pass++;
}
}
cout<<"《"<<p[k].classnum<<"班》"<<endl;
cout<<"";
cout<<"总分为:"<<sum<<" ";
ave=sum/cl_num;
cout<<"平均分为:"<<ave<<" ";
cout<<"最高分为:"<<max<<" ";
cout<<"最低分为:"<<min<<" ";
pass_rate=(1.0*pass)/cl_num;
cout<<"及格率为:"<<pass_rate*100<<"%"<<endl;
cout<<"";
}
}
system("pause");
system("cls");
}
void section(student p[], string c_name[],int s_num,int c_num)
{
int s_nopass,s_60,s_70,s_80,s_90,trigger;
for(int i=0;i<c_num;i++)
{
cout<<"【"<<c_name[i]<<"】";
for(int k=0;k<s_num;k++)
{
trigger=0;
s_nopass=0;
s_60=0;
s_70=0;
s_80=0;
s_90=0;
for(int j=0;j<k;j++)
if(strcmp(p[k].classnum,p[j].classnum)==0)
trigger=1;
if(trigger==1)
continue;
for(int j=k;j<s_num;j++)
{
if(strcmp(p[k].classnum,p[j].classnum)==0)
{
if(*(p[j].score+i)>=90)
s_90++;
else if(*(p[j].score+i)>=80)
s_80++;
else if(*(p[j].score+i)>=70)
s_70++;
else if(*(p[j].score+i)>=60)
s_60++;
else if(*(p[j].score+i)<60)
s_nopass++;
}
}
cout<<endl;
cout<<"《"<<p[k].classnum<<"班》"<<endl;
cout<<"";
cout<<"不及格:"<<s_nopass<<" 人 ";
cout<<"60至70:"<<s_60<<" 人 ";
cout<<"70至80:"<<s_70<<" 人 ";
cout<<"80至90:"<<s_80<<" 人 ";
cout<<"90至100:"<<s_90<<" 人 "<<endl;
cout<<"";
}
}
system("pause");
system("cls");
}
void search(student p[], string c_name[],int s_num,int c_num)
{
char name_or_id[SIZE];
cout<<"请输入学号或名字:";
cin.get(name_or_id,SIZE);
cin.get();
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"错误!请重新输入: ";
cin.get(name_or_id,SIZE);
cin.get();
}
cout<<"";
int n=0;
for(int i=0;i<s_num;i++)
{
if(strcmp(p[i].name,name_or_id)==0||strcmp(p[i].id,name_or_id)==0)
{
n++;
cout<<"学号"<<p[i].id<<"的"<<p[i].name<<"同学的成绩如下:"<<endl;
cout<<"";
for(int j=0;j<c_num;j++)
cout<<c_name[j]<<"科目:"<<*(p[i].score+j)<<"分"<<" ";
cout<<endl;
cout<<"";
}
}
if(n==0)
cout<<"没有这名同学的信息。"<<endl;
system("pause");
system("cls");
}
void sort(student p[], string c_name[],int s_num,int c_num)
{
int *score_s=new int[s_num];
for(int i=0;i<c_num;i++)
{
for(int j=0;j<s_num;j++)
score_s[j]=*(p[j].score+i);
quicksort(score_s,0,s_num-1);
cout<<"【"<<c_name[i]<<"】由高到低的分数排序如下:"<<endl;
cout<<"";
for(int j=0;j<s_num;j++)
cout<<score_s[j]<<"分 ";
cout<<endl;
cout<<"";
}
system("pause");
system("cls");
delete[] score_s;
}
void fileout(student p[], string c_name[],int s_num,int c_num,int semester)
{
ofstream fout;
char fname[SIZE];
char _fname1[SIZE]="basic_";
char _fname2[SIZE]="course_";
char _fname3[SIZE]="student_";
cout<<"请输入要保存的文件名(需要加上后缀.txt):";
cin.getline(fname,SIZE);
strcat(_fname1,fname);
strcat(_fname2,fname);
strcat(_fname3,fname);
fout.open(fname);
for(int i=0;i<s_num;i++)
{
fout<<""<<endl;
fout<<"【个人信息】";
fout<<"姓名:"<<p[i].name<<" "<<"班级:"<<p[i].classnum<<"班 "<<"学号:"<<p[i].id<<endl;
fout<<"*"<<endl;
fout<<"【成绩】";
for(int j=0;j<c_num;j++)
fout<<c_name[j]<<":"<<*(p[i].score+j)<<" ";
fout<<endl;
fout<<""<<endl;
fout<<endl;
}
fout.close();
fout.open(_fname1);
fout<<s_num<<endl;
fout<<semester<<endl;
fout<<c_num<<endl;
fout.close();
fout.open(_fname2);
for(int i=0;i<c_num;i++)
{
fout<<c_name[i]<<endl;
}
fout.close();
fout.open(_fname3);
for(int i=0;i<s_num;i++)
{
fout<<p[i].classnum<<endl;
fout<<p[i].id<<endl;
fout<<p[i].name<<endl;
for(int j=0;j<c_num;j++)
{
fout<<*(p[i].score+j)<<endl;
}
}
cout<<"已输出到"<<fname<<"中。"<<endl;
system("pause");
system("cls");
}
void quicksort(int s[],int l,int r)
{
if(l<r)
{
int i=l,j=r,x=s[l];
while(i<j)
{
while(i<j&&s[j]<=x)
j--;
if(i<j)
s[i++]=s[j];
while(i<j&&s[i]>=x)
i++;
if(i<j)
s[j--]=s[i];
}
s[i]=x;
quicksort(s,l,i-1);
quicksort(s,i+1,r);
}
}
课程综合设计
最新推荐文章于 2020-03-10 16:03:47 发布