You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

728 lines
26 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <iostream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <fstream>
#include <string>
#include <cctype>
using namespace std;
const int SIZE=20;
struct student
{
char classnum[SIZE]; //班级
char id[SIZE]; //学号
char name[SIZE]; //姓名
int *score;
};
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);//文件形式输出
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
{
int i;
for(i=0;i<cour_num;i++)
{
cout<<setfill('=')<<setw(25);
cout<<"请输入第 "<<i+1<<" 个课程名:";
cin>>cour_name[i];
cin.get();
}
}
int i;
int **all_score=new int*[student_num];
for(i=0;i<student_num;i++)
all_score[i]=new int[cour_num];
for(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);
}
int i;
for(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<<"【1】输入基本信息 "<<"【2】显示成绩信息 "<<"【3】成绩统计分析"<<endl;
cout<<"【4】统计各科各分数段人数 "<<"【5】查找某个学生的各科成绩 " <<"【6】由高到低显示成绩"<<endl;
cout<<"【7】更新学生成绩 "<<"【8】保存学生与成绩信息 "<<"【9】结束"<<endl<<endl;
cout<<"********************************************************************************"<<endl;
cout<<"输入:";
cin.get(select);
cin.get();
while(n==0&&select!='1')
{
cout<<"输入有误,请先输入基本信息!"<<endl;
select='1';
}
if(select=='1')
input(p,cour_name,student_num,cour_num);
else if(select=='2')
show(p,cour_name,student_num,cour_num);
else if(select=='3')
statistic(p,cour_name,student_num,cour_num);
else if(select=='4')
section(p,cour_name,student_num,cour_num);
else if(select=='5')
search(p,cour_name,student_num,cour_num);
else if(select=='6')
sort(p,cour_name,student_num,cour_num);
else if(select=='7')
update(p,cour_name,student_num,cour_num);
else if(select=='8')
fileout(p,cour_name,student_num,cour_num,semester);
else if(select=='9')
;
else
cout<<"输入有误,请重新输入: "<<endl;
n++;
}
cout<<"********************************************************************************"<<endl;
cout<<"欢迎使用,再见!"<<endl;
delete p;
delete cour_name;
for(i=0;i<student_num;i++)
delete[] all_score[i];
delete all_score;
return 0;
}
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<<"个学生的班级例如自动化1122";
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(24);
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 show(student p[], string c_name[],int s_num,int c_num)
{
cout<<"********************************************************************************";
cout<<"科目:\t\t";
for(int j=0;j<c_num;j++)
cout<<"\t"<<c_name[j];
cout<<endl;
cout<<"********************************************************************************";
for(int i=0;i<s_num;i++)
{
cout<<p[i].classnum<<"班:"<<p[i].name<<":";
if(isalpha(p[i].name[0]))
cout<<"\t\t";
else
cout<<"\t";
for(int j=0;j<c_num;j++)
cout<<*(p[i].score+j)<<"\t";
cout<<endl;
cout<<"********************************************************************************";
}
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);
int j;
for(j=0;j<k;j++)
if(strcmp(p[k].classnum,p[j].classnum)==0)
trigger=1;
if(trigger==1)
continue;
for(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 update(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();
char ch;
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<<"请选择要执行的操作:"<<endl;
cout<<"********************************************************************************";
cout<<"(a)更新学生的基本信息 (b)更新学生的成绩"<<endl;
cout<<"(q)结束"<<endl;
cout<<"********************************************************************************";
cout<<"输入:";
cin.get(ch);
cin.get();
cout<<"********************************************************************************";
if(ch!='q')
{
if(ch=='a')
{
cout<<"请输入其班级例如自动化1122";
cin.get(p[i].classnum,SIZE);
cin.get();
cout<<"********************************************************************************";
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"输入有误!请重新输入: ";
cin.get(p[i].classnum,SIZE);
cin.get();
cout<<"********************************************************************************";
}
cout<<"请输入其学号:";
cin.get(p[i].id,SIZE);
cin.get();
cout<<"********************************************************************************";
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"输入有误!请重新输入: ";
cin.get(p[i].id,SIZE);
cin.get();
cout<<"********************************************************************************";
}
for(int k=0;k<s_num;k++)
{
if(k==i)
k++;
if(strcmp(p[k].id,p[i].id)==0)
{
cout<<"与已有学生的学号重复,请重新输入:"<<endl;
cin.get(p[i].id,SIZE);
cin.get();
cout<<"********************************************************************************";
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"输入有误!请重新输入: ";
cin.get(p[i].id,SIZE);
cin.get();
cout<<"********************************************************************************";
}
}
}
cout<<"请输入其姓名:";
cin.getline(p[i].name,SIZE);
cout<<"********************************************************************************";
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"输入有误!请重新输入: ";
cin.getline(p[i].name,SIZE);
cout<<"********************************************************************************";
}
}
else if(ch=='b')
{
for(int j=0;j<c_num;j++)
{
cout<<"请输入"<<c_name[j]<<"的成绩:";
cin>>*(p[i].score+j);
cin.get();
cout<<"********************************************************************************";
while(!cin.good())
{
cin.clear();
cin.sync();
cout<<"输入有误!请重新输入: ";
cin>>*(p[i].score+j);
cin.get();
cout<<"********************************************************************************";
}
while(*(p[i].score+j)>100||*(p[i].score+j)<0)
{
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();
cout<<"********************************************************************************";
}
}
}
}
else
{
cout<<"输入有误,请重新输入:";
cin.get(ch);
cin.get();
cout<<"********************************************************************************";
}
}
}
}
if(n==0)
{
cout<<"没有这名同学。"<<endl;
cout<<"********************************************************************************";
}
system("pause");
system("cls");
}
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);
}
}